JavaProjectRepo/business-css/src/test/java/com/yfd/business/css/SimulationInitTest.java
2025-12-23 14:42:05 +08:00

147 lines
8.7 KiB
Java

package com.yfd.business.css;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
@SpringBootTest
@AutoConfigureMockMvc
public class SimulationInitTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
@Test
public void initSimulation_and_queryResults() throws Exception {
String projectId = "proj-0001-uuid";
String scenarioId = "scen-001-uuid";
String projectJson = "{\"projectId\":\"" + projectId + "\",\"name\":\"测试项目\"}";
mockMvc.perform(MockMvcRequestBuilders.post("/projects")
.contentType(MediaType.APPLICATION_JSON)
.content(projectJson))
.andExpect(MockMvcResultMatchers.status().isOk());
String topology = "{\"devices\":[{\"deviceId\":\"dev-002-uuid\",\"name\":\"设备01\",\"type\":\"CylindricalTank\",\"static\":{\"diameter\":120,\"unit\":\"cm\"},\"properties\":{\"height\":{\"type\":\"influence\",\"unit\":\"cm\",\"bias\":0,\"sources\":[{\"entityType\":\"device\",\"entityId\":\"dev-002-uuid\",\"property\":\"diameter\",\"coefficient\":1,\"delay\":{\"enabled\":true,\"time\":0,\"unit\":\"s\"}}]}}},"
+ "{\"deviceId\":\"dev-003-uuid\",\"name\":\"设备02\",\"type\":\"AnnularTank\",\"static\":{\"diameter\":130,\"unit\":\"cm\"},\"properties\":{\"height\":{\"type\":\"influence\",\"unit\":\"cm\",\"bias\":0,\"sources\":[{\"entityType\":\"device\",\"entityId\":\"dev-003-uuid\",\"property\":\"diameter\",\"coefficient\":1,\"delay\":{\"enabled\":true,\"time\":0,\"unit\":\"s\"}}]}}}],\"pipelines\":[]}";
String topologyBody = "{\"topology\":" + objectMapper.writeValueAsString(objectMapper.readTree(topology)) + "}";
mockMvc.perform(MockMvcRequestBuilders.put("/projects/" + projectId + "/topology")
.contentType(MediaType.APPLICATION_JSON)
.content(topologyBody))
.andExpect(MockMvcResultMatchers.status().isOk());
String createEventBody = "{\"scenarioId\":\"" + scenarioId + "\"}";
String eventResp = mockMvc.perform(MockMvcRequestBuilders.post("/events")
.contentType(MediaType.APPLICATION_JSON)
.content(createEventBody))
.andExpect(MockMvcResultMatchers.status().isOk())
.andReturn().getResponse().getContentAsString();
JsonNode eventNode = objectMapper.readTree(eventResp).path("data");
String eventId = eventNode.path("eventId").asText();
String attrChanges = "{"
+ "\"attr_changes\":{"
+ "\"target\":{\"entityType\":\"device\",\"entityId\":\"dev-002-uuid\",\"property\":\"diameter\"},"
+ "\"unit\":\"cm\","
+ "\"segments\":[{"
+ "\"segmentId\":\"segment-1\",\"start\":0,\"end\":18,"
+ "\"timeline\":["
+ "{\"t\":0,\"value\":20},{\"t\":2,\"value\":50},{\"t\":4,\"value\":70},{\"t\":6,\"value\":100},"
+ "{\"t\":8,\"value\":120},{\"t\":10,\"value\":150},{\"t\":12,\"value\":200},{\"t\":14,\"value\":220},"
+ "{\"t\":16,\"value\":250},{\"t\":18,\"value\":300}"
+ "]"
+ "}]"
+ "}"
+ "}";
mockMvc.perform(MockMvcRequestBuilders.put("/events/" + eventId + "/attr-changes")
.contentType(MediaType.APPLICATION_JSON)
.content(attrChanges))
.andExpect(MockMvcResultMatchers.status().isOk());
String initBody = "{\"startTime\":0,\"endTime\":18,\"step\":2}";
String initResp = mockMvc.perform(MockMvcRequestBuilders.post("/projects/" + projectId + "/scenarios/" + scenarioId + "/simulation/init")
.contentType(MediaType.APPLICATION_JSON)
.content(initBody))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$.code").value(0))
.andReturn().getResponse().getContentAsString();
JsonNode initNode = objectMapper.readTree(initResp).path("data");
int generatedEvents = initNode.path("generated").path("events").asInt();
int generatedSnapshots = initNode.path("generated").path("snapshots").asInt();
Assertions.assertTrue(generatedEvents >= 0);
Assertions.assertTrue(generatedSnapshots >= 0);
mockMvc.perform(MockMvcRequestBuilders.get("/scenario-results/by-scenario")
.param("scenarioId", scenarioId)
.param("pageNum", "1")
.param("pageSize", "50"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$.code").value(0))
.andExpect(MockMvcResultMatchers.jsonPath("$.data.records").isArray());
}
@Test
public void initSimulation_direct() throws Exception {
String projectId = "proj-0001-uuid";
String scenarioId = "scen-001-uuid";
String initBody = "{\"startTime\":0,\"endTime\":10,\"step\":2}";
String initResp = mockMvc.perform(MockMvcRequestBuilders.post("/projects/" + projectId + "/scenarios/" + scenarioId + "/simulation/init")
.contentType(MediaType.APPLICATION_JSON)
.content(initBody))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$.code").value(0))
.andReturn().getResponse().getContentAsString();
JsonNode initNode = objectMapper.readTree(initResp).path("data");
int generatedEvents = initNode.path("generated").path("events").asInt();
int generatedSnapshots = initNode.path("generated").path("snapshots").asInt();
Assertions.assertTrue(generatedEvents >= 0);
Assertions.assertTrue(generatedSnapshots >= 0);
mockMvc.perform(MockMvcRequestBuilders.get("/scenario-results/by-scenario")
.param("scenarioId", scenarioId)
.param("pageNum", "1")
.param("pageSize", "50"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$.code").value(0))
.andExpect(MockMvcResultMatchers.jsonPath("$.data.records").isArray());
}
@Test
public void initSimulation_returnData() throws Exception {
String projectId = "proj-0001-uuid";
String scenarioId = "scen-001-uuid";
String initBody = "{\"startTime\":0,\"endTime\":12,\"step\":3}";
String initResp = mockMvc.perform(MockMvcRequestBuilders.post("/projects/" + projectId + "/scenarios/" + scenarioId + "/simulation/init")
.contentType(MediaType.APPLICATION_JSON)
.content(initBody))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$.code").value(0))
.andReturn().getResponse().getContentAsString();
System.out.println("initResp=" + initResp);
JsonNode initNode = objectMapper.readTree(initResp).path("data");
int eventsCount = initNode.path("generated").path("events").asInt();
int snapshotsCount = initNode.path("generated").path("snapshots").asInt();
System.out.println("eventsCount=" + eventsCount + ", snapshotsCount=" + snapshotsCount);
String resultResp = mockMvc.perform(MockMvcRequestBuilders.get("/scenario-results/by-scenario")
.param("scenarioId", scenarioId)
.param("pageNum", "1")
.param("pageSize", "20"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$.code").value(0))
.andReturn().getResponse().getContentAsString();
System.out.println("resultResp=" + resultResp);
JsonNode resultNode = objectMapper.readTree(resultResp).path("data").path("records");
Assertions.assertTrue(resultNode.isArray());
System.out.println("recordsSize=" + resultNode.size());
}
}