11import request from 'supertest' ;
22import app from '../src/app.js' ;
33import 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
1314const userTest = {
@@ -34,7 +35,7 @@ afterAll(async () => {
3435
3536describe ( '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