Enforce exact published form version contracts
Local review candidate only. Explicitly selected inherited prerequisites and prior repair patches; unrelated WIP and independent MQ fixes are excluded. No push or deployment authorized.
This commit is contained in:
@@ -2,6 +2,12 @@ package com.yunhai.flowcenter.service;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.yunhai.platform.openapi.core.YschOpenCall;
|
||||
import com.yunhai.platform.openapi.core.OpenApiException;
|
||||
import com.yunhai.platform.openapi.core.OpenApiErrorCode;
|
||||
import com.yunhai.platform.utils.exception.DException;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.ValueSource;
|
||||
import org.junit.jupiter.params.provider.NullSource;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
@@ -72,7 +78,7 @@ class FormCenterSchemaClientTest {
|
||||
when(openCall.get(anyString(), anyString(), anyMap(), eq(Map.class)))
|
||||
.thenReturn(schemaData("U1", 3, Arrays.asList("STUDENT", "TEACHER")));
|
||||
|
||||
Map<String, Object> snap = client.fetchSchema(27L, "U1");
|
||||
Map<String, Object> snap = client.fetchSchema(27L, "U1", 3);
|
||||
|
||||
assertEquals("U1", snap.get("formUuid"));
|
||||
assertEquals(3, snap.get("formVersion"));
|
||||
@@ -88,11 +94,11 @@ class FormCenterSchemaClientTest {
|
||||
|
||||
@Test
|
||||
void legacySingleStringAudienceIsWrappedAsArray() {
|
||||
Map<String, Object> data = schemaData("U1", 1, null);
|
||||
Map<String, Object> data = schemaData("U1", 3, null);
|
||||
data.put("audience", "STUDENT");
|
||||
when(openCall.get(anyString(), anyString(), anyMap(), eq(Map.class))).thenReturn(data);
|
||||
|
||||
Map<String, Object> snap = client.fetchSchema(27L, "U1");
|
||||
Map<String, Object> snap = client.fetchSchema(27L, "U1", 3);
|
||||
|
||||
assertEquals(Arrays.asList("STUDENT"), snap.get("audience"),
|
||||
"C5 切换窗口的旧单值串按一元素数组容错");
|
||||
@@ -104,7 +110,7 @@ class FormCenterSchemaClientTest {
|
||||
.thenThrow(new RuntimeException("connect refused"));
|
||||
|
||||
assertThrows(FormCenterSchemaClient.SchemaUnavailableException.class,
|
||||
() -> client.fetchSchema(27L, "U1"));
|
||||
() -> client.fetchSchema(27L, "U1", 3));
|
||||
verify(openCall, times(FormCenterSchemaClient.MAX_ATTEMPTS))
|
||||
.get(anyString(), anyString(), anyMap(), eq(Map.class));
|
||||
}
|
||||
@@ -115,7 +121,77 @@ class FormCenterSchemaClientTest {
|
||||
when(openCall.get(anyString(), anyString(), anyMap(), eq(Map.class))).thenReturn(null);
|
||||
|
||||
assertThrows(FormCenterSchemaClient.SchemaUnavailableException.class,
|
||||
() -> client.fetchSchema(27L, "U1"));
|
||||
assertTrue(true);
|
||||
() -> client.fetchSchema(27L, "U1", 3));
|
||||
verify(openCall, times(FormCenterSchemaClient.MAX_ATTEMPTS))
|
||||
.get(anyString(), anyString(), anyMap(), eq(Map.class));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@NullSource
|
||||
@ValueSource(strings = {"0", "-1", "4", "3.5", "wrong", "2147483648"})
|
||||
void malformedOrWrongReturnedVersionIsContractFailureWithoutRetry(String returnedVersion) {
|
||||
Map<String, Object> data = schemaData("U1", 3, Arrays.asList("STUDENT"));
|
||||
data.put("version", returnedVersion);
|
||||
when(openCall.get(anyString(), anyString(), anyMap(), eq(Map.class))).thenReturn(data);
|
||||
assertThrows(FormCenterSchemaClient.SchemaContractViolationException.class,
|
||||
() -> client.fetchSchema(27L, "U1", 3));
|
||||
verify(openCall, times(1)).get(anyString(), anyString(), anyMap(), eq(Map.class));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@NullSource
|
||||
@ValueSource(strings = {"", "U2"})
|
||||
void missingOrWrongReturnedUuidIsContractFailureWithoutRetry(String returnedUuid) {
|
||||
when(openCall.get(anyString(), anyString(), anyMap(), eq(Map.class)))
|
||||
.thenReturn(schemaData(returnedUuid, 3, Arrays.asList("STUDENT")));
|
||||
assertThrows(FormCenterSchemaClient.SchemaContractViolationException.class,
|
||||
() -> client.fetchSchema(27L, "U1", 3));
|
||||
verify(openCall, times(1)).get(anyString(), anyString(), anyMap(), eq(Map.class));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(ints = {0, -1})
|
||||
void illegalRequestedVersionMakesNoRemoteCall(int version) {
|
||||
assertThrows(IllegalArgumentException.class, () -> client.fetchSchema(27L, "U1", version));
|
||||
org.mockito.Mockito.verifyNoInteractions(openCall);
|
||||
}
|
||||
|
||||
@Test
|
||||
void resourceRejectionUsesEnvelopeCodeAndDoesNotRetry() {
|
||||
// SDK 实际携带 OpenApiErrorCode,不会转换成本地 ErrorCode 枚举;文案刻意无关键词。
|
||||
when(openCall.get(anyString(), anyString(), anyMap(), eq(Map.class)))
|
||||
.thenThrow(new DException(new OpenApiErrorCode(2, "opaque")));
|
||||
assertThrows(FormCenterSchemaClient.SchemaResourceUnavailableException.class,
|
||||
() -> client.fetchSchema(27L, "U1", 3));
|
||||
verify(openCall, times(1)).get(anyString(), anyString(), anyMap(), eq(Map.class));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(ints = {3, 4})
|
||||
void authRejectionDoesNotBlindlyRetry(int code) {
|
||||
when(openCall.get(anyString(), anyString(), anyMap(), eq(Map.class)))
|
||||
.thenThrow(new DException(new OpenApiErrorCode(code, "opaque")));
|
||||
assertThrows(FormCenterSchemaClient.SchemaAccessDeniedException.class,
|
||||
() -> client.fetchSchema(27L, "U1", 3));
|
||||
verify(openCall, times(1)).get(anyString(), anyString(), anyMap(), eq(Map.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void http404DoesNotBlindlyRetry() {
|
||||
when(openCall.get(anyString(), anyString(), anyMap(), eq(Map.class)))
|
||||
.thenThrow(new OpenApiException("opaque", 404, ""));
|
||||
assertThrows(FormCenterSchemaClient.SchemaResourceUnavailableException.class,
|
||||
() -> client.fetchSchema(27L, "U1", 3));
|
||||
verify(openCall, times(1)).get(anyString(), anyString(), anyMap(), eq(Map.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void internalRemoteFailureRemainsRetryable() {
|
||||
when(openCall.get(anyString(), anyString(), anyMap(), eq(Map.class)))
|
||||
.thenThrow(new DException(new OpenApiErrorCode(6, "opaque")));
|
||||
assertThrows(FormCenterSchemaClient.SchemaUnavailableException.class,
|
||||
() -> client.fetchSchema(27L, "U1", 3));
|
||||
verify(openCall, times(FormCenterSchemaClient.MAX_ATTEMPTS))
|
||||
.get(anyString(), anyString(), anyMap(), eq(Map.class));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user