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()