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<String, String> mediaRequest = Collections.singletonMap("query", formattedMediaQuery);
|
String mediaResponse = postGraphQL(mediaRequest);
|
|
ObjectMapper objectMapper = new ObjectMapper();
|
Map<String, Object> mediaResponseMap = objectMapper.readValue(mediaResponse, Map.class);
|
String mediaId = ((Map<String, String>)((Map<String, Object>) mediaResponseMap.get("data")).get("saveMedia")).get("id");
|
assertNotNull(mediaId, "Media ID should not be null");
|
|
// 2. Verify Media in DB with JDBC
|
Map<String, Object> 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<String, String> judgeRequest = Collections.singletonMap("query", formattedJudgeQuery);
|
String judgeResponse = postGraphQL(judgeRequest);
|
Map<String, Object> judgeResponseMap = objectMapper.readValue(judgeResponse, Map.class);
|
String judgeId = ((Map<String, String>)((Map<String, Object>) judgeResponseMap.get("data")).get("saveJudge")).get("id");
|
assertNotNull(judgeId, "Judge ID should not be null");
|
|
// 4. Verify Judge in DB with JDBC
|
Map<String, Object> 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<String, String> requestBody) {
|
HttpHeaders headers = new HttpHeaders();
|
headers.setContentType(org.springframework.http.MediaType.APPLICATION_JSON);
|
HttpEntity<Map<String, String>> entity = new HttpEntity<>(requestBody, headers);
|
String url = "http://localhost:" + port + "/graphql";
|
org.springframework.http.ResponseEntity<String> 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);
|
}
|
}
|