This is an automated email from the ASF dual-hosted git repository. ikamga pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git
commit 6063af7975bae9defbfd1bb6b108e82fda3d4fef Author: Isaac Kamga <[email protected]> AuthorDate: Wed Jan 2 21:52:06 2019 +0100 Document the notifications service --- component-test/build.gradle | 11 ++ ...fication.java => AbstractNotificationTest.java} | 8 +- .../cn/notification/EmailApiDocumentation.java | 128 +++++++++++++++++++++ .../cn/notification/SmsApiDocumentation.java | 118 +++++++++++++++++++ .../fineract/cn/notification/TestEmailService.java | 2 +- .../fineract/cn/notification/TestSMSService.java | 3 +- .../service/listener/CustomerEventListener.java | 18 +++ 7 files changed, 281 insertions(+), 7 deletions(-) diff --git a/component-test/build.gradle b/component-test/build.gradle index 2e29cf4..55f1d42 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.3") } } @@ -34,6 +35,7 @@ plugins { id("org.nosphere.apache.rat") version "0.3.1" } apply from: '../shared.gradle' +apply plugin: 'org.asciidoctor.convert' dependencies { compile( @@ -44,9 +46,18 @@ dependencies { [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.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 { publications { mavenJava(MavenPublication) { diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/TestNotification.java b/component-test/src/main/java/org/apache/fineract/cn/notification/AbstractNotificationTest.java similarity index 95% rename from component-test/src/main/java/org/apache/fineract/cn/notification/TestNotification.java rename to component-test/src/main/java/org/apache/fineract/cn/notification/AbstractNotificationTest.java index 6a6bf6b..545d4f5 100644 --- a/component-test/src/main/java/org/apache/fineract/cn/notification/TestNotification.java +++ b/component-test/src/main/java/org/apache/fineract/cn/notification/AbstractNotificationTest.java @@ -47,8 +47,8 @@ import java.security.interfaces.RSAPrivateKey; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT, - classes = {TestNotification.TestConfiguration.class}) -public class TestNotification extends SuiteTestEnvironment { + classes = {AbstractNotificationTest.TestConfiguration.class}) +public class AbstractNotificationTest extends SuiteTestEnvironment { @ClassRule public final static TenantDataStoreContextTestRule tenantDataStoreContext = TenantDataStoreContextTestRule.forRandomTenantName(cassandraInitializer, mariaDBInitializer); @@ -65,13 +65,13 @@ public class TestNotification extends SuiteTestEnvironment { public final TenantApplicationSecurityEnvironmentTestRule tenantApplicationSecurityEnvironment = new TenantApplicationSecurityEnvironmentTestRule(testEnvironment, this::waitForInitialize); - public TestNotification() { + public AbstractNotificationTest() { super(); } @Before public void prepTest() { - userContext = tenantApplicationSecurityEnvironment.createAutoUserContext(TestNotification.TEST_USER); + userContext = tenantApplicationSecurityEnvironment.createAutoUserContext(AbstractNotificationTest.TEST_USER); final RSAPrivateKey tenantPrivateKey = tenantApplicationSecurityEnvironment.getSystemSecurityEnvironment().tenantPrivateKey(); logger.info("tenantPrivateKey = {}", tenantPrivateKey); } diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/EmailApiDocumentation.java b/component-test/src/main/java/org/apache/fineract/cn/notification/EmailApiDocumentation.java new file mode 100644 index 0000000..1632f0c --- /dev/null +++ b/component-test/src/main/java/org/apache/fineract/cn/notification/EmailApiDocumentation.java @@ -0,0 +1,128 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.cn.notification; + +import com.google.gson.Gson; +import org.apache.commons.lang.RandomStringUtils; +import org.apache.fineract.cn.notification.api.v1.client.NotificationManager; +import org.apache.fineract.cn.notification.api.v1.domain.EmailConfiguration; +import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants; +import org.apache.fineract.cn.notification.util.DomainObjectGenerator; +import org.apache.fineract.cn.test.listener.EventRecorder; +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.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.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +public class EmailApiDocumentation extends AbstractNotificationTest { + @Rule + public final JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation("build/doc/generated-snippets/document-email"); + + @Autowired + private WebApplicationContext context; + + private MockMvc mockMvc; + + @Autowired + private NotificationManager notificationManager; + + @Autowired + private EventRecorder eventRecorder; + + @Before + public void setUp() { + + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context) + .apply(documentationConfiguration(this.restDocumentation)) + .build(); + } + + @Test + public void documentCreateEmailConfiguration() throws Exception { + final EmailConfiguration emailConfiguration = DomainObjectGenerator.emailConfiguration(); + + Gson gson = new Gson(); + this.mockMvc.perform(post("/notification/email/create") + .accept(MediaType.APPLICATION_JSON_VALUE) + .contentType(MediaType.APPLICATION_JSON_VALUE) + .content(gson.toJson(emailConfiguration))) + .andExpect(status().isAccepted()) + .andDo(document("document-create-emailconfiguration", preprocessRequest(prettyPrint()), + requestFields( + fieldWithPath("identifier").description("EmailConfiguration's identifier"), + fieldWithPath("host").description("EmailConfiguration's host"), + fieldWithPath("port").description("EmailConfiguration's port"), + fieldWithPath("protocol").description("EmailConfiguration's protocol"), + fieldWithPath("username").description("EmailConfiguration's username"), + fieldWithPath("app_password").description("EmailConfiguration's app_password"), + fieldWithPath("smtp_auth").description("EmailConfiguration's smtp authentication"), + fieldWithPath("start_tls").description("EmailConfiguration's start tls"), + fieldWithPath("state").description("EmailConfiguration's state") + ) + )); + } + + @Test + public void documentFindEmailConfiguration() throws Exception { + final EmailConfiguration emailConfiguration = EmailConfiguration.create("emailtesty", + "smtp.google.com", + "1233", + "smtp", + "example", + RandomStringUtils.randomAlphanumeric(16), + "true", + "true", + "ACTIVE"); + + this.notificationManager.createEmailConfiguration(emailConfiguration); + eventRecorder.wait(NotificationEventConstants.POST_EMAIL_CONFIGURATION, EmailConfiguration.class); + + this.mockMvc.perform(get("/notification/email/" + emailConfiguration.getIdentifier()) + .accept(MediaType.ALL_VALUE) + .contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()) + .andDo(document("document-find-emailconfiguration", preprocessRequest(prettyPrint()), + responseFields( + fieldWithPath("identifier").description("EmailConfiguration's identifier"), + fieldWithPath("host").description("EmailConfiguration's host"), + fieldWithPath("port").description("EmailConfiguration's port"), + fieldWithPath("protocol").description("EmailConfiguration's protocol"), + fieldWithPath("username").description("EmailConfiguration's username"), + fieldWithPath("app_password").description("EmailConfiguration's app_password"), + fieldWithPath("smtp_auth").description("EmailConfiguration's smtp authentication"), + fieldWithPath("start_tls").description("EmailConfiguration's start tls"), + fieldWithPath("state").description("EmailConfiguration's state") + ) + )); + } +} diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/SmsApiDocumentation.java b/component-test/src/main/java/org/apache/fineract/cn/notification/SmsApiDocumentation.java new file mode 100644 index 0000000..1655289 --- /dev/null +++ b/component-test/src/main/java/org/apache/fineract/cn/notification/SmsApiDocumentation.java @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.cn.notification; + +import com.google.gson.Gson; +import org.apache.commons.lang.RandomStringUtils; +import org.apache.fineract.cn.notification.api.v1.client.NotificationManager; +import org.apache.fineract.cn.notification.api.v1.domain.SMSConfiguration; +import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants; +import org.apache.fineract.cn.notification.util.DomainObjectGenerator; +import org.apache.fineract.cn.test.listener.EventRecorder; +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.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.get; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +public class SmsApiDocumentation extends AbstractNotificationTest { + @Rule + public final JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation("build/doc/generated-snippets/document-sms"); + + @Autowired + private WebApplicationContext context; + + private MockMvc mockMvc; + + @Autowired + private NotificationManager notificationManager; + + @Autowired + private EventRecorder eventRecorder; + + @Before + public void setUp() { + + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context) + .apply(documentationConfiguration(this.restDocumentation)) + .build(); + } + + @Test + public void documentCreateSMSConfiguration() throws Exception { + final SMSConfiguration smsConfiguration = DomainObjectGenerator.smsConfiguration(); + + Gson gson = new Gson(); + this.mockMvc.perform(post("/notification/sms/create") + .accept(MediaType.APPLICATION_JSON_VALUE) + .contentType(MediaType.APPLICATION_JSON_VALUE) + .content(gson.toJson(smsConfiguration))) + .andExpect(status().isAccepted()) + .andDo(document("document-create-smsconfiguration", preprocessRequest(prettyPrint()), + requestFields( + fieldWithPath("identifier").description("SMSConfiguration's identifier"), + fieldWithPath("auth_token").description("SMSConfiguration's auth_token"), + fieldWithPath("account_sid").description("SMSConfiguration's account_sid"), + fieldWithPath("sender_number").description("Sender's number"), + fieldWithPath("state").description("SMSConfiguration's state") + ) + )); + } + + @Test + public void documentFindSMSConfiguration() throws Exception { + + final SMSConfiguration smsConfiguration = SMSConfiguration.create(RandomStringUtils.randomAlphanumeric(4), + RandomStringUtils.randomAlphanumeric(8), + RandomStringUtils.randomAlphanumeric(8), + "+309483932", + "ACTIVE"); + + this.notificationManager.createSMSConfiguration(smsConfiguration); + this.eventRecorder.wait(NotificationEventConstants.POST_SMS_CONFIGURATION, SMSConfiguration.class); + + this.mockMvc.perform(get("/notification/sms/" + smsConfiguration.getIdentifier()) + .accept(MediaType.ALL_VALUE) + .contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()) + .andDo(document("document-find-smsconfiguration", preprocessRequest(prettyPrint()), + responseFields( + fieldWithPath("type").description("SMSConfiguration's type"), + fieldWithPath("identifier").description("SMSConfiguration's identifier"), + fieldWithPath("auth_token").description("SMSConfiguration's auth_token"), + fieldWithPath("account_sid").description("SMSConfiguration's account_sid"), + fieldWithPath("sender_number").description("Sender's number"), + fieldWithPath("state").description("SMSConfiguration's state") + ) + )); + } +} diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/TestEmailService.java b/component-test/src/main/java/org/apache/fineract/cn/notification/TestEmailService.java index 90f73c7..2855f68 100644 --- a/component-test/src/main/java/org/apache/fineract/cn/notification/TestEmailService.java +++ b/component-test/src/main/java/org/apache/fineract/cn/notification/TestEmailService.java @@ -32,7 +32,7 @@ import org.junit.Assert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; -public class TestEmailService extends TestNotification { +public class TestEmailService extends AbstractNotificationTest { private final String configIdentifier = "Gmail"; @Autowired diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/TestSMSService.java b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSMSService.java index e25a3e8..33536ed 100644 --- a/component-test/src/main/java/org/apache/fineract/cn/notification/TestSMSService.java +++ b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSMSService.java @@ -23,7 +23,6 @@ import org.apache.fineract.cn.api.util.NotFoundException; import org.apache.fineract.cn.customer.api.v1.client.CustomerNotFoundException; import org.apache.fineract.cn.notification.api.v1.client.ConfigurationNotFoundException; import org.apache.fineract.cn.notification.api.v1.client.NotificationManager; -import org.apache.fineract.cn.notification.api.v1.domain.EmailConfiguration; import org.apache.fineract.cn.notification.api.v1.domain.SMSConfiguration; import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants; import org.apache.fineract.cn.notification.service.internal.service.NotificationService; @@ -33,7 +32,7 @@ import org.junit.Assert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; -public class TestSMSService extends TestNotification { +public class TestSMSService extends AbstractNotificationTest { @Autowired private NotificationService notificationService; diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java index d1cb4d6..78889a3 100644 --- a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java +++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file
