4290f482f4
Release package / release (push) Successful in 1m49s
Co-authored-by: TakahashiNg <83152264+TakahashiNguyen@users.noreply.github.com> Reviewed-on: #49
342 lines
9.0 KiB
Java
342 lines
9.0 KiB
Java
package com.drinkool.services;
|
|
|
|
import static io.restassured.RestAssured.given;
|
|
import static org.hamcrest.CoreMatchers.is;
|
|
import static org.hamcrest.CoreMatchers.not;
|
|
import static org.hamcrest.CoreMatchers.notNullValue;
|
|
import static org.hamcrest.Matchers.hasItems;
|
|
import static org.hamcrest.Matchers.hasSize;
|
|
|
|
import com.drinkool.InternalValue;
|
|
import com.drinkool.Role;
|
|
import com.drinkool.dtos.AddMenuItem;
|
|
import com.drinkool.entities.EateryEntity;
|
|
import com.drinkool.entities.MenuItemEntity;
|
|
import com.drinkool.lib.dtos.event.ManagerCreate;
|
|
import io.quarkus.test.junit.QuarkusTest;
|
|
import io.restassured.http.ContentType;
|
|
import io.smallrye.reactive.messaging.memory.InMemoryConnector;
|
|
import jakarta.enterprise.context.control.ActivateRequestContext;
|
|
import jakarta.enterprise.inject.Any;
|
|
import jakarta.inject.Inject;
|
|
import jakarta.transaction.Transactional;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.UUID;
|
|
import net.datafaker.Faker;
|
|
import org.junit.jupiter.api.Assertions;
|
|
import org.junit.jupiter.api.BeforeEach;
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
@QuarkusTest
|
|
public class EateryServiceTest {
|
|
|
|
private final Faker faker = new Faker();
|
|
|
|
@Inject
|
|
@Any
|
|
InMemoryConnector connector;
|
|
|
|
@Test
|
|
@ActivateRequestContext
|
|
void testConsumeManagerSignup() throws InterruptedException {
|
|
// 1. Chuẩn bị dữ liệu giả lập
|
|
ManagerCreate input = new ManagerCreate();
|
|
input.id = UUID.randomUUID(); // Giả sử manager ID là 99
|
|
input.eateryName = "Quan Bun Cha Test";
|
|
|
|
// 2. Đẩy tin nhắn vào channel "manager-in" bằng InMemoryConnector
|
|
connector.source("manager-in").send(input);
|
|
|
|
Thread.sleep(1000);
|
|
|
|
// 3. Kiểm tra kết quả trong Database
|
|
// Lưu ý: Vì xử lý Kafka là bất đồng bộ, đôi khi cần đợi vài miligiây
|
|
// nhưng với InMemoryConnector thì thường là tức thì.
|
|
|
|
EateryEntity eatery = EateryEntity.find("ownerId", input.id).firstResult();
|
|
|
|
Assertions.assertNotNull(eatery, "Eatery should be created in DB");
|
|
Assertions.assertEquals("Quan Bun Cha Test", eatery.name);
|
|
}
|
|
|
|
private UUID savedEateryId;
|
|
private String savedEateryName;
|
|
private UUID savedOwnerId = UUID.randomUUID();
|
|
private UUID savedMenuItemId;
|
|
|
|
@BeforeEach
|
|
@Transactional
|
|
void setup() {
|
|
MenuItemEntity.deleteAll();
|
|
EateryEntity.deleteAll();
|
|
|
|
savedEateryName = faker.restaurant().name();
|
|
|
|
EateryEntity eatery = new EateryEntity();
|
|
eatery = eatery.create(savedOwnerId, savedEateryName);
|
|
savedEateryId = eatery.id;
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
EateryEntity e = new EateryEntity();
|
|
e.create(UUID.randomUUID(), faker.restaurant().name());
|
|
}
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
savedMenuItemId = MenuItemEntity.create(
|
|
eatery,
|
|
new AddMenuItem(
|
|
faker.food().dish(),
|
|
faker.number().randomDouble(2, 10, 100),
|
|
""
|
|
)
|
|
).id;
|
|
}
|
|
}
|
|
|
|
@Test
|
|
void testGetAllEateries() {
|
|
// Cấu trúc query GraphQL
|
|
String query = "{ \"query\": \"{ allEateries { ownerId name } }\" }";
|
|
|
|
given()
|
|
.contentType(ContentType.JSON)
|
|
.body(query)
|
|
.when()
|
|
.post("/graphql")
|
|
.then()
|
|
.statusCode(200)
|
|
// GraphQL trả về dữ liệu bọc trong object "data"
|
|
.body("data.allEateries", notNullValue())
|
|
.body("data.allEateries.name", hasItems(savedEateryName));
|
|
}
|
|
|
|
@Test
|
|
void testGetEateryById() {
|
|
// Sử dụng biến id đã lưu ở setup
|
|
// Lưu ý: Trong GraphQL, String/UUID phải nằm trong dấu ngoặc kép
|
|
String query = String.format(
|
|
"{ \"query\": \"{ eateryById(id: \\\"%s\\\") { ownerId name } }\" }",
|
|
savedEateryId
|
|
);
|
|
|
|
given()
|
|
.contentType(ContentType.JSON)
|
|
.body(query)
|
|
.when()
|
|
.post("/graphql")
|
|
.then()
|
|
.statusCode(200)
|
|
.body("data.eateryById.name", is(savedEateryName));
|
|
}
|
|
|
|
@Test
|
|
public void testAddMenuItemSuccess() {
|
|
String mutation =
|
|
"mutation addMenuItem($menuItem: AddMenuItemInput!) {" +
|
|
" addMenuItem(menuItem: $menuItem) {" +
|
|
" id" +
|
|
" name" +
|
|
" price" +
|
|
" }" +
|
|
"}";
|
|
|
|
Map<String, Object> menuItemData = new HashMap<>();
|
|
menuItemData.put("name", "Trà Sữa");
|
|
menuItemData.put("price", 30000.0);
|
|
|
|
Map<String, Object> variables = new HashMap<>();
|
|
variables.put("menuItem", menuItemData);
|
|
|
|
Map<String, Object> requestBody = new HashMap<>();
|
|
requestBody.put("query", mutation);
|
|
requestBody.put("variables", variables);
|
|
|
|
given()
|
|
.contentType(ContentType.JSON)
|
|
.header(InternalValue.role, Role.Manager)
|
|
.header(InternalValue.userId, savedOwnerId) // Thay "x-user-id" bằng InternalValue.userId của bạn
|
|
.body(requestBody)
|
|
.when()
|
|
.post("/graphql")
|
|
.then()
|
|
.statusCode(200)
|
|
.body("data.addMenuItem.name", is("Trà Sữa"))
|
|
.body("data.addMenuItem.id", notNullValue());
|
|
}
|
|
|
|
@Test
|
|
public void testAddMenuItemFailInvalidRole() {
|
|
String mutation =
|
|
"mutation addMenuItem($menuItem: AddMenuItemInput!) {" +
|
|
" addMenuItem(menuItem: $menuItem) {" +
|
|
" id" +
|
|
" name" +
|
|
" price" +
|
|
" }" +
|
|
"}";
|
|
|
|
Map<String, Object> menuItemData = new HashMap<>();
|
|
menuItemData.put("name", "Trà Sữa");
|
|
menuItemData.put("price", 30000.0);
|
|
|
|
Map<String, Object> variables = new HashMap<>();
|
|
variables.put("menuItem", menuItemData);
|
|
|
|
Map<String, Object> requestBody = new HashMap<>();
|
|
requestBody.put("query", mutation);
|
|
requestBody.put("variables", variables);
|
|
|
|
given()
|
|
.contentType(ContentType.JSON)
|
|
.header(InternalValue.role, Role.Customer)
|
|
.header(InternalValue.userId, savedOwnerId)
|
|
.body(requestBody)
|
|
.when()
|
|
.post("/graphql")
|
|
.then()
|
|
.statusCode(200);
|
|
}
|
|
|
|
@Test
|
|
public void testAddMenuItemFailInvalidOwner() {
|
|
String mutation =
|
|
"mutation { addMenuItem(name: \"Coffee\", price: 20000.0) { id } }";
|
|
|
|
Map<String, Object> requestBody = new HashMap<>();
|
|
requestBody.put("query", mutation);
|
|
|
|
given()
|
|
.contentType(ContentType.JSON)
|
|
.header(InternalValue.role, Role.Manager)
|
|
.header(InternalValue.userId, UUID.randomUUID())
|
|
.body(requestBody)
|
|
.when()
|
|
.post("/graphql")
|
|
.then()
|
|
.statusCode(200)
|
|
.body("data.addMenuItem", is((Object) null));
|
|
}
|
|
|
|
@Test
|
|
public void testGetMenuItemsByEatery_Success() {
|
|
String query =
|
|
"query getItems($id: String!) {" +
|
|
" menuItemsByEatery(eateryId: $id) {" +
|
|
" id" +
|
|
" name" +
|
|
" price" +
|
|
" }" +
|
|
"}";
|
|
|
|
Map<String, Object> variables = new HashMap<>();
|
|
variables.put("id", savedEateryId.toString());
|
|
|
|
Map<String, Object> requestBody = new HashMap<>();
|
|
requestBody.put("query", query);
|
|
requestBody.put("variables", variables);
|
|
|
|
given()
|
|
.contentType(ContentType.JSON)
|
|
.body(requestBody)
|
|
.when()
|
|
.post("/graphql")
|
|
.then()
|
|
.statusCode(200)
|
|
.body("data.menuItemsByEatery", hasSize(not(0)));
|
|
}
|
|
|
|
@Test
|
|
public void testGetMenuItemsByEatery_NotFound() {
|
|
String randomId = UUID.randomUUID().toString();
|
|
|
|
String query =
|
|
"query getItems($id: String!) {" +
|
|
" menuItemsByEatery(eateryId: $id) {" +
|
|
" id" +
|
|
" }" +
|
|
"}";
|
|
|
|
Map<String, Object> variables = new HashMap<>();
|
|
variables.put("id", randomId);
|
|
|
|
Map<String, Object> requestBody = new HashMap<>();
|
|
requestBody.put("query", query);
|
|
requestBody.put("variables", variables);
|
|
|
|
given()
|
|
.contentType(ContentType.JSON)
|
|
.body(requestBody)
|
|
.when()
|
|
.post("/graphql")
|
|
.then()
|
|
.statusCode(200)
|
|
.body("data.menuItemsByEatery", hasSize(0)); // Phải trả về List rỗng như code bạn viết
|
|
}
|
|
|
|
@Test
|
|
public void testUpdateMenuItem_Success() {
|
|
String mutation = """
|
|
mutation updateMenuItem($menuItem: UpdateMenuItemInput!) {
|
|
updateMenuItem(menuItem: $menuItem) {
|
|
id
|
|
name
|
|
price
|
|
}
|
|
}
|
|
""";
|
|
|
|
String newValue = "Phở Bò";
|
|
|
|
Map<String, Object> menuItemData = new HashMap<>();
|
|
menuItemData.put("id", savedMenuItemId);
|
|
menuItemData.put("name", newValue);
|
|
|
|
Map<String, Object> variables = new HashMap<>();
|
|
variables.put("menuItem", menuItemData);
|
|
|
|
Map<String, Object> requestBody = new HashMap<>();
|
|
requestBody.put("query", mutation);
|
|
requestBody.put("variables", variables);
|
|
|
|
given()
|
|
.contentType(ContentType.JSON)
|
|
.header(InternalValue.role, Role.Manager)
|
|
.header(InternalValue.userId, savedOwnerId)
|
|
.body(requestBody)
|
|
.when()
|
|
.post("/graphql")
|
|
.then()
|
|
.body("data.updateMenuItem.name", is(newValue))
|
|
.body("data.updateMenuItem.id", is(savedMenuItemId.toString()))
|
|
.statusCode(200);
|
|
}
|
|
|
|
@Test
|
|
public void testDeleteMenuItem_Success() {
|
|
String mutation = """
|
|
mutation deleteItem($input: String!) {
|
|
deleteMenuItem(menuItemId: $input)
|
|
}
|
|
""";
|
|
|
|
Map<String, Object> variables = new HashMap<>();
|
|
variables.put("input", savedMenuItemId.toString());
|
|
|
|
Map<String, Object> requestBody = new HashMap<>();
|
|
requestBody.put("query", mutation);
|
|
requestBody.put("variables", variables);
|
|
|
|
given()
|
|
.contentType(ContentType.JSON)
|
|
.header(InternalValue.role, Role.Manager)
|
|
.header(InternalValue.userId, savedOwnerId)
|
|
.body(requestBody)
|
|
.when()
|
|
.post("/graphql")
|
|
.then()
|
|
.statusCode(200)
|
|
.body("data.deleteMenuItem", is(true));
|
|
}
|
|
}
|