|
1 | 1 | /* eslint-disable unicorn/no-null */ |
2 | 2 | import type { ContextSpec, OpenApiSchemaObjectType } from '@orval/core'; |
| 3 | +import { EnumGeneration } from '@orval/core'; |
3 | 4 | import { describe, expect, it } from 'vitest'; |
4 | 5 |
|
5 | 6 | import { createTestContextSpec } from '../../../../core/src/test-utils/context'; |
@@ -1166,3 +1167,66 @@ describe('getMockScalar (schema-scoped overrides)', () => { |
1166 | 1167 | expect(result.value).toBe("'red'"); |
1167 | 1168 | }); |
1168 | 1169 | }); |
| 1170 | + |
| 1171 | +describe('getMockScalar (referenced string enum by enumGenerationType #3690)', () => { |
| 1172 | + const baseArg = { |
| 1173 | + imports: [], |
| 1174 | + operationId: 'test-operation', |
| 1175 | + tags: [], |
| 1176 | + existingReferencedProperties: [], |
| 1177 | + splitMockImplementations: [], |
| 1178 | + }; |
| 1179 | + |
| 1180 | + const enumRefItem = { |
| 1181 | + type: 'string' as OpenApiSchemaObjectType, |
| 1182 | + enum: ['ONE', 'TWO', 'THREE'], |
| 1183 | + name: 'MyEnum', |
| 1184 | + isRef: true, |
| 1185 | + }; |
| 1186 | + |
| 1187 | + it('inlines the enum values for `union` (a union type has no runtime value)', () => { |
| 1188 | + const result = getMockScalar({ |
| 1189 | + ...baseArg, |
| 1190 | + item: { ...enumRefItem }, |
| 1191 | + context: scalarContext({ enumGenerationType: EnumGeneration.UNION }), |
| 1192 | + }); |
| 1193 | + |
| 1194 | + expect(result.value).toBe( |
| 1195 | + "faker.helpers.arrayElement(['ONE','TWO','THREE'] as const)", |
| 1196 | + ); |
| 1197 | + // No value import: the union type must not be referenced as a value. |
| 1198 | + expect(result.imports).not.toContainEqual( |
| 1199 | + expect.objectContaining({ name: 'MyEnum', values: true }), |
| 1200 | + ); |
| 1201 | + }); |
| 1202 | + |
| 1203 | + it('uses Object.values for `enum` (a native enum is a runtime object)', () => { |
| 1204 | + const result = getMockScalar({ |
| 1205 | + ...baseArg, |
| 1206 | + item: { ...enumRefItem }, |
| 1207 | + context: scalarContext({ enumGenerationType: EnumGeneration.ENUM }), |
| 1208 | + }); |
| 1209 | + |
| 1210 | + expect(result.value).toBe( |
| 1211 | + 'faker.helpers.arrayElement(Object.values(MyEnum))', |
| 1212 | + ); |
| 1213 | + expect(result.imports).toContainEqual( |
| 1214 | + expect.objectContaining({ name: 'MyEnum', values: true }), |
| 1215 | + ); |
| 1216 | + }); |
| 1217 | + |
| 1218 | + it('uses Object.values for `const` (a const object is a runtime value)', () => { |
| 1219 | + const result = getMockScalar({ |
| 1220 | + ...baseArg, |
| 1221 | + item: { ...enumRefItem }, |
| 1222 | + context: scalarContext({ enumGenerationType: EnumGeneration.CONST }), |
| 1223 | + }); |
| 1224 | + |
| 1225 | + expect(result.value).toBe( |
| 1226 | + 'faker.helpers.arrayElement(Object.values(MyEnum))', |
| 1227 | + ); |
| 1228 | + expect(result.imports).toContainEqual( |
| 1229 | + expect.objectContaining({ name: 'MyEnum', values: true }), |
| 1230 | + ); |
| 1231 | + }); |
| 1232 | +}); |
0 commit comments