usawa

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

entry.py (6578B)


      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)
     30         o.add_part(dst)
     31 
     32         s = o.serialize()
     33         logg.debug('serialized first {}'.format(s.hex()))
     34         o = Entry.deserialize(s)
     35         ss = o.serialize()
     36         logg.debug('serialized second {}'.format(ss.hex()))
     37 
     38         self.assertEqual(s, ss)
     39 
     40 
     41     def test_wallet_create(self):
     42         pk = bytes.fromhex('b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c')
     43         o = DemoWallet()
     44         o = DemoWallet(privatekey=pk)
     45         pubk = o.pubkey()
     46         oo = DemoWallet(publickey=pubk)
     47         self.assertEqual(o.pubkey(), oo.pubkey())
     48 
     49 
     50     def test_entry_sign_verify(self):
     51         dst = EntryPart('FOO.Asset/foo', 1337)
     52         src = EntryPart('FOO.Income/foo', 1337, debit=True)
     53         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)
     54         o.add_part(src)
     55         o.add_part(dst)
     56         wallet = DemoWallet()
     57         data = o.wrap(wallet=wallet)
     58         r = Entry.unwrap(data)
     59 
     60 
     61     def test_entry_sign_verify_imported(self):
     62         dst = EntryPart('FOO.Asset/foo', 1337)
     63         src = EntryPart('FOO.Income/foo', 1337, debit=True)
     64         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)
     65         o.add_part(src)
     66         o.add_part(dst)
     67         wallet = DemoWallet()
     68         (digest, sig, msg) = o.sign(wallet)
     69         tree = o.to_tree()
     70         s = lxml.etree.tostring(tree, method='c14n2')
     71         logg.debug('string {}'.format(s))
     72         
     73         tree = lxml.etree.fromstring(s)
     74         o = Entry.from_tree(tree, self.uidx)
     75         o.verify(wallet)
     76 
     77 
     78     def test_entry_acl_verify(self):
     79         dst = EntryPart('FOO.Asset/foo', 1337)
     80         src = EntryPart('FOO.Income/foo', 1337, debit=True)
     81         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)
     82         o.add_part(src)
     83         o.add_part(dst)
     84         wallet = DemoWallet()
     85         data = o.wrap(wallet)
     86         pubk_wrong = bytes.fromhex('72f25d90ef4cfecda8fa2c47561af5af0a10a92bfd15986b1f916358bf6ac8a37858a14d27329506a3766bad0f34d2e04caf397c1607b4380eb33c97d37dfc37')
     87         acl = ACL()
     88         with self.assertRaises(ACLError):
     89             Entry.unwrap(data, acl=acl)
     90         acl.add(pubk_wrong, label='wrong')
     91         with self.assertRaises(ACLError):
     92             Entry.unwrap(data, acl=acl)
     93         acl.add(wallet.pubkey(), label='right')
     94         Entry.unwrap(data, acl=acl)
     95 
     96 
     97     def test_entry_export_import(self):
     98         dst = EntryPart('FOO.Asset/foo', 1337)
     99         src = EntryPart('FOO.Income/foo', 1337, debit=True)
    100         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)
    101         o.add_part(src)
    102         o.add_part(dst)
    103         wallet = DemoWallet()
    104         o.sign(wallet)
    105         tree = o.to_tree()
    106 
    107         s = lxml.etree.tostring(tree)
    108         tree = lxml.etree.fromstring(s)
    109         tree = Entry.from_tree(tree, self.uidx)
    110 
    111 
    112     def test_entry_attach(self):
    113         dst = EntryPart('FOO.Asset/foo', 1337)
    114         src = EntryPart('FOO.Income/foo', 1337, debit=True)
    115         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)
    116         o.add_part(src)
    117         o.add_part(dst)
    118 
    119         fp = os.path.join(testdir, 'test.xml')
    120         asset = Asset.from_file(fp)
    121         o.attach(asset)
    122         wallet = DemoWallet()
    123         o.sign(wallet)
    124         tree = o.to_tree()
    125      
    126         s = lxml.etree.tostring(tree)
    127         tree = lxml.etree.fromstring(s)
    128         entry = Entry.from_tree(tree, self.uidx)
    129 
    130 
    131     def test_entry_mux(self):
    132         dst_one = EntryPart('FOO.Asset/foo', 1337)
    133         dst_two = EntryPart('FOO.Asset/bar', 42)
    134         src = EntryPart('FOO.Income/baz', 1337+42, debit=True)
    135         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)
    136         o.add_part(src)
    137         o.add_part(dst_one)
    138         o.add_part(dst_two)
    139         wallet = DemoWallet()
    140         data = o.wrap(wallet=wallet)
    141 
    142 
    143     def test_entry_balance(self):
    144         dst_one = EntryPart('FOO.Asset/foo', 1337)
    145         dst_two = EntryPart('FOO.Asset/bar', 42)
    146         src = EntryPart('FOO.Income/baz', 1337+42, debit=True)
    147         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, unitindex=self.uidx)
    148         o.add_part(src)
    149         o.add_part(dst_one)
    150         o.add_part(dst_two)
    151 
    152 
    153     def test_entry_full_serialize(self):
    154         dst_one = EntryPart('FOO.Asset/foo', 1337)
    155         dst_two = EntryPart('FOO.Asset/bar', 42)
    156         src = EntryPart('FOO.Income/baz', 1337+42, debit=True)
    157         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, unitindex=self.uidx)
    158         o.add_part(src)
    159         o.add_part(dst_one)
    160         o.add_part(dst_two)
    161         o.tag('foobar')
    162         o.tag('barbaz')
    163         b = o.serialize()
    164         o = Entry.deserialize(b)
    165         self.assertTrue(o.has_tag('foobar'))
    166         self.assertTrue(o.has_tag('barbaz'))
    167 
    168 
    169 if __name__ == '__main__':
    170     unittest.main()