Co-authored-by: TakahashiNg <83152264+TakahashiNguyen@users.noreply.github.com> Reviewed-on: #35
This commit was merged in pull request #35.
This commit is contained in:
+16
-3
@@ -1,5 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
@@ -42,6 +44,16 @@
|
||||
<artifactId>lib</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.datafaker</groupId>
|
||||
<artifactId>datafaker</artifactId>
|
||||
<version>2.0.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.quarkus</groupId>
|
||||
<artifactId>quarkus-smallrye-graphql</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.quarkus</groupId>
|
||||
<artifactId>quarkus-messaging-kafka</artifactId>
|
||||
@@ -144,7 +156,8 @@
|
||||
<configuration>
|
||||
<argLine>@{argLine}</argLine>
|
||||
<systemPropertyVariables>
|
||||
<native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
|
||||
<native.image.path>
|
||||
${project.build.directory}/${project.build.finalName}-runner</native.image.path>
|
||||
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
|
||||
<maven.home>${maven.home}</maven.home>
|
||||
</systemPropertyVariables>
|
||||
@@ -168,4 +181,4 @@
|
||||
</properties>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
||||
</project>
|
||||
@@ -3,6 +3,8 @@ package com.drinkool.entities;
|
||||
import com.drinkool.lib.entities.BaseEntity;
|
||||
import jakarta.persistence.*;
|
||||
import jakarta.transaction.Transactional;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@Entity
|
||||
@@ -18,10 +20,17 @@ public class EateryEntity extends BaseEntity {
|
||||
@Column(nullable = false)
|
||||
public boolean isVerified = false;
|
||||
|
||||
@OneToMany(
|
||||
mappedBy = "eatery",
|
||||
cascade = CascadeType.ALL,
|
||||
orphanRemoval = true
|
||||
)
|
||||
public List<MenuItemEntity> menus = new ArrayList<>();
|
||||
|
||||
public EateryEntity() {}
|
||||
|
||||
@Transactional
|
||||
public void create(UUID ownerId, String name) {
|
||||
public EateryEntity create(UUID ownerId, String name) {
|
||||
EateryEntity existedEatery = EateryEntity.find(
|
||||
"ownerId",
|
||||
ownerId
|
||||
@@ -33,5 +42,7 @@ public class EateryEntity extends BaseEntity {
|
||||
this.name = name;
|
||||
|
||||
this.persist();
|
||||
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,9 +9,16 @@ import java.util.*;
|
||||
@Table
|
||||
public class MenuItemEntity extends BaseEntity {
|
||||
|
||||
@Column(nullable = false)
|
||||
public String name;
|
||||
|
||||
@Column(nullable = false)
|
||||
public double price;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "eatery_id")
|
||||
public EateryEntity eatery;
|
||||
|
||||
// Danh sách các nguyên liệu cấu thành món ăn này
|
||||
@OneToMany(
|
||||
mappedBy = "menuItem",
|
||||
|
||||
@@ -2,12 +2,17 @@ package com.drinkool.services;
|
||||
|
||||
import com.drinkool.dtos.event.ManagerCreate;
|
||||
import com.drinkool.entities.EateryEntity;
|
||||
|
||||
import jakarta.enterprise.context.ApplicationScoped;
|
||||
import jakarta.transaction.Transactional;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import org.eclipse.microprofile.graphql.GraphQLApi;
|
||||
import org.eclipse.microprofile.graphql.Name;
|
||||
import org.eclipse.microprofile.graphql.Query;
|
||||
import org.eclipse.microprofile.reactive.messaging.Incoming;
|
||||
|
||||
@ApplicationScoped
|
||||
@GraphQLApi
|
||||
public class EateryService {
|
||||
|
||||
@Incoming("manager-in")
|
||||
@@ -17,4 +22,14 @@ public class EateryService {
|
||||
|
||||
eatery.create(input.id, input.eateryName);
|
||||
}
|
||||
|
||||
@Query("allEateries")
|
||||
public List<EateryEntity> getAll() {
|
||||
return EateryEntity.listAll();
|
||||
}
|
||||
|
||||
@Query("eateryById")
|
||||
public EateryEntity getEatery(@Name("id") UUID id) {
|
||||
return EateryEntity.findById(id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,30 @@
|
||||
package com.drinkool.services;
|
||||
|
||||
import static io.restassured.RestAssured.given;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.CoreMatchers.notNullValue;
|
||||
import static org.hamcrest.Matchers.hasItems;
|
||||
|
||||
import com.drinkool.dtos.event.ManagerCreate;
|
||||
import com.drinkool.entities.EateryEntity;
|
||||
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.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;
|
||||
@@ -40,4 +51,59 @@ public class EateryServiceTest {
|
||||
Assertions.assertNotNull(eatery, "Eatery should be created in DB");
|
||||
Assertions.assertEquals("Quan Bun Cha Test", eatery.name);
|
||||
}
|
||||
|
||||
private UUID lastSavedId;
|
||||
private String lastSavedName;
|
||||
|
||||
@BeforeEach
|
||||
@Transactional
|
||||
void setup() {
|
||||
EateryEntity.deleteAll();
|
||||
|
||||
lastSavedName = faker.restaurant().name();
|
||||
|
||||
EateryEntity eatery = new EateryEntity();
|
||||
lastSavedId = eatery.create(UUID.randomUUID(), lastSavedName).id;
|
||||
|
||||
for (int i = 0; i < 2; i++) {
|
||||
EateryEntity e = new EateryEntity();
|
||||
e.create(UUID.randomUUID(), faker.restaurant().name());
|
||||
}
|
||||
}
|
||||
|
||||
@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(lastSavedName));
|
||||
}
|
||||
|
||||
@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 } }\" }",
|
||||
lastSavedId
|
||||
);
|
||||
|
||||
given()
|
||||
.contentType(ContentType.JSON)
|
||||
.body(query)
|
||||
.when()
|
||||
.post("/graphql")
|
||||
.then()
|
||||
.statusCode(200)
|
||||
.body("data.eateryById.name", is(lastSavedName));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user