1
1
import { Test , TestingModule } from '@nestjs/testing' ;
2
2
import { VehicleBrandsService } from './vehicle-brands.service' ;
3
3
import { getRepositoryToken } from '@nestjs/typeorm' ;
4
- import { Repository } from 'typeorm' ;
4
+ import { Repository , SelectQueryBuilder } from 'typeorm' ;
5
5
import { HttpException , HttpStatus } from '@nestjs/common' ;
6
6
import { VehicleBrand } from './entities/vehicle-brand.entity' ;
7
+ import { Order } from '../common/constants' ;
7
8
8
9
describe ( 'VehicleBrandsService' , ( ) => {
9
10
let service : VehicleBrandsService ;
@@ -26,6 +27,116 @@ describe('VehicleBrandsService', () => {
26
27
) ;
27
28
} ) ;
28
29
30
+ describe ( 'create' , ( ) => {
31
+ it ( 'should create a vehicle brand if it does not exist' , async ( ) => {
32
+ const createVehicleBrandDto = { name : 'Toyota' } ;
33
+ const vehicleBrand = { id : 1 , name : 'Toyota' } as VehicleBrand ;
34
+ jest . spyOn ( repository , 'find' ) . mockResolvedValue ( [ ] ) ;
35
+ jest . spyOn ( repository , 'save' ) . mockResolvedValue ( vehicleBrand ) ;
36
+
37
+ expect ( await service . create ( createVehicleBrandDto ) ) . toEqual ( vehicleBrand ) ;
38
+ expect ( repository . find ) . toHaveBeenCalledWith ( {
39
+ where : { name : 'Toyota' } ,
40
+ } ) ;
41
+ expect ( repository . save ) . toHaveBeenCalledWith ( createVehicleBrandDto ) ;
42
+ } ) ;
43
+
44
+ it ( 'should throw an exception if vehicle brand already exists' , async ( ) => {
45
+ const createVehicleBrandDto = { name : 'Toyota' } ;
46
+ jest
47
+ . spyOn ( repository , 'find' )
48
+ . mockResolvedValue ( [ { id : 1 , name : 'Toyota' } as VehicleBrand ] ) ;
49
+
50
+ await expect ( service . create ( createVehicleBrandDto ) ) . rejects . toThrow (
51
+ new HttpException (
52
+ {
53
+ status : HttpStatus . CONFLICT ,
54
+ error : 'Vehicle brand already exists' ,
55
+ } ,
56
+ HttpStatus . CONFLICT
57
+ )
58
+ ) ;
59
+ expect ( repository . find ) . toHaveBeenCalledWith ( {
60
+ where : { name : 'Toyota' } ,
61
+ } ) ;
62
+ } ) ;
63
+ } ) ;
64
+
65
+ describe ( 'findVehicleBrands' , ( ) => {
66
+ it ( 'should return a list of vehicle brands' , async ( ) => {
67
+ const pageOptionsDto = {
68
+ order : Order . ASC ,
69
+ take : 10 ,
70
+ skip : 0 ,
71
+ sortField : 'name' ,
72
+ } ;
73
+ const vehicleBrands = [
74
+ { id : 2 , name : 'Mercedes' } as VehicleBrand ,
75
+ { id : 1 , name : 'Toyota' } as VehicleBrand ,
76
+ ] ;
77
+ jest . spyOn ( repository , 'createQueryBuilder' ) . mockReturnValue ( {
78
+ orderBy : jest . fn ( ) . mockReturnThis ( ) ,
79
+ skip : jest . fn ( ) . mockReturnThis ( ) ,
80
+ take : jest . fn ( ) . mockReturnThis ( ) ,
81
+ getCount : jest . fn ( ) . mockResolvedValue ( 2 ) ,
82
+ getRawAndEntities : jest
83
+ . fn ( )
84
+ . mockResolvedValue ( { entities : vehicleBrands } ) ,
85
+ } as unknown as SelectQueryBuilder < VehicleBrand > ) ;
86
+
87
+ const result = await service . findVehicleBrands ( pageOptionsDto ) ;
88
+ expect ( result . data [ 0 ] ) . toEqual ( vehicleBrands [ 0 ] ) ;
89
+ expect ( result . data [ 1 ] ) . toEqual ( vehicleBrands [ 1 ] ) ;
90
+ expect ( result . meta . itemCount ) . toEqual ( 2 ) ;
91
+ } ) ;
92
+
93
+ it ( 'should return a list of vehicle brands sorted by id if sortField is not provided' , async ( ) => {
94
+ const pageOptionsDto = {
95
+ order : Order . ASC ,
96
+ take : 10 ,
97
+ skip : 0 ,
98
+ } ;
99
+ const vehicleBrands = [
100
+ { id : 1 , name : 'Toyota' } as VehicleBrand ,
101
+ { id : 2 , name : 'Mercedes' } as VehicleBrand ,
102
+ ] ;
103
+ jest . spyOn ( repository , 'createQueryBuilder' ) . mockReturnValue ( {
104
+ orderBy : jest . fn ( ) . mockReturnThis ( ) ,
105
+ skip : jest . fn ( ) . mockReturnThis ( ) ,
106
+ take : jest . fn ( ) . mockReturnThis ( ) ,
107
+ getCount : jest . fn ( ) . mockResolvedValue ( 2 ) ,
108
+ getRawAndEntities : jest
109
+ . fn ( )
110
+ . mockResolvedValue ( { entities : vehicleBrands } ) ,
111
+ } as unknown as SelectQueryBuilder < VehicleBrand > ) ;
112
+
113
+ const result = await service . findVehicleBrands ( pageOptionsDto ) ;
114
+ expect ( result . data [ 0 ] ) . toEqual ( vehicleBrands [ 0 ] ) ;
115
+ expect ( result . data [ 1 ] ) . toEqual ( vehicleBrands [ 1 ] ) ;
116
+ expect ( result . meta . itemCount ) . toEqual ( 2 ) ;
117
+ } ) ;
118
+
119
+ it ( 'should return an empty list if no vehicle brands found' , async ( ) => {
120
+ const pageOptionsDto = {
121
+ order : Order . ASC ,
122
+ take : 10 ,
123
+ skip : 0 ,
124
+ sortField : 'name' ,
125
+ } ;
126
+ jest . spyOn ( repository , 'createQueryBuilder' ) . mockReturnValue ( {
127
+ orderBy : jest . fn ( ) . mockReturnThis ( ) ,
128
+ skip : jest . fn ( ) . mockReturnThis ( ) ,
129
+ take : jest . fn ( ) . mockReturnThis ( ) ,
130
+ getCount : jest . fn ( ) . mockResolvedValue ( 0 ) ,
131
+ getRawAndEntities : jest . fn ( ) . mockResolvedValue ( { entities : [ ] } ) ,
132
+ } as unknown as SelectQueryBuilder < VehicleBrand > ) ;
133
+
134
+ const result = await service . findVehicleBrands ( pageOptionsDto ) ;
135
+ expect ( result . data ) . toEqual ( [ ] ) ;
136
+ expect ( result . meta . itemCount ) . toEqual ( 0 ) ;
137
+ } ) ;
138
+ } ) ;
139
+
29
140
describe ( 'findByField' , ( ) => {
30
141
it ( 'should return a vehicle brand if found' , async ( ) => {
31
142
const vehicleBrand = { id : 1 , name : 'Toyota' } as VehicleBrand ;
@@ -49,6 +160,7 @@ describe('VehicleBrandsService', () => {
49
160
describe ( 'findOne' , ( ) => {
50
161
it ( 'should call findByField with id' , async ( ) => {
51
162
const vehicleBrand = { id : 1 , name : 'Toyota' } ;
163
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
52
164
jest . spyOn ( service as any , 'findByField' ) . mockResolvedValue ( vehicleBrand ) ;
53
165
54
166
expect ( await service . findOne ( 1 ) ) . toEqual ( vehicleBrand ) ;
@@ -59,6 +171,7 @@ describe('VehicleBrandsService', () => {
59
171
describe ( 'findByName' , ( ) => {
60
172
it ( 'should call findByField with name' , async ( ) => {
61
173
const vehicleBrand = { id : 1 , name : 'Toyota' } ;
174
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
175
jest . spyOn ( service as any , 'findByField' ) . mockResolvedValue ( vehicleBrand ) ;
63
176
64
177
expect ( await service . findByName ( 'Toyota' ) ) . toEqual ( vehicleBrand ) ;
@@ -71,14 +184,7 @@ describe('VehicleBrandsService', () => {
71
184
const vehicleBrand = { id : 1 , name : 'Toyota' } as VehicleBrand ;
72
185
const updateVehicleBrandDto = { name : 'Mercedes' } ;
73
186
const updatedVehicleBrand = { id : 1 , name : 'Mercedes' } as VehicleBrand ;
74
- jest
75
- . spyOn ( service , 'findByName' )
76
- . mockRejectedValue (
77
- new HttpException (
78
- { status : HttpStatus . NOT_FOUND , error : 'Vehicle brand not found' } ,
79
- HttpStatus . NOT_FOUND
80
- )
81
- ) ;
187
+ jest . spyOn ( repository , 'find' ) . mockResolvedValue ( [ ] ) ;
82
188
jest
83
189
. spyOn ( service , 'findOne' )
84
190
. mockResolvedValueOnce ( vehicleBrand )
@@ -88,7 +194,9 @@ describe('VehicleBrandsService', () => {
88
194
expect ( await service . update ( 1 , updateVehicleBrandDto ) ) . toEqual (
89
195
updatedVehicleBrand
90
196
) ;
91
- expect ( service . findByName ) . toHaveBeenCalledWith ( updatedVehicleBrand . name ) ;
197
+ expect ( repository . find ) . toHaveBeenCalledWith ( {
198
+ where : { name : updatedVehicleBrand . name } ,
199
+ } ) ;
92
200
expect ( service . findOne ) . toHaveBeenCalledWith ( vehicleBrand . id ) ;
93
201
expect ( repository . save ) . toHaveBeenCalledWith ( {
94
202
...vehicleBrand ,
@@ -98,14 +206,7 @@ describe('VehicleBrandsService', () => {
98
206
99
207
it ( 'should throw an exception if vehicle brand not found' , async ( ) => {
100
208
const updateVehicleBrandDto = { name : 'Toyota' } ;
101
- jest
102
- . spyOn ( service , 'findByName' )
103
- . mockRejectedValue (
104
- new HttpException (
105
- { status : HttpStatus . NOT_FOUND , error : 'Vehicle brand not found' } ,
106
- HttpStatus . NOT_FOUND
107
- )
108
- ) ;
209
+ jest . spyOn ( repository , 'find' ) . mockResolvedValue ( [ ] ) ;
109
210
110
211
jest
111
212
. spyOn ( service , 'findOne' )
@@ -122,17 +223,17 @@ describe('VehicleBrandsService', () => {
122
223
HttpStatus . NOT_FOUND
123
224
)
124
225
) ;
125
- expect ( service . findByName ) . toHaveBeenCalledWith (
126
- updateVehicleBrandDto . name
127
- ) ;
226
+ expect ( repository . find ) . toHaveBeenCalledWith ( {
227
+ where : { name : updateVehicleBrandDto . name } ,
228
+ } ) ;
128
229
expect ( service . findOne ) . toHaveBeenCalledWith ( 1 ) ;
129
230
} ) ;
130
231
131
232
it ( 'should throw an exception if vehicle brand to be updated already exists' , async ( ) => {
132
233
const updateVehicleBrandDto = { name : 'Toyota' } ;
133
234
jest
134
- . spyOn ( service , 'findByName ' )
135
- . mockResolvedValue ( { id : 2 , name : 'Toyota' } as VehicleBrand ) ;
235
+ . spyOn ( repository , 'find ' )
236
+ . mockResolvedValue ( [ { id : 2 , name : 'Toyota' } as VehicleBrand ] ) ;
136
237
137
238
jest
138
239
. spyOn ( service , 'findOne' )
@@ -147,10 +248,45 @@ describe('VehicleBrandsService', () => {
147
248
HttpStatus . CONFLICT
148
249
)
149
250
) ;
150
- expect ( service . findByName ) . toHaveBeenCalledWith (
151
- updateVehicleBrandDto . name
152
- ) ;
251
+ expect ( repository . find ) . toHaveBeenCalledWith ( {
252
+ where : { name : updateVehicleBrandDto . name } ,
253
+ } ) ;
153
254
expect ( service . findOne ) . not . toHaveBeenCalledWith ( 1 ) ;
154
255
} ) ;
155
256
} ) ;
257
+
258
+ describe ( 'remove' , ( ) => {
259
+ it ( 'should remove a vehicle brand if it exists' , async ( ) => {
260
+ const vehicleBrand = { id : 1 , name : 'Toyota' } as VehicleBrand ;
261
+ jest . spyOn ( service , 'findOne' ) . mockResolvedValue ( vehicleBrand ) ;
262
+ jest
263
+ . spyOn ( repository , 'delete' )
264
+ . mockResolvedValue ( undefined ) ;
265
+
266
+ expect ( await service . remove ( 1 ) ) . toEqual ( undefined ) ;
267
+ expect ( service . findOne ) . toHaveBeenCalledWith ( 1 ) ;
268
+ expect ( repository . delete ) . toHaveBeenCalledWith ( 1 ) ;
269
+ } ) ;
270
+
271
+ it ( 'should throw an exception if vehicle brand not found' , async ( ) => {
272
+ jest
273
+ . spyOn ( service , 'findOne' )
274
+ . mockRejectedValue (
275
+ new HttpException (
276
+ { status : HttpStatus . NOT_FOUND , error : 'Vehicle brand not found' } ,
277
+ HttpStatus . NOT_FOUND
278
+ )
279
+ ) ;
280
+ jest . spyOn ( repository , 'delete' ) ;
281
+
282
+ await expect ( service . remove ( 1 ) ) . rejects . toThrow (
283
+ new HttpException (
284
+ { status : HttpStatus . NOT_FOUND , error : 'Vehicle brand not found' } ,
285
+ HttpStatus . NOT_FOUND
286
+ )
287
+ ) ;
288
+ expect ( service . findOne ) . toHaveBeenCalledWith ( 1 ) ;
289
+ expect ( repository . delete ) . not . toHaveBeenCalled ( ) ;
290
+ } ) ;
291
+ } ) ;
156
292
} ) ;
0 commit comments