From 861cec3a3ad9e15deb6c77f5f5741f2b12f9c9e3 Mon Sep 17 00:00:00 2001 From: Phill Pover Date: Mon, 31 Mar 2025 17:32:51 +0100 Subject: [PATCH] Cleanup and fixes --- backend/src/app.module.ts | 4 +-- .../blogpost.entity.ts} | 2 +- .../blogposts/blogposts.controller.spec.ts | 34 +++++++++++++++++++ backend/src/blogposts/blogposts.controller.ts | 25 ++++++++++++++ backend/src/blogposts/blogposts.module.ts | 13 +++++++ .../blogposts.repositorymock.factory.ts | 4 +++ .../src/blogposts/blogposts.service.spec.ts | 32 +++++++++++++++++ backend/src/blogposts/blogposts.service.ts | 34 +++++++++++++++++++ .../src/blogposts/dto/create-blog-post.dto.ts | 4 +++ backend/src/mocktype.ts | 3 ++ backend/src/posts/dto/create-post.dto.ts | 4 --- backend/src/posts/posts.controller.spec.ts | 18 ---------- backend/src/posts/posts.controller.ts | 24 ------------- backend/src/posts/posts.module.ts | 9 ----- backend/src/posts/posts.service.spec.ts | 18 ---------- backend/src/posts/posts.service.ts | 33 ------------------ backend/src/users/users.service.spec.ts | 15 +++++++- 17 files changed, 166 insertions(+), 110 deletions(-) rename backend/src/{posts/post.entity.ts => blogposts/blogpost.entity.ts} (82%) create mode 100644 backend/src/blogposts/blogposts.controller.spec.ts create mode 100644 backend/src/blogposts/blogposts.controller.ts create mode 100644 backend/src/blogposts/blogposts.module.ts create mode 100644 backend/src/blogposts/blogposts.repositorymock.factory.ts create mode 100644 backend/src/blogposts/blogposts.service.spec.ts create mode 100644 backend/src/blogposts/blogposts.service.ts create mode 100644 backend/src/blogposts/dto/create-blog-post.dto.ts create mode 100644 backend/src/mocktype.ts delete mode 100644 backend/src/posts/dto/create-post.dto.ts delete mode 100644 backend/src/posts/posts.controller.spec.ts delete mode 100644 backend/src/posts/posts.controller.ts delete mode 100644 backend/src/posts/posts.module.ts delete mode 100644 backend/src/posts/posts.service.spec.ts delete mode 100644 backend/src/posts/posts.service.ts diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index ea519e0..025bd27 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -4,7 +4,7 @@ import configuration from './config/configuration'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { DatabaseModule } from './database/database.module'; -import { PostsModule } from './posts/posts.module'; +import { BlogPostsModule } from './blogposts/blogposts.module'; import { UsersModule } from './users/users.module'; @Module({ @@ -13,7 +13,7 @@ import { UsersModule } from './users/users.module'; load: [configuration] }), DatabaseModule, - PostsModule, + BlogPostsModule, UsersModule ], controllers: [AppController], diff --git a/backend/src/posts/post.entity.ts b/backend/src/blogposts/blogpost.entity.ts similarity index 82% rename from backend/src/posts/post.entity.ts rename to backend/src/blogposts/blogpost.entity.ts index c7ee653..5c2c210 100644 --- a/backend/src/posts/post.entity.ts +++ b/backend/src/blogposts/blogpost.entity.ts @@ -1,7 +1,7 @@ import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; @Entity() -export class Post { +export class BlogPost { @PrimaryGeneratedColumn() id: number diff --git a/backend/src/blogposts/blogposts.controller.spec.ts b/backend/src/blogposts/blogposts.controller.spec.ts new file mode 100644 index 0000000..2a7b235 --- /dev/null +++ b/backend/src/blogposts/blogposts.controller.spec.ts @@ -0,0 +1,34 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { getRepositoryToken } from '@nestjs/typeorm'; +import { BlogPostsController } from './blogposts.controller'; +import { BlogPostsService } from './blogposts.service'; +import { BlogPost } from './blogpost.entity'; + +const mockBlogPost = new BlogPost(); + +describe('BlogPostsController', () => { + let controller: BlogPostsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [BlogPostsController], + providers: [ + BlogPostsService, + { + provide: getRepositoryToken(BlogPost), + useValue: { + findAll: jest.fn().mockResolvedValue([mockBlogPost]), + findOne: jest.fn().mockResolvedValue(mockBlogPost), + create: jest.fn().mockResolvedValue(1), + }, + }, + ] + }).compile(); + + controller = module.get(BlogPostsController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/backend/src/blogposts/blogposts.controller.ts b/backend/src/blogposts/blogposts.controller.ts new file mode 100644 index 0000000..282915b --- /dev/null +++ b/backend/src/blogposts/blogposts.controller.ts @@ -0,0 +1,25 @@ +import { Body, Controller, Get, Param, Post } from '@nestjs/common'; +import { BlogPostsService } from './blogposts.service'; +import { CreateBlogPostDto } from './dto/create-blog-post.dto'; +import { BlogPost } from './blogpost.entity'; + +@Controller('blogposts') +export class BlogPostsController { + + constructor(private readonly blogPostsService: BlogPostsService) {} + + @Get() + findAll(): Promise { + return this.blogPostsService.findAll(); + } + + @Get(':id') + findOne(@Param('id') id: number): Promise { + return this.blogPostsService.findOne(id); + } + + @Post() + create(@Body() createBlogPostDto: CreateBlogPostDto): Promise { + return this.blogPostsService.create(createBlogPostDto); + } +} diff --git a/backend/src/blogposts/blogposts.module.ts b/backend/src/blogposts/blogposts.module.ts new file mode 100644 index 0000000..2a58e8d --- /dev/null +++ b/backend/src/blogposts/blogposts.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { BlogPost } from './blogpost.entity'; +import { BlogPostsService } from './blogposts.service'; +import { BlogPostsController } from './blogposts.controller'; + +@Module({ + imports: [TypeOrmModule.forFeature([BlogPost])], + controllers: [BlogPostsController], + providers: [BlogPostsService], + exports: [TypeOrmModule] +}) +export class BlogPostsModule {} diff --git a/backend/src/blogposts/blogposts.repositorymock.factory.ts b/backend/src/blogposts/blogposts.repositorymock.factory.ts new file mode 100644 index 0000000..61d28ca --- /dev/null +++ b/backend/src/blogposts/blogposts.repositorymock.factory.ts @@ -0,0 +1,4 @@ +// @ts-ignore +export const repositoryMockFactory: () => MockType> = jest.fn(() => ({ + findOne: jest.fn(entity => entity), +})); diff --git a/backend/src/blogposts/blogposts.service.spec.ts b/backend/src/blogposts/blogposts.service.spec.ts new file mode 100644 index 0000000..37e300c --- /dev/null +++ b/backend/src/blogposts/blogposts.service.spec.ts @@ -0,0 +1,32 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { getRepositoryToken } from '@nestjs/typeorm'; +import { BlogPostsService } from './blogposts.service'; +import { BlogPost } from './blogpost.entity'; + +const mockBlogPost = new BlogPost(); + +describe('BlogPostsService', () => { + let service: BlogPostsService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + BlogPostsService, + { + provide: getRepositoryToken(BlogPost), + useValue: { + findAll: jest.fn().mockResolvedValue([mockBlogPost]), + findOne: jest.fn().mockResolvedValue(mockBlogPost), + create: jest.fn().mockResolvedValue(1), + }, + }, + ], + }).compile(); + + service = module.get(BlogPostsService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/backend/src/blogposts/blogposts.service.ts b/backend/src/blogposts/blogposts.service.ts new file mode 100644 index 0000000..a6cc33f --- /dev/null +++ b/backend/src/blogposts/blogposts.service.ts @@ -0,0 +1,34 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { DataSource, Repository } from 'typeorm'; +import { BlogPost } from './blogpost.entity'; +import { CreateBlogPostDto } from './dto/create-blog-post.dto'; + +@Injectable() +export class BlogPostsService { + constructor( + @InjectRepository(BlogPost) + private blogPostsRepository: Repository + ) {} + + findAll(): Promise { + return this.blogPostsRepository.find(); + } + + findOne(id: number): Promise { + return this.blogPostsRepository.findOneBy({ id }); + } + + async create(createBlogPostDto: CreateBlogPostDto): Promise { + const newBlogPost = this.blogPostsRepository.create({ + title: createBlogPostDto.title, + body: createBlogPostDto.body + }); + const blogPost = await this.blogPostsRepository.save(newBlogPost); + return blogPost.id; + } + + async remove(id: number): Promise { + await this.blogPostsRepository.delete(id); + } +} diff --git a/backend/src/blogposts/dto/create-blog-post.dto.ts b/backend/src/blogposts/dto/create-blog-post.dto.ts new file mode 100644 index 0000000..78d723a --- /dev/null +++ b/backend/src/blogposts/dto/create-blog-post.dto.ts @@ -0,0 +1,4 @@ +export class CreateBlogPostDto { + title: string; + body: string; +} diff --git a/backend/src/mocktype.ts b/backend/src/mocktype.ts new file mode 100644 index 0000000..69895cb --- /dev/null +++ b/backend/src/mocktype.ts @@ -0,0 +1,3 @@ +export type MockType = { + [P in keyof T]?: jest.Mock<{}>; +}; diff --git a/backend/src/posts/dto/create-post.dto.ts b/backend/src/posts/dto/create-post.dto.ts deleted file mode 100644 index a91b9d4..0000000 --- a/backend/src/posts/dto/create-post.dto.ts +++ /dev/null @@ -1,4 +0,0 @@ -export CreatePostDto { - title: string; - body: string; -} diff --git a/backend/src/posts/posts.controller.spec.ts b/backend/src/posts/posts.controller.spec.ts deleted file mode 100644 index 7784335..0000000 --- a/backend/src/posts/posts.controller.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { PostsController } from './posts.controller'; - -describe('PostsController', () => { - let controller: PostsController; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [PostsController], - }).compile(); - - controller = module.get(PostsController); - }); - - it('should be defined', () => { - expect(controller).toBeDefined(); - }); -}); diff --git a/backend/src/posts/posts.controller.ts b/backend/src/posts/posts.controller.ts deleted file mode 100644 index c4de74d..0000000 --- a/backend/src/posts/posts.controller.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Controller, Get } from '@nestjs/common'; -import { PostsService } from './posts.service'; -import { CreatePostDto } from './dto'; - -@Controller('posts') -export class PostsController { - - constructor(private readonly postsService: PostService) {} - - @Get() - findAll(): string { - return this.postsService.findAll(); - } - - @Get(':id') - findOne(@Param('id') id: string): string { - return this.postsService.findOne(id); - } - - @Post() - create(@Body() createPostDto: CreatePostDto): string { - return this.postsService; - } -} diff --git a/backend/src/posts/posts.module.ts b/backend/src/posts/posts.module.ts deleted file mode 100644 index 4920fbb..0000000 --- a/backend/src/posts/posts.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { Post } from './Post.entity'; - -@Module({ - imports: [TypeOrmModule.forFeature([Post])], - exports: [TypeOrmModule] -}) -export class PostsModule {} diff --git a/backend/src/posts/posts.service.spec.ts b/backend/src/posts/posts.service.spec.ts deleted file mode 100644 index e152158..0000000 --- a/backend/src/posts/posts.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { PostsService } from './posts.service'; - -describe('PostsService', () => { - let service: PostsService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [PostsService], - }).compile(); - - service = module.get(PostsService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/backend/src/posts/posts.service.ts b/backend/src/posts/posts.service.ts deleted file mode 100644 index e06239f..0000000 --- a/backend/src/posts/posts.service.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import { Post } from './Post.entity'; - -@Injectable() -export class PostsService { - constructor( - @InjectRepository(Post) - private PostsRepository: Repository, - ) {} - - findAll(): Promise { - return this.PostsRepository.find(); - } - - findOne(id: number): Promise { - return this.PostsRepository.findOneBy({ id }); - } - - async create(title: string, body: string) Promise { - const newPost = this.PostsRepository.create({ - title: title, - body: body - }); - const post = await this.PostsRepository.save(newPost); - return post.id; - } - - async remove(id: number): Promise { - await this.PostsRepository.delete(id); - } -} diff --git a/backend/src/users/users.service.spec.ts b/backend/src/users/users.service.spec.ts index 62815ba..f0140be 100644 --- a/backend/src/users/users.service.spec.ts +++ b/backend/src/users/users.service.spec.ts @@ -1,12 +1,25 @@ import { Test, TestingModule } from '@nestjs/testing'; +import { getRepositoryToken } from '@nestjs/typeorm'; import { UsersService } from './users.service'; +import { User } from './user.entity'; + +const mockUser = new User(); describe('UsersService', () => { let service: UsersService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ - providers: [UsersService], + providers: [ + UsersService , + { + provide: getRepositoryToken(User), + useValue: { + save: jest.fn().mockResolvedValue(mockUser), + find: jest.fn().mockResolvedValue([mockUser]), + }, + }, + ] }).compile(); service = module.get(UsersService);