diff --git a/api/src/main/resources/custom_templates/api_test.mustache b/api/src/main/resources/custom_templates/api_test.mustache new file mode 100644 index 00000000000..a3e69d1ba6b --- /dev/null +++ b/api/src/main/resources/custom_templates/api_test.mustache @@ -0,0 +1,136 @@ +package {{package}}; + +import {{invokerPackage}}.ApiException; +import {{modelPackage}}.*; +import com.okta.sdk.helper.PresetHelper; +import com.okta.sdk.helper.TerraformHelper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.DisplayName; + +{{#imports}} +import {{import}}; +{{/imports}} + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.*; + +/** + * Auto-generated unit tests for {{classname}} operations + * + * NOTE: This test class requires Terraform-generated prerequisite data to run. + * Tests will fail if the TF_OUTPUTS environment variable is not set with the + * required test prerequisite data. + */ +public class {{classname}}Test { + + private {{classname}} apiClient; + private PresetHelper presetHelper; + private TerraformHelper terraformHelper; + + @BeforeEach + public void setUp() { + presetHelper = new PresetHelper(); + terraformHelper = new TerraformHelper(); + apiClient = new {{classname}}(presetHelper.getApiClient()); + } + +{{#operations}} +{{#operation}} + /** + * Test case for {{operationId}} operation. + * + * This test executes the actual API method with parameters extracted from + * prerequisite data created by Terraform. It validates HTTP response codes. + * + * Method name: test_{{operationId}} + */ + @Test + @DisplayName("Test {{operationId}} operation") + @SuppressWarnings("unchecked") + public void test_{{operationId}}() throws Exception { + // Load prerequisite data from Terraform + Map prerequisiteData = terraformHelper.getPrerequisiteDataForTest("test_{{operationId}}"); + + // Fail if no prerequisite data found - tests require Terraform data + if (prerequisiteData.isEmpty()) { + throw new AssertionError("No prerequisite data found in Terraform output for test: test_{{operationId}}"); + } + + // Extract parameters from prerequisite data + Map payload = (Map) prerequisiteData.getOrDefault("payload", new HashMap<>()); + Map prerequisiteObject = (Map) prerequisiteData.getOrDefault("prerequisite_object", new HashMap<>()); + + // Handle file uploads if present + byte[] fileContent = null; + if (payload.containsKey("file_path")) { + String filePath = payload.get("file_path").toString(); + fileContent = Files.readAllBytes(Paths.get(filePath)); + } + + // Execute the API method with parameters extracted from prerequisiteData + try { + {{#returnType}} + {{{returnType}}} response = apiClient.{{operationId}}( + {{#allParams}} + {{#isBodyParam}}extractParameterWithType(prerequisiteData, "{{paramName}}", null, "{{datatype}}"){{/isBodyParam}}{{^isBodyParam}}extractParameter(prerequisiteData, "{{paramName}}", null){{/isBodyParam}}{{^-last}}, {{/-last}} + {{/allParams}} + ); + + // Verify response is not null + if (response == null) { + throw new AssertionError("Response should not be null for {{operationId}}"); + } + {{/returnType}} + {{^returnType}} + apiClient.{{operationId}}( + {{#allParams}} + {{#isBodyParam}}extractParameterWithType(prerequisiteData, "{{paramName}}", null, "{{datatype}}"){{/isBodyParam}}{{^isBodyParam}}extractParameter(prerequisiteData, "{{paramName}}", null){{/isBodyParam}}{{^-last}}, {{/-last}} + {{/allParams}} + ); + {{/returnType}} + } catch (ApiException e) { + // Verify the HTTP response status code is valid (200, 201, 202, 204) + int code = e.getCode(); + if (!(code == 200 || code == 201 || code == 202 || code == 204)) { + throw new AssertionError("API returned unexpected status code: " + code); + } + } + } + +{{/operation}} +{{/operations}} + + /** + * Helper method to extract a parameter from prerequisite data. + * Delegates to TerraformHelper.extractParameter for smart field name resolution. + * + * @param prerequisiteData Map containing Terraform prerequisite data + * @param paramName Name of the parameter to extract + * @param defaultValue Default value if parameter is not found + * @return The extracted parameter value or default value + */ + @SuppressWarnings("unchecked") + private T extractParameter(Map prerequisiteData, String paramName, T defaultValue) { + Object value = TerraformHelper.extractParameter(prerequisiteData, paramName, defaultValue); + return (T) value; + } + + /** + * Helper method to extract a parameter with a specific target class for deserialization. + * This is useful when a parameter can be multiple model types (e.g., Group vs AddGroupRequest). + * + * @param prerequisiteData Map containing Terraform prerequisite data + * @param paramName Name of the parameter to extract + * @param defaultValue Default value if parameter is not found + * @param targetClassName Fully qualified class name for deserialization + * @return The extracted parameter value deserialized to the target class, or default value + */ + @SuppressWarnings("unchecked") + private T extractParameterWithType(Map prerequisiteData, String paramName, T defaultValue, String targetClassName) { + Object value = TerraformHelper.extractParameter(prerequisiteData, paramName, defaultValue, targetClassName); + return (T) value; + } +}