@@ -12,6 +12,8 @@ import { VehicleDto } from './dto/vehicle.dto';
12
12
import { VehicleBrand } from '../vehicle-brands/entities/vehicle-brand.entity' ;
13
13
import { AddressesService } from '../addresses/addresses.service' ;
14
14
import { Address } from '../addresses/entities/address.entity' ;
15
+ import { AddressDto } from '../addresses/dto/address.dto' ;
16
+ import { UpdateAddressDto } from '../addresses/dto/update-address.dto' ;
15
17
16
18
describe ( 'VehiclesService' , ( ) => {
17
19
let service : VehiclesService ;
@@ -193,10 +195,11 @@ describe('VehiclesService', () => {
193
195
} ,
194
196
} ;
195
197
const vehicleBrand = { id : 1 , name : 'Toyota' } as VehicleBrandDto ;
196
- it ( 'should update a vehicle' , async ( ) => {
198
+ it ( 'should update a vehicle and update the address ' , async ( ) => {
197
199
const id = 1 ;
198
200
const updateVehicleDto : UpdateVehicleDto = {
199
201
registrationNumber : 'XYZ789' ,
202
+ brand : 'Toyota' ,
200
203
clientAddress : {
201
204
id : 1 ,
202
205
createdAt : new Date ( '2021-09-01T00:00:00.000Z' ) ,
@@ -208,19 +211,24 @@ describe('VehiclesService', () => {
208
211
street : 'ul. Cieszyńska 12' ,
209
212
} ,
210
213
} ;
214
+
215
+ const { id : addressId , ...addressData } =
216
+ updateVehicleDto . clientAddress as UpdateAddressDto ;
217
+ const vehicleClientAddress = new Address ( ) ;
218
+ vehicleClientAddress . id = 1 ;
211
219
const vehicle = new Vehicle ( ) ;
212
220
vehicle . id = id ;
213
221
vehicle . registrationNumber = 'ABC123' ;
214
222
vehicle . vehicleIdentificationNumber = 'ASDFGH1234567890' ;
215
- vehicle . clientAddress = new Address ( ) ;
216
- vehicle . clientAddress . id = 1 ;
223
+ vehicle . clientAddress = vehicleClientAddress ;
217
224
218
225
const vehicleBrand = new VehicleBrand ( ) ;
219
226
vehicleBrand . name = 'Toyota' ;
220
227
221
228
jest
222
229
. spyOn ( service , 'findOne' )
223
- . mockResolvedValue ( vehicle as unknown as VehicleDto ) ;
230
+ . mockResolvedValueOnce ( vehicle as unknown as VehicleDto )
231
+ . mockResolvedValueOnce ( mockVehicleDto ) ;
224
232
jest
225
233
. spyOn ( vehicleBrandsService , 'findByName' )
226
234
. mockResolvedValue ( vehicleBrand ) ;
@@ -234,6 +242,63 @@ describe('VehiclesService', () => {
234
242
. spyOn ( addressesService , 'create' )
235
243
. mockResolvedValue ( vehicle . clientAddress ) ;
236
244
jest . spyOn ( addressesService , 'remove' ) . mockResolvedValue ( undefined ) ;
245
+ jest . spyOn ( vehiclesRepository , 'find' ) . mockResolvedValue ( [ ] ) ;
246
+ jest . spyOn ( vehiclesRepository , 'save' ) . mockResolvedValue ( vehicle ) ;
247
+
248
+ const result = await service . update ( id , updateVehicleDto ) ;
249
+ expect ( result ) . toEqual ( mockVehicleDto ) ;
250
+ expect ( vehicleBrandsService . findByName ) . toHaveBeenCalledWith (
251
+ updateVehicleDto . brand
252
+ ) ;
253
+ expect ( service . findOne ) . toHaveBeenCalledWith ( id ) ;
254
+ expect ( addressesService . findOne ) . toHaveBeenCalledWith (
255
+ ( updateVehicleDto . clientAddress as UpdateAddressDto ) . id
256
+ ) ;
257
+ expect ( addressesService . update ) . toHaveBeenCalledWith (
258
+ ( updateVehicleDto . clientAddress as UpdateAddressDto ) . id ,
259
+ addressData
260
+ ) ;
261
+ expect ( addressesService . create ) . not . toHaveBeenCalled ( ) ;
262
+ expect ( addressesService . remove ) . not . toHaveBeenCalled ( ) ;
263
+ } ) ;
264
+
265
+ it ( 'should update a vehicle and create the address' , async ( ) => {
266
+ const id = 1 ;
267
+ const updateVehicleDto : UpdateVehicleDto = {
268
+ registrationNumber : 'XYZ789' ,
269
+ clientAddress : {
270
+ city : 'Bielsko-Biała' ,
271
+ administrativeArea : 'Śląskie' ,
272
+ postalCode : '43-300' ,
273
+ country : 'Poland' ,
274
+ street : 'ul. Cieszyńska 12' ,
275
+ } ,
276
+ } ;
277
+ const vehicle = new Vehicle ( ) ;
278
+ vehicle . id = id ;
279
+ vehicle . registrationNumber = 'ABC123' ;
280
+ vehicle . vehicleIdentificationNumber = 'ASDFGH1234567890' ;
281
+
282
+ const clientAddress = new Address ( ) ;
283
+ clientAddress . id = 1 ;
284
+
285
+ const vehicleBrand = new VehicleBrand ( ) ;
286
+ vehicleBrand . name = 'Toyota' ;
287
+
288
+ jest
289
+ . spyOn ( service , 'findOne' )
290
+ . mockResolvedValue ( vehicle as unknown as VehicleDto ) ;
291
+ jest
292
+ . spyOn ( vehicleBrandsService , 'findByName' )
293
+ . mockResolvedValue ( vehicleBrand ) ;
294
+ jest . spyOn ( addressesService , 'findOne' ) . mockResolvedValue ( undefined ) ;
295
+ jest
296
+ . spyOn ( addressesService , 'update' )
297
+ . mockResolvedValue ( vehicle . clientAddress ) ;
298
+ jest
299
+ . spyOn ( addressesService , 'create' )
300
+ . mockResolvedValue ( clientAddress ) ;
301
+ jest . spyOn ( addressesService , 'remove' ) . mockResolvedValue ( undefined ) ;
237
302
jest
238
303
. spyOn ( vehicleBrandsService , 'findByName' )
239
304
. mockResolvedValue ( vehicleBrand ) ;
@@ -243,6 +308,65 @@ describe('VehiclesService', () => {
243
308
244
309
const result = await service . update ( id , updateVehicleDto ) ;
245
310
expect ( result ) . toEqual ( mockVehicleDto ) ;
311
+ expect ( vehicleBrandsService . findByName ) . not . toHaveBeenCalledWith ( ) ;
312
+ expect ( service . findOne ) . toHaveBeenCalledWith ( id ) ;
313
+ expect ( addressesService . findOne ) . not . toHaveBeenCalled ( ) ;
314
+ expect ( addressesService . update ) . not . toHaveBeenCalled ( ) ;
315
+ expect ( addressesService . create ) . toHaveBeenCalledWith (
316
+ updateVehicleDto . clientAddress
317
+ ) ;
318
+ expect ( addressesService . remove ) . not . toHaveBeenCalled ( ) ;
319
+ } ) ;
320
+
321
+ it ( 'should update a vehicle and remove the address' , async ( ) => {
322
+ const id = 1 ;
323
+ const updateVehicleDto : UpdateVehicleDto = {
324
+ registrationNumber : 'XYZ789' ,
325
+ } ;
326
+ const vehicleClientAddress = new Address ( ) ;
327
+ vehicleClientAddress . id = 1 ;
328
+ const vehicle = new Vehicle ( ) ;
329
+ vehicle . id = id ;
330
+ vehicle . registrationNumber = 'ABC123' ;
331
+ vehicle . vehicleIdentificationNumber = 'ASDFGH1234567890' ;
332
+ vehicle . clientAddress = vehicleClientAddress ;
333
+
334
+ const vehicleBrand = new VehicleBrand ( ) ;
335
+ vehicleBrand . name = 'Toyota' ;
336
+
337
+ jest
338
+ . spyOn ( service , 'findOne' )
339
+ . mockResolvedValue ( vehicle as unknown as VehicleDto ) ;
340
+ jest
341
+ . spyOn ( vehicleBrandsService , 'findByName' )
342
+ . mockResolvedValue ( vehicleBrand ) ;
343
+ jest
344
+ . spyOn ( addressesService , 'findOne' )
345
+ . mockResolvedValue ( vehicle . clientAddress ) ;
346
+ jest
347
+ . spyOn ( addressesService , 'update' )
348
+ . mockResolvedValue ( vehicle . clientAddress ) ;
349
+ jest
350
+ . spyOn ( addressesService , 'create' )
351
+ . mockResolvedValue ( vehicle . clientAddress ) ;
352
+ jest . spyOn ( addressesService , 'remove' ) . mockResolvedValue ( undefined ) ;
353
+ jest
354
+ . spyOn ( vehicleBrandsService , 'findByName' )
355
+ . mockResolvedValue ( vehicleBrand ) ;
356
+ jest . spyOn ( service , 'findOne' ) . mockResolvedValue ( mockVehicleDto ) ;
357
+ jest . spyOn ( vehiclesRepository , 'find' ) . mockResolvedValue ( [ vehicle ] ) ;
358
+ jest . spyOn ( vehiclesRepository , 'save' ) . mockResolvedValue ( vehicle ) ;
359
+
360
+ const result = await service . update ( id , updateVehicleDto ) ;
361
+ expect ( result ) . toEqual ( mockVehicleDto ) ;
362
+ expect ( vehicleBrandsService . findByName ) . not . toHaveBeenCalledWith ( ) ;
363
+ expect ( service . findOne ) . toHaveBeenCalledWith ( id ) ;
364
+ expect ( addressesService . findOne ) . not . toHaveBeenCalled ( ) ;
365
+ expect ( addressesService . update ) . not . toHaveBeenCalled ( ) ;
366
+ expect ( addressesService . create ) . not . toHaveBeenCalled ( ) ;
367
+ expect ( addressesService . remove ) . toHaveBeenCalledWith (
368
+ vehicle . clientAddress . id
369
+ ) ;
246
370
} ) ;
247
371
248
372
it ( 'should throw an error if vehicle not found' , async ( ) => {
@@ -297,10 +421,15 @@ describe('VehiclesService', () => {
297
421
it ( 'should remove a vehicle' , async ( ) => {
298
422
const id = 1 ;
299
423
const vehicle = new VehicleDto ( ) ;
424
+ vehicle . clientAddress = { id : 1 } as AddressDto ;
300
425
jest . spyOn ( service , 'findOne' ) . mockResolvedValue ( vehicle ) ;
301
426
jest . spyOn ( vehiclesRepository , 'delete' ) . mockResolvedValue ( undefined ) ;
427
+ jest . spyOn ( addressesService , 'remove' ) . mockResolvedValue ( ) ;
302
428
303
429
await service . remove ( id ) ;
430
+ expect ( addressesService . remove ) . toHaveBeenCalledWith (
431
+ vehicle . clientAddress . id
432
+ ) ;
304
433
expect ( vehiclesRepository . delete ) . toHaveBeenCalledWith ( id ) ;
305
434
} ) ;
306
435
0 commit comments