Skip to content

Commit 84b4e94

Browse files
Basic wallet full tests
1 parent c0b0e62 commit 84b4e94

7 files changed

Lines changed: 110 additions & 39 deletions

File tree

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ jobs:
114114
115115
- name: Run tests
116116
env:
117-
REGTEST: "true"
117+
IN_CONTAINER: "true"
118118
run: |
119119
pytest
120120

tests/config/config.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
test_non_relays=True
33
lite_mode=False
44
test_notifications=True
5-
network_type=mainnet
5+
network_type=regtest
66
auto_connect_timeout_ms=3000
77

88
[daemon]

tests/test_monero_daemon_rpc.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
from utils import TestUtils as Utils, TestContext, BinaryBlockContext, MiningUtils
1515

1616
logger: logging.Logger = logging.getLogger(__name__)
17-
Utils.load_config()
1817

1918

2019
class TestMoneroDaemonRpc:

tests/test_monero_wallet_full.py

Lines changed: 87 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,23 @@
11
import pytest
2-
import os
32

43
from typing import Optional
54
from typing_extensions import override
65
from monero import (
7-
MoneroWalletFull, MoneroWalletConfig, MoneroNetworkType, MoneroAccount,
6+
MoneroWalletFull, MoneroWalletConfig, MoneroAccount,
87
MoneroSubaddress, MoneroDaemonRpc, MoneroWallet
98
)
109

1110
from utils import TestUtils as Utils
1211
from test_monero_wallet_common import BaseTestMoneroWallet
1312

14-
Utils.load_config()
1513

16-
17-
# TODO enable full wallet tests
18-
@pytest.mark.skipif(True, reason="TODO")
1914
class TestMoneroWalletFull(BaseTestMoneroWallet):
2015

2116
_daemon: MoneroDaemonRpc = Utils.get_daemon_rpc()
2217
_wallet: MoneroWalletFull = Utils.get_wallet_full() # type: ignore
2318

19+
#region Overrides
20+
2421
@override
2522
def _create_wallet(self, config: Optional[MoneroWalletConfig], start_syncing: bool = True):
2623
# assign defaults
@@ -82,33 +79,13 @@ def _get_seed_languages(self) -> list[str]:
8279
def get_test_wallet(self) -> MoneroWallet:
8380
return Utils.get_wallet_full()
8481

85-
def test_wallet_creation_and_close(self):
86-
config_keys = MoneroWalletConfig()
87-
config_keys.language = "English"
88-
config_keys.network_type = MoneroNetworkType.TESTNET
89-
keys_wallet = MoneroWalletFull.create_wallet(config_keys)
90-
seed = keys_wallet.get_seed()
91-
92-
config = MoneroWalletConfig()
93-
config.path = "test_wallet_sync"
94-
config.password = "password"
95-
config.network_type = MoneroNetworkType.TESTNET
96-
config.restore_height = 0
97-
config.seed = seed
98-
config.language = "English"
82+
#endregion
9983

100-
wallet = MoneroWalletFull.create_wallet(config)
101-
assert wallet.is_view_only() is False
102-
wallet.close(save=False)
103-
104-
for ext in ["", ".keys", ".address.txt"]:
105-
try:
106-
os.remove(f"test_wallet_sync{ext}")
107-
except FileNotFoundError:
108-
pass
84+
#region Tests
10985

11086
# Can create a subaddress with and without a label
11187
@pytest.mark.skipif(Utils.TEST_NON_RELAYS is False, reason="TEST_NON_RELAYS disabled")
88+
@override
11289
def test_create_subaddress(self):
11390
# create subaddresses across accounts
11491
accounts: list[MoneroAccount] = self._wallet.get_accounts()
@@ -138,3 +115,84 @@ def test_create_subaddress(self):
138115
Utils.assert_equals(len(subaddresses), len(subaddresses_new) - 1)
139116
Utils.assert_equals(subaddress, subaddresses_new[len(subaddresses_new) - 1])
140117
account_idx += 1
118+
119+
#endregion
120+
121+
#region Disabled Tests
122+
123+
@pytest.mark.skipif(Utils.REGTEST, reason="Cannot retrieve accurate height by date from regtest fakechain")
124+
@override
125+
def test_get_height_by_date(self):
126+
return super().test_get_height_by_date()
127+
128+
@pytest.mark.skip(reason="TODO")
129+
@override
130+
def test_create_wallet_random(self) -> None:
131+
return super().test_create_wallet_random()
132+
133+
@pytest.mark.skip(reason="TODO")
134+
@override
135+
def test_create_wallet_from_seed(self, test_config: BaseTestMoneroWallet.Config) -> None:
136+
return super().test_create_wallet_from_seed(test_config)
137+
138+
@pytest.mark.skip(reason="TODO")
139+
@override
140+
def test_create_wallet_from_keys(self) -> None:
141+
return super().test_create_wallet_from_keys()
142+
143+
@pytest.mark.skip(reason="TODO")
144+
@override
145+
def test_create_wallet_from_seed_with_offset(self) -> None:
146+
return super().test_create_wallet_from_seed_with_offset()
147+
148+
@pytest.mark.skip(reason="TODO")
149+
@override
150+
def test_wallet_equality_ground_truth(self):
151+
return super().test_wallet_equality_ground_truth()
152+
153+
@pytest.mark.skip(reason="TODO")
154+
@override
155+
def test_get_payment_uri(self):
156+
return super().test_get_payment_uri()
157+
158+
@pytest.mark.skip(reason="TODO")
159+
@override
160+
def test_set_tx_note(self) -> None:
161+
return super().test_set_tx_note()
162+
163+
@pytest.mark.skip(reason="TODO")
164+
@override
165+
def test_set_tx_notes(self):
166+
return super().test_set_tx_notes()
167+
168+
@pytest.mark.skip(reason="TODO")
169+
@override
170+
def test_set_daemon_connection(self):
171+
return super().test_set_daemon_connection()
172+
173+
@pytest.mark.skip(reason="TODO")
174+
@override
175+
def test_mining(self):
176+
return super().test_mining()
177+
178+
@pytest.mark.skip(reason="TODO")
179+
@override
180+
def test_export_key_images(self):
181+
return super().test_export_key_images()
182+
183+
@pytest.mark.skip(reason="TODO (monero-project): https://github.com/monero-project/monero/issues/5812")
184+
@override
185+
def test_import_key_images(self):
186+
return super().test_import_key_images()
187+
188+
@pytest.mark.skip(reason="TODO")
189+
@override
190+
def test_get_new_key_images_from_last_import(self):
191+
return super().test_get_new_key_images_from_last_import()
192+
193+
@pytest.mark.skip(reason="TODO")
194+
@override
195+
def test_subaddress_lookahead(self) -> None:
196+
return super().test_subaddress_lookahead()
197+
198+
#endregion

tests/test_monero_wallet_keys.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from test_monero_wallet_common import BaseTestMoneroWallet
1313

1414
logger: logging.Logger = logging.getLogger(__name__)
15-
Utils.load_config()
1615

1716

1817
class TestMoneroWalletKeys(BaseTestMoneroWallet):

tests/test_monero_wallet_rpc.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
from utils import TestUtils as Utils
66
from test_monero_wallet_common import BaseTestMoneroWallet
77

8-
Utils.load_config()
9-
108

119
class TestMoneroWalletRpc(BaseTestMoneroWallet):
1210

tests/utils/test_utils.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ class TestUtils(ABC):
3131
__test__ = False
3232
_LOADED: bool = False
3333

34+
IN_CONTAINER: bool = False
35+
"""indicates if tests are running in docker container"""
36+
3437
"""directory with monero binaries to test (monerod and monero-wallet-rpc)"""
3538
WALLET_PORT_OFFSETS: dict[MoneroWalletRpc, int] = {}
3639

@@ -71,7 +74,7 @@ class TestUtils(ABC):
7174
# test wallet constants
7275
MAX_FEE = 7500000*10000
7376
NETWORK_TYPE: MoneroNetworkType = MoneroNetworkType.MAINNET
74-
REGTEST: bool = getenv("REGTEST") == "true" or True
77+
REGTEST: bool = False
7578
LANGUAGE: str = ""
7679
SEED: str = ""
7780
ADDRESS: str = ""
@@ -104,12 +107,13 @@ def load_config(cls) -> None:
104107
assert parser.has_section("wallet")
105108

106109
# parse general config
110+
nettype_str = parser.get('general', 'network_type')
107111
cls.TEST_NON_RELAYS = parser.getboolean('general', 'test_non_relays')
108112
cls.TEST_NOTIFICATIONS = parser.getboolean('general', 'test_notifications')
109113
cls.LITE_MODE = parser.getboolean('general', 'lite_mode')
110114
cls.AUTO_CONNECT_TIMEOUT_MS = parser.getint('general', 'auto_connect_timeout_ms')
111-
cls.NETWORK_TYPE = cls.parse_network_type(parser.get('general', 'network_type'))
112-
cls._LOADED = True
115+
cls.NETWORK_TYPE = cls.parse_network_type(nettype_str)
116+
cls.REGTEST = cls.is_regtest(nettype_str)
113117

114118
# parse daemon config
115119
cls.DAEMON_RPC_URI = parser.get('daemon', 'rpc_uri')
@@ -141,6 +145,9 @@ def load_config(cls) -> None:
141145
cls.WALLET_RPC_URI = cls.WALLET_RPC_DOMAIN + ":" + str(cls.WALLET_RPC_PORT_START)
142146
cls.WALLET_RPC_ZMQ_URI = "tcp:#" + cls.WALLET_RPC_ZMQ_DOMAIN + ":" + str(cls.WALLET_RPC_ZMQ_PORT_START)
143147
cls.SYNC_PERIOD_IN_MS = parser.getint('wallet', 'sync_period_in_ms')
148+
in_container = getenv("IN_CONTAINER", "false")
149+
cls.IN_CONTAINER = in_container.lower() == "true" or in_container == "1"
150+
cls._LOADED = True
144151

145152
@classmethod
146153
def current_timestamp(cls) -> int:
@@ -161,10 +168,17 @@ def network_type_to_str(cls, nettype: MoneroNetworkType) -> str:
161168

162169
raise TypeError(f"Invalid network type provided: {str(nettype)}")
163170

171+
@classmethod
172+
def is_regtest(cls, network_type_str: Optional[str]) -> bool:
173+
if network_type_str is None:
174+
return False
175+
nettype = network_type_str.lower()
176+
return nettype == "regtest" or nettype == "reg"
177+
164178
@classmethod
165179
def parse_network_type(cls, nettype: str) -> MoneroNetworkType:
166180
net = nettype.lower()
167-
if net == "mainnet" or net == "main":
181+
if net == "mainnet" or net == "main" or cls.is_regtest(net):
168182
return MoneroNetworkType.MAINNET
169183
elif net == "testnet" or net == "test":
170184
return MoneroNetworkType.TESTNET
@@ -1031,3 +1045,6 @@ def test_get_blocks_range(
10311045
for i, block in enumerate(blocks):
10321046
cls.assert_equals(real_start_height + i, block.height)
10331047
cls.test_block(block, block_ctx)
1048+
1049+
1050+
TestUtils.load_config()

0 commit comments

Comments
 (0)