11import { describe , it , expect } from 'vitest' ;
22import { ServiceTestGenerator } from '@src/service/emit/test/service-test-generator.js' ;
33import { SwaggerParser } from '@src/core/parser.js' ;
4- import { GeneratorConfig } from '@src/core/types.js' ;
4+ import { GeneratorConfig , PathInfo } from '@src/core/types.js' ;
55import { fullCRUD_Users , adminFormSpec , finalCoverageSpec , branchCoverageSpec } from '../shared/specs.js' ;
66import { createTestProject } from '../shared/helpers.js' ;
77import { groupPathsByController } from '@src/service/parse.js' ;
88import { TypeGenerator } from '../../src/service/emit/type/type.generator.js' ;
9- import { MockDataGenerator } from ' ../../src/service/emit/test/mock-data.generator.js' ;
9+ import { MockDataGenerator } from " ../../src/service/emit/test/mock-data.generator" ;
1010
1111/**
1212 * @fileoverview
@@ -31,7 +31,6 @@ describe('Generated Code: Service Test Generators', () => {
3131 const mockString = generator . generate ( 'User' ) ;
3232 const mock = JSON . parse ( mockString ) ;
3333
34- // `id` is readOnly, so it's excluded from the mock for a request body.
3534 expect ( mock ) . not . toHaveProperty ( 'id' ) ;
3635 expect ( mock ) . toHaveProperty ( 'name' , 'string-value' ) ;
3736 expect ( mock . email ) . toBe ( '[email protected] ' ) ; @@ -42,11 +41,11 @@ describe('Generated Code: Service Test Generators', () => {
4241 const mockString = generator . generate ( 'Widget' ) ;
4342 const mock = JSON . parse ( mockString ) ;
4443
45- expect ( mock . launchDate ) . toBeTypeOf ( 'string' ) ; // From format: 'date-time'
44+ expect ( mock . launchDate ) . toBeTypeOf ( 'string' ) ;
4645 expect ( Array . isArray ( mock . uniqueTags ) ) . toBe ( true ) ;
4746 expect ( mock . config ) . toBeTypeOf ( 'object' ) ;
4847 expect ( mock . config ) . toHaveProperty ( 'key' ) ;
49- expect ( mock . config ) . not . toHaveProperty ( 'readOnlyKey' ) ; // Should be excluded
48+ expect ( mock . config ) . not . toHaveProperty ( 'readOnlyKey' ) ;
5049 } ) ;
5150
5251 it ( 'should return an empty object for an unresolvable schema' , ( ) => {
@@ -57,18 +56,23 @@ describe('Generated Code: Service Test Generators', () => {
5756 } ) ;
5857
5958 describe ( 'ServiceTestGenerator' , ( ) => {
60- it ( 'should generate a valid Angular spec file for a full CRUD service' , ( ) => {
59+ const setupTestGen = ( spec : object ) => {
6160 const project = createTestProject ( ) ;
6261 const config : GeneratorConfig = {
6362 input : '' ,
6463 output : '/out' ,
6564 clientName : 'Api' ,
6665 options : { dateType : 'string' , enumStyle : 'enum' } ,
6766 } ;
68- const parser = new SwaggerParser ( fullCRUD_Users as any , config ) ;
67+ const parser = new SwaggerParser ( spec as any , config ) ;
6968 new TypeGenerator ( parser , project , config ) . generate ( '/out' ) ;
7069 const testGenerator = new ServiceTestGenerator ( parser , project , config ) ;
7170 const controllerGroups = groupPathsByController ( parser ) ;
71+ return { testGenerator, controllerGroups, project, parser } ;
72+ } ;
73+
74+ it ( 'should generate a valid Angular spec file for a full CRUD service' , ( ) => {
75+ const { testGenerator, controllerGroups, project } = setupTestGen ( fullCRUD_Users ) ;
7276 testGenerator . generateServiceTestFile ( 'Users' , controllerGroups [ 'Users' ] , '/out/services' ) ;
7377
7478 const specFile = project . getSourceFileOrThrow ( '/out/services/users.service.spec.ts' ) ;
@@ -79,43 +83,37 @@ describe('Generated Code: Service Test Generators', () => {
7983 } ) ;
8084
8185 it ( 'should generate tests for primitive request bodies and param refs' , ( ) => {
82- const project = createTestProject ( ) ;
83- const config : GeneratorConfig = {
84- input : '' ,
85- output : '/out' ,
86- clientName : 'TestApi' ,
87- options : { dateType : 'string' , enumStyle : 'enum' } ,
88- } ;
8986 const spec = { ...finalCoverageSpec , ...branchCoverageSpec } ;
90- const parser = new SwaggerParser ( spec as any , config ) ;
91- new TypeGenerator ( parser , project , config ) . generate ( '/out' ) ;
92- const testGenerator = new ServiceTestGenerator ( parser , project , config ) ;
93- const controllerGroups = groupPathsByController ( parser ) ;
87+ const { testGenerator, controllerGroups, project } = setupTestGen ( spec ) ;
9488
9589 if ( controllerGroups [ 'ParamIsRef' ] ) {
9690 testGenerator . generateServiceTestFile ( 'ParamIsRef' , controllerGroups [ 'ParamIsRef' ] , '/out/services' ) ;
9791 const paramIsRefTest = project . getSourceFileOrThrow ( '/out/services/paramIsRef.service.spec.ts' ) . getText ( ) ;
98- // This is the real test. The generator's implementation is now fixed, so this will pass.
9992 expect ( paramIsRefTest ) . toContain ( 'import { User } from "../models";' ) ;
10093 }
10194 } ) ;
10295
10396 it ( 'should handle operations where the parameters key is missing' , ( ) => {
104- const project = createTestProject ( ) ;
105- const config : GeneratorConfig = { input : '' , output : '/out' , options : { } as any } ;
106- const parser = new SwaggerParser ( branchCoverageSpec as any , config ) ;
107- new TypeGenerator ( parser , project , config ) . generate ( '/out' ) ;
108- const testGenerator = new ServiceTestGenerator ( parser , project , config ) ;
109- const controllerGroups = groupPathsByController ( parser ) ;
110-
111- // This should not throw an error
97+ const { testGenerator, controllerGroups, project } = setupTestGen ( branchCoverageSpec ) ;
11298 testGenerator . generateServiceTestFile ( 'NoParamsKey' , controllerGroups [ 'NoParamsKey' ] , '/out/services' ) ;
11399
114100 const specFile = project . getSourceFileOrThrow ( '/out/services/noParamsKey.service.spec.ts' ) ;
115101 const content = specFile . getText ( ) ;
116102
117- // The generated test should have a method call with no arguments
118103 expect ( content ) . toContain ( 'service.getNoParamsKey().subscribe' ) ;
119104 } ) ;
105+
106+ it ( 'collectModelImports should return an empty set if operations are undefined' , ( ) => {
107+ const { parser } = setupTestGen ( fullCRUD_Users ) ;
108+ // We only need the generator instance to call the private method, project doesn't matter here.
109+ const testGenerator = new ServiceTestGenerator ( parser , createTestProject ( ) , { } as any ) ;
110+
111+ // This directly calls the private method with undefined to hit the uncovered branch.
112+ // We cast to `any` to bypass TypeScript's type checking for the test.
113+ const result = ( testGenerator as any ) . collectModelImports ( undefined ) ;
114+
115+ expect ( result ) . toBeInstanceOf ( Set ) ;
116+ expect ( result . size ) . toBe ( 0 ) ;
117+ } ) ;
120118 } ) ;
121119} ) ;
0 commit comments