Skip to content

Commit e854a02

Browse files
committed
docs: update user.test.js y package.json
1 parent 82cc1ad commit e854a02

File tree

2 files changed

+191
-3
lines changed

2 files changed

+191
-3
lines changed

email-api/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"scripts": {
55
"dev": "node --watch --env-file=.env src/server.js",
66
"start": "node src/server.js",
7-
"test": "NODE_OPTIONS='--experimental-vm-modules --no-warnings' jest --no-cache --detectOpenHandles --forceExit"
7+
"test": "jest --detectOpenHandles --forceExit"
88
},
99
"type": "module",
1010
"dependencies": {

email-api/tests/user.test.js

Lines changed: 190 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import request from 'supertest';
1+
/*import request from 'supertest';
22
import app from '../src/app.js';
33
import sequelize from '../src/db/connect.js';
44
import nodemailer from 'nodemailer';
5-
import { EmailCode } from '../src/models/emailcode.model.js';
5+
//import { EmailCode } from '../src/models/emailcode.model.js';
66
77
88
// Mock de Nodemailer para no enviar correos reales durante el test
@@ -151,6 +151,194 @@ describe('User Auth & Management API', () => {
151151
test('Should fail if code is null (Database Constraint)', async () => {
152152
//const { EmailCode } = await import('../src/models/emailcode.model.js');
153153
154+
try {
155+
await EmailCode.create({ userId: userId }); // Falta el campo 'code'
156+
} catch (error) {
157+
// Sequelize debería lanzar un error de validación
158+
expect(error.name).toBe('SequelizeValidationError');
159+
}
160+
});
161+
});
162+
});*/
163+
164+
import request from 'supertest';
165+
import app from '../src/app.js';
166+
import sequelize from '../src/db/connect.js';
167+
import nodemailer from 'nodemailer';
168+
169+
// Mock de Nodemailer para no enviar correos reales durante el test
170+
jest.mock('nodemailer', () => ({
171+
createTransport: jest.fn().mockReturnValue({
172+
sendMail: jest.fn().mockResolvedValue(true)
173+
})
174+
}));
175+
176+
const userTest = {
177+
  email: 'testuser@gmail.com',
178+
  password: 'password123',
179+
  firstName: 'Clio',
180+
  lastName: 'Data',
181+
  country: 'Mexico',
182+
  image: 'https://img.com/clio.png',
183+
  frontBaseUrl: 'http://localhost:5173/verify'
184+
};
185+
186+
let token;
187+
let userId;
188+
let verificationCode;
189+
190+
beforeAll(async () => {
191+
  await sequelize.sync({ force: true }); // Limpia la base de datos antes de empezar
192+
});
193+
194+
afterAll(async () => {
195+
  await sequelize.close(); // Cierra la conexión al terminar
196+
});
197+
198+
describe('User Auth & Management API', () => {
199+
  // Crear Usuario
200+
  test('POST /users should create a user and "send" an email', async () => {
201+
const res = await request(app)
202+
.post('/users')
203+
.send(userTest)
204+
205+
expect(res.status).toBe(201)
206+
expect(res.body.user).toHaveProperty('id')
207+
expect(res.body.user.email).toBe(userTest.email)
208+
209+
// CAMBIO: Verificamos que el transportador de nodemailer fue llamado
210+
const transport = nodemailer.createTransport()
211+
expect(transport.sendMail).toHaveBeenCalled()
212+
213+
userId = res.body.user.id
214+
});
215+
216+
  // Login Fallido (Sin verificar)
217+
  test('POST /users/login should fail if user is not verified', async () => {
218+
const res = await request(app)
219+
.post('/users/login')
220+
.send({
221+
email: userTest.email,
222+
password: userTest.password
223+
})
224+
225+
expect(res.status).toBe(401)
226+
expect(res.body.message).toBe('Unverified user')
227+
});
228+
229+
  // Obtener el código de verificación directamente de la DB para el test
230+
  test('GET /users/verify/:code should verify the user', async () => {
231+
232+
// Buscamos el código en la base de datos
233+
const { EmailCode } = await import('../src/models/emailcode.model.js')
234+
const codeObj = await EmailCode.findOne({ where: { userId } })
235+
verificationCode = codeObj.code
236+
237+
const res = await request(app)
238+
.get(`/users/verify/${verificationCode}`)
239+
240+
expect(res.status).toBe(200)
241+
expect(res.body.user.isVerified).toBe(true)
242+
});
243+
244+
  // Login Exitoso (Ya verificado)
245+
  test('POST /users/login should return a JWT', async () => {
246+
const res = await request(app)
247+
.post('/users/login')
248+
.send({
249+
email: userTest.email,
250+
password: userTest.password
251+
})
252+
253+
expect(res.status).toBe(200)
254+
expect(res.body).toHaveProperty('token')
255+
token = res.body.token
256+
});
257+
258+
  // Ruta Protegida (GET /users/me)
259+
  test('GET /users/me should return user data with valid token', async () => {
260+
const res = await request(app)
261+
.get('/users/me')
262+
.set('Authorization', `Bearer ${token}`)
263+
264+
expect(res.status).toBe(200)
265+
expect(res.body.email).toBe(userTest.email)
266+
});
267+
268+
  // Prueba de Seguridad (Acceso denegado)
269+
  test('GET /users/me should return 401 without token', async () => {
270+
const res = await request(app).get('/users/me')
271+
expect(res.status).toBe(401)
272+
});
273+
 
274+
  //test para emails
275+
  describe('Emails Controller - Auth-Mailer-API', () => {
276+
test('POST /emails/contact should trigger SendGrid and return 200', async () => {
277+
const contactData = {
278+
name: 'Test User',
279+
email: 'test@example.com',
280+
phone: '1234567890',
281+
message: 'Testing the Auth-Mailer-API integration'
282+
}
283+
284+
const res = await request(app)
285+
.post('/emails/contact')
286+
.send(contactData)
287+
288+
expect(res.status).toBe(200)
289+
expect(res.body.message).toBe('Email sent successfully!')
290+
291+
// CAMBIO: Verificamos que Nodemailer recibió los datos correctos
292+
const transport = nodemailer.createTransport();
293+
expect(transport.sendMail).toHaveBeenCalledWith(expect.objectContaining({
294+
to: contactData.email
295+
// El subject dependerá de lo que definas en tu controller
296+
}));
297+
});
298+
});
299+
300+
/*
301+
const { EmailCode } = await import('../src/models/emailcode.model.js');
302+
     
303+
      // Usamos el userId que generamos en el test de creación de usuario anterior
304+
      const newCode = await EmailCode.create({
305+
        code: 'verification-test-code-999',
306+
        userId: userId
307+
      });
308+
 
309+
      expect(newCode.code).toBe('verification-test-code-999');
310+
      expect(newCode.userId).toBe(userId);
311+
312+
test('Should fail if code is null (Database Constraint)', async () => {
313+
      const { EmailCode } = await import('../src/models/emailcode.model.js');
314+
     
315+
      try {
316+
        await EmailCode.create({ userId: userId }); // Falta el campo 'code'
317+
      } catch (error) {
318+
        // Sequelize debería lanzar un error de validación
319+
        expect(error.name).toBe('SequelizeValidationError');
320+
      }
321+
    });
322+
*/
323+
 
324+
  // test para emailcode
325+
  describe('EmailCode Model Logic', () => {
326+
test('Should create and store a verification code linked to a user', async () => {
327+
const { EmailCode } = await import('../src/models/emailcode.model.js')
328+
329+
// Usamos el userId que generamos en el test de creación de usuario anterior
330+
const newCode = await EmailCode.create({
331+
code: 'verification-test-code-999',
332+
userId: userId
333+
})
334+
});
335+
336+
expect(newCode.code).toBe('verification-test-code-999')
337+
expect(newCode.userId).toBe(userId)
338+
339+
test('Should fail if code is null (Database Constraint)', async () => {
340+
const { EmailCode } = await import('../src/models/emailcode.model.js')
341+
154342
try {
155343
await EmailCode.create({ userId: userId }); // Falta el campo 'code'
156344
} catch (error) {

0 commit comments

Comments
 (0)