Skip to content

Commit 96b6a88

Browse files
committed
Add tests for oneOf discriminator-first decoding
- Add 1 integration test for Swift5 generator - Add 1 integration test for Swift6 generator - Tests validate generated code uses discriminator-first decoding pattern - Tests verify switch on discriminator value instead of sequential try?
1 parent 4165a5d commit 96b6a88

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

modules/openapi-generator/src/test/java/org/openapitools/codegen/swift5/Swift5ClientCodegenTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,4 +317,42 @@ public void oneOfFormParameterTest() {
317317

318318
}
319319

320+
@Test(description = "test oneOf with discriminator generates discriminator-first decoding", enabled = true)
321+
public void oneOfDiscriminatorFirstDecodingTest() throws IOException {
322+
Path target = Files.createTempDirectory("test");
323+
File output = target.toFile();
324+
try {
325+
final CodegenConfigurator configurator = new CodegenConfigurator()
326+
.setGeneratorName("swift5")
327+
.setInputSpec("src/test/resources/3_0/oneOfDiscriminator.yaml")
328+
.setOutputDir(target.toAbsolutePath().toString());
329+
330+
final ClientOptInput clientOptInput = configurator.toClientOptInput();
331+
DefaultGenerator generator = new DefaultGenerator(false);
332+
generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true");
333+
generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "false");
334+
generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false");
335+
336+
List<File> files = generator.opts(clientOptInput).generate();
337+
338+
File modelFile = files.stream()
339+
.filter(f -> f.getName().equals("FruitOneOfEnumMappingDisc.swift"))
340+
.findFirst()
341+
.orElseThrow(() -> new RuntimeException("FruitOneOfEnumMappingDisc.swift not found"));
342+
343+
String content = Files.readString(modelFile.toPath());
344+
345+
// Verify discriminator-first decoding pattern
346+
Assert.assertTrue(content.contains("private enum DiscriminatorCodingKey: String, CodingKey"));
347+
Assert.assertTrue(content.contains("let keyedContainer = try decoder.container(keyedBy: DiscriminatorCodingKey.self)"));
348+
Assert.assertTrue(content.contains("switch discriminatorValue"));
349+
Assert.assertTrue(content.contains("case \"APPLE\":"));
350+
Assert.assertTrue(content.contains("self = .typeAppleOneOfEnumMappingDisc(try AppleOneOfEnumMappingDisc(from: decoder))"));
351+
Assert.assertFalse(content.contains("if let value = try? container.decode(AppleOneOfEnumMappingDisc.self)"));
352+
353+
} finally {
354+
output.deleteOnExit();
355+
}
356+
}
357+
320358
}

modules/openapi-generator/src/test/java/org/openapitools/codegen/swift6/Swift6ClientCodegenTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,4 +363,42 @@ public void oneOfArrayTypeNamesTest() throws IOException {
363363
output.deleteOnExit();
364364
}
365365
}
366+
367+
@Test(description = "test oneOf with discriminator generates discriminator-first decoding", enabled = true)
368+
public void oneOfDiscriminatorFirstDecodingTest() throws IOException {
369+
Path target = Files.createTempDirectory("test");
370+
File output = target.toFile();
371+
try {
372+
final CodegenConfigurator configurator = new CodegenConfigurator()
373+
.setGeneratorName("swift6")
374+
.setInputSpec("src/test/resources/3_0/oneOfDiscriminator.yaml")
375+
.setOutputDir(target.toAbsolutePath().toString());
376+
377+
final ClientOptInput clientOptInput = configurator.toClientOptInput();
378+
DefaultGenerator generator = new DefaultGenerator(false);
379+
generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true");
380+
generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "false");
381+
generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false");
382+
383+
List<File> files = generator.opts(clientOptInput).generate();
384+
385+
File modelFile = files.stream()
386+
.filter(f -> f.getName().equals("FruitOneOfEnumMappingDisc.swift"))
387+
.findFirst()
388+
.orElseThrow(() -> new RuntimeException("FruitOneOfEnumMappingDisc.swift not found"));
389+
390+
String content = Files.readString(modelFile.toPath());
391+
392+
// Verify discriminator-first decoding pattern
393+
Assert.assertTrue(content.contains("private enum DiscriminatorCodingKey: String, CodingKey"));
394+
Assert.assertTrue(content.contains("let keyedContainer = try decoder.container(keyedBy: DiscriminatorCodingKey.self)"));
395+
Assert.assertTrue(content.contains("switch discriminatorValue"));
396+
Assert.assertTrue(content.contains("case \"APPLE\":"));
397+
Assert.assertTrue(content.contains("self = .typeAppleOneOfEnumMappingDisc(try AppleOneOfEnumMappingDisc(from: decoder))"));
398+
Assert.assertFalse(content.contains("if let value = try? container.decode(AppleOneOfEnumMappingDisc.self)"));
399+
400+
} finally {
401+
output.deleteOnExit();
402+
}
403+
}
366404
}

0 commit comments

Comments
 (0)