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()); } }