forked from ethereum/web3.py
/
test_attach_modules.py
129 lines (102 loc) · 3.16 KB
/
test_attach_modules.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import pytest
from eth_utils import (
is_integer,
)
from web3 import Web3
from web3._utils.module import (
attach_modules,
)
from web3.exceptions import (
ValidationError,
)
from web3.module import (
Module,
)
from web3.providers.eth_tester import (
EthereumTesterProvider,
)
class MockEth(Module):
def block_number(self):
return 42
class MockGeth(Module):
pass
class MockGethAdmin(Module):
def start_ws(self):
return True
class MockGethPersonal(Module):
def unlock_account(self):
return True
def test_attach_modules():
mods = {
"geth": (MockGeth, {
"personal": MockGethPersonal,
"admin": MockGethAdmin,
}),
"eth": MockEth,
}
w3 = Web3(EthereumTesterProvider(), modules={})
attach_modules(w3, mods)
assert w3.eth.block_number() == 42
assert w3.geth.personal.unlock_account() is True
assert w3.geth.admin.start_ws() is True
def test_attach_single_module_as_tuple():
w3 = Web3(EthereumTesterProvider(), modules={'eth': (MockEth,)})
assert w3.eth.block_number() == 42
def test_attach_modules_multiple_levels_deep():
mods = {
"eth": MockEth,
"geth": (MockGeth, {
"personal": (MockGethPersonal, {
"admin": MockGethAdmin,
}),
}),
}
w3 = Web3(EthereumTesterProvider(), modules={})
attach_modules(w3, mods)
assert w3.eth.block_number() == 42
assert w3.geth.personal.unlock_account() is True
assert w3.geth.personal.admin.start_ws() is True
def test_attach_modules_with_wrong_module_format():
mods = {
"eth": (MockEth, MockGeth, MockGethPersonal)
}
w3 = Web3(EthereumTesterProvider, modules={})
with pytest.raises(ValidationError, match="Module definitions can only have 1 or 2 elements"):
attach_modules(w3, mods)
def test_attach_modules_with_existing_modules():
mods = {
"eth": MockEth,
}
w3 = Web3(EthereumTesterProvider, modules=mods)
with pytest.raises(AttributeError,
match="The web3 object already has an attribute with that name"):
attach_modules(w3, mods)
def test_attach_external_modules_multiple_levels_deep(module1, module2, module3, module4):
w3 = Web3(
EthereumTesterProvider(),
external_modules={
'module1': module1,
'module2': (module2, {
'submodule1': (module3, {
'submodule2': module4,
}),
})
}
)
assert w3.isConnected()
# assert instantiated with default modules
assert hasattr(w3, 'geth')
assert hasattr(w3, 'eth')
assert is_integer(w3.eth.chain_id)
# assert instantiated with module1
assert hasattr(w3, 'module1')
assert w3.module1.a == 'a'
assert w3.module1.b == 'b'
# assert instantiated with module2 + submodules
assert hasattr(w3, 'module2')
assert w3.module2.c == 'c'
assert w3.module2.d() == 'd'
assert hasattr(w3.module2, 'submodule1')
assert w3.module2.submodule1.e == 'e'
assert hasattr(w3.module2.submodule1, 'submodule2')
assert w3.module2.submodule1.submodule2.f == 'f'