11import { beforeEach , describe , expect , it } from 'vitest'
2- import { createProject , getAllProjects } from './project-repository'
2+ import {
3+ checkProjectNameExists ,
4+ checkProjectSlugExists ,
5+ createProject ,
6+ getAllProjects
7+ } from './project-repository'
38import { runMigration } from '../db/database-migration-util'
49import { db } from '../db/database'
5- import type { CreateProjectFormSchema , SelectableProject } from './project'
10+ import type { ProjectCreationParams , SelectableProject } from './project'
611import type { Languages } from 'kysely-codegen'
712import type { Selectable } from 'kysely'
813
9- const projectCreationObject : CreateProjectFormSchema = {
14+ const projectCreationObject : ProjectCreationParams = {
1015 name : 'Test Project' ,
11- base_language : 'en'
16+ base_language_code : 'en' ,
17+ slug : 'test-project'
1218}
1319
1420beforeEach ( async ( ) => {
@@ -29,7 +35,7 @@ describe('Project Repository', () => {
2935 expect ( project ) . toMatchObject ( {
3036 id : createdProject . id ,
3137 name : projectCreationObject . name ,
32- base_language : createdProject . base_language
38+ base_language_id : createdProject . base_language_id
3339 } )
3440
3541 expect ( project . id ) . toBeTypeOf ( 'number' )
@@ -44,6 +50,26 @@ describe('Project Repository', () => {
4450 expect ( projects ) . toHaveLength ( 1 )
4551 } )
4652
53+ it ( 'should not allow creation of projects with duplicate slugs' , async ( ) => {
54+ const projectCreationObject1 = {
55+ name : 'Test Project' ,
56+ base_language_code : 'en' ,
57+ slug : 'test-project'
58+ }
59+ const projectCreationObject2 = {
60+ name : 'test-project' ,
61+ base_language_code : 'en' ,
62+ slug : 'test-project'
63+ }
64+
65+ await createProject ( projectCreationObject1 )
66+
67+ await expect ( createProject ( projectCreationObject2 ) ) . rejects . toThrow ( )
68+
69+ const projects = await db . selectFrom ( 'projects' ) . selectAll ( ) . execute ( )
70+ expect ( projects ) . toHaveLength ( 1 )
71+ } )
72+
4773 it ( 'should create a base language for the project' , async ( ) => {
4874 const createdProject = await createProject ( projectCreationObject )
4975
@@ -53,26 +79,26 @@ describe('Project Repository', () => {
5379 const language = languages [ 0 ] as Selectable < Languages >
5480
5581 expect ( language . project_id ) . toBe ( createdProject . id )
56- expect ( language . code ) . toBe ( projectCreationObject . base_language )
82+ expect ( language . code ) . toBe ( projectCreationObject . base_language_code )
5783 } )
5884
5985 it ( 'should link the base language to the project' , async ( ) => {
6086 const createdProject = await createProject ( projectCreationObject )
6187
62- expect ( createdProject . base_language ) . not . toBe ( 0 )
88+ expect ( createdProject . base_language_id ) . not . toBe ( 0 )
6389
6490 const language = await db
6591 . selectFrom ( 'languages' )
66- . where ( 'id' , '==' , createdProject . base_language )
92+ . where ( 'id' , '==' , createdProject . base_language_id )
6793 . selectAll ( )
6894 . executeTakeFirstOrThrow ( )
6995
7096 expect ( language . project_id ) . toBe ( createdProject . id )
7197 } )
7298
7399 it ( 'should allow creation of multiple projects with the same base language code' , async ( ) => {
74- const project1 = { name : 'Project 1' , base_language : 'en' }
75- const project2 = { name : 'Project 2' , base_language : 'en' }
100+ const project1 = { name : 'Project 1' , base_language_code : 'en' , slug : 'project-1 ' }
101+ const project2 = { name : 'Project 2' , base_language_code : 'en' , slug : 'project-2 ' }
76102
77103 await createProject ( project1 )
78104 await createProject ( project2 )
@@ -95,8 +121,8 @@ describe('Project Repository', () => {
95121 } )
96122
97123 it ( 'should return all created projects' , async ( ) => {
98- const project1 = { name : 'Project 1' , base_language : 'en' }
99- const project2 = { name : 'Project 2' , base_language : 'fr' }
124+ const project1 = { name : 'Project 1' , base_language_code : 'en' , slug : 'project-1 ' }
125+ const project2 = { name : 'Project 2' , base_language_code : 'fr' , slug : 'project-2 ' }
100126
101127 await createProject ( project1 )
102128 await createProject ( project2 )
@@ -120,10 +146,42 @@ describe('Project Repository', () => {
120146 expect ( project ) . toMatchObject ( {
121147 id : createdProject . id ,
122148 name : projectCreationObject . name ,
123- base_language : createdProject . base_language
149+ base_language_id : createdProject . base_language_id
124150 } )
125151
126152 expect ( project . id ) . toBeTypeOf ( 'number' )
127153 } )
128154 } )
155+
156+ describe ( 'checkProjectNameExists' , ( ) => {
157+ it ( 'should return true if a project with the given name exists' , async ( ) => {
158+ await createProject ( projectCreationObject )
159+
160+ const nameExists = await checkProjectNameExists ( projectCreationObject . name )
161+ expect ( nameExists ) . toBe ( true )
162+ } )
163+
164+ it ( 'should return false if no project with the given name exists' , async ( ) => {
165+ await createProject ( projectCreationObject )
166+
167+ const nameExists = await checkProjectNameExists ( 'Nonexistent Project' )
168+ expect ( nameExists ) . toBe ( false )
169+ } )
170+ } )
171+
172+ describe ( 'checkProjectSlugExists' , ( ) => {
173+ it ( 'should return true if a project with the given slug exists' , async ( ) => {
174+ await createProject ( projectCreationObject )
175+
176+ const slugExists = await checkProjectSlugExists ( projectCreationObject . slug )
177+ expect ( slugExists ) . toBe ( true )
178+ } )
179+
180+ it ( 'should return false if no project with the given slug exists' , async ( ) => {
181+ await createProject ( projectCreationObject )
182+
183+ const slugExists = await checkProjectSlugExists ( 'nonexistent-slug' )
184+ expect ( slugExists ) . toBe ( false )
185+ } )
186+ } )
129187} )
0 commit comments