From e308f3dafccaadc8a0f6e06618149ea5607e27eb Mon Sep 17 00:00:00 2001 From: Hisham Alrashdan Date: Fri, 13 Nov 2026 08:15:54 +0300 Subject: [PATCH] Treat an unknown ACK code in an XML response as invalid HL7v2ResponseValidator handles ER7 and XML responses in separate branches. The ER7 branch marks a response as invalid when MSA.1 is not one of the configured successful, error or rejected codes. The XML branch had no such fallthrough: it left the response status unchanged, so a destination that received an XML ACK with an unknown code stayed SENT. Give the XML branch the same fallthrough. The response is QUEUED with "Invalid HL7 v2.x acknowledgement received.", as on the ER7 path. Both branches now share one helper for this. An XML response with no MSA.1 value is invalid too, which matches a missing MSA segment in ER7. The test that pinned the old behaviour now expects the invalid result. A second test covers an XML response without an MSA segment. Part of #560 (item 2) Assisted-by: Claude:claude-fable-5-2 Signed-off-by: Hisham Alrashdan --- .../hl7v2/HL7v2ResponseValidator.java | 12 +++++++++--- .../hl7v2/HL7v2ResponseValidatorTest.java | 19 +++++++++++++------ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/server/src/main/java/com/mirth/connect/plugins/datatypes/hl7v2/HL7v2ResponseValidator.java b/server/src/main/java/com/mirth/connect/plugins/datatypes/hl7v2/HL7v2ResponseValidator.java index 165366b5d3..1e56533ed3 100644 --- a/server/src/main/java/com/mirth/connect/plugins/datatypes/hl7v2/HL7v2ResponseValidator.java +++ b/server/src/main/java/com/mirth/connect/plugins/datatypes/hl7v2/HL7v2ResponseValidator.java @@ -82,6 +82,8 @@ public Response validate(Response response, ConnectorMessage connectorMessage) { } else { response.setStatus(Status.SENT); } + } else { + handleInvalidACK(response); } } else { // ER7 response received @@ -175,9 +177,7 @@ public Response validate(Response response, ConnectorMessage connectorMessage) { } if (!valid) { - response.setStatus(Status.QUEUED); - response.setStatusMessage("Invalid HL7 v2.x acknowledgement received."); - response.setError(response.getStatusMessage()); + handleInvalidACK(response); } } } catch (Exception e) { @@ -300,6 +300,12 @@ private void handleNACK(Response response, boolean rejected, String msa3, String response.setError(nackMessage.toString()); } + private void handleInvalidACK(Response response) { + response.setStatus(Status.QUEUED); + response.setStatusMessage("Invalid HL7 v2.x acknowledgement received."); + response.setError(response.getStatusMessage()); + } + private void handleInvalidControlId(Response response, String originalControlID, String msa2) { response.setStatus(Status.ERROR); diff --git a/server/src/test/java/com/mirth/connect/plugins/datatypes/hl7v2/HL7v2ResponseValidatorTest.java b/server/src/test/java/com/mirth/connect/plugins/datatypes/hl7v2/HL7v2ResponseValidatorTest.java index abdacf9740..ef576bd427 100644 --- a/server/src/test/java/com/mirth/connect/plugins/datatypes/hl7v2/HL7v2ResponseValidatorTest.java +++ b/server/src/test/java/com/mirth/connect/plugins/datatypes/hl7v2/HL7v2ResponseValidatorTest.java @@ -236,13 +236,20 @@ public void testXmlErrorAndRejectedAcks() { assertEquals("NACK sent from receiver. (Rejected)", validate("CR").getStatusMessage()); } - /* - * Characterizes existing behaviour: an unknown ACK code in an ER7 response is QUEUED as invalid - * (see testUnknownAckCodeIsInvalid), but in an XML response the status is left as it was. - */ @Test - public void testXmlUnknownAckCodeLeavesStatusUnchanged() { - assertEquals(Status.SENT, validate("XX").getStatus()); + public void testXmlUnknownAckCodeIsInvalid() { + Response response = validate("XX"); + + assertEquals(Status.QUEUED, response.getStatus()); + assertEquals("Invalid HL7 v2.x acknowledgement received.", response.getStatusMessage()); + } + + @Test + public void testXmlMissingMsaIsInvalid() { + Response response = validate("ACK"); + + assertEquals(Status.QUEUED, response.getStatus()); + assertEquals("Invalid HL7 v2.x acknowledgement received.", response.getStatusMessage()); } @Test