usawa

Signed, immutable accounting.
Info | Log | Files | Refs | Submodules | LICENSE

entry.py (4969B)


      1 import logging
      2 import datetime
      3 import unittest
      4 import os
      5 
      6 from usawa import EntryPart, Entry, DemoWallet, ACL, UnitIndex, Asset
      7 from usawa.error import ACLError
      8 import lxml.etree
      9 
     10 logging.basicConfig(level=logging.DEBUG)
     11 logg = logging.getLogger()
     12 
     13 testdir = os.path.realpath(os.path.dirname(__file__))
     14 
     15 class TestEntry(unittest.TestCase):
     16     
     17     def setUp(self):
     18         self.parent = bytes.fromhex('0cf9180a764aba863a67b6d72f0918bc131c6772642cb2dce5a34f0a702f9470ddc2bf125c12198b1995c233c34b4afd346c54a2334c350a948a51b6e8b4e6b6')
     19         self.ref = '1bda7dfa-b8fd-400d-8b42-1d2861ad7f70'
     20         self.description = "foo bar baz"
     21         self.dtreg = datetime.datetime.now()
     22         self.uidx = UnitIndex('FOO')
     23 
     24 
     25     def test_entry_serialize(self):
     26         dst = EntryPart('FOO', 'asset', 'foo', 1337)
     27         src = EntryPart('FOO', 'income', 'foo', 1337, debit=True)
     28         o = Entry(42, datetime.datetime.strptime('2025-11-11', '%Y-%m-%d'), parent=self.parent, ref=self.ref, description=self.description, tx_datereg=self.dtreg)
     29         o.add_part(src, debit=True)
     30         o.add_part(dst)
     31 
     32         s = o.serialize()
     33         o = Entry.deserialize(s)
     34         ss = o.serialize()
     35 
     36         self.assertEqual(s, ss)
     37 
     38 
     39     def test_wallet_create(self):
     40         pk = bytes.fromhex('b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c')
     41         o = DemoWallet()
     42         o = DemoWallet(privatekey=pk)
     43         pubk = o.pubkey()
     44         oo = DemoWallet(publickey=pubk)
     45         self.assertEqual(o.pubkey(), oo.pubkey())
     46 
     47 
     48     def test_entry_sign_verify(self):
     49         dst = EntryPart('FOO', 'asset', 'foo', 1337)
     50         src = EntryPart('FOO', 'income', 'foo', 1337, debit=True)
     51         o = Entry(42, datetime.datetime.strptime('2025-11-11', '%Y-%m-%d'), parent=self.parent, ref=self.ref, description=self.description, tx_datereg=self.dtreg)
     52         o.add_part(src, debit=True)
     53         o.add_part(dst)
     54         wallet = DemoWallet()
     55         data = o.wrap(wallet=wallet)
     56         r = Entry.unwrap(data)
     57 
     58 
     59     def test_entry_sign_verify_imported(self):
     60         dst = EntryPart('FOO', 'asset', 'foo', 1337)
     61         src = EntryPart('FOO', 'income', 'foo', 1337, debit=True)
     62         o = Entry(42, datetime.datetime.strptime('2025-11-11', '%Y-%m-%d'), parent=self.parent, ref=self.ref, description=self.description, tx_datereg=self.dtreg)
     63         o.add_part(src, debit=True)
     64         o.add_part(dst)
     65         wallet = DemoWallet()
     66         (digest, sig, msg) = o.sign(wallet)
     67         tree = o.to_tree()
     68         s = lxml.etree.tostring(tree, method='c14n2')
     69         logg.debug('string {}'.format(s))
     70         
     71         tree = lxml.etree.fromstring(s)
     72         o = Entry.from_tree(tree, self.uidx)
     73         o.verify(wallet)
     74 
     75 
     76     def test_entry_acl_verify(self):
     77         dst = EntryPart('FOO', 'asset', 'foo', 1337)
     78         src = EntryPart('FOO', 'income', 'foo', 1337, debit=True)
     79         o = Entry(42, datetime.datetime.strptime('2025-11-11', '%Y-%m-%d'), parent=self.parent, ref=self.ref, description=self.description, tx_datereg=self.dtreg)
     80         o.add_part(src, debit=True)
     81         o.add_part(dst)
     82         wallet = DemoWallet()
     83         data = o.wrap(wallet)
     84         pubk_wrong = bytes.fromhex('72f25d90ef4cfecda8fa2c47561af5af0a10a92bfd15986b1f916358bf6ac8a37858a14d27329506a3766bad0f34d2e04caf397c1607b4380eb33c97d37dfc37')
     85         acl = ACL()
     86         with self.assertRaises(ACLError):
     87             Entry.unwrap(data, acl=acl)
     88         acl.add(pubk_wrong, label='wrong')
     89         with self.assertRaises(ACLError):
     90             Entry.unwrap(data, acl=acl)
     91         acl.add(wallet.pubkey(), label='right')
     92         Entry.unwrap(data, acl=acl)
     93 
     94 
     95     def test_entry_export_import(self):
     96         dst = EntryPart('FOO', 'asset', 'foo', 1337)
     97         src = EntryPart('FOO', 'income', 'foo', 1337, debit=True)
     98         o = Entry(42, datetime.datetime.strptime('2025-11-11', '%Y-%m-%d'), parent=self.parent, ref=self.ref, description=self.description, tx_datereg=self.dtreg)
     99         o.add_part(src, debit=True)
    100         o.add_part(dst)
    101         wallet = DemoWallet()
    102         o.sign(wallet)
    103         tree = o.to_tree()
    104 
    105         s = lxml.etree.tostring(tree)
    106         tree = lxml.etree.fromstring(s)
    107         tree = Entry.from_tree(tree, self.uidx)
    108 
    109 
    110     def test_entry_attach(self):
    111         dst = EntryPart('FOO', 'asset', 'foo', 1337)
    112         src = EntryPart('FOO', 'income', 'foo', 1337, debit=True)
    113         o = Entry(42, datetime.datetime.strptime('2025-11-11', '%Y-%m-%d'), parent=self.parent, ref=self.ref, description=self.description, tx_datereg=self.dtreg)
    114         o.add_part(src, debit=True)
    115         o.add_part(dst)
    116 
    117         fp = os.path.join(testdir, 'test.xml')
    118         asset = Asset.from_file(fp)
    119         o.attach(asset)
    120         wallet = DemoWallet()
    121         o.sign(wallet)
    122         tree = o.to_tree()
    123      
    124         s = lxml.etree.tostring(tree)
    125         tree = lxml.etree.fromstring(s)
    126         entry = Entry.from_tree(tree, self.uidx)
    127 
    128 
    129 if __name__ == '__main__':
    130     unittest.main()