Files
quasar/backend/dist/tests/routes/games.spec.js
Benito Rodríguez 2667e11284
Some checks failed
CI / lint (push) Failing after 10s
CI / test-backend (push) Has been skipped
CI / test-frontend (push) Has been skipped
CI / test-e2e (push) Has been skipped
Refactor code structure for improved readability and maintainability
2026-03-22 11:34:38 +01:00

355 lines
14 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const vitest_1 = require("vitest");
const app_1 = require("../../src/app");
const prisma_1 = require("../../src/plugins/prisma");
(0, vitest_1.describe)('Games API', () => {
let app;
(0, vitest_1.beforeEach)(async () => {
app = (0, app_1.buildApp)();
await app.ready();
// Limpiar base de datos antes de cada test
// Orden importante: relaciones de FK primero
await prisma_1.prisma.purchase.deleteMany();
await prisma_1.prisma.gamePlatform.deleteMany();
await prisma_1.prisma.artwork.deleteMany();
await prisma_1.prisma.priceHistory.deleteMany();
await prisma_1.prisma.game.deleteMany();
await prisma_1.prisma.platform.deleteMany();
});
(0, vitest_1.afterEach)(async () => {
await app.close();
});
(0, vitest_1.describe)('GET /api/games', () => {
(0, vitest_1.it)('debería devolver una lista vacía cuando no hay juegos', async () => {
const res = await app.inject({
method: 'GET',
url: '/api/games',
});
(0, vitest_1.expect)(res.statusCode).toBe(200);
(0, vitest_1.expect)(res.json()).toEqual([]);
});
(0, vitest_1.it)('debería devolver una lista de juegos con todas sus propiedades', async () => {
// Crear un juego de prueba
const platform = await prisma_1.prisma.platform.create({
data: { name: 'Nintendo', slug: 'nintendo' },
});
const game = await prisma_1.prisma.game.create({
data: {
title: 'The Legend of Zelda',
slug: 'legend-of-zelda',
description: 'Un videojuego clásico',
source: 'manual',
gamePlatforms: {
create: {
platformId: platform.id,
},
},
purchases: {
create: {
priceCents: 5000,
currency: 'USD',
store: 'eBay',
date: new Date('2025-01-15'),
},
},
},
include: {
gamePlatforms: {
include: {
platform: true,
},
},
purchases: true,
},
});
const res = await app.inject({
method: 'GET',
url: '/api/games',
});
(0, vitest_1.expect)(res.statusCode).toBe(200);
const body = res.json();
(0, vitest_1.expect)(Array.isArray(body)).toBe(true);
(0, vitest_1.expect)(body.length).toBe(1);
(0, vitest_1.expect)(body[0]).toHaveProperty('id');
(0, vitest_1.expect)(body[0]).toHaveProperty('title');
});
});
(0, vitest_1.describe)('POST /api/games', () => {
(0, vitest_1.it)('debería crear un juego válido con todos los campos', async () => {
// Crear plataforma primero
const platform = await prisma_1.prisma.platform.create({
data: { name: 'Nintendo 64', slug: 'n64' },
});
const payload = {
title: 'Super Mario 64',
platformId: platform.id,
description: 'Notas sobre el juego',
priceCents: 15000,
currency: 'USD',
store: 'Local Shop',
date: '2025-01-20',
condition: 'CIB',
};
const res = await app.inject({
method: 'POST',
url: '/api/games',
payload,
});
(0, vitest_1.expect)(res.statusCode).toBe(201);
const body = res.json();
(0, vitest_1.expect)(body).toHaveProperty('id');
(0, vitest_1.expect)(body.title).toBe('Super Mario 64');
(0, vitest_1.expect)(body.description).toBe('Notas sobre el juego');
});
(0, vitest_1.it)('debería fallar si falta el título (requerido)', async () => {
const res = await app.inject({
method: 'POST',
url: '/api/games',
payload: {
platformId: 'non-existing-id',
priceCents: 10000,
},
});
(0, vitest_1.expect)(res.statusCode).toBe(400);
});
(0, vitest_1.it)('debería fallar si el título está vacío', async () => {
const res = await app.inject({
method: 'POST',
url: '/api/games',
payload: {
title: '',
platformId: 'some-id',
},
});
(0, vitest_1.expect)(res.statusCode).toBe(400);
});
(0, vitest_1.it)('debería crear un juego con solo los campos requeridos', async () => {
const res = await app.inject({
method: 'POST',
url: '/api/games',
payload: {
title: 'Game Title Only',
},
});
(0, vitest_1.expect)(res.statusCode).toBe(201);
const body = res.json();
(0, vitest_1.expect)(body).toHaveProperty('id');
(0, vitest_1.expect)(body.title).toBe('Game Title Only');
});
});
(0, vitest_1.describe)('PUT /api/games/:id', () => {
(0, vitest_1.it)('debería actualizar un juego existente', async () => {
const game = await prisma_1.prisma.game.create({
data: {
title: 'Original Title',
slug: 'original-title',
source: 'manual',
},
});
const res = await app.inject({
method: 'PUT',
url: `/api/games/${game.id}`,
payload: {
title: 'Updated Title',
description: 'Updated description',
},
});
(0, vitest_1.expect)(res.statusCode).toBe(200);
const body = res.json();
(0, vitest_1.expect)(body.title).toBe('Updated Title');
(0, vitest_1.expect)(body.description).toBe('Updated description');
});
(0, vitest_1.it)('debería devolver 404 si el juego no existe', async () => {
const res = await app.inject({
method: 'PUT',
url: '/api/games/non-existing-id',
payload: {
title: 'Some Title',
},
});
(0, vitest_1.expect)(res.statusCode).toBe(404);
});
(0, vitest_1.it)('debería permitir actualización parcial', async () => {
const game = await prisma_1.prisma.game.create({
data: {
title: 'Original Title',
slug: 'original',
description: 'Original description',
source: 'manual',
},
});
const res = await app.inject({
method: 'PUT',
url: `/api/games/${game.id}`,
payload: {
description: 'New description only',
},
});
(0, vitest_1.expect)(res.statusCode).toBe(200);
const body = res.json();
(0, vitest_1.expect)(body.title).toBe('Original Title'); // No cambió
(0, vitest_1.expect)(body.description).toBe('New description only'); // Cambió
});
});
(0, vitest_1.describe)('DELETE /api/games/:id', () => {
(0, vitest_1.it)('debería eliminar un juego existente', async () => {
const game = await prisma_1.prisma.game.create({
data: {
title: 'Game to Delete',
slug: 'game-to-delete',
source: 'manual',
},
});
const res = await app.inject({
method: 'DELETE',
url: `/api/games/${game.id}`,
});
(0, vitest_1.expect)(res.statusCode).toBe(204);
// Verificar que el juego fue eliminado
const deletedGame = await prisma_1.prisma.game.findUnique({
where: { id: game.id },
});
(0, vitest_1.expect)(deletedGame).toBeNull();
});
(0, vitest_1.it)('debería devolver 404 si el juego no existe', async () => {
const res = await app.inject({
method: 'DELETE',
url: '/api/games/non-existing-id',
});
(0, vitest_1.expect)(res.statusCode).toBe(404);
});
});
(0, vitest_1.describe)('POST /api/games/from-metadata', () => {
(0, vitest_1.it)('debería crear un juego a partir de metadatos', async () => {
const payload = {
metadata: {
source: 'igdb',
externalIds: { igdb: 1234 },
name: 'Super Mario Bros.',
slug: 'super-mario-bros',
releaseDate: '1985-09-13T00:00:00.000Z',
genres: ['Platform'],
coverUrl: 'https://example.com/cover.jpg',
},
};
const res = await app.inject({
method: 'POST',
url: '/api/games/from-metadata',
payload,
});
(0, vitest_1.expect)(res.statusCode).toBe(201);
const body = res.json();
(0, vitest_1.expect)(body).toHaveProperty('id');
(0, vitest_1.expect)(body.title).toBe('Super Mario Bros.');
(0, vitest_1.expect)(body.source).toBe('igdb');
(0, vitest_1.expect)(body.sourceId).toBe('1234');
});
(0, vitest_1.it)('debería crear un juego con overrides', async () => {
const platform = await prisma_1.prisma.platform.create({
data: { name: 'Nintendo Entertainment System', slug: 'nes' },
});
const payload = {
metadata: {
source: 'igdb',
externalIds: { igdb: 1234 },
name: 'Super Mario Bros.',
slug: 'super-mario-bros',
releaseDate: '1985-09-13T00:00:00.000Z',
genres: ['Platform'],
coverUrl: 'https://example.com/cover.jpg',
},
overrides: {
platformId: platform.id,
description: 'Descripción personalizada',
priceCents: 10000,
currency: 'USD',
store: 'eBay',
date: '2025-01-15',
condition: 'CIB',
},
};
const res = await app.inject({
method: 'POST',
url: '/api/games/from-metadata',
payload,
});
(0, vitest_1.expect)(res.statusCode).toBe(201);
const body = res.json();
(0, vitest_1.expect)(body.title).toBe('Super Mario Bros.');
(0, vitest_1.expect)(body.description).toBe('Descripción personalizada');
(0, vitest_1.expect)(body.gamePlatforms).toHaveLength(1);
(0, vitest_1.expect)(body.gamePlatforms[0].platformId).toBe(platform.id);
(0, vitest_1.expect)(body.purchases).toHaveLength(1);
(0, vitest_1.expect)(body.purchases[0].priceCents).toBe(10000);
});
(0, vitest_1.it)('debería devolver 400 si falta el campo metadata', async () => {
const res = await app.inject({
method: 'POST',
url: '/api/games/from-metadata',
payload: {},
});
(0, vitest_1.expect)(res.statusCode).toBe(400);
});
(0, vitest_1.it)('debería devolver 400 si metadata.name está vacío', async () => {
const res = await app.inject({
method: 'POST',
url: '/api/games/from-metadata',
payload: {
metadata: {
source: 'igdb',
externalIds: { igdb: 1234 },
name: '',
slug: 'super-mario-bros',
},
},
});
(0, vitest_1.expect)(res.statusCode).toBe(400);
});
(0, vitest_1.it)('debería usar el externalId principal como sourceId', async () => {
const payload = {
metadata: {
source: 'rawg',
externalIds: { rawg: 5678, igdb: 1234 },
name: 'Zelda',
slug: 'zelda',
},
};
const res = await app.inject({
method: 'POST',
url: '/api/games/from-metadata',
payload,
});
(0, vitest_1.expect)(res.statusCode).toBe(201);
const body = res.json();
(0, vitest_1.expect)(body.source).toBe('rawg');
(0, vitest_1.expect)(body.sourceId).toBe('5678');
});
(0, vitest_1.it)('debería manejar metadata sin externalIds', async () => {
const payload = {
metadata: {
source: 'manual',
externalIds: {},
name: 'Custom Game',
slug: 'custom-game',
},
};
const res = await app.inject({
method: 'POST',
url: '/api/games/from-metadata',
payload,
});
(0, vitest_1.expect)(res.statusCode).toBe(201);
const body = res.json();
(0, vitest_1.expect)(body.title).toBe('Custom Game');
(0, vitest_1.expect)(body.source).toBe('manual');
(0, vitest_1.expect)(body.sourceId).toBeNull();
});
});
});
/**
* Metadatos:
* Autor: GitHub Copilot
* Última actualización: 2026-02-11
*/