Skip to content

Commit a89e8e8

Browse files
committed
fix: remove and replace sendgrid code in backend for nodemailer and gmail
1 parent 1415fd0 commit a89e8e8

File tree

4 files changed

+28
-55
lines changed

4 files changed

+28
-55
lines changed

email-api/.env.example

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,5 @@ PORT=4000
33
DATABASE_URL=postgres://user:password@localhost:5432/your_db
44
EMAIL=
55
GOOGLE_APP_PASSWORD=
6-
SENDGRID_API_KEY=
76
SECRET_KEY=
87
EXPIRE_IN=1d

email-api/src/config/env.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ export const env = {
66
DATABASE_URL: process.env.DATABASE_URL || '',
77
EMAIL: process.env.EMAIL || '',
88
GOOGLE_APP_PASSWORD: process.env.GOOGLE_APP_PASSWORD || '',
9-
SENDGRID_API_KEY: process.env.SENDGRID_API_KEY || '',
109
SECRET_KEY: process.env.SECRET_KEY || '',
1110
EXPIRE_IN: process.env.EXPIRE_IN || '1d'
1211
}

email-api/src/mails/mailer.js

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import nodemailer from 'nodemailer' // Cambiamos la librería
1+
import nodemailer from 'nodemailer' // Se cambia la librería
22
import { env } from '../config/env.js'
33

4-
// Creamos el transportador con la configuración de Gmail
54
const transporter = nodemailer.createTransport({
65
host: "smtp.gmail.com",
76
port: 465,
@@ -15,14 +14,6 @@ const transporter = nodemailer.createTransport({
1514
}
1615
});
1716

18-
/*const transporter = nodemailer.createTransport({
19-
service: 'gmail',
20-
auth: {
21-
user: env.EMAIL,
22-
pass: env.GOOGLE_APP_PASSWORD, // Aquí irá tu código de 16 letras
23-
},
24-
});*/
25-
2617
export const sendEmail = async ({ to, subject, html }) => {
2718
const mailOptions = {
2819
from: env.EMAIL,
@@ -36,29 +27,6 @@ export const sendEmail = async ({ to, subject, html }) => {
3627
console.log("Email sent via Gmail App Password to:", to);
3728
} catch (err) {
3829
console.error("Gmail/Nodemailer error:", err.message);
39-
// Importante: No lanzamos el error (throw) para que el registro del usuario
40-
// en el controller no se detenga si el mail falla.
41-
}
42-
}
43-
44-
45-
/*import sgMail from '@sendgrid/mail'
46-
import { env } from '../config/env.js'
47-
48-
sgMail.setApiKey(env.SENDGRID_API_KEY)
49-
50-
export const sendEmail = async ({ to, subject, html }) => {
51-
const msg = {
52-
to,
53-
from: env.EMAIL, // debe ser el correo verificado en SendGrid
54-
subject,
55-
html
56-
}
57-
try {
58-
await sgMail.send(msg)
59-
console.log("Email sent via SendGrid:", to)
60-
} catch (err) {
61-
console.error("SendGrid error:", err.response?.body || err.message)
62-
throw err
30+
// Importante: No lanzamos el error (throw) para que el registro del usuario en el controller no se detenga si el mail falla.
6331
}
64-
}*/
32+
}

email-api/tests/user.test.js

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import request from 'supertest';
22
import app from '../src/app.js';
33
import sequelize from '../src/db/connect.js';
4-
//import { User } from '../src/models/user.model.js';
5-
import sgMail from '@sendgrid/mail';
4+
import nodemailer from 'nodemailer';
65

7-
// Mock de SendGrid para no gastar créditos
8-
jest.mock('@sendgrid/mail', () => ({
9-
setApiKey: jest.fn(),
10-
send: jest.fn().mockResolvedValue([{ statusCode: 202 }]),
6+
7+
// Mock de Nodemailer para no enviar correos reales durante el test
8+
jest.mock('nodemailer', () => ({
9+
createTransport: jest.fn().mockReturnValue({
10+
sendMail: jest.fn().mockResolvedValue(true)
11+
})
1112
}));
1213

1314
const userTest = {
@@ -34,7 +35,7 @@ afterAll(async () => {
3435

3536
describe('User Auth & Management API', () => {
3637

37-
// 1. Crear Usuario
38+
// Crear Usuario
3839
test('POST /users should create a user and "send" an email', async () => {
3940
const res = await request(app)
4041
.post('/users')
@@ -43,11 +44,15 @@ describe('User Auth & Management API', () => {
4344
expect(res.status).toBe(201);
4445
expect(res.body.user).toHaveProperty('id');
4546
expect(res.body.user.email).toBe(userTest.email);
46-
expect(sgMail.send).toHaveBeenCalled(); // Verifica que se intentó enviar el mail
47+
48+
// CAMBIO: Verificamos que el transportador de nodemailer fue llamado
49+
const transport = nodemailer.createTransport();
50+
expect(transport.sendMail).toHaveBeenCalled();
51+
4752
userId = res.body.user.id;
4853
});
4954

50-
// 2. Login Fallido (Sin verificar)
55+
// Login Fallido (Sin verificar)
5156
test('POST /users/login should fail if user is not verified', async () => {
5257
const res = await request(app)
5358
.post('/users/login')
@@ -60,7 +65,7 @@ describe('User Auth & Management API', () => {
6065
expect(res.body.message).toBe('Unverified user');
6166
});
6267

63-
// 3. Obtener el código de verificación directamente de la DB para el test
68+
// Obtener el código de verificación directamente de la DB para el test
6469
test('GET /users/verify/:code should verify the user', async () => {
6570
// Buscamos el código en la base de datos
6671
const { EmailCode } = await import('../src/models/emailcode.model.js');
@@ -74,7 +79,7 @@ describe('User Auth & Management API', () => {
7479
expect(res.body.user.isVerified).toBe(true);
7580
});
7681

77-
// 4. Login Exitoso (Ya verificado)
82+
// Login Exitoso (Ya verificado)
7883
test('POST /users/login should return a JWT', async () => {
7984
const res = await request(app)
8085
.post('/users/login')
@@ -88,7 +93,7 @@ describe('User Auth & Management API', () => {
8893
token = res.body.token;
8994
});
9095

91-
// 5. Ruta Protegida (GET /users/me)
96+
// Ruta Protegida (GET /users/me)
9297
test('GET /users/me should return user data with valid token', async () => {
9398
const res = await request(app)
9499
.get('/users/me')
@@ -98,13 +103,13 @@ describe('User Auth & Management API', () => {
98103
expect(res.body.email).toBe(userTest.email);
99104
});
100105

101-
// 6. Prueba de Seguridad (Acceso denegado)
106+
// Prueba de Seguridad (Acceso denegado)
102107
test('GET /users/me should return 401 without token', async () => {
103108
const res = await request(app).get('/users/me');
104109
expect(res.status).toBe(401);
105110
});
106111

107-
//test para emails
112+
// test para emails
108113
describe('Emails Controller - Auth-Mailer-API', () => {
109114
test('POST /emails/contact should trigger SendGrid and return 200', async () => {
110115
const contactData = {
@@ -120,10 +125,12 @@ describe('User Auth & Management API', () => {
120125

121126
expect(res.status).toBe(200);
122127
expect(res.body.message).toBe('Email sent successfully!');
123-
// Verificamos que el mock de SendGrid fue llamado
124-
expect(sgMail.send).toHaveBeenCalledWith(expect.objectContaining({
125-
to: contactData.email,
126-
subject: 'Hi there!'
128+
129+
// CAMBIO: Verificamos que Nodemailer recibió los datos correctos
130+
const transport = nodemailer.createTransport();
131+
expect(transport.sendMail).toHaveBeenCalledWith(expect.objectContaining({
132+
to: contactData.email
133+
// El subject dependerá de lo definido en el controller
127134
}));
128135
});
129136
});

0 commit comments

Comments
 (0)