From a198873cdbac6028fd9e7be83d7b6d4efd61066d Mon Sep 17 00:00:00 2001 From: Bryce Willey Date: Tue, 5 Aug 2025 11:41:20 -0400 Subject: [PATCH] Save sequence number, not a load doc boolean Also adds unit test for parsing the doc. --- ...lingDocDocassembleJacksonDeserializer.java | 4 +- ...rmationDocassembleJacksonDeserializer.java | 5 +- .../ecfcodes/tyler/CourtLocationInfo.java | 1 + .../efsp/ecfcodes/tyler/DataFieldRow.java | 6 ++ .../suffolk/litlab/efsp/model/FilingDoc.java | 14 ++-- .../ecf4/EcfCourtSpecificSerializer.java | 5 +- .../efsp/server/setup/tyler/Ecf4Filer.java | 3 +- ...DocDocassembleJacksonDeserializerTest.java | 63 ++++++++++------ .../ecf4/EcfCourtSpecificSerializerTest.java | 74 +++++++++++++++---- 9 files changed, 121 insertions(+), 54 deletions(-) diff --git a/proxyserver/src/main/java/edu/suffolk/litlab/efsp/docassemble/FilingDocDocassembleJacksonDeserializer.java b/proxyserver/src/main/java/edu/suffolk/litlab/efsp/docassemble/FilingDocDocassembleJacksonDeserializer.java index e8cedbf5a..1d345583e 100644 --- a/proxyserver/src/main/java/edu/suffolk/litlab/efsp/docassemble/FilingDocDocassembleJacksonDeserializer.java +++ b/proxyserver/src/main/java/edu/suffolk/litlab/efsp/docassemble/FilingDocDocassembleJacksonDeserializer.java @@ -45,7 +45,7 @@ public class FilingDocDocassembleJacksonDeserializer { /** Parses a filing from the DA Json Object. Used by Deserializers that include filings. */ public static Optional fromNode( - JsonNode node, Map varToPartyId, boolean isLeadDoc, InfoCollector collector) + JsonNode node, Map varToPartyId, int sequenceNum, InfoCollector collector) throws FilingError { if (!node.isObject()) { FilingError err = @@ -200,7 +200,7 @@ public static Optional fromNode( courtesyCopies, preliminaryCopies, action, - isLeadDoc)); + sequenceNum)); } private static Optional getAttachment(JsonNode node, InfoCollector collector) diff --git a/proxyserver/src/main/java/edu/suffolk/litlab/efsp/docassemble/FilingInformationDocassembleJacksonDeserializer.java b/proxyserver/src/main/java/edu/suffolk/litlab/efsp/docassemble/FilingInformationDocassembleJacksonDeserializer.java index e6c2eddf9..6e7c1f220 100644 --- a/proxyserver/src/main/java/edu/suffolk/litlab/efsp/docassemble/FilingInformationDocassembleJacksonDeserializer.java +++ b/proxyserver/src/main/java/edu/suffolk/litlab/efsp/docassemble/FilingInformationDocassembleJacksonDeserializer.java @@ -434,10 +434,7 @@ private static List extractFilingDocs( collector.pushAttributeStack("al_court_bundle.elements[" + i + "]"); Optional maybeDoc = FilingDocDocassembleJacksonDeserializer.fromNode( - elems.get(i), - varToPartyId, - i == 0, // the 0th doc is the Lead doc by default - collector); + elems.get(i), varToPartyId, filingDocs.size(), collector); collector.popAttributeStack(); maybeDoc.ifPresent( doc -> { diff --git a/proxyserver/src/main/java/edu/suffolk/litlab/efsp/ecfcodes/tyler/CourtLocationInfo.java b/proxyserver/src/main/java/edu/suffolk/litlab/efsp/ecfcodes/tyler/CourtLocationInfo.java index 7a28fb69e..c0501b1c1 100644 --- a/proxyserver/src/main/java/edu/suffolk/litlab/efsp/ecfcodes/tyler/CourtLocationInfo.java +++ b/proxyserver/src/main/java/edu/suffolk/litlab/efsp/ecfcodes/tyler/CourtLocationInfo.java @@ -169,6 +169,7 @@ public CourtLocationInfo() { this.showdamageamount = false; this.allowchargeupdate = false; this.allowpartyid = false; + this.allowserviceoninitial = BoolOrDefault.DEFAULT; } public CourtLocationInfo(ResultSet rs) throws SQLException { diff --git a/proxyserver/src/main/java/edu/suffolk/litlab/efsp/ecfcodes/tyler/DataFieldRow.java b/proxyserver/src/main/java/edu/suffolk/litlab/efsp/ecfcodes/tyler/DataFieldRow.java index 114cb6250..e1078b5a6 100644 --- a/proxyserver/src/main/java/edu/suffolk/litlab/efsp/ecfcodes/tyler/DataFieldRow.java +++ b/proxyserver/src/main/java/edu/suffolk/litlab/efsp/ecfcodes/tyler/DataFieldRow.java @@ -49,6 +49,12 @@ public DataFieldRow( this.location = location; } + // Used for testing. + public DataFieldRow( + String code, String name, boolean isvisible, boolean isrequired, String location) { + this(code, name, isvisible, isrequired, "", "", "", "", "", "", false, location); + } + /** * According to the Tyler docs, if some data field is not defined, it defaults to isVisible=False, * and isRequired=False. Everything else will be empty diff --git a/proxyserver/src/main/java/edu/suffolk/litlab/efsp/model/FilingDoc.java b/proxyserver/src/main/java/edu/suffolk/litlab/efsp/model/FilingDoc.java index 49d9c1c61..a9981fbcf 100644 --- a/proxyserver/src/main/java/edu/suffolk/litlab/efsp/model/FilingDoc.java +++ b/proxyserver/src/main/java/edu/suffolk/litlab/efsp/model/FilingDoc.java @@ -38,13 +38,13 @@ public class FilingDoc { private final List optServices; private final Optional filingAction; - private final boolean isLeadDoc; + private final int sequenceNum; public FilingDoc( Optional filingCode, List filingPartyIds, NonEmptyList filingAttachments, - boolean isLeadDoc) { + int sequenceNum) { this( filingCode, "", @@ -59,7 +59,7 @@ public FilingDoc( List.of(), List.of(), Optional.empty(), - isLeadDoc); + sequenceNum); } /** Full constructor, in all it's mess. */ @@ -77,7 +77,7 @@ public FilingDoc( List courtesyCopies, List preliminaryCopies, Optional filingAction, - boolean isLeadDoc) { + int sequenceNum) { this.filingCode = filingCode; this.userProvidedDescription = NonEmptyString.create(userProvidedDescription); this.filingReferenceNum = filingReferenceNum; @@ -93,7 +93,7 @@ public FilingDoc( this.courtesyCopies = courtesyCopies; this.preliminaryCopies = preliminaryCopies; this.filingAction = filingAction; - this.isLeadDoc = isLeadDoc; + this.sequenceNum = sequenceNum; } /** Returns the sum of all of the attachment files lengths. */ @@ -117,8 +117,8 @@ public UUID getId() { return id; } - public boolean isLead() { - return isLeadDoc; + public int sequenceNum() { + return sequenceNum; } public List getFilingPartyIds() { diff --git a/proxyserver/src/main/java/edu/suffolk/litlab/efsp/server/ecf4/EcfCourtSpecificSerializer.java b/proxyserver/src/main/java/edu/suffolk/litlab/efsp/server/ecf4/EcfCourtSpecificSerializer.java index 56353e15c..7733cb7a5 100644 --- a/proxyserver/src/main/java/edu/suffolk/litlab/efsp/server/ecf4/EcfCourtSpecificSerializer.java +++ b/proxyserver/src/main/java/edu/suffolk/litlab/efsp/server/ecf4/EcfCourtSpecificSerializer.java @@ -720,7 +720,6 @@ private PersonNameTextType checkName( public JAXBElement filingDocToXml( FilingDoc doc, - int sequenceNum, boolean isInitialFiling, CaseCategory caseCategory, CaseType motionType, @@ -780,7 +779,7 @@ public JAXBElement filingDocToXml( } } - docType.setDocumentSequenceID(Ecf4Helper.convertString(Integer.toString(sequenceNum))); + docType.setDocumentSequenceID(Ecf4Helper.convertString(Integer.toString(doc.sequenceNum()))); DocumentMetadataType metadata = ecfOf.createDocumentMetadataType(); metadata.setRegisterActionDescriptionText(Ecf4Helper.convertText(filing.code)); @@ -968,7 +967,7 @@ public JAXBElement filingDocToXml( docType.getDocumentRendition().add(rendition); docType.setId(doc.getIdString()); - if (doc.isLead()) { + if (doc.sequenceNum() == 0) { // default to the first doc being the lead one. return tylerObjFac.createFilingLeadDocument(docType); } else { return tylerObjFac.createFilingConnectedDocument(docType); diff --git a/proxyserver/src/main/java/edu/suffolk/litlab/efsp/server/setup/tyler/Ecf4Filer.java b/proxyserver/src/main/java/edu/suffolk/litlab/efsp/server/setup/tyler/Ecf4Filer.java index 5bbec343f..e257e4dfc 100644 --- a/proxyserver/src/main/java/edu/suffolk/litlab/efsp/server/setup/tyler/Ecf4Filer.java +++ b/proxyserver/src/main/java/edu/suffolk/litlab/efsp/server/setup/tyler/Ecf4Filer.java @@ -420,7 +420,6 @@ private CoreMessageAndNames prepareFiling( JAXBElement result = serializer.filingDocToXml( filingDoc, - seqNum, isInitialFiling, allCodes.cat, allCodes.type, @@ -430,7 +429,7 @@ private CoreMessageAndNames prepareFiling( collector); collector.popAttributeStack(); filingIdToObj.put(filingDoc.getIdString(), result.getValue()); - if (filingDoc.isLead()) { + if (filingDoc.sequenceNum() == 0) { cfm.getFilingLeadDocument().add(result); } else { cfm.getFilingConnectedDocument().add(result); diff --git a/proxyserver/src/test/java/edu/suffolk/litlab/efsp/docassemble/FilingDocDocassembleJacksonDeserializerTest.java b/proxyserver/src/test/java/edu/suffolk/litlab/efsp/docassemble/FilingDocDocassembleJacksonDeserializerTest.java index 07ac00d09..56627a3df 100644 --- a/proxyserver/src/test/java/edu/suffolk/litlab/efsp/docassemble/FilingDocDocassembleJacksonDeserializerTest.java +++ b/proxyserver/src/test/java/edu/suffolk/litlab/efsp/docassemble/FilingDocDocassembleJacksonDeserializerTest.java @@ -8,7 +8,6 @@ import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import edu.suffolk.litlab.efsp.model.FilingDoc; import edu.suffolk.litlab.efsp.model.PartyId; import edu.suffolk.litlab.efsp.utils.FailFastCollector; import edu.suffolk.litlab.efsp.utils.FilingError; @@ -19,7 +18,6 @@ import java.time.format.DateTimeParseException; import java.util.List; import java.util.Map; -import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -35,7 +33,6 @@ public class FilingDocDocassembleJacksonDeserializerTest { // TODO: more tests FilingAttachment separately, if possible - Optional doc; InfoCollector collector; Map varToPartyId; @@ -49,11 +46,11 @@ public void setUp() { public void testWeirdJsonShouldBeEmpty() throws JsonMappingException, JsonProcessingException, FilingError { ObjectMapper m = new ObjectMapper(); - assertThatThrownBy(() -> fromNode(m.readTree("null"), varToPartyId, true, collector)) + assertThatThrownBy(() -> fromNode(m.readTree("null"), varToPartyId, 0, collector)) .isInstanceOf(FilingError.class); - assertThatThrownBy(() -> fromNode(m.readTree("[]"), varToPartyId, true, collector)) + assertThatThrownBy(() -> fromNode(m.readTree("[]"), varToPartyId, 0, collector)) .isInstanceOf(FilingError.class); - doc = fromNode(m.readTree("{}"), varToPartyId, true, collector); + var doc = fromNode(m.readTree("{}"), varToPartyId, 0, collector); assertThat(doc).isEmpty(); } @@ -61,7 +58,7 @@ public void testWeirdJsonShouldBeEmpty() @Test public void noAttachmentsShouldLoadDocument() throws FilingError, IOException { JsonNode node = readFile("old_style_doc.json"); - doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, true, collector); + var doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, 0, collector); assertThat(doc).isPresent(); var attachments = doc.get().getFilingAttachments(); assertThat(attachments.length()).isEqualTo(1); @@ -71,8 +68,28 @@ public void noAttachmentsShouldLoadDocument() throws FilingError, IOException { @Test public void oneAttachmentShouldLoadDocument() throws FilingError, IOException { JsonNode node = readFile("one_attachment.json"); - doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, true, collector); + var maybeDoc = + FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, 0, collector); + assertThat(maybeDoc).isPresent(); + var doc = maybeDoc.get(); + assertThat(doc.sequenceNum()).isEqualTo(0); + var attachments = doc.getFilingAttachments(); + assertThat(attachments.length()).isEqualTo(1); + assertThat(attachments.head().getDocumentTypeFormatStandardName()).isEqualTo("6586"); + var parties = doc.getFilingPartyIds(); + assertThat(parties.size()).isEqualTo(1); + assertThat(parties.get(0).isNewInCurrentFiling()).isTrue(); + assertThat(doc.getDescription()).isPresent(); + assertThat(doc.getDescription().get().get()) + .isEqualTo("The Motion to Stay Eviction for Bob Ma"); + } + + @Test + public void oneAttachmentAsSecondSequenceShouldLoadDocument() throws FilingError, IOException { + JsonNode node = readFile("one_attachment.json"); + var doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, 2, collector); assertThat(doc).isPresent(); + assertThat(doc.get().sequenceNum()).isEqualTo(2); var attachments = doc.get().getFilingAttachments(); assertThat(attachments.length()).isEqualTo(1); assertThat(attachments.head().getDocumentTypeFormatStandardName()).isEqualTo("6586"); @@ -84,7 +101,7 @@ public void oneAttachmentShouldLoadDocument() throws FilingError, IOException { @Test public void partyIdNotPresent() throws IOException, FilingError { JsonNode node = readFile("one_attachment.json"); - doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, Map.of(), true, collector); + var doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, Map.of(), 0, collector); assertThat(doc).isPresent(); var parties = doc.get().getFilingPartyIds(); assertThat(parties.size()).isEqualTo(1); @@ -94,7 +111,7 @@ public void partyIdNotPresent() throws IOException, FilingError { @Test public void oneEnabledOneDisabledShouldLoadOneAttachment() throws FilingError, IOException { JsonNode node = readFile("one_enabled_one_disabled.json"); - doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, true, collector); + var doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, 0, collector); assertThat(doc).isPresent(); var attachments = doc.get().getFilingAttachments(); assertThat(attachments.length()).isEqualTo(1); @@ -104,14 +121,14 @@ public void oneEnabledOneDisabledShouldLoadOneAttachment() throws FilingError, I @Test public void noEnabledShouldFilingError() throws IOException, FilingError { JsonNode node = readFile("fail_no_enabled_attachment.json"); - doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, true, collector); + var doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, 0, collector); assertThat(doc).as("Document shouldn't have parsed").isEmpty(); } @Test public void shouldFallbackToParentDocIfNoEnabled() throws FilingError, IOException { JsonNode node = readFile("fallback_to_upper_doc.json"); - doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, true, collector); + var doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, 0, collector); assertThat(doc).isPresent(); var attachments = doc.get().getFilingAttachments(); assertThat(attachments.length()).isEqualTo(1); @@ -122,7 +139,7 @@ public void shouldFallbackToParentDocIfNoEnabled() throws FilingError, IOExcepti @Test public void noDocTypesShouldBeEmptyStrings() throws IOException, FilingError { JsonNode node = readFile("fail_missing_doc_types.json"); - doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, true, collector); + var doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, 0, collector); assertThat(doc).isPresent(); var attachments = doc.get().getFilingAttachments(); assertThat(attachments.length()).isEqualTo(1); @@ -132,7 +149,7 @@ public void noDocTypesShouldBeEmptyStrings() throws IOException, FilingError { @Test public void twoAttachmentsShouldLoadTwoAttachments() throws FilingError, IOException { JsonNode node = readFile("two_attachments.json"); - doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, true, collector); + var doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, 0, collector); assertThat(doc).isPresent(); var attachments = doc.get().getFilingAttachments(); assertThat(attachments.length()).isEqualTo(2); @@ -146,7 +163,7 @@ public void twoAttachmentsShouldLoadTwoAttachments() throws FilingError, IOExcep @Test public void hasOptionalServicesShouldParse() throws FilingError, IOException { JsonNode node = readFile("has_optional_services.json"); - doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, true, collector); + var doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, 0, collector); assertThat(doc).isPresent(); var optionalServices = doc.get().getOptionalServices(); assertThat(optionalServices).hasSize(1); @@ -157,7 +174,7 @@ public void hasOptionalServicesShouldParse() throws FilingError, IOException { public void filingActionShouldAlwaysParse() throws IOException, FilingError { for (var emptyData : List.of("null", "\"\"", "\"clearly_wrong\"")) { JsonNode node = readTemplate("template_filing_action.json", emptyData); - doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, true, collector); + var doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, 0, collector); assertThat(doc).isPresent(); assertThat(doc.get().getFilingAction()).isEmpty(); } @@ -169,7 +186,7 @@ public void filingActionShouldAlwaysParse() throws IOException, FilingError { "\"e_file_and_serve\"", "\"serve\"")) { JsonNode node = readTemplate("template_filing_action.json", data); - doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, true, collector); + var doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, 0, collector); assertThat(doc).isPresent(); assertThat(doc.get().getFilingAction()).isPresent(); } @@ -178,7 +195,7 @@ public void filingActionShouldAlwaysParse() throws IOException, FilingError { @Test public void testTylerMergeAttachments() throws IOException, FilingError { JsonNode node = readFile("tyler_merge_attachments.json"); - doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, true, collector); + var doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, 0, collector); assertThat(doc).isPresent(); var attachments = doc.get().getFilingAttachments(); assertThat(attachments.length()).isEqualTo(1); @@ -202,7 +219,8 @@ record InputSaved(String dateInput, String savedDate) {} // TODO: weird behavior: local date parses based on server's timezone? Should fix new InputSaved("\"2024-02-29T01:19:00.123Z\"", "2024-02-28"))) { JsonNode node = readTemplate(INPUT_FILE, testData.dateInput); - doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, true, collector); + var doc = + FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, 0, collector); assertThat(doc).isPresent(); assertThat(doc.get().getDueDate()).isPresent(); assertThat(doc.get().getDueDate().get()).isEqualTo(testData.savedDate); @@ -217,7 +235,8 @@ public void nonTextDueDateShouldBeEmpty() throws IOException, FilingError { )) { // TODO(brycew): Should also include an empty and blank string, but those error // right now JsonNode node = readTemplate(INPUT_FILE, emptyData); - doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, true, collector); + var doc = + FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, 0, collector); assertThat(doc).isPresent(); assertThat(doc.get().getDueDate()).isEmpty(); } @@ -238,7 +257,7 @@ public void invalidDueDateShouldThrow() throws IOException, FilingError { assertThatThrownBy( () -> FilingDocDocassembleJacksonDeserializer.fromNode( - node, varToPartyId, true, collector)) + node, varToPartyId, 0, collector)) .withFailMessage("Failed on %s", badData) .isInstanceOf(DateTimeParseException.class); } @@ -262,7 +281,7 @@ public void testMalformedDataUrlShouldThrow() throws IOException { assertThatThrownBy( () -> FilingDocDocassembleJacksonDeserializer.fromNode( - node, varToPartyId, true, collector)) + node, varToPartyId, 0, collector)) .withFailMessage("Using %s", badData) .isInstanceOf(FilingError.class); } diff --git a/proxyserver/src/test/java/edu/suffolk/litlab/efsp/server/ecf4/EcfCourtSpecificSerializerTest.java b/proxyserver/src/test/java/edu/suffolk/litlab/efsp/server/ecf4/EcfCourtSpecificSerializerTest.java index 992ed168a..ff3ccd488 100644 --- a/proxyserver/src/test/java/edu/suffolk/litlab/efsp/server/ecf4/EcfCourtSpecificSerializerTest.java +++ b/proxyserver/src/test/java/edu/suffolk/litlab/efsp/server/ecf4/EcfCourtSpecificSerializerTest.java @@ -17,14 +17,20 @@ import ecf4.latest.oasis.names.tc.legalxml_courtfiling.schema.xsd.commontypes_4.OrganizationType; import ecf4.latest.oasis.names.tc.legalxml_courtfiling.schema.xsd.commontypes_4.PersonType; import ecf4.latest.tyler.ecf.extensions.common.CapabilityType; +import edu.suffolk.litlab.efsp.docassemble.FilingDocDocassembleJacksonDeserializer; +import edu.suffolk.litlab.efsp.ecfcodes.tyler.CaseCategory; +import edu.suffolk.litlab.efsp.ecfcodes.tyler.CaseType; import edu.suffolk.litlab.efsp.ecfcodes.tyler.CodeDatabase; import edu.suffolk.litlab.efsp.ecfcodes.tyler.CourtLocationInfo; import edu.suffolk.litlab.efsp.ecfcodes.tyler.CrossReference; import edu.suffolk.litlab.efsp.ecfcodes.tyler.DataFieldRow; import edu.suffolk.litlab.efsp.ecfcodes.tyler.DataFields; +import edu.suffolk.litlab.efsp.ecfcodes.tyler.FileType; +import edu.suffolk.litlab.efsp.ecfcodes.tyler.FilingCode; import edu.suffolk.litlab.efsp.ecfcodes.tyler.PartyType; import edu.suffolk.litlab.efsp.model.ContactInformation; import edu.suffolk.litlab.efsp.model.Name; +import edu.suffolk.litlab.efsp.model.PartyId; import edu.suffolk.litlab.efsp.model.Person; import edu.suffolk.litlab.efsp.utils.AllWrongCollector; import edu.suffolk.litlab.efsp.utils.FailFastCollector; @@ -32,6 +38,7 @@ import edu.suffolk.litlab.efsp.utils.InfoCollector; import jakarta.xml.bind.JAXBElement; import jakarta.xml.bind.JAXBException; +import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Optional; @@ -65,25 +72,15 @@ public void setUp() { when(cd.getCrossReference("cook:cd1", caseType)).thenReturn(refs); when(cd.getCrossReference("adams", caseType)).thenReturn(blank); when(cd.getLanguageNames("not_real")).thenReturn(List.of("English", "Polish", "Spanish")); + when(cd.getAllowedFileTypes("not_real")) + .thenReturn(List.of(new FileType("PDF", "pdf", ".pdf", "not_real"))); when(cd.getDataFields(eq("not_real"))) .thenReturn( new DataFields( List.of( Map.of( "PartyGender", - new DataFieldRow( - "PartyGender", - "Party Gender", - true, - false, - "", - "", - "", - "", - "", - "", - false, - ""), + new DataFieldRow("PartyGender", "Party Gender", true, false, ""), "PartyPhone", new DataFieldRow( "PartyPhone", @@ -97,7 +94,10 @@ public void setUp() { "^(\\+0?1\\s)?\\(?\\d{3}\\)?\\d{3}\\d{4}$", "", false, - ""))))); + ""), + "DocumentDescription", + new DataFieldRow( + "DocumentDescription", "Document Description", true, false, ""))))); collector = new FailFastCollector(); } @@ -302,4 +302,50 @@ public void shouldThrowOnBadCrossRefKey() throws JsonMappingException, JsonProce // Expected! } } + + @Test + public void shouldParseDoc() throws IOException, FilingError { + collector = new AllWrongCollector(); + CourtLocationInfo loc = new CourtLocationInfo(); + loc.code = "not_real"; + loc.allowserviceoninitial = CourtLocationInfo.BoolOrDefault.TRUE; + + CaseCategory caseCategory = new CaseCategory("7", "Civil", null, null, null, null, null); + CaseType caseType = new CaseType("100", "Divorce", "7", "true", "100", null, null, "not_real"); + FilingCode filing = + new FilingCode( + "200", + "Initial Filing", + "100", + "7", + "100", + "0", + false, + null, + null, + null, + false, + false, + null, + "not_real"); + + var varToPartyId = Map.of("users[0]", PartyId.CurrentFilingNew("abc")); + JsonNode node = readFile("one_attachment.json"); + var doc = FilingDocDocassembleJacksonDeserializer.fromNode(node, varToPartyId, 2, collector); + + EcfCourtSpecificSerializer cookSer = new EcfCourtSpecificSerializer(cd, loc); + ObjectMapper mapper = new ObjectMapper(); + JsonNode miscNode = mapper.createObjectNode(); + var xmlDoc = + cookSer.filingDocToXml( + doc.get(), true, caseCategory, caseType, filing, true, miscNode, collector); + assertThat(xmlDoc.getValue().getDocumentSequenceID().getValue()).isEqualTo("2"); + assertThat(xmlDoc.getValue().getDocumentDescriptionText().getValue()) + .isEqualTo("The Motion to Stay Eviction for Bob Ma"); + } + + private JsonNode readFile(String jsonFile) throws IOException { + ObjectMapper mapper = new ObjectMapper(); + return mapper.readTree(this.getClass().getResourceAsStream("/filingdocs/" + jsonFile)); + } }