From fc240c4976d92adb53ded051c68100191fed1b72 Mon Sep 17 00:00:00 2001
From: Epari <xtetauer@fi.muni.cz>
Date: Wed, 24 Apr 2024 12:31:44 +0200
Subject: [PATCH] Controller integration tests

---
 .../obs/controller/AnalyticsController.java   |  3 +-
 .../AnalyticsControllerIntegrationTest.java   | 86 ++++++++++++++++---
 .../controller/AnalyticsControllerTest.java   |  8 +-
 3 files changed, 82 insertions(+), 15 deletions(-)

diff --git a/analytics-service/src/main/java/cz/muni/fi/obs/controller/AnalyticsController.java b/analytics-service/src/main/java/cz/muni/fi/obs/controller/AnalyticsController.java
index 9593590..1e2865e 100644
--- a/analytics-service/src/main/java/cz/muni/fi/obs/controller/AnalyticsController.java
+++ b/analytics-service/src/main/java/cz/muni/fi/obs/controller/AnalyticsController.java
@@ -13,9 +13,10 @@ import org.springframework.web.bind.annotation.*;
 
 @Slf4j
 @RestController
-@RequestMapping("/api/v1/{accountNumber}")
+@RequestMapping("/v1/{accountNumber}")
 public class AnalyticsController {
     private final AnalyticsFacade analyticsFacade;
+
     @Autowired
     public AnalyticsController(AnalyticsFacade analyticsFacade) {
         this.analyticsFacade = analyticsFacade;
diff --git a/analytics-service/src/test/java/cz/muni/fi/obs/integration/controller/AnalyticsControllerIntegrationTest.java b/analytics-service/src/test/java/cz/muni/fi/obs/integration/controller/AnalyticsControllerIntegrationTest.java
index ec8b85b..2e1126c 100644
--- a/analytics-service/src/test/java/cz/muni/fi/obs/integration/controller/AnalyticsControllerIntegrationTest.java
+++ b/analytics-service/src/test/java/cz/muni/fi/obs/integration/controller/AnalyticsControllerIntegrationTest.java
@@ -1,11 +1,8 @@
 package cz.muni.fi.obs.integration.controller;
 
 import cz.muni.fi.obs.Application;
-import cz.muni.fi.obs.api.DailySummaryRequest;
-import cz.muni.fi.obs.api.DailySummaryResult;
-import cz.muni.fi.obs.data.AnalyticsRepository;
+import cz.muni.fi.obs.api.*;
 import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.jdbc.Sql;
@@ -13,18 +10,15 @@ import org.springframework.web.util.UriComponents;
 import org.springframework.web.util.UriComponentsBuilder;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.AFTER_TEST_METHOD;
+import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.AFTER_TEST_CLASS;
 import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_CLASS;
 
 @Sql(value = {"/initialize_db.sql"}, executionPhase = BEFORE_TEST_CLASS)
-@Sql(value = {"/drop_all.sql"}, executionPhase = AFTER_TEST_METHOD)
+@Sql(value = {"/drop_all.sql"}, executionPhase = AFTER_TEST_CLASS)
 @ContextConfiguration(classes = {Application.class})
 public class AnalyticsControllerIntegrationTest extends ControllerIntegrationTest {
 
-    private static final String ANALYTICS_CONTROLLER_PATH = "/api/analytics-service/api/v1/{account_number}/";
-
-    @Autowired
-    private AnalyticsRepository analyticsRepository;
+    private static final String ANALYTICS_CONTROLLER_PATH = "/api/analytics-service/v1/{account_number}/";
 
     @Test
     void createDailySummary_ValidRequest_CreatesCorrectSummary() {
@@ -44,5 +38,77 @@ public class AnalyticsControllerIntegrationTest extends ControllerIntegrationTes
                 .as(DailySummaryResult.class);
 
         assertThat(dailySummaryResult.summaries()).hasSize(3);
+
+        DailySummary firstSummary = dailySummaryResult.summaries().getFirst();
+
+        assertThat(firstSummary.date()).isEqualTo("2021-01-01");
+        assertThat(firstSummary.totalWithdrawalTransactions()).isEqualTo(5);
+        assertThat(firstSummary.totalDepositTransactions()).isEqualTo(5);
+        assertThat(firstSummary.totalWithdrawn()).isEqualTo("20000.00");
+        assertThat(firstSummary.totalDeposited()).isEqualTo("10000.00");
+        assertThat(firstSummary.averageWithdrawn()).isEqualTo("4000.00");
+        assertThat(firstSummary.averageDeposited()).isEqualTo("2000.00");
+        assertThat(firstSummary.difference()).isEqualTo("-10000.00");
+    }
+
+    @Test
+    void createDailySummary_InvalidRequest_ReturnsBadRequest() {
+        UriComponents components = UriComponentsBuilder.
+                fromPath(ANALYTICS_CONTROLLER_PATH + "daily-summary")
+                .buildAndExpand("1234567890");
+
+        DailySummaryRequest request = new DailySummaryRequest(2021, 13);
+
+        requestSpecification(components)
+                .accept(MediaType.APPLICATION_JSON_VALUE)
+                .body(request)
+                .post()
+                .then()
+                .statusCode(400);
+    }
+
+    @Test
+    void createMonthlySummary_ValidRequest_CreatesCorrectSummary() {
+        UriComponents components = UriComponentsBuilder.
+                fromPath(ANALYTICS_CONTROLLER_PATH + "monthly-summary")
+                .buildAndExpand("1234567890");
+
+        MonthlySummaryRequest request = new MonthlySummaryRequest(2021, 1);
+
+        MonthlySummaryResult monthlySummaryResult = requestSpecification(components)
+                .accept(MediaType.APPLICATION_JSON_VALUE)
+                .body(request)
+                .post()
+                .then()
+                .statusCode(200)
+                .extract()
+                .as(MonthlySummaryResult.class);
+
+        MonthlySummary summary = monthlySummaryResult.summary();
+
+        assertThat(summary.month()).isEqualTo("JANUARY");
+        assertThat(summary.totalWithdrawalTransactions()).isEqualTo(19);
+        assertThat(summary.totalDepositTransactions()).isEqualTo(17);
+        assertThat(summary.totalWithdrawn()).isEqualTo("48000.00");
+        assertThat(summary.totalDeposited()).isEqualTo("32000.00");
+        assertThat(summary.averageWithdrawn()).isEqualTo("2526.32");
+        assertThat(summary.averageDeposited()).isEqualTo("1882.35");
+        assertThat(summary.difference()).isEqualTo("-16000.00");
+    }
+
+    @Test
+    void createMonthlySummary_InvalidRequest_ReturnsBadRequest() {
+        UriComponents components = UriComponentsBuilder.
+                fromPath(ANALYTICS_CONTROLLER_PATH + "monthly-summary")
+                .buildAndExpand("1234567890");
+
+        MonthlySummaryRequest request = new MonthlySummaryRequest(2021, 13);
+
+        requestSpecification(components)
+                .accept(MediaType.APPLICATION_JSON_VALUE)
+                .body(request)
+                .post()
+                .then()
+                .statusCode(400);
     }
 }
\ No newline at end of file
diff --git a/analytics-service/src/test/java/cz/muni/fi/obs/unit/controller/AnalyticsControllerTest.java b/analytics-service/src/test/java/cz/muni/fi/obs/unit/controller/AnalyticsControllerTest.java
index 81be1ab..a223b56 100644
--- a/analytics-service/src/test/java/cz/muni/fi/obs/unit/controller/AnalyticsControllerTest.java
+++ b/analytics-service/src/test/java/cz/muni/fi/obs/unit/controller/AnalyticsControllerTest.java
@@ -45,7 +45,7 @@ class AnalyticsControllerTest {
         when(analyticsFacade.getDailySummary(any(String.class), any(Integer.class), any(Integer.class)))
                 .thenReturn(new DailySummaryResult(LocalDate.now(), new ArrayList<>()));
 
-        mockMvc.perform(post("/api/v1/12345/daily-summary")
+        mockMvc.perform(post("/v1/12345/daily-summary")
                         .contentType(MediaType.APPLICATION_JSON)
                         .content(objectMapper.writeValueAsString(new DailySummaryRequest(2021, 1))))
                 .andExpect(status().isOk());
@@ -58,7 +58,7 @@ class AnalyticsControllerTest {
         when(analyticsFacade.getDailySummary(any(String.class), any(Integer.class), any(Integer.class)))
                 .thenReturn(new DailySummaryResult(LocalDate.now(), new ArrayList<>()));
 
-        mockMvc.perform(post("/api/v1/12345/daily-summary")
+        mockMvc.perform(post("/v1/12345/daily-summary")
                         .contentType(MediaType.APPLICATION_JSON)
                         .content(objectMapper.writeValueAsString(new DailySummaryRequest(2021, -1))))
                 .andExpect(status().isBadRequest());
@@ -70,7 +70,7 @@ class AnalyticsControllerTest {
         when(analyticsFacade.getMonthlySummary(any(String.class), any(Integer.class), any(Integer.class)))
                 .thenReturn(new MonthlySummaryResult(LocalDate.now(), null));
 
-        mockMvc.perform(post("/api/v1/12345/monthly-summary")
+        mockMvc.perform(post("/v1/12345/monthly-summary")
                         .contentType(MediaType.APPLICATION_JSON)
                         .content(objectMapper.writeValueAsString(new MonthlySummaryRequest(2021, 1))))
                 .andExpect(status().isOk());
@@ -83,7 +83,7 @@ class AnalyticsControllerTest {
         when(analyticsFacade.getMonthlySummary(any(String.class), any(Integer.class), any(Integer.class)))
                 .thenReturn(new MonthlySummaryResult(LocalDate.now(), null));
 
-        mockMvc.perform(post("/api/v1/12345/monthly-summary")
+        mockMvc.perform(post("/v1/12345/monthly-summary")
                         .contentType(MediaType.APPLICATION_JSON)
                         .content(objectMapper.writeValueAsString(new MonthlySummaryRequest(-10, 1))))
                 .andExpect(status().isBadRequest());
-- 
GitLab