package com.rongyichuang.judge; import com.fasterxml.jackson.databind.ObjectMapper; import com.rongyichuang.common.entity.Media; import com.rongyichuang.judge.entity.Judge; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.util.StreamUtils; import javax.sql.DataSource; import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.Map; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class JudgeCreationE2ETest { @LocalServerPort private int port; @Autowired private TestRestTemplate restTemplate; @Autowired private DataSource dataSource; private JdbcTemplate jdbcTemplate; @BeforeEach void setUp() { jdbcTemplate = new JdbcTemplate(dataSource); // Clean up database before each test jdbcTemplate.execute("DELETE FROM t_judge_tag"); jdbcTemplate.execute("DELETE FROM t_judge"); jdbcTemplate.execute("DELETE FROM t_media"); } @Test void testCreateJudgeEndToEnd() throws Exception { // 1. Save Media Info (Simulating image upload) String mediaQuery = readGraphQLQuery("graphql/test-save-media.graphql"); String mediaFileName = "logo.png"; String mediaFilePath = "test/logo.png"; String formattedMediaQuery = String.format(mediaQuery, mediaFileName, mediaFilePath, 12345L, "image/png", "cos", "test-bucket", "ap-guangzhou"); Map mediaRequest = Collections.singletonMap("query", formattedMediaQuery); String mediaResponse = postGraphQL(mediaRequest); ObjectMapper objectMapper = new ObjectMapper(); Map mediaResponseMap = objectMapper.readValue(mediaResponse, Map.class); String mediaId = ((Map)((Map) mediaResponseMap.get("data")).get("saveMedia")).get("id"); assertNotNull(mediaId, "Media ID should not be null"); // 2. Verify Media in DB with JDBC Map mediaRecord = jdbcTemplate.queryForMap("SELECT * FROM t_media WHERE id = ?", mediaId); assertEquals(mediaFileName, mediaRecord.get("file_name")); assertEquals(mediaFilePath, mediaRecord.get("file_path")); // 3. Save Judge Info String judgeQuery = readGraphQLQuery("graphql/test-save-judge.graphql"); String formattedJudgeQuery = String.format(judgeQuery, "测试评委", "13800138000", mediaId); Map judgeRequest = Collections.singletonMap("query", formattedJudgeQuery); String judgeResponse = postGraphQL(judgeRequest); Map judgeResponseMap = objectMapper.readValue(judgeResponse, Map.class); String judgeId = ((Map)((Map) judgeResponseMap.get("data")).get("saveJudge")).get("id"); assertNotNull(judgeId, "Judge ID should not be null"); // 4. Verify Judge in DB with JDBC Map judgeRecord = jdbcTemplate.queryForMap("SELECT * FROM t_judge WHERE id = ?", judgeId); assertEquals("测试评委", judgeRecord.get("name")); assertEquals("13800138000", judgeRecord.get("phone")); assertEquals(Long.valueOf(mediaId), judgeRecord.get("avatar_media_id")); System.out.println("--- E2E Test Passed ---"); System.out.println("Judge created with ID: " + judgeId); System.out.println("Media created with ID: " + mediaId); System.out.println("--- Verification with JDBC successful ---"); } private String postGraphQL(Map requestBody) { HttpHeaders headers = new HttpHeaders(); headers.setContentType(org.springframework.http.MediaType.APPLICATION_JSON); HttpEntity> entity = new HttpEntity<>(requestBody, headers); String url = "http://localhost:" + port + "/graphql"; org.springframework.http.ResponseEntity response = restTemplate.postForEntity(url, entity, String.class); if (response.getStatusCode() != org.springframework.http.HttpStatus.OK || !response.hasBody()) { throw new RuntimeException("GraphQL request failed with status: " + response.getStatusCode() + " and body: " + response.getBody()); } return response.getBody(); } private String readGraphQLQuery(String path) throws Exception { ClassPathResource resource = new ClassPathResource(path); return StreamUtils.copyToString(resource.getInputStream(), StandardCharsets.UTF_8); } }