|
|
@@ -74,6 +74,8 @@ class CockpitMonitoringDistributionControllerTest {
|
|
|
.andExpect(jsonPath("$.data.readOnly").value(true))
|
|
|
.andExpect(jsonPath("$.data.displayName").value("监测分布"))
|
|
|
.andExpect(jsonPath("$.data.timezone").value("Asia/Shanghai"))
|
|
|
+ // 执行票 62:响应必须回显快照标记(调用方第 2 页起原样回带)。
|
|
|
+ .andExpect(jsonPath("$.data.snapshotAt").value(SNAPSHOT_AT))
|
|
|
.andExpect(jsonPath("$.data.pagination.page").value(1))
|
|
|
.andExpect(jsonPath("$.data.pagination.pageSize").value(500))
|
|
|
.andExpect(jsonPath("$.data.pagination.total").value(9))
|
|
|
@@ -332,6 +334,31 @@ class CockpitMonitoringDistributionControllerTest {
|
|
|
.andExpect(jsonPath("$.data.requestId").value("monitoring-distribution-500"));
|
|
|
}
|
|
|
|
|
|
+ @Test
|
|
|
+ void snapshotTokenIsEchoedAndStaysStableAcrossPages() throws Exception {
|
|
|
+ // 执行票 62:调用方拿不到 token 就无法跨页对齐。「第 1 页给的 token,
|
|
|
+ // 第 2 页原样回带」必须真的落在同一份快照上,且两页回显同一个 token。
|
|
|
+ String pageOneToken = com.jayway.jsonpath.JsonPath.read(
|
|
|
+ mockMvc.perform(get(ENDPOINT).param("page", "1").param("pageSize", "2"))
|
|
|
+ .andExpect(status().isOk())
|
|
|
+ .andExpect(jsonPath("$.data.snapshotAt").value(SNAPSHOT_AT))
|
|
|
+ .andReturn().getResponse().getContentAsString(),
|
|
|
+ "$.data.snapshotAt");
|
|
|
+ mockMvc.perform(get(ENDPOINT).param("page", "2").param("pageSize", "2").param("snapshotAt", pageOneToken))
|
|
|
+ .andExpect(status().isOk())
|
|
|
+ .andExpect(jsonPath("$.data.snapshotAt").value(SNAPSHOT_AT))
|
|
|
+ .andExpect(jsonPath("$.data.pagination.page").value(2))
|
|
|
+ .andExpect(jsonPath("$.data.pagination.hasMore").value(true));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void pageBeyondFirstWithoutSnapshotTokenIsRejected() throws Exception {
|
|
|
+ // 反证:第 2 页不带 token 必须 400(否则上面那条「同快照」断言可能是恒真)。
|
|
|
+ mockMvc.perform(get(ENDPOINT).param("page", "2").param("pageSize", "2"))
|
|
|
+ .andExpect(status().isBadRequest())
|
|
|
+ .andExpect(jsonPath("$.data.message").value("监测分布分页参数不合法"));
|
|
|
+ }
|
|
|
+
|
|
|
@Test
|
|
|
void mutatingRequestIsRejectedBeforeReadAdapterIsCalled() throws Exception {
|
|
|
mockMvc.perform(post(ENDPOINT))
|