Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci-released.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
runs-on: ubuntu-latest
permissions:
id-token: write
attestations: write
contents: read
outputs:
upload_artifact_name: ${{ steps.update_spec.outputs.upload_artifact_name }}
steps:
Expand Down
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,7 @@ dependencies {
testAnnotationProcessor "org.projectlombok:lombok:$lombokVersion"

// Testing
testImplementation("org.assertj:assertj-core:3.6.1")
testImplementation platform('org.junit:junit-bom:6.0.0')
testImplementation 'org.junit.jupiter:junit-jupiter-api'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.junit.jupiter.api.Test;
import uk.gov.hmcts.cp.openapi.model.cdk.AnswerResponse;
import uk.gov.hmcts.cp.openapi.model.cdk.AnswerWithLlmResponse;
import uk.gov.hmcts.cp.openapi.model.cdk.QueryStatusResponse;
import uk.gov.hmcts.cp.openapi.model.cdk.QuerySummary;

import java.time.OffsetDateTime;
import java.util.List;
import java.util.UUID;

import static org.junit.jupiter.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
import static uk.gov.hmcts.cp.openapi.model.cdk.QueryLifecycleStatus.ANSWER_AVAILABLE;

class ExamplePayloadBindingTest {

Expand All @@ -19,119 +19,65 @@ class ExamplePayloadBindingTest {
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

@Test
void can_deserialize_AnswerResponse_example() throws Exception {
String json = """
{
"queryId": "%s",
"userQuery": "Summary of case based on witness statements",
"answer": "jkhkdvlvld ::SourcePage 12",
"version": 1,
"createdAt": "2025-01-01T11:11:11Z"
}
""".formatted(UUID.randomUUID());

Class<?> cls = Class.forName("uk.gov.hmcts.cp.openapi.model.cdk.AnswerResponse");
Object obj = mapper.readValue(json, cls);
assertNotNull(obj);

Object queryId = cls.getMethod("getQueryId").invoke(obj);
Object userQuery = cls.getMethod("getUserQuery").invoke(obj);
Object answer = cls.getMethod("getAnswer").invoke(obj);
Object createdAt = cls.getMethod("getCreatedAt").invoke(obj);
Object version = cls.getMethod("getVersion").invoke(obj);

assertNotNull(queryId);
assertEquals("Summary of case based on witness statements", userQuery);
assertEquals("jkhkdvlvld ::SourcePage 12", answer);

if (createdAt instanceof OffsetDateTime odt) {
assertEquals(OffsetDateTime.parse("2025-01-01T11:11:11Z"), odt);
} else {
assertEquals("2025-01-01T11:11:11Z", String.valueOf(createdAt));
}

assertEquals(1, ((Number) version).intValue());
void json_should_map_to_AnswerResponse_object() throws Exception {
String json = "{\n" +
" \"queryId\": \"a1a6eeb3-06f5-4c33-ac48-c09d66991ca1\",\n" +
" \"userQuery\": \"Summary of case based on witness statements\",\n" +
" \"answer\": \"jkhkdvlvld ::SourcePage 12\",\n" +
" \"version\": 1,\n" +
" \"createdAt\": \"2025-01-01T11:11:11Z\"\n" +
"}";

AnswerResponse answerResponse = mapper.readValue(json, AnswerResponse.class);
assertThat(answerResponse.getQueryId().toString()).isEqualTo("a1a6eeb3-06f5-4c33-ac48-c09d66991ca1");
assertThat(answerResponse.getUserQuery()).isEqualTo("Summary of case based on witness statements");
assertThat(answerResponse.getAnswer()).isEqualTo("jkhkdvlvld ::SourcePage 12");
assertThat(answerResponse.getVersion()).isEqualTo(1);
assertThat(answerResponse.getCreatedAt()).isEqualTo("2025-01-01T11:11:11Z");
}

@Test
void can_deserialize_AnswerWithLlmResponse_example() throws Exception {
String json = """
{
"queryId": "%s",
"userQuery": "Summary of case based on witness statements",
"answer": "jkhkdvlvld",
"version": 2,
"llmInput": "jv,dfnv,nv.,c .,c,",
"createdAt": "2025-01-01T11:11:11Z"
}
""".formatted(UUID.randomUUID());

Class<?> cls = Class.forName("uk.gov.hmcts.cp.openapi.model.cdk.AnswerWithLlmResponse");
Object obj = mapper.readValue(json, cls);
assertNotNull(obj);

assertEquals("jv,dfnv,nv.,c .,c,", cls.getMethod("getLlmInput").invoke(obj));
assertEquals(2, ((Number) cls.getMethod("getVersion").invoke(obj)).intValue());

Object createdAt = cls.getMethod("getCreatedAt").invoke(obj);
if (createdAt instanceof OffsetDateTime odt) {
assertEquals(OffsetDateTime.parse("2025-01-01T11:11:11Z"), odt);
} else {
assertEquals("2025-01-01T11:11:11Z", String.valueOf(createdAt));
}
void json_should_map_to_AnswerWithLimResponse_object() throws Exception {
String json = "{\n" +
" \"queryId\": \"a1a6eeb3-06f5-4c33-ac48-c09d66991ca1\",\n" +
" \"userQuery\": \"Summary of case based on witness statements\",\n" +
" \"answer\": \"jkhkdvlvld\",\n" +
" \"version\": 2,\n" +
" \"llmInput\": \"jv,dfnv,nv.,c .,c,\",\n" +
" \"createdAt\": \"2025-01-01T11:11:11Z\"\n" +
"}";

AnswerWithLlmResponse answerResponse = mapper.readValue(json, AnswerWithLlmResponse.class);
assertThat(answerResponse.getQueryId().toString()).isEqualTo("a1a6eeb3-06f5-4c33-ac48-c09d66991ca1");
assertThat(answerResponse.getUserQuery()).isEqualTo("Summary of case based on witness statements");
assertThat(answerResponse.getAnswer()).isEqualTo("jkhkdvlvld");
assertThat(answerResponse.getVersion()).isEqualTo(2);
assertThat(answerResponse.getLlmInput()).isEqualTo("jv,dfnv,nv.,c .,c,");
assertThat(answerResponse.getCreatedAt()).isEqualTo("2025-01-01T11:11:11Z");
}

@Test
@SuppressWarnings("unchecked")
void can_serialize_roundtrip_QueryStatusResponse() throws Exception {
String expectedAsOf = "2025-05-01T12:00:00Z";

ObjectNode root = mapper.createObjectNode();
root.put("asOf", expectedAsOf);

ObjectNode q = mapper.createObjectNode();
q.put("queryId", UUID.randomUUID().toString());
q.put("userQuery", "Summary of case based on witness statements");
q.put("queryPrompt", "Summarise the case using all witness statements, focusing on timeline.");
q.put("status", "ANSWER_AVAILABLE");
q.put("effectiveAt", "2025-05-01T11:59:00Z");

root.putArray("queries").add(q);

Class<?> respCls = Class.forName("uk.gov.hmcts.cp.openapi.model.cdk.QueryStatusResponse");
Object resp = mapper.readValue(mapper.writeValueAsString(root), respCls);
assertNotNull(resp);

Object asOfObj = respCls.getMethod("getAsOf").invoke(resp);
assertNotNull(asOfObj);
if (asOfObj instanceof OffsetDateTime odt) {
assertEquals(OffsetDateTime.parse(expectedAsOf), odt);
} else {
assertEquals(expectedAsOf, asOfObj.toString());
}

Object queriesObj = respCls.getMethod("getQueries").invoke(resp);
assertNotNull(queriesObj);
assertTrue(queriesObj instanceof List<?>);
List<?> queries = (List<?>) queriesObj;
assertEquals(1, queries.size());

Object first = queries.get(0);
Class<?> qCls = first.getClass();

Object status = qCls.getMethod("getStatus").invoke(first);
String statusText = (status instanceof Enum<?> e) ? e.name() : String.valueOf(status);
assertEquals("ANSWER_AVAILABLE", statusText);

assertEquals(
"Summarise the case using all witness statements, focusing on timeline.",
qCls.getMethod("getQueryPrompt").invoke(first)
);
assertEquals(
"Summary of case based on witness statements",
qCls.getMethod("getUserQuery").invoke(first)
);

assertNotNull(qCls.getMethod("getEffectiveAt").invoke(first), "effectiveAt must be present");
void json_should_map_to_QueryStatusResponse_object() throws Exception {
String json = "{\n" +
" \"asOf\": \"2025-05-01T12:00:00Z\",\n" +
" \"queries\": [\n" +
" {\n" +
" \"queryId\": \"a1a6eeb3-06f5-4c33-ac48-c09d66991ca1\",\n" +
" \"userQuery\": \"Summary of case based on witness statements\",\n" +
" \"queryPrompt\": \"Summarise the case using all witness statements, focusing on timeline.\",\n" +
" \"status\": \"ANSWER_AVAILABLE\",\n" +
" \"effectiveAt\": \"2025-01-01T11:11:11Z\"\n" +
" }\n" +
" ]\n" +
"}";

QueryStatusResponse statusResponse = mapper.readValue(json, QueryStatusResponse.class);
assertThat(statusResponse.getAsOf()).isEqualTo("2025-05-01T12:00:00Z");
QuerySummary item0 = statusResponse.getQueries().get(0);
assertThat(item0.getQueryId().toString()).isEqualTo("a1a6eeb3-06f5-4c33-ac48-c09d66991ca1");
assertThat(item0.getUserQuery()).isEqualTo("Summary of case based on witness statements");
assertThat(item0.getQueryPrompt()).isEqualTo("Summarise the case using all witness statements, focusing on timeline.");
assertThat(item0.getStatus()).isEqualTo(ANSWER_AVAILABLE);
assertThat(item0.getEffectiveAt()).isEqualTo("2025-01-01T11:11:11Z");
}
}
Loading