You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by GitBox <gi...@apache.org> on 2018/11/30 12:43:22 UTC

[GitHub] pembemiriam closed pull request #9: Document Portfolio service API in component-test module

pembemiriam closed pull request #9: Document Portfolio service API in component-test module
URL: https://github.com/apache/fineract-cn-portfolio/pull/9
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/.gitignore b/.gitignore
index f9d7cba..7f171b2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,9 @@
 .idea
 build/
 target/
+api/out/
+component-test/out/
+service/out
 
 # Ignore Gradle GUI config
 gradle-app.setting
diff --git a/component-test/build.gradle b/component-test/build.gradle
index b0dd2d7..8964833 100644
--- a/component-test/build.gradle
+++ b/component-test/build.gradle
@@ -26,6 +26,7 @@ buildscript {
 
     dependencies {
         classpath ("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
+        classpath  'org.asciidoctor:asciidoctor-gradle-plugin:1.5.2'
     }
 }
 
@@ -36,6 +37,10 @@ plugins {
 
 apply from: '../shared.gradle'
 
+apply plugin: 'spring-boot'
+apply plugin: 'org.asciidoctor.convert'
+
+
 dependencies {
     compile(
             [group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka-server'],
@@ -46,8 +51,19 @@ dependencies {
             [group: 'org.apache.fineract.cn', name: 'api', version: versions.frameworkapi],
             [group: 'org.apache.fineract.cn', name: 'test', version: versions.frameworktest],
             [group: 'org.apache.fineract.cn', name: 'lang', version: versions.frameworklang],
-            [group: 'org.springframework.boot', name: 'spring-boot-starter-test']
+            [group: 'org.springframework.boot', name: 'spring-boot-starter-test'],
+            [group: 'org.springframework.restdocs', name: 'spring-restdocs-mockmvc'],
+            [group: 'junit', name: 'junit', version: '4.12']
     )
+    
+}
+
+asciidoctor {
+    sourceDir 'build/doc/asciidoc/'
+    outputDir 'build/doc/html5'
+    options backend: "html", doctype: "book"
+    attributes "source-highlighter": "highlightjs", \
+                'snippets': file('build/doc/generated-snippets/')
 }
 
 publishing {
diff --git a/component-test/src/main/java/org/apache/fineract/cn/portfolio/BalanceSegmentSetApiDocumentation.java b/component-test/src/main/java/org/apache/fineract/cn/portfolio/BalanceSegmentSetApiDocumentation.java
new file mode 100644
index 0000000..86eee87
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/portfolio/BalanceSegmentSetApiDocumentation.java
@@ -0,0 +1,197 @@
+package org.apache.fineract.cn.portfolio;
+
+import com.google.gson.Gson;
+import org.apache.fineract.cn.portfolio.api.v1.domain.BalanceSegmentSet;
+import org.apache.fineract.cn.portfolio.api.v1.domain.Product;
+import org.apache.fineract.cn.portfolio.api.v1.events.BalanceSegmentSetEvent;
+import org.apache.fineract.cn.portfolio.api.v1.events.EventConstants;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.restdocs.JUnitRestDocumentation;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+
+import static org.apache.fineract.cn.lang.config.TenantHeaderFilter.TENANT_HEADER;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint;
+import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
+import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields;
+import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+public class BalanceSegmentSetApiDocumentation extends AbstractPortfolioTest {
+
+    @Rule
+    public final JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation("build/doc/generated-snippets/test-balancesegmentsets");
+
+    @Autowired
+    private WebApplicationContext context;
+
+    private MockMvc mockMvc;
+
+    @Before
+    public void setUp ( ) {
+
+        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
+                .apply(documentationConfiguration(this.restDocumentation))
+                .alwaysDo(document("{method-name}", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint())))
+                .build();
+    }
+
+    @Test
+    public void documentCreateBalanceSegmentSet ( ) throws Exception {
+
+        final Product product = createProduct();
+
+        final BalanceSegmentSet balanceSegmentSet = new BalanceSegmentSet();
+        balanceSegmentSet.setIdentifier(testEnvironment.generateUniqueIdentifer("bss"));
+        balanceSegmentSet.setSegments(Arrays.asList(
+                BigDecimal.ZERO.setScale(5, BigDecimal.ROUND_HALF_EVEN),
+                BigDecimal.TEN.setScale(5, BigDecimal.ROUND_HALF_EVEN),
+                BigDecimal.valueOf(10_000_0000, 5)));
+        balanceSegmentSet.setSegmentIdentifiers(Arrays.asList("abc", "def", "ghi"));
+
+        Gson gson = new Gson();
+        this.mockMvc.perform(post("/products/" +product.getIdentifier()+ "/balancesegmentsets/")
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .content(gson.toJson(balanceSegmentSet)))
+                .andExpect(status().isAccepted())
+                .andDo(document("document-create-balance-segment-set", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()),
+                        requestFields(
+                                fieldWithPath("identifier").description("Balance segment set's identifier"),
+                                fieldWithPath("segments").description("Balance segment set's given name"),
+                                fieldWithPath("segmentIdentifiers").description("Balance segment sets's segment identfiers"))));
+
+    }
+
+    @Test
+    public void documentGetAllBalanceSegmentSets () throws Exception {
+        final Product product = createProduct();
+
+        final BalanceSegmentSet balanceSegmentSet = new BalanceSegmentSet();
+        balanceSegmentSet.setIdentifier(testEnvironment.generateUniqueIdentifer("bss"));
+        balanceSegmentSet.setSegments(Arrays.asList(
+                BigDecimal.ZERO.setScale(3, BigDecimal.ROUND_HALF_EVEN),
+                BigDecimal.TEN.setScale(3, BigDecimal.ROUND_HALF_EVEN),
+                BigDecimal.valueOf(10_000_0000, 3)));
+        balanceSegmentSet.setSegmentIdentifiers(Arrays.asList("how","are", "you"));
+
+        portfolioManager.createBalanceSegmentSet(product.getIdentifier(), balanceSegmentSet);
+
+        this.mockMvc.perform(get("/products/" +product.getIdentifier()+ "/balancesegmentsets/")
+                .accept(MediaType.APPLICATION_JSON_VALUE)
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .header(TENANT_HEADER, tenantDataStoreContext.getTenantName()))
+                .andExpect(status().isOk())
+                .andDo(document(
+                        "document-get-all-balance-segment-sets", preprocessRequest(prettyPrint()),
+                        responseFields(
+                                fieldWithPath("[]").description("An array of balance segment sets"),
+                                fieldWithPath("[].identifier").description("Balance segment set's identifier "),
+                                fieldWithPath("[].segments").description("Balance segment set's segments "),
+                                fieldWithPath("[].segmentIdentifiers").description("Balance segment set's segment identifier"))));
+
+    }
+
+    @Test
+    public void documentGetBalanceSegmentSet () throws Exception {
+        final Product product = createProduct();
+
+        final BalanceSegmentSet balanceSegmentSet = new BalanceSegmentSet();
+        balanceSegmentSet.setIdentifier(testEnvironment.generateUniqueIdentifer("bss"));
+        balanceSegmentSet.setSegments(Arrays.asList(
+                BigDecimal.ZERO.setScale(3, BigDecimal.ROUND_HALF_EVEN),
+                BigDecimal.TEN.setScale(3, BigDecimal.ROUND_HALF_EVEN),
+                BigDecimal.valueOf(10_000_0000, 3)));
+        balanceSegmentSet.setSegmentIdentifiers(Arrays.asList("how","are", "you"));
+
+        portfolioManager.createBalanceSegmentSet(product.getIdentifier(), balanceSegmentSet);
+        this.eventRecorder.wait(EventConstants.POST_BALANCE_SEGMENT_SET, new BalanceSegmentSetEvent(product.getIdentifier(), balanceSegmentSet.getIdentifier()));
+
+
+        this.mockMvc.perform(get("/products/" +product.getIdentifier()+ "/balancesegmentsets/" +balanceSegmentSet.getIdentifier())
+                .accept(MediaType.APPLICATION_JSON_VALUE)
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .header(TENANT_HEADER, tenantDataStoreContext.getTenantName()))
+                .andExpect(status().isOk())
+                .andDo(document(
+                        "document-get-balance-segment-set", preprocessRequest(prettyPrint()),
+                        responseFields(
+                                fieldWithPath("identifier").description("Balance segment set's identifier"),
+                                fieldWithPath("segments").description("Balance segment set's given name"),
+                                fieldWithPath("segmentIdentifiers").description("Balance segment sets's segment identfiers"))));
+
+    }
+
+    @Test
+    public void documentChangeBalanceSegmentSet () throws Exception {
+        final Product product = createProduct();
+
+        final BalanceSegmentSet balanceSegmentSet = new BalanceSegmentSet();
+        balanceSegmentSet.setIdentifier(testEnvironment.generateUniqueIdentifer("bss"));
+        balanceSegmentSet.setSegments(Arrays.asList(
+                BigDecimal.ZERO.setScale(3, BigDecimal.ROUND_HALF_EVEN),
+                BigDecimal.TEN.setScale(3, BigDecimal.ROUND_HALF_EVEN),
+                BigDecimal.valueOf(10_000_0000, 3)));
+        balanceSegmentSet.setSegmentIdentifiers(Arrays.asList("how","are", "you"));
+
+        portfolioManager.createBalanceSegmentSet(product.getIdentifier(), balanceSegmentSet);
+        this.eventRecorder.wait(EventConstants.POST_BALANCE_SEGMENT_SET, new BalanceSegmentSetEvent(product.getIdentifier(), balanceSegmentSet.getIdentifier()));
+
+
+        balanceSegmentSet.setSegments(Arrays.asList(
+                BigDecimal.ZERO.setScale(6, BigDecimal.ROUND_HALF_EVEN),
+                BigDecimal.valueOf(100_0000, 6),
+                BigDecimal.valueOf(10_000_0000, 6)));
+        balanceSegmentSet.setSegmentIdentifiers(Arrays.asList("abc", "def", "ghi"));
+
+        Gson gson = new Gson();
+        this.mockMvc.perform(put("/products/" + product.getIdentifier()+ "/balancesegmentsets/" +balanceSegmentSet.getIdentifier())
+                .accept(MediaType.APPLICATION_JSON_VALUE)
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .header(TENANT_HEADER, tenantDataStoreContext.getTenantName())
+                .content(gson.toJson(balanceSegmentSet)))
+                .andExpect(status().isAccepted())
+                .andDo(document(
+                        "document-change-balance-segment-set", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()),
+                        requestFields(
+                                fieldWithPath("identifier").description("Balance segment set's identifier"),
+                                fieldWithPath("segments").description("Balance segment set's given name"),
+                                fieldWithPath("segmentIdentifiers").description("Balance segment sets's segment identfiers"))));
+
+    }
+
+    @Test
+    public void documentDeleteBalanceSegmentSet() throws Exception {
+        final Product product = createProduct();
+
+        final BalanceSegmentSet balanceSegmentSet = new BalanceSegmentSet();
+        balanceSegmentSet.setIdentifier(testEnvironment.generateUniqueIdentifer("bss"));
+        balanceSegmentSet.setSegments(Arrays.asList(
+                BigDecimal.ZERO.setScale(3, BigDecimal.ROUND_HALF_EVEN),
+                BigDecimal.TEN.setScale(3, BigDecimal.ROUND_HALF_EVEN),
+                BigDecimal.valueOf(10_000_0000, 3)));
+        balanceSegmentSet.setSegmentIdentifiers(Arrays.asList("am","fine", "thanks"));
+
+        portfolioManager.createBalanceSegmentSet(product.getIdentifier(), balanceSegmentSet);
+        this.mockMvc.perform(delete("/products/" + product.getIdentifier()+ "/balancesegmentsets/" +balanceSegmentSet.getIdentifier())
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .accept(MediaType.ALL_VALUE))
+                .andExpect(status().isAccepted())
+                .andDo(document("document-delete-balance-segment-set", preprocessResponse(prettyPrint())));
+
+    }
+
+
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/portfolio/CaseDocumentsApiDocumentation.java b/component-test/src/main/java/org/apache/fineract/cn/portfolio/CaseDocumentsApiDocumentation.java
new file mode 100644
index 0000000..2f01abc
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/portfolio/CaseDocumentsApiDocumentation.java
@@ -0,0 +1,127 @@
+package org.apache.fineract.cn.portfolio;
+
+import com.google.gson.Gson;
+import org.apache.fineract.cn.individuallending.api.v1.domain.caseinstance.CaseCustomerDocuments;
+import org.apache.fineract.cn.portfolio.api.v1.domain.*;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.restdocs.JUnitRestDocumentation;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import java.util.Arrays;
+
+import static org.apache.fineract.cn.lang.config.TenantHeaderFilter.TENANT_HEADER;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.put;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint;
+import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
+import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields;
+import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+public class CaseDocumentsApiDocumentation extends AbstractPortfolioTest {
+
+    @Rule
+    public final JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation("build/doc/generated-snippets/test-casedocuments");
+
+    @Autowired
+    private WebApplicationContext context;
+
+    private MockMvc mockMvc;
+
+    @Before
+    public void setUp() {
+
+        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
+                .apply(documentationConfiguration(this.restDocumentation))
+                .alwaysDo(document("{method-name}", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint())))
+                .build();
+    }
+
+    @Test
+    public void documentGetCaseDocuments() throws Exception {
+
+        final Product product = createAndEnableProduct();
+
+        final Case customerCase = createCase(product.getIdentifier());
+
+
+       final CaseCustomerDocuments caseDocuments = caseDocumentsManager.getCaseDocuments(
+                product.getIdentifier(), customerCase.getIdentifier());
+
+       final CaseCustomerDocuments.Document studentLoanDocument
+                = new CaseCustomerDocuments.Document(Fixture.CUSTOMER_IDENTIFIER, "student_loan_documents");
+        final CaseCustomerDocuments.Document houseTitle
+                = new CaseCustomerDocuments.Document(Fixture.CUSTOMER_IDENTIFIER, "house_title");
+        final CaseCustomerDocuments.Document workContract
+                = new CaseCustomerDocuments.Document(Fixture.CUSTOMER_IDENTIFIER, "work_contract");
+
+      caseDocuments.setDocuments(Arrays.asList(studentLoanDocument, houseTitle, workContract));
+
+        this.mockMvc.perform(get("/individuallending/products/" + product.getIdentifier() + "/cases/" + customerCase.getIdentifier() + "/documents")
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .accept(MediaType.ALL_VALUE))
+                .andExpect(status().isOk())
+                .andDo(document("document-get-case-documents", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()),
+                        responseFields(
+                                fieldWithPath("documents").type("List<Document>").description("The case document +\n" +
+                                        " +\n" +
+                                        "_Document_ { +\n" +
+                                        "  *enum* _Type_ { +\n" +
+                                        "     customerId, +\n" +
+                                        "     documentId, +\n" +
+                                        "  } +"))));
+
+    }
+
+
+    @Test
+    public void documentChangeCaseDocuments() throws Exception {
+
+        final Product product = createAndEnableProduct();
+
+        final Case customerCase = createCase(product.getIdentifier());
+
+        final CaseCustomerDocuments caseDocuments = caseDocumentsManager.getCaseDocuments(
+                product.getIdentifier(), customerCase.getIdentifier());
+
+        final CaseCustomerDocuments.Document houseLoanDocument
+                = new CaseCustomerDocuments.Document(Fixture.CUSTOMER_IDENTIFIER, "house_loan_documents");
+        final CaseCustomerDocuments.Document houseTitle
+                = new CaseCustomerDocuments.Document(Fixture.CUSTOMER_IDENTIFIER, "house_title");
+        final CaseCustomerDocuments.Document workContract
+                = new CaseCustomerDocuments.Document(Fixture.CUSTOMER_IDENTIFIER, "work_contract");
+
+        caseDocuments.setDocuments(Arrays.asList(houseLoanDocument, houseTitle, workContract));
+
+        caseDocumentsManager.changeCaseDocuments(product.getIdentifier(), customerCase.getIdentifier(), caseDocuments);
+
+        Gson gson = new Gson();
+        this.mockMvc.perform(put("/individuallending/products/" + product.getIdentifier() + "/cases/" + customerCase.getIdentifier() + "/documents")
+                .accept(MediaType.APPLICATION_JSON_VALUE)
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .header(TENANT_HEADER, tenantDataStoreContext.getTenantName())
+                .content(gson.toJson(caseDocuments)))
+                .andExpect(status().isAccepted())
+                .andDo(document(
+                        "document-change-case-documents", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()),
+                        requestFields(
+                                fieldWithPath("documents").type("List<Document>").description("The case document +\n" +
+                                        " +\n" +
+                                        "_Document_ { +\n" +
+                                        "  *enum* _Type_ { +\n" +
+                                        "     customerId, +\n" +
+                                        "     documentId, +\n" +
+                                        "  } +"))));
+    }
+
+}
\ No newline at end of file
diff --git a/component-test/src/main/java/org/apache/fineract/cn/portfolio/CasesApiDocumentation.java b/component-test/src/main/java/org/apache/fineract/cn/portfolio/CasesApiDocumentation.java
new file mode 100644
index 0000000..00b1d6b
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/portfolio/CasesApiDocumentation.java
@@ -0,0 +1,108 @@
+package org.apache.fineract.cn.portfolio;
+
+import com.google.gson.Gson;
+import org.apache.fineract.cn.individuallending.api.v1.domain.caseinstance.CaseParameters;
+import org.apache.fineract.cn.individuallending.api.v1.domain.product.AccountDesignators;
+import org.apache.fineract.cn.portfolio.api.v1.domain.AccountAssignment;
+import org.apache.fineract.cn.portfolio.api.v1.domain.Case;
+import org.apache.fineract.cn.portfolio.api.v1.domain.Product;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.restdocs.JUnitRestDocumentation;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+import java.util.HashSet;
+import java.util.Set;
+import static org.apache.fineract.cn.lang.config.TenantHeaderFilter.TENANT_HEADER;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.put;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint;
+import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
+import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+public class CasesApiDocumentation extends AbstractPortfolioTest {
+
+    @Rule
+    public final JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation("build/doc/generated-snippets/test-cases");
+
+    @Autowired
+    private WebApplicationContext context;
+
+    private MockMvc mockMvc;
+
+    @Before
+    public void setUp() {
+
+        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
+                .apply(documentationConfiguration(this.restDocumentation))
+                .alwaysDo(document("{method-name}", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint())))
+                .build();
+    }
+
+    @Test
+    public void documentCreateCase () throws Exception {
+
+        final Product product = createAndEnableProduct();
+
+       final Case caseInstance = createCase(product.getIdentifier());
+       caseInstance.setIdentifier("case-v1");
+
+        Gson gson = new Gson();
+        this.mockMvc.perform(post("/products/"+product.getIdentifier()+"/cases/")
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .content(gson.toJson(caseInstance)))
+                .andExpect(status().isAccepted())
+                .andDo(document("document-create-case", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()),
+                        requestFields(
+                                fieldWithPath("identifier").description("Cases's identifier"),
+                                fieldWithPath("productIdentifier").description("Products's identifier"),
+                                fieldWithPath("interest").description("Cases's interest"),
+                                fieldWithPath("parameters").description("cases's parameters"),
+                                fieldWithPath("accountAssignments").description("Cases's account assignment"),
+                                fieldWithPath("currentState").description("Cases's current state"))));
+
+    }
+
+    @Test
+    public void documentChangeCase () throws Exception {
+
+        final Product product = createAndEnableProduct();
+
+
+        final CaseParameters newCaseParameters = Fixture.createAdjustedCaseParameters(x -> {});
+        final String originalParameters = new Gson().toJson(newCaseParameters);
+        final Case caseInstance = createAdjustedCase(product.getIdentifier(), x -> x.setParameters(originalParameters));
+
+        final Set<AccountAssignment> accountAssignments = new HashSet<>();
+        accountAssignments.add(new AccountAssignment(AccountDesignators.CUSTOMER_LOAN_GROUP, "002-011"));
+        accountAssignments.add(new AccountAssignment(AccountDesignators.ENTRY, "002-012"));
+        caseInstance.setAccountAssignments(accountAssignments);
+
+        Gson gson = new Gson();
+        this.mockMvc.perform(put("/products/" + product.getIdentifier() + "/cases/" + caseInstance.getIdentifier())
+                .accept(MediaType.APPLICATION_JSON_VALUE)
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .header(TENANT_HEADER, tenantDataStoreContext.getTenantName())
+                .content(gson.toJson(caseInstance)))
+                .andExpect(status().isAccepted())
+                .andDo(document(
+                        "document-change-case", preprocessRequest(prettyPrint()),
+                        requestFields(
+                                fieldWithPath("identifier").description("Cases's identifier"),
+                                fieldWithPath("productIdentifier").description("Products's identifier"),
+                                fieldWithPath("interest").description("Cases's interest"),
+                                fieldWithPath("parameters").description("cases's parameters"),
+                                fieldWithPath("accountAssignments").description("Cases's account assignment"),
+                                fieldWithPath("currentState").description("Cases's current state"))));
+
+    }
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/portfolio/ChargeDefinitionApiDocumentation.java b/component-test/src/main/java/org/apache/fineract/cn/portfolio/ChargeDefinitionApiDocumentation.java
new file mode 100644
index 0000000..63da9d8
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/portfolio/ChargeDefinitionApiDocumentation.java
@@ -0,0 +1,239 @@
+package org.apache.fineract.cn.portfolio;
+
+import com.google.gson.Gson;
+import org.apache.fineract.cn.individuallending.api.v1.domain.product.AccountDesignators;
+import org.apache.fineract.cn.individuallending.api.v1.domain.workflow.Action;
+import org.apache.fineract.cn.portfolio.api.v1.domain.ChargeDefinition;
+import org.apache.fineract.cn.portfolio.api.v1.domain.Product;
+import org.apache.fineract.cn.portfolio.api.v1.events.ChargeDefinitionEvent;
+import org.apache.fineract.cn.portfolio.api.v1.events.EventConstants;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.restdocs.JUnitRestDocumentation;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import java.math.BigDecimal;
+
+import static org.apache.fineract.cn.lang.config.TenantHeaderFilter.TENANT_HEADER;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint;
+import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
+import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields;
+import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+public class ChargeDefinitionApiDocumentation extends AbstractPortfolioTest {
+
+    @Rule
+    public final JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation("build/doc/generated-snippets/test-chargedefinitions");
+
+    @Autowired
+    private WebApplicationContext context;
+
+    private MockMvc mockMvc;
+
+    @Before
+    public void setUp() {
+
+        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
+                .apply(documentationConfiguration(this.restDocumentation))
+                .alwaysDo(document("{method-name}", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint())))
+                .build();
+    }
+
+    @Test
+    public void documentGetAllChargeDefinitions ( ) throws Exception {
+        final Product product = createProduct();
+
+        try {
+            this.mockMvc.perform(get("/products/" +product.getIdentifier()+"/charges/")
+                    .accept(MediaType.APPLICATION_JSON_VALUE)
+                    .contentType(MediaType.APPLICATION_JSON_VALUE)
+                    .header(TENANT_HEADER, tenantDataStoreContext.getTenantName()))
+                    .andExpect(status().isOk())
+                    .andDo(document(
+                            "document-get-all-charge-definitions", preprocessRequest(prettyPrint()),
+                            responseFields(
+
+                                    fieldWithPath("identifier").description("Charge definition's identifier"),
+                                    fieldWithPath("name").description("Charge definitions given name"),
+                                    fieldWithPath("description").description("Charge definitions description"),
+                                    fieldWithPath("accrueAction").description("Charge definitions accrue action"),
+                                    fieldWithPath("proportionalTo").description("Charge definitions proportional to"),
+                                    fieldWithPath("accrualAccountDesignator").description("Charge definitions accrual acion generatort"),
+                                    fieldWithPath("forCycleSizeUnit").description("Charge definitions cycle size unit"),
+                                    fieldWithPath("forSegmentSet").description("Charge definitions segment set"),
+                                    fieldWithPath("fromSegment").description("Charge definitions from segment"),
+                                    fieldWithPath("toSegment").description("Charge definitions to segment"),
+                                    fieldWithPath("chargeOnTop").description("Charge definitions charge on top"),
+                                    fieldWithPath("fromAccountDesignator").description("From account designator"),
+                                    fieldWithPath("toAccountDesignator").description("To account designator"),
+                                    fieldWithPath("amount").description("Charge definition's amount"),
+                                    fieldWithPath("chargeMethod").description("Charge definitions charge method"),
+                                    fieldWithPath("chargeAction").description("Charge definition's charge action"),
+                                    fieldWithPath("description").description("Employee's middle name"),
+                                    fieldWithPath("readOnly").description("Readability"))));
+
+    } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+
+    @Test
+    public void documentCreateChargeDefinition() throws Exception {
+
+        final Product product = createProduct();
+
+        final ChargeDefinition chargeDefinition = new ChargeDefinition();
+        chargeDefinition.setIdentifier("charge123");
+        chargeDefinition.setName("core123");
+        chargeDefinition.setFromAccountDesignator("Pembe");
+        chargeDefinition.setToAccountDesignator("Miriam");
+        chargeDefinition.setAmount(BigDecimal.ONE.setScale(3, BigDecimal.ROUND_UNNECESSARY));
+        chargeDefinition.setChargeMethod(ChargeDefinition.ChargeMethod.FIXED);
+        chargeDefinition.setChargeAction(Action.OPEN.name());
+        chargeDefinition.setDescription("describe charge");
+
+
+        Gson gson = new Gson();
+        this.mockMvc.perform(post("/products/"+product.getIdentifier()+"/charges/")
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .content(gson.toJson(chargeDefinition)))
+                .andExpect(status().isAccepted())
+                .andDo(document("document-create-charge-definition", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()),
+                        requestFields(
+                                fieldWithPath("identifier").description("Charge definition's identifier"),
+                                fieldWithPath("name").description("Charge definitions given name"),
+                                fieldWithPath("fromAccountDesignator").description("From account designator"),
+                                fieldWithPath("toAccountDesignator").description("To account designator"),
+                                fieldWithPath("amount").description("Charge definition's amount"),
+                                fieldWithPath("chargeMethod").description("Charge definitions charge method"),
+                                fieldWithPath("chargeAction").description("Charge definition's charge action"),
+                                fieldWithPath("description").description("Employee's middle name"),
+                                fieldWithPath("readOnly").description("Readability"))));
+
+    }
+
+    @Test
+    public void documentChangeChargeDefinition() throws Exception {
+
+        final Product product = createProduct();
+
+        final ChargeDefinition chargeDefinition = new ChargeDefinition();
+        chargeDefinition.setIdentifier("charge124");
+        chargeDefinition.setName("core123");
+        chargeDefinition.setFromAccountDesignator("Pembe");
+        chargeDefinition.setToAccountDesignator("Miriam");
+        chargeDefinition.setAmount(BigDecimal.ONE.setScale(3, BigDecimal.ROUND_UNNECESSARY));
+        chargeDefinition.setChargeMethod(ChargeDefinition.ChargeMethod.FIXED);
+        chargeDefinition.setChargeAction(Action.OPEN.name());
+        chargeDefinition.setDescription("describe charge");
+
+        portfolioManager.createChargeDefinition(product.getIdentifier(), chargeDefinition);
+
+        chargeDefinition.setName("charge12345");
+        chargeDefinition.setFromAccountDesignator("Paul");
+        chargeDefinition.setToAccountDesignator("Motia");
+
+        Gson gson = new Gson();
+        this.mockMvc.perform(put("/products/" + product.getIdentifier() + "/charges/" + chargeDefinition.getIdentifier())
+                .accept(MediaType.APPLICATION_JSON_VALUE)
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .header(TENANT_HEADER, tenantDataStoreContext.getTenantName())
+                .content(gson.toJson(chargeDefinition)))
+                .andExpect(status().isAccepted())
+                .andDo(document(
+                        "document-change-charge-definition", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()),
+                        requestFields(
+                                fieldWithPath("identifier").description("Charge definition's identifier"),
+                                fieldWithPath("name").description("Charge definitions given name"),
+                                fieldWithPath("fromAccountDesignator").description("From account designator"),
+                                fieldWithPath("toAccountDesignator").description("To account designator"),
+                                fieldWithPath("amount").description("Charge definition's amount"),
+                                fieldWithPath("chargeMethod").description("Charge definitions charge method"),
+                                fieldWithPath("chargeAction").description("Charge definition's charge action"),
+                                fieldWithPath("description").description("Employee's middle name"),
+                                fieldWithPath("readOnly").description("Readability"))));
+    }
+
+    @Test
+    public void documentGetChargeDefinition() throws Exception {
+
+        final Product product = createProduct();
+
+        final ChargeDefinition chargeDefinition = new ChargeDefinition();
+        chargeDefinition.setIdentifier("charge10");
+        chargeDefinition.setName("core123");
+        chargeDefinition.setFromAccountDesignator("pembe");
+        chargeDefinition.setToAccountDesignator("miriam");
+        chargeDefinition.setAmount(BigDecimal.ONE.setScale(3, BigDecimal.ROUND_UNNECESSARY));
+        chargeDefinition.setChargeMethod(ChargeDefinition.ChargeMethod.FIXED);
+        chargeDefinition.setChargeAction(Action.OPEN.name());
+        chargeDefinition.setDescription("describe charge");
+
+        portfolioManager.createChargeDefinition(product.getIdentifier(), chargeDefinition);
+
+
+        this.mockMvc.perform(get("/products/" + product.getIdentifier() + "/charges/" + chargeDefinition.getIdentifier())
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .accept(MediaType.ALL_VALUE))
+                .andExpect(status().isOk())
+                .andDo(document("document-get-case-document", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()),
+                        responseFields(
+                                fieldWithPath("identifier").description("Charge definition's identifier"),
+                                fieldWithPath("name").description("Charge definitions given name"),
+                                fieldWithPath("description").description("Charge definitions description"),
+                                fieldWithPath("accrueAction").description("Charge definitions accrue action"),
+                                fieldWithPath("proportionalTo").description("Charge definitions proportional to"),
+                                fieldWithPath("accrualAccountDesignator").description("Charge definitions accrual acion generatort"),
+                                fieldWithPath("forCycleSizeUnit").description("Charge definitions cycle size unit"),
+                                fieldWithPath("forSegmentSet").description("Charge definitions segment set"),
+                                fieldWithPath("fromSegment").description("Charge definitions from segment"),
+                                fieldWithPath("toSegment").description("Charge definitions to segment"),
+                                fieldWithPath("chargeOnTop").description("Charge definitions charge on top"),
+                                fieldWithPath("fromAccountDesignator").description("From account designator"),
+                                fieldWithPath("toAccountDesignator").description("To account designator"),
+                                fieldWithPath("amount").description("Charge definition's amount"),
+                                fieldWithPath("chargeMethod").description("Charge definitions charge method"),
+                                fieldWithPath("chargeAction").description("Charge definition's charge action"),
+                                fieldWithPath("description").description("Employee's middle name"),
+                                fieldWithPath("readOnly").description("Readability"))));
+    }
+
+    @Test
+    public void documentDeleteChargeDefinition () throws Exception{
+
+        final Product product = createProduct();
+
+        final ChargeDefinition chargeDefinitionToDelete = new ChargeDefinition();
+        chargeDefinitionToDelete.setAmount(BigDecimal.TEN);
+        chargeDefinitionToDelete.setIdentifier("random123");
+        chargeDefinitionToDelete.setName("account");
+        chargeDefinitionToDelete.setDescription("account charge definition");
+        chargeDefinitionToDelete.setChargeAction(Action.APPROVE.name());
+        chargeDefinitionToDelete.setChargeMethod(ChargeDefinition.ChargeMethod.FIXED);
+        chargeDefinitionToDelete.setToAccountDesignator(AccountDesignators.GENERAL_LOSS_ALLOWANCE);
+        chargeDefinitionToDelete.setFromAccountDesignator(AccountDesignators.INTEREST_ACCRUAL);
+        portfolioManager.createChargeDefinition(product.getIdentifier(), chargeDefinitionToDelete);
+        this.eventRecorder.wait(EventConstants.POST_CHARGE_DEFINITION,
+                new ChargeDefinitionEvent(product.getIdentifier(), chargeDefinitionToDelete.getIdentifier()));
+
+        this.mockMvc.perform(delete("/products/"+product.getIdentifier()+"/charges/" + chargeDefinitionToDelete.getIdentifier())
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .accept(MediaType.ALL_VALUE))
+                .andExpect(status().isAccepted())
+                .andDo(document("document-delete-charge-definition", preprocessResponse(prettyPrint())));
+    }
+
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/portfolio/LossProvisionApiDocumentation.java b/component-test/src/main/java/org/apache/fineract/cn/portfolio/LossProvisionApiDocumentation.java
new file mode 100644
index 0000000..c297245
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/portfolio/LossProvisionApiDocumentation.java
@@ -0,0 +1,127 @@
+package org.apache.fineract.cn.portfolio;
+
+
+import com.google.gson.Gson;
+import org.apache.fineract.cn.individuallending.api.v1.domain.product.LossProvisionConfiguration;
+import org.apache.fineract.cn.individuallending.api.v1.domain.product.LossProvisionStep;
+import org.apache.fineract.cn.portfolio.api.v1.domain.Product;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.restdocs.JUnitRestDocumentation;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.apache.fineract.cn.lang.config.TenantHeaderFilter.TENANT_HEADER;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.put;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint;
+import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
+import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields;
+import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+
+public class LossProvisionApiDocumentation extends AbstractPortfolioTest {
+
+    @Rule
+    public final JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation("build/doc/generated-snippets/test-lossprovision");
+
+    @Autowired
+    private WebApplicationContext context;
+
+    private MockMvc mockMvc;
+
+    @Before
+    public void setUp ( ) {
+
+        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
+                .apply(documentationConfiguration(this.restDocumentation))
+                .alwaysDo(document("{method-name}", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint())))
+                .build();
+    }
+
+    @Test
+    public void documentChangeLossProvisionConfiguration ( ) throws Exception {
+        final Product product = createAdjustedProduct(x -> {});
+
+
+        final List<LossProvisionStep> lossProvisionSteps = new ArrayList<>();
+        lossProvisionSteps.add(new LossProvisionStep(1, BigDecimal.valueOf(5_00, 2)));
+        final LossProvisionConfiguration lossProvisionConfiguration = new LossProvisionConfiguration(lossProvisionSteps);
+
+        individualLending.changeLossProvisionConfiguration(product.getIdentifier(), lossProvisionConfiguration);
+
+
+        Gson gson = new Gson();
+        this.mockMvc.perform(put("/individuallending/products/" + product.getIdentifier() + "/lossprovisionconfiguration")
+                .accept(MediaType.APPLICATION_JSON_VALUE)
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .header(TENANT_HEADER, tenantDataStoreContext.getTenantName())
+                .content(gson.toJson(lossProvisionConfiguration)))
+                .andExpect(status().isAccepted())
+                .andDo(document(
+                        "document-change-loss-provision-configuration", preprocessRequest(prettyPrint()),
+                        requestFields(
+                                fieldWithPath("lossProvisionSteps").type("List<LossProvisionSteps>").description("The loss provision configurations +\n" +
+                                        " +\n" +
+                                        "_LossProvisionSteps_ { +\n" +
+                                        "  *enum* _Type_ { +\n" +
+                                        "     daysLate, +\n" +
+                                        "     percentProvision, +\n" +
+                                        "  } +")
+                        )
+                ));
+    }
+
+    @Test
+    public void documentGetLossProvisionConfiguration ( ) throws Exception{
+
+        final Product product = createAdjustedProduct(x -> {});
+
+        final List<LossProvisionStep> lossProvisionSteps1 = new ArrayList<>();
+        lossProvisionSteps1.add(new LossProvisionStep(0, BigDecimal.valueOf(1_00, 2)));
+        lossProvisionSteps1.add(new LossProvisionStep(1, BigDecimal.valueOf(9_00, 2)));
+        lossProvisionSteps1.add(new LossProvisionStep(30, BigDecimal.valueOf(35_00, 2)));
+        lossProvisionSteps1.add(new LossProvisionStep(60, BigDecimal.valueOf(55_00, 2)));
+        final LossProvisionConfiguration lossProvisionConfiguration = new LossProvisionConfiguration(lossProvisionSteps1);
+
+        individualLending.changeLossProvisionConfiguration(product.getIdentifier(), lossProvisionConfiguration);
+
+        try {
+            this.mockMvc.perform(get("/individuallending/products/" + product.getIdentifier() + "/lossprovisionconfiguration")
+                    .accept(MediaType.APPLICATION_JSON_VALUE)
+                    .contentType(MediaType.APPLICATION_JSON_VALUE)
+                    .header(TENANT_HEADER, tenantDataStoreContext.getTenantName()))
+                    .andExpect(status().isOk())
+                    .andDo(document(
+                            "document-get-loss-provision-configuration", preprocessRequest(prettyPrint()),
+                            responseFields(
+                                    fieldWithPath("lossProvisionSteps").type("List<LossProvisionSteps>").description("The loss provision configurations +\n" +
+                                            " +\n" +
+                                            "_LossProvisionSteps_ { +\n" +
+                                            "  *enum* _Type_ { +\n" +
+                                            "     daysLate, +\n" +
+                                            "     percentProvision, +\n" +
+                                            "  } +")
+                            )
+                    ));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+
+    }
\ No newline at end of file
diff --git a/component-test/src/main/java/org/apache/fineract/cn/portfolio/PatternApiDocumentation.java b/component-test/src/main/java/org/apache/fineract/cn/portfolio/PatternApiDocumentation.java
new file mode 100644
index 0000000..da82448
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/portfolio/PatternApiDocumentation.java
@@ -0,0 +1,65 @@
+package org.apache.fineract.cn.portfolio;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.restdocs.JUnitRestDocumentation;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import static org.apache.fineract.cn.lang.config.TenantHeaderFilter.TENANT_HEADER;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint;
+import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
+import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+public class PatternApiDocumentation extends AbstractPortfolioTest {
+    @Rule
+    public final JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation("build/doc/generated-snippets/test-pattern");
+
+    @Autowired
+    private WebApplicationContext context;
+
+    private MockMvc mockMvc;
+
+    @Before
+    public void setUp ( ) {
+
+        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
+                .apply(documentationConfiguration(this.restDocumentation))
+                .alwaysDo(document("{method-name}", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint())))
+                .build();
+    }
+
+    @Test
+    public void documentGetPatterns ( ) throws Exception {
+
+        try {
+            this.mockMvc.perform(get("/patterns/")
+                    .accept(MediaType.APPLICATION_JSON_VALUE)
+                    .contentType(MediaType.APPLICATION_JSON_VALUE)
+                    .header(TENANT_HEADER, tenantDataStoreContext.getTenantName()))
+                    .andExpect(status().isOk())
+                    .andDo(document(
+                            "document-get-patterns", preprocessRequest(prettyPrint()),
+                            responseFields(
+                                    fieldWithPath("parameterPackage").description("Pattern's parameter package"),
+                                    fieldWithPath("accountAssignmentGroups").description("Pattern's groups"),
+                                    fieldWithPath("accountAssignmentsRequired").description("Pattern's account assignment status")
+                                    )
+
+                                    ));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/portfolio/PlannedPaymentsApiDocumentation.java b/component-test/src/main/java/org/apache/fineract/cn/portfolio/PlannedPaymentsApiDocumentation.java
new file mode 100644
index 0000000..a3c3102
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/portfolio/PlannedPaymentsApiDocumentation.java
@@ -0,0 +1,89 @@
+package org.apache.fineract.cn.portfolio;
+
+import com.google.gson.Gson;
+import org.apache.fineract.cn.portfolio.api.v1.domain.Case;
+import org.apache.fineract.cn.portfolio.api.v1.domain.Product;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.restdocs.JUnitRestDocumentation;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import static org.apache.fineract.cn.lang.config.TenantHeaderFilter.TENANT_HEADER;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint;
+import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
+import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields;
+import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+public class PlannedPaymentsApiDocumentation extends AbstractPortfolioTest {
+
+    @Rule
+    public final JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation("build/doc/generated-snippets/test-plannedpayments");
+
+    @Autowired
+    private WebApplicationContext context;
+
+    private MockMvc mockMvc;
+
+    @Before
+    public void setUp() {
+
+        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
+                .apply(documentationConfiguration(this.restDocumentation))
+                .alwaysDo(document("{method-name}", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint())))
+                .build();
+    }
+
+    @Test
+    public void documentGetPaymentScheduledForCase() throws Exception {
+        final Product product = createAndEnableProduct();
+        final Case caseInstance = createCase(product.getIdentifier());
+
+        this.mockMvc.perform(get("/individuallending/products/" + product.getIdentifier() + "/cases/" + caseInstance.getIdentifier() + "/plannedpayments")
+                .accept(MediaType.APPLICATION_JSON_VALUE)
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .header(TENANT_HEADER, tenantDataStoreContext.getTenantName()))
+                .andExpect(status().isOk())
+                .andDo(document(
+                        "document-get-payment-scheduled-for-case", preprocessRequest(prettyPrint()),
+                        responseFields(
+                                fieldWithPath("chargeNames").description("Charge names"),
+                                fieldWithPath("elements").description("Payments"),
+                                fieldWithPath("totalPages").description("Total number of pages "),
+                                fieldWithPath("totalElements").description("Total elements found"))));
+
+    }
+
+    @Test
+    public void documentGetPaymentScheduledForParameters() throws Exception {
+        final Product product = createAndEnableProduct();
+        final Case caseInstance = createCase(product.getIdentifier());
+
+        Gson gson = new Gson();
+        this.mockMvc.perform(post("/individuallending/products/" + product.getIdentifier() + "/plannedpayments")
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .content(gson.toJson(caseInstance)))
+                .andExpect(status().isOk())
+                .andDo(document("document-get-payment-scheduled-for-parameters", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()),
+                        requestFields(
+                                fieldWithPath("identifier").description("Cases's identifier"),
+                                fieldWithPath("productIdentifier").description("Products's identifier"),
+                                fieldWithPath("interest").description("Cases's interest"),
+                                fieldWithPath("parameters").description("cases's parameters"),
+                                fieldWithPath("accountAssignments").description("Cases's account assignment"),
+                                fieldWithPath("currentState").description("Cases's current state"))));
+
+    }
+
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/portfolio/ProductsApiDocumentation.java b/component-test/src/main/java/org/apache/fineract/cn/portfolio/ProductsApiDocumentation.java
new file mode 100644
index 0000000..4675a03
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/portfolio/ProductsApiDocumentation.java
@@ -0,0 +1,236 @@
+package org.apache.fineract.cn.portfolio;
+
+import com.google.gson.Gson;
+import org.apache.fineract.cn.portfolio.api.v1.domain.Product;
+import org.apache.fineract.cn.portfolio.api.v1.events.EventConstants;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.restdocs.JUnitRestDocumentation;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import static org.apache.fineract.cn.lang.config.TenantHeaderFilter.TENANT_HEADER;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint;
+import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
+import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields;
+import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+public class ProductsApiDocumentation extends AbstractPortfolioTest {
+
+    @Rule
+    public final JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation("build/doc/generated-snippets/test-product");
+
+    @Autowired
+    private WebApplicationContext context;
+
+    private MockMvc mockMvc;
+
+    @Before
+    public void setUp() {
+
+        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
+                .apply(documentationConfiguration(this.restDocumentation))
+                .alwaysDo(document("{method-name}", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint())))
+                .build();
+    }
+
+    @Test
+    public void documentCreateProduct() throws Exception {
+        final Product product = createAdjustedProduct(x -> {});
+         product.setIdentifier("agro11");
+
+        Gson gson = new Gson();
+        this.mockMvc.perform(post("/products/")
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .content(gson.toJson(product)))
+                .andExpect(status().isAccepted())
+                .andDo(document("document-create-product", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()),
+                        requestFields(
+                                fieldWithPath("identifier").description("Product's identifier"),
+                                fieldWithPath("name").description("Product's given name"),
+                                fieldWithPath("termRange").type("List<TermRange>").description("The term range +\n" +
+                                        " +\n" +
+                                        "_TermRange_ { +\n" +
+                                        "  *enum* _Type_ { +\n" +
+                                        "     temporalUnit, +\n" +
+                                        "     maximum, +\n" +
+                                        "  } +"),
+                                fieldWithPath("balanceRange").description("Product's balance range"),
+                                fieldWithPath("interestRange").description("Products interest Range"),
+                                fieldWithPath("interestBasis").description("Products's interest basis"),
+                                fieldWithPath("patternPackage").description("Product's pattern package"),
+                                fieldWithPath("description").description("product description"),
+                                fieldWithPath("currencyCode").description("Country currency code"),
+                                fieldWithPath("minorCurrencyUnitDigits").description("Country minor currency unit"),
+                                fieldWithPath("accountAssignments").description("Account Assignments"),
+                                fieldWithPath("parameters").description("Product's parameters"),
+                                fieldWithPath("enabled").description("Readability"))));
+
+    }
+
+
+    @Test
+    public void documentGetProducts() throws Exception {
+        final Product product = createAdjustedProduct(x -> {});
+
+       this.eventRecorder.wait(EventConstants.POST_PRODUCT, product.getIdentifier());
+
+        try {
+            this.mockMvc.perform(get("/products?pageIndex=0&size=200")
+                    .accept(MediaType.APPLICATION_JSON_VALUE)
+                    .contentType(MediaType.APPLICATION_JSON_VALUE)
+                    .header(TENANT_HEADER, tenantDataStoreContext.getTenantName()))
+                    .andExpect(status().isOk())
+                    .andDo(document(
+                            "document-get-products", preprocessRequest(prettyPrint()),
+                            responseFields(
+                                    fieldWithPath("identifier").description("Product's identifier"),
+                                    fieldWithPath("name").description("Product's given name"),
+                                    fieldWithPath("termRange").type("List<TermRange>").description("The term range +\n" +
+                                            " +\n" +
+                                            "_TermRange_ { +\n" +
+                                            "  *enum* _Type_ { +\n" +
+                                            "     temporalUnit, +\n" +
+                                            "     maximum, +\n" +
+                                            "  } +"),
+                                    fieldWithPath("balanceRange").description("Product's balance range"),
+                                    fieldWithPath("interestRange").description("Products interest Range"),
+                                    fieldWithPath("interestBasis").description("Products's interest basis"),
+                                    fieldWithPath("patternPackage").description("Product's pattern package"),
+                                    fieldWithPath("description").description("product description"),
+                                    fieldWithPath("currencyCode").description("Country currency code"),
+                                    fieldWithPath("minorCurrencyUnitDigits").description("Country minor currency unit"),
+                                    fieldWithPath("accountAssignments").description("Account Assignments"),
+                                    fieldWithPath("parameters").description("Product's parameters"),
+                                    fieldWithPath("enabled").description("Readability"))));
+    } catch (Exception e) {
+        e.printStackTrace();
+    }
+
+}
+
+    @Test
+    public void documentDeleteProducts() throws Exception {
+
+        final Product product = createAdjustedProduct(x -> {
+        });
+
+
+        this.mockMvc.perform(delete("/products/" + product.getIdentifier())
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .accept(MediaType.ALL_VALUE))
+                .andExpect(status().isAccepted())
+                .andDo(document("document-delete-products", preprocessResponse(prettyPrint())));
+
+    }
+
+    @Test
+    public void documentGetProduct() throws Exception {
+
+        final Product product = createAdjustedProduct(x -> {
+        });
+
+        this.mockMvc.perform(get("/products/" + product.getIdentifier())
+                .accept(MediaType.APPLICATION_JSON_VALUE)
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .header(TENANT_HEADER, tenantDataStoreContext.getTenantName()))
+                .andExpect(status().isOk())
+                .andDo(document(
+                        "document-get-product", preprocessRequest(prettyPrint()),
+                        responseFields(
+                                fieldWithPath("identifier").description("Charge definition's identifier"),
+                                fieldWithPath("name").description("Charge definitions given name"),
+                                fieldWithPath("termRange").type("List<TermRange>").description("The term range +\n" +
+                                        " +\n" +
+                                        "_TermRange_ { +\n" +
+                                        "  *enum* _Type_ { +\n" +
+                                        "     temporalUnit, +\n" +
+                                        "     maximum, +\n" +
+                                        "  } +"),
+                                fieldWithPath("balanceRange").description("From account designator"),
+                                fieldWithPath("interestRange").description("To account designator"),
+                                fieldWithPath("interestBasis").description("Charge definition's amount"),
+                                fieldWithPath("patternPackage").description("Charge definitions charge method"),
+                                fieldWithPath("description").description("Charge definitions charge method"),
+                                fieldWithPath("currencyCode").description("Charge definition's charge action"),
+                                fieldWithPath("minorCurrencyUnitDigits").description("Employee's middle name"),
+                                fieldWithPath("accountAssignments").description("Readability"),
+                                fieldWithPath("parameters").description("Readability"),
+                                fieldWithPath("enabled").description("Readability"),
+                                fieldWithPath("createdOn").description("Readability"),
+                                fieldWithPath("createdBy").description("Readability"),
+                                fieldWithPath("lastModifiedOn").description("Readability"),
+                                fieldWithPath("lastModifiedBy").description("Readability"))));
+
+}
+
+    @Test
+    public void documentChangeProduct() throws Exception {
+
+        final Product product = createAdjustedProduct(x -> {});
+        product.setName("akawo");
+
+        Gson gson = new Gson();
+        this.mockMvc.perform(put("/products/" + product.getIdentifier())
+                .accept(MediaType.APPLICATION_JSON_VALUE)
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .header(TENANT_HEADER, tenantDataStoreContext.getTenantName())
+                .content(gson.toJson(product)))
+                .andExpect(status().isAccepted())
+                .andDo(document(
+                        "document-change-product", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()),
+                        requestFields(
+                                fieldWithPath("identifier").description("Charge definition's identifier"),
+                                fieldWithPath("name").description("Charge definitions given name"),
+                                fieldWithPath("termRange").type("List<TermRange>").description("The term range +\n" +
+                                        " +\n" +
+                                        "_TermRange_ { +\n" +
+                                        "  *enum* _Type_ { +\n" +
+                                        "     temporalUnit, +\n" +
+                                        "     maximum, +\n" +
+                                        "  } +"),
+                                fieldWithPath("balanceRange").description("From account designator"),
+                                fieldWithPath("interestRange").description("To account designator"),
+                                fieldWithPath("interestBasis").description("Charge definition's amount"),
+                                fieldWithPath("patternPackage").description("Charge definitions charge method"),
+                                fieldWithPath("description").description("Charge definitions charge method"),
+                                fieldWithPath("currencyCode").description("Charge definition's charge action"),
+                                fieldWithPath("minorCurrencyUnitDigits").description("Employee's middle name"),
+                                fieldWithPath("accountAssignments").description("Readability"),
+                                fieldWithPath("parameters").description("Readability"),
+                                fieldWithPath("enabled").description("Readability"))));
+
+    }
+
+    @Test
+    public void documentGetIncompleteAccountAssignments () throws Exception {
+
+        final Product product = createAdjustedProduct(x -> {});
+
+        this.mockMvc.perform(get("/products/" + product.getIdentifier()+"/incompleteaccountassignments")
+                .accept(MediaType.APPLICATION_JSON_VALUE)
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .header(TENANT_HEADER, tenantDataStoreContext.getTenantName()))
+                .andExpect(status().isOk())
+                .andDo(document(
+                        "document-get-incomplete-account-assignments", preprocessRequest(prettyPrint()),
+                        responseFields(
+                               )));
+
+    }
+
+
+
+
+
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/portfolio/TaskDefinitionApiDocumentation.java b/component-test/src/main/java/org/apache/fineract/cn/portfolio/TaskDefinitionApiDocumentation.java
new file mode 100644
index 0000000..ee2f358
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/portfolio/TaskDefinitionApiDocumentation.java
@@ -0,0 +1,166 @@
+package org.apache.fineract.cn.portfolio;
+
+import com.google.gson.Gson;
+import org.apache.fineract.cn.portfolio.api.v1.domain.Product;
+import org.apache.fineract.cn.portfolio.api.v1.domain.TaskDefinition;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.restdocs.JUnitRestDocumentation;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import static org.apache.fineract.cn.lang.config.TenantHeaderFilter.TENANT_HEADER;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint;
+import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
+import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields;
+import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+public class TaskDefinitionApiDocumentation extends AbstractPortfolioTest {
+
+    @Rule
+    public final JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation("build/doc/generated-snippets/test-taskdefinition");
+
+    @Autowired
+    private WebApplicationContext context;
+
+    private MockMvc mockMvc;
+
+    @Before
+    public void setUp ( ) {
+
+        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
+                .apply(documentationConfiguration(this.restDocumentation))
+                .alwaysDo(document("{method-name}", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint())))
+                .build();
+    }
+
+    @Test
+    public void documentListTaskDefinitions ( ) throws Exception {
+        final Product product = createProduct();
+
+        try {
+            this.mockMvc.perform(get("/products/" +product.getIdentifier()+"/tasks/")
+                    .accept(MediaType.APPLICATION_JSON_VALUE)
+                    .contentType(MediaType.APPLICATION_JSON_VALUE)
+                    .header(TENANT_HEADER, tenantDataStoreContext.getTenantName()))
+                    .andExpect(status().isOk())
+                    .andDo(document(
+                            "document-list-task-definitions", preprocessRequest(prettyPrint()),
+                            responseFields(
+                                    fieldWithPath("identifier").type("String").description("task identifier's identifier"),
+                                    fieldWithPath("name").type("String").description("task identifier's name"),
+                                    fieldWithPath("description").type("String").description("task identifier's description"),
+                                    fieldWithPath("actions").description("The task definition action"),
+                                    fieldWithPath("fourEyes").type("String").description("task identifier's identifier"),
+                                    fieldWithPath("mandatory").type("String").description("task identifier's identifier")
+                            )
+                    ));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+
+    @Test
+    public void documentGetTaskDefinition ( ) throws Exception {
+        final Product product = createProduct();
+        final TaskDefinition taskDefinition = createTaskDefinition(product);
+
+        try {
+            this.mockMvc.perform(get("/products/" +product.getIdentifier()+"/tasks/" +taskDefinition.getIdentifier())
+                    .accept(MediaType.APPLICATION_JSON_VALUE)
+                    .contentType(MediaType.APPLICATION_JSON_VALUE)
+                    .header(TENANT_HEADER, tenantDataStoreContext.getTenantName()))
+                    .andExpect(status().isOk())
+                    .andDo(document(
+                            "document-get-task-definition", preprocessRequest(prettyPrint()),
+                            responseFields(
+                                    fieldWithPath("identifier").type("String").description("task identifier's identifier"),
+                                    fieldWithPath("name").type("String").description("task identifier's name"),
+                                    fieldWithPath("description").type("String").description("task identifier's description"),
+                                    fieldWithPath("actions").description("The task definition action"),
+                                    fieldWithPath("fourEyes").type("String").description("task identifier's identifier"),
+                                    fieldWithPath("mandatory").type("String").description("task identifier's identifier")
+                            )
+                    ));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    @Test
+    public void documentChangeTaskDefinition () throws Exception {
+
+        final Product product = createProduct();
+        final TaskDefinition taskDefinition = createTaskDefinition(product);
+        taskDefinition.setDescription("Describe task definition");
+        taskDefinition.setFourEyes(false);
+
+        Gson gson = new Gson();
+        this.mockMvc.perform(put("/products/" + product.getIdentifier() + "/tasks/" +taskDefinition.getIdentifier() )
+                .accept(MediaType.APPLICATION_JSON_VALUE)
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .header(TENANT_HEADER, tenantDataStoreContext.getTenantName())
+                .content(gson.toJson(taskDefinition)))
+                .andExpect(status().isAccepted())
+                .andDo(document(
+                        "document-change-task-definition", preprocessRequest(prettyPrint()),
+                        requestFields(
+                                fieldWithPath("identifier").type("String").description("task identifier's identifier"),
+                                fieldWithPath("name").type("String").description("task identifier's name"),
+                                fieldWithPath("description").type("String").description("task identifier's description"),
+                                fieldWithPath("actions").description("The task definition action"),
+                                fieldWithPath("fourEyes").type("String").description("task identifier's identifier"),
+                                fieldWithPath("mandatory").type("String").description("task identifier's identifier")
+                        )
+
+                        ));
+
+    }
+
+    @Test
+    public void documentAddTaskDefinition () throws Exception {
+
+        final Product product = createProduct();
+        final TaskDefinition taskDefinition = createTaskDefinition(product);
+        taskDefinition.setIdentifier("ask");
+
+        Gson gson = new Gson();
+        this.mockMvc.perform(post("/products/"+product.getIdentifier()+"/tasks/")
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .content(gson.toJson(taskDefinition)))
+                .andExpect(status().isAccepted())
+                .andDo(document("document-add-task-definition", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()),
+                        requestFields(
+                                fieldWithPath("identifier").type("String").description("task identifier's identifier"),
+                                fieldWithPath("name").type("String").description("task identifier's name"),
+                                fieldWithPath("description").type("String").description("task identifier's description"),
+                                fieldWithPath("actions").description("The task definition action"),
+                                fieldWithPath("fourEyes").type("String").description("task identifier's identifier"),
+                                fieldWithPath("mandatory").type("String").description("task identifier's identifier"))));
+    }
+
+    @Test
+    public void documentDeleteTaskDefinition () throws Exception {
+        final Product product = createProduct();
+        final TaskDefinition taskDefinition = createTaskDefinition(product);
+
+        this.mockMvc.perform(delete("/products/"+product.getIdentifier()+"/tasks/" + taskDefinition.getIdentifier())
+                .contentType(MediaType.APPLICATION_JSON_VALUE)
+                .accept(MediaType.ALL_VALUE))
+                .andExpect(status().isAccepted())
+                .andDo(document("document-delete-task-definition", preprocessResponse(prettyPrint())));
+    }
+}


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services