Skip to content
This repository was archived by the owner on Jan 13, 2023. It is now read-only.

Commit 363a0bf

Browse files
authored
Merge pull request #299 from lzpap/utils_test
add tests for `iter_used_addresses`
2 parents 1eef60b + feef769 commit 363a0bf

File tree

1 file changed

+241
-0
lines changed

1 file changed

+241
-0
lines changed

test/commands/extended/utils_test.py

Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,241 @@
1+
# coding=utf-8
2+
from __future__ import absolute_import, division, print_function, \
3+
unicode_literals
4+
5+
from unittest import TestCase
6+
from iota.commands.extended.utils import iter_used_addresses
7+
from iota import MockAdapter
8+
from iota.crypto.types import Seed
9+
from test import mock
10+
11+
12+
class IterUsedAddressesTestCase(TestCase):
13+
def setUp(self):
14+
super(IterUsedAddressesTestCase, self).setUp()
15+
16+
self.adapter = MockAdapter()
17+
self.seed = Seed(trytes='S' * 81)
18+
self.address0 = 'A' * 81
19+
self.address1 = 'B' * 81
20+
self.address2 = 'C' * 81
21+
self.address3 = 'D' * 81
22+
23+
# To speed up the tests, we will mock the address generator.
24+
def address_generator(ag, start, step=1):
25+
for addy in [self.address0, self.address1, self.address2,
26+
self.address3][start::step]:
27+
yield addy
28+
self.mock_address_generator = address_generator
29+
30+
def seed_unused_address(self):
31+
self.adapter.seed_response('findTransactions', {
32+
'hashes': [],
33+
})
34+
self.adapter.seed_response('wereAddressesSpentFrom', {
35+
'states': [False],
36+
})
37+
38+
def get_all_used_addresses(self, start=0):
39+
return [address for address, _
40+
in iter_used_addresses(self.adapter, self.seed, start)]
41+
42+
def test_first_address_is_not_used(self):
43+
"""
44+
The very first address is not used. No address is returned.
45+
"""
46+
# Address 0
47+
self.seed_unused_address()
48+
49+
with mock.patch(
50+
'iota.crypto.addresses.AddressGenerator.create_iterator',
51+
self.mock_address_generator,
52+
):
53+
self.assertEqual([], self.get_all_used_addresses())
54+
55+
self.assertListEqual(
56+
self.adapter.requests,
57+
[
58+
{
59+
'command': 'findTransactions',
60+
'addresses': [self.address0],
61+
},
62+
{
63+
'command': 'wereAddressesSpentFrom',
64+
'addresses': [self.address0],
65+
},
66+
]
67+
)
68+
69+
def test_transactions_are_considered_used(self):
70+
"""
71+
An address with a transaction is considered used.
72+
"""
73+
# Address 0
74+
self.adapter.seed_response('findTransactions', {
75+
'hashes': ['T' * 81],
76+
})
77+
78+
# Address 1
79+
self.seed_unused_address()
80+
81+
with mock.patch(
82+
'iota.crypto.addresses.AddressGenerator.create_iterator',
83+
self.mock_address_generator,
84+
):
85+
self.assertEqual([self.address0], self.get_all_used_addresses())
86+
87+
self.assertListEqual(
88+
self.adapter.requests,
89+
[
90+
{
91+
'command': 'findTransactions',
92+
'addresses': [self.address0],
93+
},
94+
{
95+
'command': 'findTransactions',
96+
'addresses': [self.address1],
97+
},
98+
{
99+
'command': 'wereAddressesSpentFrom',
100+
'addresses': [self.address1],
101+
},
102+
]
103+
)
104+
105+
def test_spent_from_is_considered_used(self):
106+
"""
107+
An address that was spent from is considered used.
108+
"""
109+
# Address 0
110+
self.adapter.seed_response('findTransactions', {
111+
'hashes': [],
112+
})
113+
self.adapter.seed_response('wereAddressesSpentFrom', {
114+
'states': [True],
115+
})
116+
117+
# Address 1
118+
self.seed_unused_address()
119+
120+
with mock.patch(
121+
'iota.crypto.addresses.AddressGenerator.create_iterator',
122+
self.mock_address_generator,
123+
):
124+
self.assertEqual([self.address0], self.get_all_used_addresses())
125+
126+
self.assertListEqual(
127+
self.adapter.requests,
128+
[
129+
{
130+
'command': 'findTransactions',
131+
'addresses': [self.address0],
132+
},
133+
{
134+
'command': 'wereAddressesSpentFrom',
135+
'addresses': [self.address0],
136+
},
137+
{
138+
'command': 'findTransactions',
139+
'addresses': [self.address1],
140+
},
141+
{
142+
'command': 'wereAddressesSpentFrom',
143+
'addresses': [self.address1],
144+
},
145+
]
146+
)
147+
148+
def test_start_parameter_is_given(self):
149+
"""
150+
The correct address is returned if a start parameter is given.
151+
"""
152+
# Address 1
153+
self.adapter.seed_response('findTransactions', {
154+
'hashes': ['T' * 81],
155+
})
156+
157+
# Address 2
158+
self.seed_unused_address()
159+
160+
with mock.patch(
161+
'iota.crypto.addresses.AddressGenerator.create_iterator',
162+
self.mock_address_generator,
163+
):
164+
self.assertEqual([self.address1],
165+
self.get_all_used_addresses(start=1))
166+
167+
self.assertListEqual(
168+
self.adapter.requests,
169+
[
170+
{
171+
'command': 'findTransactions',
172+
'addresses': [self.address1],
173+
},
174+
{
175+
'command': 'findTransactions',
176+
'addresses': [self.address2],
177+
},
178+
{
179+
'command': 'wereAddressesSpentFrom',
180+
'addresses': [self.address2],
181+
},
182+
]
183+
)
184+
185+
def test_multiple_addresses_return(self):
186+
"""
187+
A larger test that combines multiple cases and more than one address
188+
should be returned.
189+
Address 0: Was spent from
190+
Address 1: Has a transaction
191+
Address 2: Is not used. Should not be returned
192+
"""
193+
194+
# Address 0
195+
self.adapter.seed_response('findTransactions', {
196+
'hashes': [],
197+
})
198+
self.adapter.seed_response('wereAddressesSpentFrom', {
199+
'states': [True],
200+
})
201+
202+
# Address 1
203+
self.adapter.seed_response('findTransactions', {
204+
'hashes': ['T' * 81],
205+
})
206+
207+
# Address 2
208+
self.seed_unused_address()
209+
210+
with mock.patch(
211+
'iota.crypto.addresses.AddressGenerator.create_iterator',
212+
self.mock_address_generator,
213+
):
214+
self.assertEqual([self.address0, self.address1],
215+
self.get_all_used_addresses())
216+
217+
self.assertListEqual(
218+
self.adapter.requests,
219+
[
220+
{
221+
'command': 'findTransactions',
222+
'addresses': [self.address0],
223+
},
224+
{
225+
'command': 'wereAddressesSpentFrom',
226+
'addresses': [self.address0],
227+
},
228+
{
229+
'command': 'findTransactions',
230+
'addresses': [self.address1],
231+
},
232+
{
233+
'command': 'findTransactions',
234+
'addresses': [self.address2],
235+
},
236+
{
237+
'command': 'wereAddressesSpentFrom',
238+
'addresses': [self.address2],
239+
},
240+
]
241+
)

0 commit comments

Comments
 (0)