From c0a39957be51efcfa3eaf451d5f5ccc318ba2017 Mon Sep 17 00:00:00 2001 From: fidel Date: Tue, 27 May 2025 13:24:53 +0100 Subject: [PATCH 1/3] added tests for userService --- src/user/user.service.spec.ts | 118 ++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) diff --git a/src/user/user.service.spec.ts b/src/user/user.service.spec.ts index 2798c9d..eacc914 100644 --- a/src/user/user.service.spec.ts +++ b/src/user/user.service.spec.ts @@ -15,4 +15,122 @@ describe('UsersService', () => { it('should be defined', () => { expect(service).toBeDefined(); }); + + describe('create()', () => { + it('should create a user and return an ID', () => { + const id = service.create({ + name: 'John', + email: 'john@example.com', + password: '123456', + }); + expect(id).toBeGreaterThan(0); + }); + + it('should create multiple users with unique IDs', () => { + const id1 = service.create({ + name: 'Jane', + email: 'jane@example.com', + password: 'abcdef', + }); + const id2 = service.create({ + name: 'Doe', + email: 'doe@example.com', + password: 'qwerty', + }); + expect(id1).not.toEqual(id2); + }); + }); + + describe('findOne()', () => { + it('should return a user if it exists', () => { + const id = service.create({ + name: 'Test', + email: 'test@test.com', + password: '123', + }); + const user = service.findOne(id); + expect(user).toBeDefined(); + expect(user?.name).toBe('Test'); + }); + + it('should return undefined if user does not exist', () => { + const user = service.findOne(999); + expect(user).toBeUndefined(); + }); + }); + + describe('findAll()', () => { + it('should return all users', () => { + service.create({ + name: 'User1', + email: 'u1@mail.com', + password: 'pass', + }); + service.create({ + name: 'User2', + email: 'u2@mail.com', + password: 'pass', + }); + const users = service.findAll(); + expect(users.length).toBeGreaterThanOrEqual(2); + }); + + it('should return empty array if no users', () => { + const emptyService = new UserService(); + expect(emptyService.findAll()).toEqual([]); + }); + }); + + describe('update()', () => { + it('should update user fields if user exists', () => { + const id = service.create({ + name: 'Old', + email: 'old@mail.com', + password: '123', + }); + const updated = service.update(id, { name: 'New' }); + const user = service.findOne(id); + expect(updated).toBe(true); + expect(user?.name).toBe('New'); + }); + + it('should return false if user does not exist', () => { + const result = service.update(999, { name: 'Ghost' }); + expect(result).toBe(false); + }); + }); + + describe('remove()', () => { + it('should delete user if exists', () => { + const id = service.create({ + name: 'ToDelete', + email: 'del@mail.com', + password: 'abc', + }); + const result = service.remove(id); + expect(result).toBe(true); + expect(service.findOne(id)).toBeUndefined(); + }); + + it('should return false if user does not exist', () => { + expect(service.remove(999)).toBe(false); + }); + }); + + describe('findByUsername()', () => { + it('should return user if username exists', () => { + service.create({ + name: 'Alice', + email: 'alice@mail.com', + password: 'pass', + }); + const user = service.findByUsername('Alice'); + expect(user).toBeDefined(); + expect(user?.email).toBe('alice@mail.com'); + }); + + it('should return undefined if username not found', () => { + expect(service.findByUsername('NotExist')).toBeUndefined(); + }); + }); }); From f75d3870905793b73b35fcd66c6f102dc7b7e50a Mon Sep 17 00:00:00 2001 From: fidel Date: Tue, 27 May 2025 13:32:29 +0100 Subject: [PATCH 2/3] updating findByUsername test to be strictly typed --- src/user/user.service.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/user/user.service.spec.ts b/src/user/user.service.spec.ts index eacc914..0c70233 100644 --- a/src/user/user.service.spec.ts +++ b/src/user/user.service.spec.ts @@ -125,8 +125,8 @@ describe('UsersService', () => { password: 'pass', }); const user = service.findByUsername('Alice'); - expect(user).toBeDefined(); - expect(user?.email).toBe('alice@mail.com'); + if (!user) throw new Error('User not found'); + expect(user.email).toBe('alice@mail.com'); }); it('should return undefined if username not found', () => { From 47d0463808ead282191a87a3755d7efa3cf70a2d Mon Sep 17 00:00:00 2001 From: fidel Date: Fri, 30 May 2025 18:02:50 +0100 Subject: [PATCH 3/3] updated the tests --- src/user/user.service.spec.ts | 168 ++++++++++++++++++---------------- src/user/user.service.ts | 8 +- 2 files changed, 94 insertions(+), 82 deletions(-) diff --git a/src/user/user.service.spec.ts b/src/user/user.service.spec.ts index 0c70233..2b560d5 100644 --- a/src/user/user.service.spec.ts +++ b/src/user/user.service.spec.ts @@ -1,7 +1,8 @@ import { Test, TestingModule } from '@nestjs/testing'; import { UserService } from './user.service'; +import { User } from './interfaces/user.interface'; -describe('UsersService', () => { +describe('UserService', () => { let service: UserService; beforeEach(async () => { @@ -17,120 +18,127 @@ describe('UsersService', () => { }); describe('create()', () => { - it('should create a user and return an ID', () => { - const id = service.create({ - name: 'John', - email: 'john@example.com', - password: '123456', - }); - expect(id).toBeGreaterThan(0); + it('should create a user and return user ID', () => { + const user: User = { + name: 'Alice', + email: 'alice@mail.com', + password: '1234', + }; + const id: number = service.create(user); + expect(typeof id).toBe('number'); }); it('should create multiple users with unique IDs', () => { - const id1 = service.create({ - name: 'Jane', - email: 'jane@example.com', - password: 'abcdef', - }); - const id2 = service.create({ - name: 'Doe', - email: 'doe@example.com', - password: 'qwerty', - }); - expect(id1).not.toEqual(id2); + const user1: User = { + name: 'User1', + email: 'u1@mail.com', + password: '123', + }; + const user2: User = { + name: 'User2', + email: 'u2@mail.com', + password: '456', + }; + const id1 = service.create(user1); + const id2 = service.create(user2); + expect(id1).not.toBe(id2); + }); + }); + + describe('findAll()', () => { + it('should return an array of users', () => { + service.create({ name: 'A', email: 'a@mail.com', password: '123' }); + const users: User[] = service.findAll(); + expect(Array.isArray(users)).toBe(true); + expect(users.length).toBeGreaterThan(0); }); }); describe('findOne()', () => { - it('should return a user if it exists', () => { - const id = service.create({ - name: 'Test', - email: 'test@test.com', - password: '123', - }); + it('should return the user by ID', () => { + const newUser: User = { + name: 'Bob', + email: 'bob@mail.com', + password: 'pass', + }; + const id = service.create(newUser); const user = service.findOne(id); expect(user).toBeDefined(); - expect(user?.name).toBe('Test'); + expect(user?.name).toBe('Bob'); }); - it('should return undefined if user does not exist', () => { - const user = service.findOne(999); - expect(user).toBeUndefined(); + it('should return undefined for non-existent ID', () => { + const result = service.findOne(9999); + expect(result).toBeUndefined(); }); }); - describe('findAll()', () => { - it('should return all users', () => { - service.create({ - name: 'User1', - email: 'u1@mail.com', - password: 'pass', - }); - service.create({ - name: 'User2', - email: 'u2@mail.com', - password: 'pass', - }); - const users = service.findAll(); - expect(users.length).toBeGreaterThanOrEqual(2); + describe('findByUsername()', () => { + it('should find a user by name', () => { + const user: User = { + name: 'Alice', + email: 'alice@mail.com', + password: '1234', + }; + service.create(user); + const result = service.findByUsername('Alice'); + expect(result).toBeDefined(); + expect(result?.email).toBe('alice@mail.com'); }); - it('should return empty array if no users', () => { - const emptyService = new UserService(); - expect(emptyService.findAll()).toEqual([]); + it('should return undefined if username not found', () => { + const result = service.findByUsername('NotExist'); + expect(result).toBeUndefined(); }); }); describe('update()', () => { - it('should update user fields if user exists', () => { - const id = service.create({ + it("should update a user's data", () => { + const user: User = { name: 'Old', email: 'old@mail.com', password: '123', + }; + const id = service.create(user); + + const updated = service.update(id, { + name: 'New', + email: 'new@mail.com', + password: '456', }); - const updated = service.update(id, { name: 'New' }); - const user = service.findOne(id); + expect(updated).toBe(true); - expect(user?.name).toBe('New'); + + const result = service.findOne(id); + expect(result?.name).toBe('New'); + expect(result?.email).toBe('new@mail.com'); }); - it('should return false if user does not exist', () => { - const result = service.update(999, { name: 'Ghost' }); + it('should return false when updating non-existent user', () => { + const result = service.update(999, { + name: 'Ghost', + }); expect(result).toBe(false); }); }); describe('remove()', () => { - it('should delete user if exists', () => { - const id = service.create({ - name: 'ToDelete', - email: 'del@mail.com', - password: 'abc', - }); - const result = service.remove(id); - expect(result).toBe(true); + it('should delete a user', () => { + const user: User = { + name: 'Temp', + email: 'temp@mail.com', + password: 'temp', + }; + const id = service.create(user); + + const deleted = service.remove(id); + expect(deleted).toBe(true); expect(service.findOne(id)).toBeUndefined(); }); - it('should return false if user does not exist', () => { - expect(service.remove(999)).toBe(false); - }); - }); - - describe('findByUsername()', () => { - it('should return user if username exists', () => { - service.create({ - name: 'Alice', - email: 'alice@mail.com', - password: 'pass', - }); - const user = service.findByUsername('Alice'); - if (!user) throw new Error('User not found'); - expect(user.email).toBe('alice@mail.com'); - }); - - it('should return undefined if username not found', () => { - expect(service.findByUsername('NotExist')).toBeUndefined(); + it('should return false for non-existent user', () => { + const deleted = service.remove(12345); + expect(deleted).toBe(false); }); }); }); diff --git a/src/user/user.service.ts b/src/user/user.service.ts index cfdedbe..7da727f 100644 --- a/src/user/user.service.ts +++ b/src/user/user.service.ts @@ -15,8 +15,7 @@ export class UserService { this.users.set(this.userIDcounter, user); return this.userIDcounter; } - findAll() { - // TODO: #26 - get all users from DB + findAll(): User[] { return Array.from(this.users.values()); } findOne(userID: number): User | undefined { @@ -28,6 +27,11 @@ export class UserService { // parseInt will not work because the defined type is already "number" return this.users.get(+userID); } + findByUsername(username: string): User | undefined { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + const usersArray = Array.from(this.users.values()) as User[]; + return usersArray.find((user: User) => user.name === username); + } update(userID: number, user: UpdateUserDto): boolean { // TODO: #26 - update user in DB if (this.users.has(+userID)) {