diff --git a/backend/package-lock.json b/backend/package-lock.json index 44b26c8..ebe6d64 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -9,11 +9,14 @@ "version": "0.0.1", "license": "UNLICENSED", "dependencies": { + "@nestjs/class-validator": "^0.13.4", "@nestjs/common": "^11.0.1", "@nestjs/config": "^4.0.2", "@nestjs/core": "^11.0.1", "@nestjs/platform-express": "^11.0.1", "@nestjs/typeorm": "^11.0.0", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.1", "crypto": "^1.0.1", "pg": "^8.14.1", "reflect-metadata": "^0.2.2", @@ -2087,6 +2090,15 @@ "node": ">= 10" } }, + "node_modules/@nestjs/class-validator": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/@nestjs/class-validator/-/class-validator-0.13.4.tgz", + "integrity": "sha512-/mqZL36LJ5uV5WDhi87Cd52IssuO+SStaOr2+6sBsvCCGUWkoJes4Wwzmm3m/gdHH+tsNxX60sVSzYcU6hAy9Q==", + "dependencies": { + "libphonenumber-js": "^1.9.43", + "validator": "^13.7.0" + } + }, "node_modules/@nestjs/cli": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-11.0.5.tgz", @@ -3076,6 +3088,11 @@ "@types/superagent": "^8.1.0" } }, + "node_modules/@types/validator": { + "version": "13.12.3", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.3.tgz", + "integrity": "sha512-2ipwZ2NydGQJImne+FhNdhgRM37e9lCev99KnqkbFHd94Xn/mErARWI1RSLem1QA19ch5kOhzIZd7e8CA2FI8g==" + }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", @@ -4412,6 +4429,21 @@ "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true }, + "node_modules/class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" + }, + "node_modules/class-validator": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz", + "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", + "dependencies": { + "@types/validator": "^13.11.8", + "libphonenumber-js": "^1.10.53", + "validator": "^13.9.0" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -7456,6 +7488,11 @@ "node": ">= 0.8.0" } }, + "node_modules/libphonenumber-js": { + "version": "1.12.6", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.6.tgz", + "integrity": "sha512-PJiS4ETaUfCOFLpmtKzAbqZQjCCKVu2OhTV4SVNNE7c2nu/dACvtCqj4L0i/KWNnIgRv7yrILvBj5Lonv5Ncxw==" + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -10448,6 +10485,14 @@ "node": ">=10.12.0" } }, + "node_modules/validator": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.0.tgz", + "integrity": "sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/backend/package.json b/backend/package.json index 79120d0..ea52f1b 100644 --- a/backend/package.json +++ b/backend/package.json @@ -20,11 +20,14 @@ "test:e2e": "jest --config ./test/jest-e2e.json" }, "dependencies": { + "@nestjs/class-validator": "^0.13.4", "@nestjs/common": "^11.0.1", "@nestjs/config": "^4.0.2", "@nestjs/core": "^11.0.1", "@nestjs/platform-express": "^11.0.1", "@nestjs/typeorm": "^11.0.0", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.1", "crypto": "^1.0.1", "pg": "^8.14.1", "reflect-metadata": "^0.2.2", diff --git a/backend/src/song/song.controller.spec.ts b/backend/src/song/song.controller.spec.ts index da8755e..0c0c9a9 100644 --- a/backend/src/song/song.controller.spec.ts +++ b/backend/src/song/song.controller.spec.ts @@ -3,8 +3,10 @@ import { getRepositoryToken } from '@nestjs/typeorm'; import { SongController } from './song.controller'; import { SongService } from './song.service'; import { Song } from './song.entity'; +import { Album } from '../album/album.entity'; const mockSong = new Song(); +const mockAlbum = new Album(); describe('SongController', () => { let controller: SongController; @@ -24,6 +26,16 @@ describe('SongController', () => { remove: jest.fn().mockResolvedValue(null), }, }, + { + provide: getRepositoryToken(Album), + useValue: { + findAll: jest.fn().mockResolvedValue([mockAlbum]), + findOneById: jest.fn().mockResolvedValue(mockAlbum), + create: jest.fn().mockResolvedValue(1), + update: jest.fn().mockResolvedValue("Album updated successfully"), + remove: jest.fn().mockResolvedValue(null), + }, + }, ] }).compile(); diff --git a/backend/src/song/song.service.spec.ts b/backend/src/song/song.service.spec.ts index b02a751..42ccfcb 100644 --- a/backend/src/song/song.service.spec.ts +++ b/backend/src/song/song.service.spec.ts @@ -2,8 +2,10 @@ import { Test, TestingModule } from '@nestjs/testing'; import { getRepositoryToken } from '@nestjs/typeorm'; import { SongService } from './song.service'; import { Song } from './song.entity'; +import { Album } from '../album/album.entity'; const mockSong = new Song(); +const mockAlbum = new Album(); describe('SongService', () => { let service: SongService; @@ -22,6 +24,16 @@ describe('SongService', () => { remove: jest.fn().mockResolvedValue(null), }, }, + { + provide: getRepositoryToken(Album), + useValue: { + findAll: jest.fn().mockResolvedValue([mockAlbum]), + findOneById: jest.fn().mockResolvedValue(mockAlbum), + create: jest.fn().mockResolvedValue(1), + update: jest.fn().mockResolvedValue("Album updated successfully"), + remove: jest.fn().mockResolvedValue(null), + }, + }, ] }).compile();