code reorganization
[epoint] / pkg / document / document_test.go
diff --git a/pkg/document/document_test.go b/pkg/document/document_test.go
new file mode 100644 (file)
index 0000000..982f3a9
--- /dev/null
@@ -0,0 +1,229 @@
+package document
+
+import (
+       "testing"
+)
+
+var signedData = []struct {
+       text string
+       ok   bool
+       hash string
+       body string
+       sig  string
+}{
+       {
+               `-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+body
+-----BEGIN PGP SIGNATURE-----
+sig
+`, true, "SHA1", "body", "-----BEGIN PGP SIGNATURE-----\nsig\n"},
+       {
+               `-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+Hash: SHA256
+
+- body  
+-----BEGIN PGP SIGNATURE-----
+sig
+`, false, "", "body", "-----BEGIN PGP SIGNATURE-----\nsig\n"},
+}
+
+func TestSigned(t *testing.T) {
+       for _, x := range signedData {
+               c, err := ParseSigned([]byte(x.text))
+               if err != nil {
+                       t.Errorf("parsing %q failed: %s\n", x.text, err)
+                       continue
+               }
+               if string(c.Body) != x.body {
+                       t.Errorf("expected: %q, got %q\n", x.body, c.Body)
+               }
+               if string(c.Signature) != x.sig {
+                       t.Errorf("expected: %q, got %q\n", x.sig, c.Signature)
+               }
+       }
+       for _, x := range signedData {
+               if !x.ok {
+                       continue
+               }
+               c := &Signed{x.hash, []byte(x.body), []byte(x.sig)}
+               s, err := FormatSigned(c)
+               if err != nil {
+                       t.Errorf("formating %#v failed: %s\n", c, err)
+                       continue
+               }
+               if string(s) != x.text {
+                       t.Errorf("expected: %q, got %q\n", x.text, s)
+               }
+       }
+}
+
+var docData = []struct {
+       text string
+       ok   bool
+       t    string
+       k    []string
+       v    []string
+}{
+       {
+               `Content-Type: text/vnd.epoint.draft; charset=utf-8
+
+K1: v1
+K2-Foo: v 2
+K3: v 3
+`, true, "Draft", []string{"K1", "K2-Foo", "K3"}, []string{"v1", "v 2", "v 3"}},
+       {
+               `Content-Type: text/vnd.epoint.debit; charset=utf-8
+
+K1:  v1
+K2-Foo: v 2
+K3: v 3
+`, true, "DebitCert", []string{"K1", "K2-Foo", "K3"}, []string{" v1", "v 2", "v 3"}},
+       {
+               `Content-Type: text/vnd.epoint.credit; charset=utf-8
+
+K1: v1
+K2-Foo: v 2
+K3: v
+ 3
+`, false, "CreditCert", []string{"K1", "K2-Foo", "K3"}, []string{"v1", "v 2", "v 3"}},
+}
+
+func TestDocument(t *testing.T) {
+       for _, x := range docData {
+               doc, err := ParseDocument([]byte(x.text))
+               if err != nil {
+                       t.Errorf("parsing %q failed: %s\n", x.text, err)
+                       continue
+               }
+               if string(doc.Type) != x.t {
+                       t.Errorf("expected: %q, got %q\n", x.t, doc.Type)
+               }
+               if len(doc.Fields) != len(x.k) {
+                       t.Errorf("expected: %d fields, got %d\n", len(x.k), len(doc.Fields))
+               }
+               for i, k := range x.k {
+                       if doc.Fields[k] != x.v[i] {
+                               t.Errorf("value of %s expected to be %s, got %s\n", k, x.v[i], doc.Fields[k])
+                       }
+               }
+       }
+       for _, x := range docData {
+               if !x.ok {
+                       continue
+               }
+               doc := new(Document)
+               doc.Type = x.t
+               doc.Fields = make(map[string]string)
+               doc.Order = x.k
+               for i, k := range x.k {
+                       doc.Fields[k] = x.v[i]
+               }
+               s, err := FormatDocument(doc)
+               if err != nil {
+                       t.Errorf("formating %#v failed: %s\n", doc, err)
+                       continue
+               }
+               if string(s) != x.text {
+                       t.Errorf("expected: %q, got %q\n", x.text, s)
+               }
+       }
+}
+
+const draftBody = `Content-Type: text/vnd.epoint.draft; charset=utf-8
+
+Drawer: 000000000000000000000000000000000000000A
+Beneficiary: 000000000000000000000000000000000000000B
+Amount: 1
+Denomination: half euro
+Issuer: 000000000000000000000000000000000000000D
+Authorized-By: 000000000000000000000000000000000000000C
+Maturity-Date: 2011-11-13T12:20:35Z
+Expiry-Date: 2011-12-27T09:18:46Z
+Nonce: 42
+Notes: some notes
+`
+
+func TestDraft(t *testing.T) {
+       doc, err := ParseDocument([]byte(draftBody))
+       if err != nil {
+               t.Errorf("ParseDocument failed: %s\n", err)
+               return
+       }
+       iv, err := ParseStruct(doc)
+       if err != nil {
+               t.Errorf("ParseStruct %v failed: %s\n", doc, err)
+               return
+       }
+       d, ok := iv.(*Draft)
+       if !ok {
+               t.Errorf("expected *Draft got %#v\n", iv)
+               return
+       }
+       doc, err = FormatStruct(d)
+       if err != nil {
+               t.Errorf("format %v draft failed: %s\n", d, err)
+               return
+       }
+       s, err := FormatDocument(doc)
+       if err != nil {
+               t.Errorf("format %v doc failed: %s\n", doc, err)
+               return
+       }
+       if string(s) != draftBody {
+               t.Errorf("parsed %#v\nexpected: %s\ngot: %s\n", d, draftBody, s)
+       }
+}
+
+const debitBody = `Content-Type: text/vnd.epoint.debit; charset=utf-8
+
+Holder: 0000000000000000000000000000000000000009
+Serial: 13
+Balance: 23
+Denomination: half euro
+Issuer: 000000000000000000000000000000000000000B
+Date: 2011-11-13T12:20:35Z
+Authorized-By: 000000000000000000000000000000000000000A
+Notes: -
+Last-Debit-Serial: 0
+Last-Credit-Serial: 12
+Last-Cert: 000000000000000000000000000000000000000C
+References: 000000000000000000000000000000000000000C
+ 000000000000000000000000000000000000000F
+Difference: 1
+Draft: 000000000000000000000000000000000000000D
+Beneficiary: 000000000000000000000000000000000000000E
+`
+
+func TestCert(t *testing.T) {
+       doc, err := ParseDocument([]byte(debitBody))
+       if err != nil {
+               t.Errorf("ParseDocument failed: %s\n", err)
+               return
+       }
+       iv, err := ParseStruct(doc)
+       if err != nil {
+               t.Errorf("ParseStruct %v failed: %s\n", doc, err)
+               return
+       }
+       d, ok := iv.(*DebitCert)
+       if !ok {
+               t.Errorf("expected *DebitCert got %#v\n", iv)
+               return
+       }
+       doc, err = FormatStruct(d)
+       if err != nil {
+               t.Errorf("format %v draft failed: %s\n", d, err)
+               return
+       }
+       s, err := FormatDocument(doc)
+       if err != nil {
+               t.Errorf("format %v doc failed: %s\n", doc, err)
+               return
+       }
+       if string(s) != debitBody {
+               t.Errorf("parsed %#v\nexpected: %s\ngot: %s\n", d, debitBody, s)
+       }
+}