From 1ec6540063e24a366ae65bc56b817d6eba31b39f Mon Sep 17 00:00:00 2001
From: Andrey Berezin <a.berezin@yadro.com>
Date: Wed, 16 Nov 2022 18:59:24 +0300
Subject: [PATCH] Refactor balance tests

Signed-off-by: Andrey Berezin <a.berezin@yadro.com>
---
 pytest_tests/testsuites/conftest.py           |   4 +
 .../testsuites/payment/test_balance.py        | 110 ++++++++++--------
 2 files changed, 64 insertions(+), 50 deletions(-)

diff --git a/pytest_tests/testsuites/conftest.py b/pytest_tests/testsuites/conftest.py
index 843f8be4..8ef79b28 100644
--- a/pytest_tests/testsuites/conftest.py
+++ b/pytest_tests/testsuites/conftest.py
@@ -136,6 +136,10 @@ def run_health_check(collect_logs, hosting: Hosting):
 @pytest.fixture(scope="session")
 @allure.title("Prepare wallet and deposit")
 def prepare_wallet_and_deposit(client_shell, prepare_tmp_dir):
+    return create_wallet_with_gas(client_shell, prepare_tmp_dir)
+
+
+def create_wallet_with_gas(client_shell, prepare_tmp_dir):
     wallet_path = os.path.join(os.getcwd(), ASSETS_DIR, f"{str(uuid.uuid4())}.json")
     init_wallet(wallet_path, WALLET_PASS)
     allure.attach.file(wallet_path, os.path.basename(wallet_path), allure.attachment_type.JSON)
diff --git a/pytest_tests/testsuites/payment/test_balance.py b/pytest_tests/testsuites/payment/test_balance.py
index 717c33eb..e7bf15e5 100644
--- a/pytest_tests/testsuites/payment/test_balance.py
+++ b/pytest_tests/testsuites/payment/test_balance.py
@@ -1,20 +1,15 @@
 import logging
 import os
-import uuid
 
 import allure
 import pytest
 import yaml
-from common import (
-    ASSETS_DIR,
-    FREE_STORAGE,
-    NEOFS_CLI_EXEC,
-    NEOFS_ENDPOINT,
-    WALLET_CONFIG,
-    WALLET_PASS,
-)
+from common import FREE_STORAGE, NEOFS_CLI_EXEC, NEOFS_ENDPOINT, WALLET_CONFIG, WALLET_PASS
 from neofs_testlib.cli import NeofsCli
-from neofs_testlib.utils.wallet import get_last_address_from_wallet, init_wallet
+from neofs_testlib.shell import CommandResult, Shell
+from neofs_testlib.utils.wallet import get_last_address_from_wallet
+
+from testsuites.conftest import create_wallet_with_gas
 
 logger = logging.getLogger("NeoLogger")
 DEPOSIT_AMOUNT = 30
@@ -23,51 +18,30 @@ DEPOSIT_AMOUNT = 30
 @pytest.mark.payments
 @pytest.mark.skipif(FREE_STORAGE, reason="Test only works on public network with paid storage")
 class TestBalanceAccounting:
-    @pytest.fixture(autouse=True)
-    def prepare_two_wallets(self, prepare_wallet_and_deposit):
-        self.user_wallet = prepare_wallet_and_deposit
-        self.address = get_last_address_from_wallet(self.user_wallet, WALLET_PASS)
-        another_wallet = os.path.join(os.getcwd(), ASSETS_DIR, f"{str(uuid.uuid4())}.json")
-        init_wallet(another_wallet, WALLET_PASS)
-        self.another_address = get_last_address_from_wallet(another_wallet, WALLET_PASS)
+    @pytest.fixture(scope="class")
+    def main_wallet(self, client_shell, prepare_tmp_dir) -> str:
+        return create_wallet_with_gas(client_shell=client_shell, prepare_tmp_dir=prepare_tmp_dir)
 
-    @allure.title("Test balance request with wallet and address")
-    def test_balance_wallet_address(self, client_shell):
-        cli = NeofsCli(client_shell, NEOFS_CLI_EXEC, WALLET_CONFIG)
-        result = cli.accounting.balance(
-            wallet=self.user_wallet,
-            rpc_endpoint=NEOFS_ENDPOINT,
-            address=self.address,
-        )
-        assert int(result.stdout.rstrip()) == DEPOSIT_AMOUNT
+    @pytest.fixture(scope="class")
+    def other_wallet(self, client_shell, prepare_tmp_dir) -> str:
+        return create_wallet_with_gas(client_shell=client_shell, prepare_tmp_dir=prepare_tmp_dir)
 
-    @allure.title("Test balance request with wallet only")
-    def test_balance_wallet(self, client_shell):
-        cli = NeofsCli(client_shell, NEOFS_CLI_EXEC, WALLET_CONFIG)
-        result = cli.accounting.balance(wallet=self.user_wallet, rpc_endpoint=NEOFS_ENDPOINT)
-        assert int(result.stdout.rstrip()) == DEPOSIT_AMOUNT
+    @pytest.fixture(scope="class")
+    def cli(self, client_shell: Shell) -> NeofsCli:
+        return NeofsCli(client_shell, NEOFS_CLI_EXEC, WALLET_CONFIG)
 
-    @allure.title("Test balance request with wallet and wrong address")
-    def test_balance_wrong_address(self, client_shell):
-        with pytest.raises(Exception, match="address option must be specified and valid"):
-            cli = NeofsCli(client_shell, NEOFS_CLI_EXEC, WALLET_CONFIG)
-            cli.accounting.balance(
-                wallet=self.user_wallet,
-                rpc_endpoint=NEOFS_ENDPOINT,
-                address=self.another_address,
+    @allure.step("Check deposit amount")
+    def check_amount(self, result: CommandResult) -> None:
+        amount_str = result.stdout.rstrip()
+
+        try:
+            amount = int(amount_str)
+        except Exception as ex:
+            pytest.fail(
+                f"Amount parse error, should be parsable as int({DEPOSIT_AMOUNT}), but given {amount_str}: {ex}"
             )
 
-    @allure.title("Test balance request with config file")
-    def test_balance_api(self, prepare_tmp_dir, client_shell):
-        config_file = self.write_api_config(
-            config_dir=prepare_tmp_dir, endpoint=NEOFS_ENDPOINT, wallet=self.user_wallet
-        )
-        logger.info(f"Config with API endpoint: {config_file}")
-
-        cli = NeofsCli(client_shell, NEOFS_CLI_EXEC, config_file=config_file)
-        result = cli.accounting.balance()
-
-        assert int(result.stdout.rstrip()) == DEPOSIT_AMOUNT
+        assert amount == DEPOSIT_AMOUNT
 
     @staticmethod
     @allure.step("Write config with API endpoint")
@@ -83,3 +57,39 @@ class TestBalanceAccounting:
         with open(api_config_file, "w") as file:
             yaml.dump(api_config, file)
         return api_config_file
+
+    @allure.title("Test balance request with wallet and address")
+    def test_balance_wallet_address(self, main_wallet: str, cli: NeofsCli):
+        result = cli.accounting.balance(
+            wallet=main_wallet,
+            rpc_endpoint=NEOFS_ENDPOINT,
+            address=get_last_address_from_wallet(main_wallet, WALLET_PASS),
+        )
+
+        self.check_amount(result)
+
+    @allure.title("Test balance request with wallet only")
+    def test_balance_wallet(self, main_wallet: str, cli: NeofsCli):
+        result = cli.accounting.balance(wallet=main_wallet, rpc_endpoint=NEOFS_ENDPOINT)
+        self.check_amount(result)
+
+    @allure.title("Test balance request with wallet and wrong address")
+    def test_balance_wrong_address(self, main_wallet: str, other_wallet: str, cli: NeofsCli):
+        with pytest.raises(Exception, match="address option must be specified and valid"):
+            cli.accounting.balance(
+                wallet=main_wallet,
+                rpc_endpoint=NEOFS_ENDPOINT,
+                address=get_last_address_from_wallet(other_wallet, WALLET_PASS),
+            )
+
+    @allure.title("Test balance request with config file")
+    def test_balance_api(self, prepare_tmp_dir: str, main_wallet: str, client_shell: Shell):
+        config_file = self.write_api_config(
+            config_dir=prepare_tmp_dir, endpoint=NEOFS_ENDPOINT, wallet=main_wallet
+        )
+        logger.info(f"Config with API endpoint: {config_file}")
+
+        cli = NeofsCli(client_shell, NEOFS_CLI_EXEC, config_file=config_file)
+        result = cli.accounting.balance()
+
+        self.check_amount(result)