From a0cd55608905bceb2d316156f17922fd00b6beb3 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Sat, 12 Jul 2014 18:47:43 +0200 Subject: [PATCH] 1.0 --- mustang/pom.xml | 4 +- .../ZUGFeRD/MustangReaderTest.java | 63 ----------- ...Test.java => MustangReaderWriterTest.java} | 105 ++++++++++++------ mustang/target/mustang-1.1.0.jar | Bin 0 -> 17276 bytes .../org/mustangproject/ZUGFeRD/AppTest.class | Bin 1415 -> 0 bytes 5 files changed, 75 insertions(+), 97 deletions(-) delete mode 100644 mustang/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderTest.java rename mustang/src/test/java/org/mustangproject/ZUGFeRD/{MustangWriterTest.java => MustangReaderWriterTest.java} (78%) create mode 100644 mustang/target/mustang-1.1.0.jar delete mode 100644 mustang/target/test-classes/org/mustangproject/ZUGFeRD/AppTest.class diff --git a/mustang/pom.xml b/mustang/pom.xml index 3a715e3f..f88270c9 100644 --- a/mustang/pom.xml +++ b/mustang/pom.xml @@ -4,7 +4,7 @@ org.mustangproject.ZUGFeRD mustang - 1.1.0.alpha + 1.1.0 @@ -48,7 +48,7 @@ junit junit - 3.8.1 + 4.11 test diff --git a/mustang/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderTest.java b/mustang/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderTest.java deleted file mode 100644 index 9608d396..00000000 --- a/mustang/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.mustangproject.ZUGFeRD; - -import java.io.IOException; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class MustangReaderTest extends TestCase { - /** - * Create the test case - * - * @param testName - * name of the test case - */ - public MustangReaderTest(String testName) { - super(testName); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() { - return new TestSuite(MustangReaderTest.class); - } - - /** - * Rigourous Test :-) - */ - public void testImport() { - ZUGFeRDImporter zi = new ZUGFeRDImporter(); - zi.extract("./src/test/MustangGnuaccountingBeispielRE-20140703_502.pdf"); - // Reading ZUGFeRD - - String amount=null; - String bic=null; - String iban=null; - String holder=null; - String ref=null; - - if (zi.canParse()) { - zi.parse(); - amount=zi.getAmount(); - bic=zi.getBIC(); - iban=zi.getIBAN(); - holder=zi.getHolder(); - ref=zi.getForeignReference(); - } - - - assertEquals(amount, "571.04"); - assertEquals(bic, "COBADEFXXX"); - assertEquals(iban, "DE88 2008 0000 0970 3757 00"); - assertEquals(holder, "Bei Spiel GmbH"); - assertEquals(ref, "RE-20140703/502"); - - - } - -} diff --git a/mustang/src/test/java/org/mustangproject/ZUGFeRD/MustangWriterTest.java b/mustang/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java similarity index 78% rename from mustang/src/test/java/org/mustangproject/ZUGFeRD/MustangWriterTest.java rename to mustang/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java index ae163ca2..b0da31bc 100644 --- a/mustang/src/test/java/org/mustangproject/ZUGFeRD/MustangWriterTest.java +++ b/mustang/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java @@ -2,6 +2,7 @@ package org.mustangproject.ZUGFeRD; import java.io.IOException; + import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; @@ -15,9 +16,11 @@ import junit.framework.TestSuite; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.jempbox.xmp.*; +import org.junit.*; +import org.junit.runners.MethodSorters; - -public class MustangWriterTest extends TestCase implements IZUGFeRDExportableTransaction { +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class MustangReaderWriterTest extends TestCase implements IZUGFeRDExportableTransaction { @Override public Date getDeliveryDate() { @@ -261,22 +264,84 @@ public class MustangWriterTest extends TestCase implements IZUGFeRDExportableTra } - private void apply() { + + /** + * Create the test case + * + * @param testName + * name of the test case + */ + public MustangReaderWriterTest(String testName) { + super(testName); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() { + return new TestSuite(MustangReaderWriterTest.class); + } + +////////// TESTS ////////////////////////////////////////////////////////////////////////////////////////// + + /** + * The importer test imports from ./src/test/MustangGnuaccountingBeispielRE-20140703_502.pdf to check the values. + * + * --> as only Name Ascending is supported for Test Unit sequence, I renamed the this test-A-Export to run before testZExport + */ + + public void testAImport() { + ZUGFeRDImporter zi = new ZUGFeRDImporter(); + zi.extract("./src/test/MustangGnuaccountingBeispielRE-20140703_502.pdf"); + // Reading ZUGFeRD + + String amount=null; + String bic=null; + String iban=null; + String holder=null; + String ref=null; + + if (zi.canParse()) { + zi.parse(); + amount=zi.getAmount(); + bic=zi.getBIC(); + iban=zi.getIBAN(); + holder=zi.getHolder(); + ref=zi.getForeignReference(); + } + + + assertEquals(amount, "571.04"); + assertEquals(bic, "COBADEFXXX"); + assertEquals(iban, "DE88 2008 0000 0970 3757 00"); + assertEquals(holder, "Bei Spiel GmbH"); + assertEquals(ref, "RE-20140703/502"); + + + } + + + /** + * The exporter test bases on ./src/test/MustangGnuaccountingBeispielRE-20140703_502blanko.pdf, adds metadata, writes + * (to ./src/test/MustangGnuaccountingBeispielRE-20140703_502new.pdf) and then imports to check the values. + * + * It would not make sense to have it run before the less complex importer test (which is probably redundant) + * --> as only Name Ascending is supported for Test Unit sequence, I renamed the Exporter Test test-Z-Export + */ + public void testZExport() { + // generate ./src/test/MustangGnuaccountingBeispielRE-20140703_502new.pdf from ./src/test/MustangGnuaccountingBeispielRE-20140703_502blank.pdf: + // the writing part + PDDocument doc; try { - System.out.println("Lese Blanko-PDF"); doc = PDDocument .load("./src/test/MustangGnuaccountingBeispielRE-20140703_502blanko.pdf"); // automatically add Zugferd to all outgoing invoices ZUGFeRDExporter ze = new ZUGFeRDExporter(); - System.out.println("Wandle in PDF/A-3u um"); ze.PDFmakeA3compliant(doc, "My Application", System.getProperty("user.name"), true); - System.out.println("ZUGFeRD-Daten generieren und anhängen"); ze.PDFattachZugferdFile(doc, this); - System.out.println("Schreibe ZUGFeRD-PDF"); doc.save("./src/test/MustangGnuaccountingBeispielRE-20140703_502new.pdf"); - System.out.println("Fertig."); } catch (IOException e) { e.printStackTrace(); } catch (TransformerException e) { @@ -285,31 +350,7 @@ public class MustangWriterTest extends TestCase implements IZUGFeRDExportableTra e.printStackTrace(); } - } - - /** - * Create the test case - * - * @param testName - * name of the test case - */ - public MustangWriterTest(String testName) { - super(testName); - } - /** - * @return the suite of tests being tested - */ - public static Test suite() { - return new TestSuite(MustangWriterTest.class); - } - - - - public void testExport() { - // generate ./src/test/MustangGnuaccountingBeispielRE-20140703_502new.pdf from ./src/test/MustangGnuaccountingBeispielRE-20140703_502blank.pdf: - // the writing part - apply(); // now check the contents (like MustangReaderTest) ZUGFeRDImporter zi = new ZUGFeRDImporter(); zi.extract("./src/test/MustangGnuaccountingBeispielRE-20140703_502new.pdf"); diff --git a/mustang/target/mustang-1.1.0.jar b/mustang/target/mustang-1.1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..88bf3ae353ba02e8aef05b955468720f6b5b69d2 GIT binary patch literal 17276 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 p``RxxqNV z{TJ<**lA|^1Nx&neXcN5C&{ERJmF z2(lVBl-*RYrQnf*oPuoyI|}j&b~Wt9F^0z)_BA}w@U@0Q3`K$Hp5r>fzQD|4{mS~$ zGCG#qHckTHaof8~X9D4pcOeDt)*V+i2HlqQPpwvmD|+3tt66OZ!uRl z(gOL6(f4gbNnsofML%>0mTjw?SjeJu`aMT>n&q{uxxQ)U%#H81%xtE2ahbpY<`O8Q zlE5L-2~<%_;HiRd6x0iUVnI-;OODJ8*AwdU+@9W@fVbGFYn9iojc zuUtd?&QS=T5Y<};rulqlu)xvm@Dx79XPogoK1Y&1#*w1$p|3Q3tIwS`2)&rX*fqkx zaVl;cMrlD;0{4*~UJ%M@jH?%K5P5NpXnjSGy@n=^L__4mA|Da?=*nx1|B5tCoWDCq zghYezQ9ewZ$VZ5G^U+m(@(