Skip to content

Commit e1edb9e

Browse files
fix: missing imports for array of files and date-time parameters (#1) (#22390)
1 parent e4a26ce commit e1edb9e

File tree

2 files changed

+107
-4
lines changed

2 files changed

+107
-4
lines changed

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -547,13 +547,15 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo
547547
}
548548
for (CodegenParameter param : operation.allParams) {
549549
// import "os" if the operation uses files
550-
if (!addedOSImport && "*os.File".equals(param.dataType)) {
550+
if (!addedOSImport && ("*os.File".equals(param.dataType) ||
551+
(param.items != null && "*os.File".equals(param.items.dataType)))) {
551552
imports.add(createMapping("import", "os"));
552553
addedOSImport = true;
553554
}
554555

555556
// import "time" if the operation has a time parameter.
556-
if (!addedTimeImport && "time.Time".equals(param.dataType)) {
557+
if (!addedTimeImport && ("time.Time".equals(param.dataType) ||
558+
(param.items != null && "time.Time".equals(param.items.dataType)))) {
557559
imports.add(createMapping("import", "time"));
558560
addedTimeImport = true;
559561
}
@@ -648,13 +650,15 @@ public WebhooksMap postProcessWebhooksWithModels(WebhooksMap objs, List<ModelMap
648650
}
649651
for (CodegenParameter param : operation.allParams) {
650652
// import "os" if the operation uses files
651-
if (!addedOSImport && "*os.File".equals(param.dataType)) {
653+
if (!addedOSImport && ("*os.File".equals(param.dataType) ||
654+
(param.items != null && "*os.File".equals(param.items.dataType)))) {
652655
imports.add(createMapping("import", "os"));
653656
addedOSImport = true;
654657
}
655658

656659
// import "time" if the operation has a time parameter.
657-
if (!addedTimeImport && "time.Time".equals(param.dataType)) {
660+
if (!addedTimeImport && ("time.Time".equals(param.dataType) ||
661+
(param.items != null && "time.Time".equals(param.items.dataType)))) {
658662
imports.add(createMapping("import", "time"));
659663
addedTimeImport = true;
660664
}

modules/openapi-generator/src/test/java/org/openapitools/codegen/go/AbstractGoCodegenTest.java

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,27 @@
1919

2020
import io.swagger.v3.oas.models.Components;
2121
import io.swagger.v3.oas.models.OpenAPI;
22+
import io.swagger.v3.oas.models.Operation;
2223
import io.swagger.v3.oas.models.media.*;
24+
import io.swagger.v3.oas.models.parameters.Parameter;
25+
import io.swagger.v3.oas.models.parameters.RequestBody;
2326
import org.mockito.Answers;
27+
import org.openapitools.codegen.*;
2428
import org.openapitools.codegen.CodegenConstants;
2529
import org.openapitools.codegen.languages.AbstractGoCodegen;
30+
import org.openapitools.codegen.model.OperationMap;
31+
import org.openapitools.codegen.model.OperationsMap;
32+
import org.openapitools.codegen.model.WebhooksMap;
2633
import org.openapitools.codegen.utils.ModelUtils;
2734
import org.testng.Assert;
2835
import org.testng.annotations.BeforeMethod;
2936
import org.testng.annotations.Test;
3037

38+
import java.util.ArrayList;
39+
import java.util.Collections;
40+
import java.util.List;
41+
import java.util.Map;
42+
3143
import static org.mockito.Mockito.mock;
3244
import static org.mockito.Mockito.withSettings;
3345

@@ -108,4 +120,91 @@ public void getTypeDeclarationTest() {
108120
defaultValue = codegen.getTypeDeclaration(schema);
109121
Assert.assertEquals(defaultValue, "map[string]interface{}");
110122
}
123+
124+
@Test(description = "test that os import is added for array of binary parameters in operations")
125+
public void testOsImportForArrayOfBinaryParametersInOperations() {
126+
// Create OpenAPI spec with array of binary files
127+
OpenAPI openAPI = new OpenAPI();
128+
openAPI.setComponents(new Components());
129+
130+
// Create operation with array of binary parameter in request body
131+
Operation operation = new Operation();
132+
RequestBody requestBody = new RequestBody();
133+
Content content = new Content();
134+
MediaType mediaType = new MediaType();
135+
136+
Schema<?> arraySchema = new ArraySchema().items(
137+
new BinarySchema()
138+
);
139+
140+
ObjectSchema objectSchema = new ObjectSchema();
141+
objectSchema.addProperty("files", arraySchema);
142+
mediaType.setSchema(objectSchema);
143+
content.addMediaType("multipart/form-data", mediaType);
144+
requestBody.setContent(content);
145+
operation.setRequestBody(requestBody);
146+
147+
codegen.setOpenAPI(openAPI);
148+
149+
// Convert to CodegenOperation
150+
CodegenOperation codegenOperation = codegen.fromOperation("/upload", "post", operation, null);
151+
152+
// Create OperationsMap structure
153+
OperationMap operationMap = new OperationMap();
154+
operationMap.setOperation(codegenOperation);
155+
OperationsMap operationsMap = new OperationsMap();
156+
operationsMap.setOperation(operationMap);
157+
operationsMap.setImports(new ArrayList<>());
158+
159+
// Post-process the operations
160+
OperationsMap result = codegen.postProcessOperationsWithModels(operationsMap, Collections.emptyList());
161+
162+
// Assert that "os" import was added
163+
List<Map<String, String>> imports = result.getImports();
164+
boolean hasOsImport = imports.stream()
165+
.anyMatch(imp -> "os".equals(imp.get("import")));
166+
167+
Assert.assertTrue(hasOsImport, "Expected 'os' import to be added for array of binary files");
168+
}
169+
170+
@Test(description = "test that time import is added for array of date-time parameters in operations")
171+
public void testTimeImportForArrayOfDateTimeParametersInOperations() {
172+
// Create OpenAPI spec with array of date-time parameter
173+
OpenAPI openAPI = new OpenAPI();
174+
openAPI.setComponents(new Components());
175+
176+
Operation operation = new Operation();
177+
Parameter parameter = new Parameter();
178+
parameter.setName("timestamps");
179+
parameter.setIn("query");
180+
181+
ArraySchema arraySchema = new ArraySchema();
182+
DateTimeSchema dateTimeSchema = new DateTimeSchema();
183+
arraySchema.setItems(dateTimeSchema);
184+
parameter.setSchema(arraySchema);
185+
186+
operation.addParametersItem(parameter);
187+
188+
codegen.setOpenAPI(openAPI);
189+
190+
// Convert to CodegenOperation
191+
CodegenOperation codegenOperation = codegen.fromOperation("/events", "get", operation, null);
192+
193+
// Create OperationsMap structure
194+
OperationMap operationMap = new OperationMap();
195+
operationMap.setOperation(codegenOperation);
196+
OperationsMap operationsMap = new OperationsMap();
197+
operationsMap.setOperation(operationMap);
198+
operationsMap.setImports(new ArrayList<>());
199+
200+
// Post-process the operations
201+
OperationsMap result = codegen.postProcessOperationsWithModels(operationsMap, Collections.emptyList());
202+
203+
// Assert that "time" import was added
204+
List<Map<String, String>> imports = result.getImports();
205+
boolean hasTimeImport = imports.stream()
206+
.anyMatch(imp -> "time".equals(imp.get("import")));
207+
208+
Assert.assertTrue(hasTimeImport, "Expected 'time' import to be added for array of date-time parameters");
209+
}
111210
}

0 commit comments

Comments
 (0)