From 6938b764fcf5dcfa13134fd3077a42136b25ec01 Mon Sep 17 00:00:00 2001 From: TakahashiNguyen Date: Tue, 31 Mar 2026 10:07:49 +0000 Subject: [PATCH] chore: add test (#11) Co-authored-by: TakahashiNg <83152264+TakahashiNguyen@users.noreply.github.com> Co-authored-by: TranHuuDanh Reviewed-on: https://git.demonkernel.io.vn/FoodSurf/backend/pulls/11 --- .devcontainer/devcontainer.json | 6 +- .devcontainer/docker-compose.main.yaml | 2 - .gitea/workflows/test.yaml | 12 +- .releaserc.json | 2 +- .../com/drinkool/models/UserModelTest.java | 41 +++++ .../services/AuthenticationServiceTest.java | 150 ++++++++++++++++++ .../src/test/resources/application.properties | 9 +- .../com/drinkool/entities/MenuItemEntity.java | 4 +- .../services/InventoryServiceTest.java | 2 + .../src/test/resources/application.properties | 3 +- lib/pom.xml | 4 +- pom.xml | 2 +- 12 files changed, 219 insertions(+), 18 deletions(-) create mode 100644 account-service/src/test/java/com/drinkool/services/AuthenticationServiceTest.java diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 4f74317..7abd761 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -21,6 +21,8 @@ } }, "containerEnv": { - "TESTCONTAINERS_RYUK_DISABLED": "true" - } + "TESTCONTAINERS_RYUK_DISABLED": "true", + "QUARKUS_DEBUG_HOST": "0.0.0.0" + }, + "forwardPorts": [5005] } diff --git a/.devcontainer/docker-compose.main.yaml b/.devcontainer/docker-compose.main.yaml index 19ee4fa..9cece89 100644 --- a/.devcontainer/docker-compose.main.yaml +++ b/.devcontainer/docker-compose.main.yaml @@ -1,6 +1,4 @@ include: - - ./docker-compose.kafka.yaml - - ./docker-compose.postgres.yaml - ./docker-compose.redis.yaml services: diff --git a/.gitea/workflows/test.yaml b/.gitea/workflows/test.yaml index 34c56a1..0c20b6c 100644 --- a/.gitea/workflows/test.yaml +++ b/.gitea/workflows/test.yaml @@ -5,6 +5,10 @@ on: branches: - main +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: build-and-test: runs-on: ubuntu-latest @@ -14,11 +18,15 @@ jobs: with: fetch-depth: 0 + - uses: shogo82148/actions-setup-redis@v1 + with: + redis-version: "7.x" + - name: Set up JDK uses: actions/setup-java@v5 with: distribution: "temurin" - java-version: "25" + java-version: "21" - name: Cache Maven packages uses: actions/cache@v4 @@ -29,7 +37,7 @@ jobs: ${{ runner.os }}-maven- - name: Build and Test all modules - run: ./mvnw -B clean verify -Dquarkus.container-image.build=false -Dquarkus.container-image.push=false + run: ./mvnw -B install -Dquarkus.container-image.build=false -Dquarkus.container-image.push=false - name: Publish Test Report uses: scacap/action-surefire-report@v1 diff --git a/.releaserc.json b/.releaserc.json index f4a8e32..9b65fa2 100644 --- a/.releaserc.json +++ b/.releaserc.json @@ -15,7 +15,7 @@ "@semantic-release/exec", { "prepareCmd": "./mvnw versions:set -DnewVersion=${nextRelease.version}", - "publishCmd": "if [ \"${branch.name}\" = \"main\" ]; then ./mvnw clean package -Dquarkus.container-image.tag=${nextRelease.version} -DskipTests; fi" + "publishCmd": "if [ \"${branch.name}\" = \"main\" ]; then ./mvnw package -Dquarkus.container-image.tag=${nextRelease.version} -DskipTests; fi" } ], [ diff --git a/account-service/src/test/java/com/drinkool/models/UserModelTest.java b/account-service/src/test/java/com/drinkool/models/UserModelTest.java index 01a5cdf..ad305cf 100644 --- a/account-service/src/test/java/com/drinkool/models/UserModelTest.java +++ b/account-service/src/test/java/com/drinkool/models/UserModelTest.java @@ -77,4 +77,45 @@ public class UserModelTest { assertEquals("InvalidPhoneNumber", exception.getMessage()); } + + @Test + @Transactional + public void testLoginSuccess() { + //dang nhap thanh cong + TestUserEntity user = new TestUserEntity(); + String phone = + "+8477" + String.format("%07d", (new Random()).nextInt(10000000)); + String password = "02092006Danh"; + user.signup("Tran Huu Danh", phone, password); + + Boolean loginResult = user.login(password); + + assertTrue(loginResult); + } + + @Test + @Transactional + public void testLoginFailWrongPassword() { + //dang nhap that bai + TestUserEntity user = new TestUserEntity(); + String phone = + "+8477" + String.format("%07d", (new Random()).nextInt(10000000)); + String truePassword = "02092006Danh"; + String wrongPassword = "02092006danhh"; + + user.signup("Tran Huu Danh", phone, truePassword); + Boolean wrongTest = user.login(wrongPassword); + + assertFalse(wrongTest); + } + + @Test + @Transactional + public void testLoginFailNullHashedPassword() { + TestUserEntity user = new TestUserEntity(); + user.hashedPassword = null; + + boolean loginResult = user.login("anhdomixi"); + assertFalse(loginResult); + } } diff --git a/account-service/src/test/java/com/drinkool/services/AuthenticationServiceTest.java b/account-service/src/test/java/com/drinkool/services/AuthenticationServiceTest.java new file mode 100644 index 0000000..f7d15f5 --- /dev/null +++ b/account-service/src/test/java/com/drinkool/services/AuthenticationServiceTest.java @@ -0,0 +1,150 @@ +package com.drinkool.services; + +import static io.restassured.RestAssured.given; +import static org.junit.jupiter.api.Assertions.*; + +import com.drinkool.dtos.*; +import com.drinkool.entities.CustomerEntity; +import io.quarkus.test.junit.QuarkusTest; +import io.restassured.http.ContentType; +import java.util.Random; +import org.junit.jupiter.api.Test; + +@QuarkusTest +public class AuthenticationServiceTest { + + private Random random = new Random(); + + private String generateRandomPhone() { + return "+8477" + String.format("%07d", random.nextInt(10000000)); + } + + @Test + void testSignup() { + String phone = generateRandomPhone(); + Signup input = new Signup(); + input.name = "Test User"; + input.phone = phone; + input.password = "password123"; + + given() + .contentType(ContentType.JSON) + .body(input) + .when() + .post("/api/signup") + .then() + .statusCode(201); + + // Kiểm tra database: Phải tìm thấy 1 user với số điện thoại này + assertEquals(1, CustomerEntity.find("phone", phone).count()); + } + + @Test + void testQuickSignup() { + String phone = generateRandomPhone(); + QuickSignup input = new QuickSignup(); + input.phone = phone; + + given() + .contentType(ContentType.JSON) + .body(input) + .when() + .post("/api/quickSignup") + .then() + .statusCode(201); + + assertEquals(1, CustomerEntity.find("phone", phone).count()); + } + + @Test + void testLoginSuccess() { + // BƯỚC 1: Tạo user trước bằng signup + String phone = generateRandomPhone(); + Signup signupData = new Signup(); + signupData.name = "Login User"; + signupData.phone = phone; + signupData.password = "secure_pass"; + + given() + .contentType(ContentType.JSON) + .body(signupData) + .post("/api/signup") + .then() + .statusCode(201); + + // BƯỚC 2: Thử đăng nhập + Login loginInput = new Login(); + loginInput.phone = phone; + loginInput.password = "secure_pass"; + + given() + .contentType(ContentType.JSON) + .body(loginInput) + .when() + .post("/api/login") + .then() + .statusCode(202); + } + + @Test + void testLoginFailWrongPassword() { + String phone = generateRandomPhone(); + Signup signupData = new Signup(); + signupData.name = "Wrong Pass User"; + signupData.phone = phone; + signupData.password = "correct_password"; + + given() + .contentType(ContentType.JSON) + .body(signupData) + .post("/api/signup") + .then() + .statusCode(201); + + Login loginInput = new Login(); + loginInput.phone = phone; + loginInput.password = "wrong_password"; + + given() + .contentType(ContentType.JSON) + .body(loginInput) + .when() + .post("/api/login") + .then() + .statusCode(400); // BadRequestException + } + + @Test + void testSmsOtp() { + String phone = generateRandomPhone(); + SmsOtp input = new SmsOtp(); + input.phone = phone; + + given() + .contentType(ContentType.JSON) + .body(input) + .when() + .post("/api/sms_otp") + .then() + .statusCode(202); + + // Lưu ý: Vì không dùng Mock, code sẽ chạy qua OtpService thật. + // Nếu OtpService lưu vào DB, bạn có thể bổ sung Assert tại đây để check OtpEntity. + } + + @Test + void testQuickLoginFailInvalidOtp() { + String phone = generateRandomPhone(); + QuickLogin input = new QuickLogin(); + input.phone = phone; + input.otp = "000000"; // Giả sử mã này luôn sai vì chưa được tạo + + given() + .contentType(ContentType.JSON) + .body(input) + .when() + .post("/api/quicklogin") + .then() + .statusCode(401); + } +} diff --git a/account-service/src/test/resources/application.properties b/account-service/src/test/resources/application.properties index 1566eab..59bc331 100644 --- a/account-service/src/test/resources/application.properties +++ b/account-service/src/test/resources/application.properties @@ -1,9 +1,10 @@ +# Quarkus +quarkus.http.host=0.0.0.0 + # Database +## Datasource %test.quarkus.datasource.db-kind=h2 %test.quarkus.datasource.jdbc.url=jdbc:h2:mem:test_db;DB_CLOSE_DELAY=-1 +## Orm %test.quarkus.hibernate-orm.database.generation=drop-and-create - -# Docker -%test.quarkus.container-image.build=false -%test.quarkus.container-image.push=false \ No newline at end of file diff --git a/eatery-service/src/main/java/com/drinkool/entities/MenuItemEntity.java b/eatery-service/src/main/java/com/drinkool/entities/MenuItemEntity.java index cdc2f4d..a1091df 100644 --- a/eatery-service/src/main/java/com/drinkool/entities/MenuItemEntity.java +++ b/eatery-service/src/main/java/com/drinkool/entities/MenuItemEntity.java @@ -19,8 +19,6 @@ public class MenuItemEntity extends BaseEntity { ) public List ingredients = new ArrayList<>(); - private MenuItemEntity() {} - /** * Thêm nguyên liệu vào món ăn với định lượng cụ thể */ @@ -49,7 +47,7 @@ public class MenuItemEntity extends BaseEntity { menu.name = name; menu.price = price; - + menu.persist(); return menu; diff --git a/eatery-service/src/test/java/com/drinkool/services/InventoryServiceTest.java b/eatery-service/src/test/java/com/drinkool/services/InventoryServiceTest.java index e6e2ca8..1496b92 100644 --- a/eatery-service/src/test/java/com/drinkool/services/InventoryServiceTest.java +++ b/eatery-service/src/test/java/com/drinkool/services/InventoryServiceTest.java @@ -29,4 +29,6 @@ public class InventoryServiceTest { assertEquals(1, InventoryItemEntity.find("name", name).count()); } + + } diff --git a/eatery-service/src/test/resources/application.properties b/eatery-service/src/test/resources/application.properties index 3dd44ee..59bc331 100644 --- a/eatery-service/src/test/resources/application.properties +++ b/eatery-service/src/test/resources/application.properties @@ -2,8 +2,9 @@ quarkus.http.host=0.0.0.0 # Database -# Database +## Datasource %test.quarkus.datasource.db-kind=h2 %test.quarkus.datasource.jdbc.url=jdbc:h2:mem:test_db;DB_CLOSE_DELAY=-1 +## Orm %test.quarkus.hibernate-orm.database.generation=drop-and-create diff --git a/lib/pom.xml b/lib/pom.xml index 9890614..7ee49c2 100644 --- a/lib/pom.xml +++ b/lib/pom.xml @@ -15,8 +15,8 @@ lib - 17 - 17 + 21 + 21 UTF-8 diff --git a/pom.xml b/pom.xml index f9eadfd..35ac368 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ 1.1.0-dev.1 pom - 17 + 21 quarkus-bom io.quarkus.platform 3.32.3