From 454fd25e120caf1d5b0c2d13641d124a57c98de8 Mon Sep 17 00:00:00 2001 From: cb-karthikp Date: Tue, 3 Feb 2026 16:26:46 +0530 Subject: [PATCH 1/2] add custom field support on post method at sub-resource level --- .../v4/builder/PostRequestParamsBuilder.java | 5 + ...tRequestParamsBuilderCustomFieldsTest.java | 95 +++++++++++++++++++ 2 files changed, 100 insertions(+) diff --git a/src/main/java/com/chargebee/sdk/java/v4/builder/PostRequestParamsBuilder.java b/src/main/java/com/chargebee/sdk/java/v4/builder/PostRequestParamsBuilder.java index 3fd276c..d28437c 100644 --- a/src/main/java/com/chargebee/sdk/java/v4/builder/PostRequestParamsBuilder.java +++ b/src/main/java/com/chargebee/sdk/java/v4/builder/PostRequestParamsBuilder.java @@ -198,6 +198,11 @@ private Model createSubModel(String simpleNameSnake, String fullPathSnake, Schem subModel.setFields(getFields(schema, fullPathSnake, isCompositeArray)); subModel.setEnumFields(getEnumFields(schema, isCompositeArray)); subModel.setSubModels(getSubModels(schema, fullPathSnake)); + + // Check for custom fields and consent fields support at sub-params level + subModel.setCustomFieldsSupported(SchemaUtil.isCustomFieldsSupported(schema)); + subModel.setConsentFieldsSupported(SchemaUtil.isConsentFieldsSupported(schema)); + return subModel; } diff --git a/src/test/java/com/chargebee/sdk/java/v4/builder/PostRequestParamsBuilderCustomFieldsTest.java b/src/test/java/com/chargebee/sdk/java/v4/builder/PostRequestParamsBuilderCustomFieldsTest.java index 3ed38f3..437644f 100644 --- a/src/test/java/com/chargebee/sdk/java/v4/builder/PostRequestParamsBuilderCustomFieldsTest.java +++ b/src/test/java/com/chargebee/sdk/java/v4/builder/PostRequestParamsBuilderCustomFieldsTest.java @@ -239,6 +239,101 @@ void shouldHandleCustomFieldsExtensionSetToFalse() throws IOException { FileOp.WriteString writeOp = findWriteOp(fileOps, "TestCreateParams.java"); assertThat(writeOp.fileContent).doesNotContain("customField"); } + + @Test + @DisplayName("Should add custom field methods to sub-params when x-cb-is-custom-fields-supported is true at sub-params level") + void shouldAddCustomFieldMethodsToSubParamsWithCustomFieldsExtension() throws IOException { + // Create a nested object schema (billing_address) with custom fields support + ObjectSchema billingAddressSchema = new ObjectSchema(); + billingAddressSchema.addProperty("line1", new StringSchema()); + billingAddressSchema.addProperty("city", new StringSchema()); + billingAddressSchema.addExtension("x-cb-is-custom-fields-supported", true); + + // Parent request schema without custom fields support + ObjectSchema requestSchema = new ObjectSchema(); + requestSchema.addProperty("first_name", new StringSchema()); + requestSchema.addProperty("billing_address", billingAddressSchema); + + MediaType mediaType = new MediaType(); + mediaType.setSchema(requestSchema); + + Content content = new Content(); + content.addMediaType("application/x-www-form-urlencoded", mediaType); + + RequestBody requestBody = new RequestBody(); + requestBody.setContent(content); + + Operation postOp = new Operation(); + postOp.setOperationId("create_customer"); + postOp.addExtension(Extension.SDK_METHOD_NAME, "create"); + postOp.addExtension(Extension.RESOURCE_ID, "customer"); + postOp.setRequestBody(requestBody); + + PathItem pathItem = new PathItem(); + pathItem.setPost(postOp); + + Paths paths = new Paths(); + paths.addPathItem("/customers", pathItem); + openAPI.setPaths(paths); + + paramsBuilder.withOutputDirectoryPath(outputPath).withTemplate(mockTemplate); + + List fileOps = paramsBuilder.build(openAPI); + + FileOp.WriteString writeOp = findWriteOp(fileOps, "CustomerCreateParams.java"); + // Parent should NOT have custom fields + assertThat(writeOp.fileContent).doesNotContain("public CustomerCreateBuilder customField("); + // Sub-params (BillingAddress) should have custom fields + assertThat(writeOp.fileContent).contains("public BillingAddressBuilder customField("); + assertThat(writeOp.fileContent).contains("public BillingAddressBuilder customFields("); + } + + @Test + @DisplayName("Should not add custom field methods to sub-params without x-cb-is-custom-fields-supported") + void shouldNotAddCustomFieldMethodsToSubParamsWithoutExtension() throws IOException { + // Create a nested object schema (billing_address) without custom fields support + ObjectSchema billingAddressSchema = new ObjectSchema(); + billingAddressSchema.addProperty("line1", new StringSchema()); + billingAddressSchema.addProperty("city", new StringSchema()); + + // Parent request schema with custom fields support + ObjectSchema requestSchema = new ObjectSchema(); + requestSchema.addProperty("first_name", new StringSchema()); + requestSchema.addProperty("billing_address", billingAddressSchema); + requestSchema.addExtension("x-cb-is-custom-fields-supported", true); + + MediaType mediaType = new MediaType(); + mediaType.setSchema(requestSchema); + + Content content = new Content(); + content.addMediaType("application/x-www-form-urlencoded", mediaType); + + RequestBody requestBody = new RequestBody(); + requestBody.setContent(content); + + Operation postOp = new Operation(); + postOp.setOperationId("create_customer"); + postOp.addExtension(Extension.SDK_METHOD_NAME, "create"); + postOp.addExtension(Extension.RESOURCE_ID, "customer"); + postOp.setRequestBody(requestBody); + + PathItem pathItem = new PathItem(); + pathItem.setPost(postOp); + + Paths paths = new Paths(); + paths.addPathItem("/customers", pathItem); + openAPI.setPaths(paths); + + paramsBuilder.withOutputDirectoryPath(outputPath).withTemplate(mockTemplate); + + List fileOps = paramsBuilder.build(openAPI); + + FileOp.WriteString writeOp = findWriteOp(fileOps, "CustomerCreateParams.java"); + // Parent should have custom fields + assertThat(writeOp.fileContent).contains("public CustomerCreateBuilder customField("); + // Sub-params (BillingAddress) should NOT have custom fields + assertThat(writeOp.fileContent).doesNotContain("public BillingAddressBuilder customField("); + } } private FileOp.WriteString findWriteOp(List fileOps, String fileName) { From 9ed3ddbf51c8abb4b06655a6db47e7c666fee240 Mon Sep 17 00:00:00 2001 From: cb-karthikp Date: Thu, 5 Feb 2026 16:13:31 +0530 Subject: [PATCH 2/2] prettier code --- .../com/chargebee/sdk/java/v4/JavaV4.java | 1 - .../builder/GetRequestParamsBuilderTest.java | 21 ++++++++++++------- ...tRequestParamsBuilderCustomFieldsTest.java | 7 +++++-- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/chargebee/sdk/java/v4/JavaV4.java b/src/main/java/com/chargebee/sdk/java/v4/JavaV4.java index b9e9e6d..d6bd938 100644 --- a/src/main/java/com/chargebee/sdk/java/v4/JavaV4.java +++ b/src/main/java/com/chargebee/sdk/java/v4/JavaV4.java @@ -4,7 +4,6 @@ import com.chargebee.sdk.FileOp; import com.chargebee.sdk.Language; import com.chargebee.sdk.java.v4.builder.*; - import java.io.IOException; import java.util.ArrayList; import java.util.List; diff --git a/src/test/java/com/chargebee/sdk/java/v4/builder/GetRequestParamsBuilderTest.java b/src/test/java/com/chargebee/sdk/java/v4/builder/GetRequestParamsBuilderTest.java index f2048fc..b7c3437 100644 --- a/src/test/java/com/chargebee/sdk/java/v4/builder/GetRequestParamsBuilderTest.java +++ b/src/test/java/com/chargebee/sdk/java/v4/builder/GetRequestParamsBuilderTest.java @@ -1620,13 +1620,15 @@ void shouldGenerateCustomFieldMethodWhenSupported() throws IOException { FileOp.WriteString writeOp = findWriteOp(fileOps, "CustomerListParams.java"); assertThat(writeOp.fileContent) - .contains("public CustomFieldSelector customField(String fieldName)"); + .contains( + "public CustomFieldSelector customField(String fieldName)"); assertThat(writeOp.fileContent) .contains("return new CustomFieldSelector<>(fieldName, this, queryParams)"); } @Test - @DisplayName("Should not generate customField method when x-cb-is-custom-fields-supported is false") + @DisplayName( + "Should not generate customField method when x-cb-is-custom-fields-supported is false") void shouldNotGenerateCustomFieldMethodWhenNotSupported() throws IOException { Operation getOperation = createGetOperation("customer", "list"); getOperation.getExtensions().put(Extension.IS_CUSTOM_FIELDS_SUPPORTED, false); @@ -1674,8 +1676,7 @@ void shouldImportCustomFieldSelectorWhenSupported() throws IOException { FileOp.WriteString writeOp = findWriteOp(fileOps, "SubscriptionListParams.java"); assertThat(writeOp.fileContent) .contains("import com.chargebee.v4.filters.CustomFieldSelector;"); - assertThat(writeOp.fileContent) - .contains("import com.chargebee.v4.filters.BooleanFilter;"); + assertThat(writeOp.fileContent).contains("import com.chargebee.v4.filters.BooleanFilter;"); } @Test @@ -1697,11 +1698,13 @@ void shouldGenerateCorrectBuilderTypeForDifferentOperations() throws IOException FileOp.WriteString customerWriteOp = findWriteOp(fileOps, "CustomerListParams.java"); assertThat(customerWriteOp.fileContent) - .contains("public CustomFieldSelector customField(String fieldName)"); + .contains( + "public CustomFieldSelector customField(String fieldName)"); FileOp.WriteString subscriptionWriteOp = findWriteOp(fileOps, "SubscriptionListParams.java"); assertThat(subscriptionWriteOp.fileContent) - .contains("public CustomFieldSelector customField(String fieldName)"); + .contains( + "public CustomFieldSelector customField(String fieldName)"); } @Test @@ -1719,7 +1722,8 @@ void shouldGenerateCustomFieldMethodWithJavadoc() throws IOException { FileOp.WriteString writeOp = findWriteOp(fileOps, "CustomerListParams.java"); assertThat(writeOp.fileContent).contains("Create a filter for a custom field"); assertThat(writeOp.fileContent).contains("@param fieldName the custom field name"); - assertThat(writeOp.fileContent).contains("@return CustomFieldSelector for choosing filter type"); + assertThat(writeOp.fileContent) + .contains("@return CustomFieldSelector for choosing filter type"); } @Test @@ -1742,7 +1746,8 @@ void shouldHandleCustomFieldSupportWithOtherFeatures() throws IOException { FileOp.WriteString writeOp = findWriteOp(fileOps, "CustomerListParams.java"); // Verify customField method is generated assertThat(writeOp.fileContent) - .contains("public CustomFieldSelector customField(String fieldName)"); + .contains( + "public CustomFieldSelector customField(String fieldName)"); // Verify other features are still generated assertThat(writeOp.fileContent).contains("public FirstNameFilter firstName()"); assertThat(writeOp.fileContent).contains("public CreatedAtFilter createdAt()"); diff --git a/src/test/java/com/chargebee/sdk/java/v4/builder/PostRequestParamsBuilderCustomFieldsTest.java b/src/test/java/com/chargebee/sdk/java/v4/builder/PostRequestParamsBuilderCustomFieldsTest.java index 437644f..dc4cb72 100644 --- a/src/test/java/com/chargebee/sdk/java/v4/builder/PostRequestParamsBuilderCustomFieldsTest.java +++ b/src/test/java/com/chargebee/sdk/java/v4/builder/PostRequestParamsBuilderCustomFieldsTest.java @@ -241,7 +241,9 @@ void shouldHandleCustomFieldsExtensionSetToFalse() throws IOException { } @Test - @DisplayName("Should add custom field methods to sub-params when x-cb-is-custom-fields-supported is true at sub-params level") + @DisplayName( + "Should add custom field methods to sub-params when x-cb-is-custom-fields-supported is true" + + " at sub-params level") void shouldAddCustomFieldMethodsToSubParamsWithCustomFieldsExtension() throws IOException { // Create a nested object schema (billing_address) with custom fields support ObjectSchema billingAddressSchema = new ObjectSchema(); @@ -289,7 +291,8 @@ void shouldAddCustomFieldMethodsToSubParamsWithCustomFieldsExtension() throws IO } @Test - @DisplayName("Should not add custom field methods to sub-params without x-cb-is-custom-fields-supported") + @DisplayName( + "Should not add custom field methods to sub-params without x-cb-is-custom-fields-supported") void shouldNotAddCustomFieldMethodsToSubParamsWithoutExtension() throws IOException { // Create a nested object schema (billing_address) without custom fields support ObjectSchema billingAddressSchema = new ObjectSchema();