package com.berryworks.edireader;
import com.berryworks.edireader.benchmark.EDITestData;
import com.berryworks.edireader.error.*;
import org.junit.Test;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.transform.TransformerException;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import static com.berryworks.edireader.util.Conversion.ediToxml;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
public class EdifactReaderTest {
public static final String EDIFACT_WITH_GROUP = "UNB+IATA:1+REUAIR08DLH:PIMA+REUAGT82AGENT/LHR01:PIMA+941027:1520+841F60UNZ+RREF+APR"
+ "+L+1'"
+ "UNG+INVOIC+BTS-SENDER+RECEIVE-PARTNER+141024:2231+201410242231+UN+D:96A'"
+ "UNH+1+DCQCKI:90:1:IA+841F60'"
+ "LOR+SR:GVA'"
+ "UNT+3+1'"
+ "UNE+1+201410242231'"
+ "UNZ+1+841F60UNZ+1+30077'";
private EdifactReader edifactReader;
@Test
public void producesXmlForSimpleCase() throws IOException, SAXException, TransformerException {
edifactReader = new EdifactReader();
StringReader reader = new StringReader(
"UNB+IATA:1+REUAIR08DLH:PIMA+REUAGT82AGENT/LHR01:PIMA+941027:1520+841F60UNZ+RREF+APR"
+ "+L+1'"
+ "UNH+1+DCQCKI:90:1:IA+841F60'"
+ "LOR+SR:GVA'"
+ "FDQ+DL+573+890701+ATL+MIA++SR+120+8907011300+8907011655+ZRH+ATL'"
+ "PPD+MEIER+F:Y++BARBARAMRS+MILLER:JOHN'"
+ "PRD+Y'"
+ "PSD+N'"
+ "PBD+2:22'"
+ "UNT+8+1'"
+ "UNZ+1+841F60UNZ+1+30077'");
StringWriter writer = new StringWriter();
ediToxml(reader, writer, edifactReader);
assertEquals(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<ediroot>" +
"<interchange Standard=\"EDIFACT\" SyntaxId=\"IATA\" SyntaxVersion=\"1\" Date=\"941027\" Time=\"1520\" Control=\"841F60UNZ\" RecipientRef=\"RREF\" ApplRef=\"APR\" Priority=\"L\" AckRequest=\"1\" Decimal=\".\">" +
"<sender><address Id=\"REUAIR08DLH\" Qual=\"PIMA\"/></sender>" +
"<receiver><address Id=\"REUAGT82AGENT/LHR01\" Qual=\"PIMA\"/></receiver>" +
"<group>" +
"<transaction Control=\"1\" DocType=\"DCQCKI\" Version=\"90\" Release=\"1\" Agency=\"IA\" AccessReference=\"841F60\">" +
"<segment Id=\"LOR\"><element Id=\"LOR01\" Composite=\"yes\"><subelement Sequence=\"1\">SR</subelement><subelement Sequence=\"2\">GVA</subelement></element></segment>" +
"<segment Id=\"FDQ\"><element Id=\"FDQ01\">DL</element><element Id=\"FDQ02\">573</element><element Id=\"FDQ03\">890701</element><element Id=\"FDQ04\">ATL</element><element Id=\"FDQ05\">MIA</element><element Id=\"FDQ07\">SR</element><element Id=\"FDQ08\">120</element><element Id=\"FDQ09\">8907011300</element><element Id=\"FDQ10\">8907011655</element><element Id=\"FDQ11\">ZRH</element><element Id=\"FDQ12\">ATL</element></segment>" +
"<segment Id=\"PPD\"><element Id=\"PPD01\">MEIER</element><element Id=\"PPD02\" Composite=\"yes\"><subelement Sequence=\"1\">F</subelement><subelement Sequence=\"2\">Y</subelement></element><element Id=\"PPD04\">BARBARAMRS</element><element Id=\"PPD05\" Composite=\"yes\"><subelement Sequence=\"1\">MILLER</subelement><subelement Sequence=\"2\">JOHN</subelement></element></segment>" +
"<segment Id=\"PRD\"><element Id=\"PRD01\">Y</element></segment>" +
"<segment Id=\"PSD\"><element Id=\"PSD01\">N</element></segment>" +
"<segment Id=\"PBD\"><element Id=\"PBD01\" Composite=\"yes\"><subelement Sequence=\"1\">2</subelement><subelement Sequence=\"2\">22</subelement></element></segment>" +
"</transaction>" +
"</group>" +
"</interchange>" +
"</ediroot>",
writer.toString());
}
@Test
public void producesXmlForFunctionalGroup() throws IOException, SAXException, TransformerException {
edifactReader = new EdifactReader();
StringReader ediInput = new StringReader(EDIFACT_WITH_GROUP);
StringWriter writer = new StringWriter();
ediToxml(ediInput, writer, edifactReader);
assertEquals(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<ediroot>" +
"<interchange Standard=\"EDIFACT\" SyntaxId=\"IATA\" SyntaxVersion=\"1\" Date=\"941027\" Time=\"1520\" Control=\"841F60UNZ\" RecipientRef=\"RREF\" ApplRef=\"APR\" Priority=\"L\" AckRequest=\"1\" Decimal=\".\">" +
"<sender><address Id=\"REUAIR08DLH\" Qual=\"PIMA\"/></sender>" +
"<receiver><address Id=\"REUAGT82AGENT/LHR01\" Qual=\"PIMA\"/></receiver>" +
"<group GroupType=\"INVOIC\" ApplSender=\"BTS-SENDER\" ApplReceiver=\"RECEIVE-PARTNER\" Date=\"141024\" Time=\"2231\" Control=\"201410242231\" StandardCode=\"UN\" StandardVersion=\"D96A\">" +
"<transaction Control=\"1\" DocType=\"DCQCKI\" Version=\"90\" Release=\"1\" Agency=\"IA\" AccessReference=\"841F60\">" +
"<segment Id=\"LOR\"><element Id=\"LOR01\" Composite=\"yes\"><subelement Sequence=\"1\">SR</subelement><subelement Sequence=\"2\">GVA</subelement></element></segment>" +
"</transaction>" +
"</group>" +
"</interchange>" +
"</ediroot>",
writer.toString());
}
@Test
public void detectsGroupCountError() throws IOException, SAXException {
String ediText = EDITestData.getEdifactInterchange().replace("UNZ+1+", "UNZ+11+");
edifactReader = new EdifactReader();
edifactReader.setContentHandler(new DefaultHandler());
try {
edifactReader.parse(new InputSource(new StringReader(ediText)));
fail("Functional group count error not detected");
} catch (GroupCountException e) {
assertEquals("Functional group count error in UNZ segment. Expected 1 instead of 11 at segment 10, field 2", e.getMessage());
}
}
@Test
public void detectsInterchangeControlNumberError() throws IOException, SAXException {
String ediText = EDITestData.getEdifactInterchange().replace("UNZ+1+841F60UNZ", "UNZ+1+not841F60UNZ");
edifactReader = new EdifactReader();
edifactReader.setContentHandler(new DefaultHandler());
try {
edifactReader.parse(new InputSource(new StringReader(ediText)));
fail("Interchange control number error not detected");
} catch (InterchangeControlNumberException e) {
assertEquals(
"Control number error in UNZ segment. Expected 841F60UNZ instead of not841F60UNZ at segment 10, field 3",
e.getMessage());
}
}
@Test
public void detectsTransactionCountError() throws IOException, SAXException {
String ediText = EDIFACT_WITH_GROUP.replace("UNE+1+", "UNE+111+");
edifactReader = new EdifactReader();
edifactReader.setContentHandler(new DefaultHandler());
try {
edifactReader.parse(new InputSource(new StringReader(ediText)));
fail("Transaction count error not detected");
} catch (TransactionCountException e) {
assertEquals("Message count error in UNE segment. Expected 1 instead of 111 at segment 6, field 2", e.getMessage());
}
}
@Test
public void detectsGroupControlNumberError() throws IOException, SAXException {
String ediText = EDIFACT_WITH_GROUP.replace("UNE+1+201410242231", "UNE+1+10242231");
edifactReader = new EdifactReader();
edifactReader.setContentHandler(new DefaultHandler());
try {
edifactReader.parse(new InputSource(new StringReader(ediText)));
fail("Group control number error not detected");
} catch (GroupControlNumberException e) {
assertEquals(
"Control number error in UNE segment. Expected 201410242231 instead of 10242231 at segment 6, field 3",
e.getMessage());
}
}
@Test
public void detectsSegmentCountError() throws IOException, SAXException {
String ediText = EDITestData.getEdifactInterchange().replace("UNT+8+", "UNT+88+");
edifactReader = new EdifactReader();
edifactReader.setContentHandler(new DefaultHandler());
try {
edifactReader.parse(new InputSource(new StringReader(ediText)));
fail("Segment count error not detected");
} catch (SegmentCountException e) {
assertEquals("Segment count error in UNT segment. Expected 8 instead of 88 at segment 9, field 2", e.getMessage());
}
}
@Test
public void detectsTransactionControlNumberError() throws IOException, SAXException {
String ediText = EDITestData.getEdifactInterchange().replace("UNT+8+1'", "UNT+8+11'");
edifactReader = new EdifactReader();
edifactReader.setContentHandler(new DefaultHandler());
try {
edifactReader.parse(new InputSource(new StringReader(ediText)));
fail("Transaction control number error not detected");
} catch (TransactionControlNumberException e) {
assertEquals(
"Control number error in UNT segment. Expected 1 instead of 11 at segment 9, field 3",
e.getMessage());
}
}
}