/
test_attach_modules.py
124 lines (99 loc) · 3.01 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
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_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'