From 40a4b51716945e90a936cb4f8e6f1ce178697786 Mon Sep 17 00:00:00 2001 From: Karrenbelt Date: Fri, 2 Sep 2022 22:45:58 +0200 Subject: [PATCH 1/5] tests: mock_keep3r_v1_raw_tx --- .../test_keep3r_job/test_behaviours.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/test_skills/test_keep3r_job/test_behaviours.py b/tests/test_skills/test_keep3r_job/test_behaviours.py index 2a9f4417..1fd55fca 100644 --- a/tests/test_skills/test_keep3r_job/test_behaviours.py +++ b/tests/test_skills/test_keep3r_job/test_behaviours.py @@ -163,6 +163,25 @@ def mock_keep3r_v1_call(self, contract_callable: str, data: Any) -> None: ), ) + def mock_keep3r_v1_raw_tx(self, contract_callable: str, data: Any) -> None: + """Mock keep3r V1 raw transaction""" + + self.mock_contract_api_request( + request_kwargs=dict( + performative=ContractApiMessage.Performative.GET_RAW_TRANSACTION, + callable=contract_callable, + ), + contract_id=str(KEEP3R_V1_CONTRACT_ID), + response_kwargs=dict( + performative=ContractApiMessage.Performative.RAW_TRANSACTION, + callable=contract_callable, + raw_transaction=ContractApiMessage.RawTransaction( + ledger_id="ethereum", + body={"data": data}, + ), + ), + ) + def mock_test_job_call(self, contract_callable: str, data: Any) -> None: """Mock TestJob contract call""" From 51f468428e9e14f30d10f6b6ba1aeeefc67861b3 Mon Sep 17 00:00:00 2001 From: Karrenbelt Date: Fri, 2 Sep 2022 22:49:42 +0200 Subject: [PATCH 2/5] tests: mock_build_work_tx_call --- .../test_keep3r_job/test_behaviours.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/test_skills/test_keep3r_job/test_behaviours.py b/tests/test_skills/test_keep3r_job/test_behaviours.py index 1fd55fca..1787fd25 100644 --- a/tests/test_skills/test_keep3r_job/test_behaviours.py +++ b/tests/test_skills/test_keep3r_job/test_behaviours.py @@ -201,6 +201,26 @@ def mock_test_job_call(self, contract_callable: str, data: Any) -> None: ), ) + def mock_build_work_tx_call(self, data: Any) -> None: + """Mock build work transaction""" + + contract_callable = "build_work_tx" + self.mock_contract_api_request( + request_kwargs=dict( + performative=ContractApiMessage.Performative.GET_RAW_TRANSACTION, + callable=contract_callable, + ), + contract_id=str(TEST_JOB_CONTRACT_ID), + response_kwargs=dict( + performative=ContractApiMessage.Performative.RAW_TRANSACTION, + callable=contract_callable, + raw_transaction=ContractApiMessage.RawTransaction( + ledger_id="ethereum", + body={"data": data}, + ), + ), + ) + def mock_ethereum_ledger_state_call(self, data: Any) -> None: """Mock ethereum ledger get state call""" From 6a2bfa6cceddffb12d849c6436efd8297ab4f2fc Mon Sep 17 00:00:00 2001 From: Karrenbelt Date: Fri, 2 Sep 2022 22:55:14 +0200 Subject: [PATCH 3/5] tests: raw_tx - DUMMY_RAW_TX --- .../test_keep3r_job/test_behaviours.py | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/tests/test_skills/test_keep3r_job/test_behaviours.py b/tests/test_skills/test_keep3r_job/test_behaviours.py index 1787fd25..1ee0dbed 100644 --- a/tests/test_skills/test_keep3r_job/test_behaviours.py +++ b/tests/test_skills/test_keep3r_job/test_behaviours.py @@ -36,6 +36,7 @@ Keep3rJobRoundBehaviour, PathSelectionBehaviour, PerformWorkBehaviour, + RawTx, WaitingBehaviour, ) from packages.keep3r_co.skills.keep3r_job.handlers import ( @@ -89,6 +90,19 @@ SOME_CONTRACT_ADDRESS = "0xaed599aadfee8e32cedb59db2b1120d33a7bacfd" +DUMMY_RAW_TX: RawTx = { + "from": SOME_CONTRACT_ADDRESS, + "to": SOME_CONTRACT_ADDRESS, + "data": "0x7cf5dab00000000000000000000000000000000000000000000000000000000000000005", + "nonce": 0, + "value": 0, + "gas": 43242, + "maxFeePerGas": 2000000000, + "maxPriorityFeePerGas": 1000000000, + "chainId": 1, +} + + class DummyRoundId: """Dummy class for setting round_id for exit condition.""" @@ -314,7 +328,7 @@ class TestBondingBehaviour(Keep3rJobFSMBehaviourBaseCase): def test_bonding_tx(self) -> None: """Test bonding tx""" - self.mock_keep3r_v1_call("build_bond_tx", {}) + self.mock_keep3r_v1_raw_tx("build_bond_tx", DUMMY_RAW_TX) self.mock_a2a_transaction() self._test_done_flag_set() self.end_round(done_event=Event.BONDING_TX) @@ -347,7 +361,7 @@ class TestActivationBehaviour(Keep3rJobFSMBehaviourBaseCase): def test_activation_tx(self) -> None: """Test activation tx""" - self.mock_keep3r_v1_call("build_activation_tx", {}) + self.mock_keep3r_v1_raw_tx("build_activation_tx", DUMMY_RAW_TX) self.mock_a2a_transaction() self._test_done_flag_set() self.end_round(done_event=Event.ACTIVATION_TX) @@ -378,7 +392,7 @@ class TestPerformWorkBehaviour(Keep3rJobFSMBehaviourBaseCase): def test_run(self) -> None: """Test perform work.""" - self.mock_test_job_call("build_work_tx", {}) + self.mock_build_work_tx_call(DUMMY_RAW_TX) self.mock_a2a_transaction() self._test_done_flag_set() self.end_round(done_event=Event.WORK_TX) From 586e0dfb914ad1450e8bc0002523168c0e6b8b61 Mon Sep 17 00:00:00 2001 From: Karrenbelt Date: Fri, 2 Sep 2022 22:57:19 +0200 Subject: [PATCH 4/5] tests: mock_build_safe_raw_tx --- .../test_keep3r_job/test_behaviours.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/test_skills/test_keep3r_job/test_behaviours.py b/tests/test_skills/test_keep3r_job/test_behaviours.py index 1ee0dbed..5f342446 100644 --- a/tests/test_skills/test_keep3r_job/test_behaviours.py +++ b/tests/test_skills/test_keep3r_job/test_behaviours.py @@ -64,6 +64,9 @@ SynchronizedData, WaitingRound, ) +from packages.valory.contracts.gnosis_safe.contract import ( + PUBLIC_ID as GNOSIS_SAFE_CONTRACT_ID, +) from packages.valory.contracts.keep3r_test_job.contract import ( PUBLIC_ID as TEST_JOB_CONTRACT_ID, ) @@ -235,6 +238,27 @@ def mock_build_work_tx_call(self, data: Any) -> None: ), ) + + def mock_build_safe_raw_tx(self) -> None: + """Mock build safe raw transaction""" + + self.mock_contract_api_request( + request_kwargs=dict( + performative=ContractApiMessage.Performative.GET_RAW_TRANSACTION, + ), + contract_id=str(GNOSIS_SAFE_CONTRACT_ID), + response_kwargs=dict( + performative=ContractApiMessage.Performative.RAW_TRANSACTION, + callable="get_raw_safe_transaction_hash", + raw_transaction=ContractApiMessage.RawTransaction( + ledger_id="ethereum", + body={ + "tx_hash": "0xb0e6add595e00477cf347d09797b156719dc5233283ac76e4efce2a674fe72d9" + }, + ), + ), + ) + def mock_ethereum_ledger_state_call(self, data: Any) -> None: """Mock ethereum ledger get state call""" @@ -329,6 +353,7 @@ def test_bonding_tx(self) -> None: """Test bonding tx""" self.mock_keep3r_v1_raw_tx("build_bond_tx", DUMMY_RAW_TX) + self.mock_build_safe_raw_tx() self.mock_a2a_transaction() self._test_done_flag_set() self.end_round(done_event=Event.BONDING_TX) @@ -362,6 +387,7 @@ def test_activation_tx(self) -> None: """Test activation tx""" self.mock_keep3r_v1_raw_tx("build_activation_tx", DUMMY_RAW_TX) + self.mock_build_safe_raw_tx() self.mock_a2a_transaction() self._test_done_flag_set() self.end_round(done_event=Event.ACTIVATION_TX) @@ -437,6 +463,7 @@ def test_is_workable( """Test is_workable.""" self.mock_test_job_call("workable", is_workable) + self.mock_build_safe_raw_tx() self.behaviour.act_wrapper() self.mock_a2a_transaction() self._test_done_flag_set() From 7760ddc0b8158cc6373f3567c3c2246fe3c4db55 Mon Sep 17 00:00:00 2001 From: Karrenbelt Date: Fri, 2 Sep 2022 22:59:13 +0200 Subject: [PATCH 5/5] refactor: test method naming --- .../test_keep3r_job/test_behaviours.py | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/tests/test_skills/test_keep3r_job/test_behaviours.py b/tests/test_skills/test_keep3r_job/test_behaviours.py index 5f342446..54a4dcb3 100644 --- a/tests/test_skills/test_keep3r_job/test_behaviours.py +++ b/tests/test_skills/test_keep3r_job/test_behaviours.py @@ -92,7 +92,6 @@ AGENT_ADDRESS = "0x1Cc0771e65FC90308DB2f7Fd02482ac4d1B82A18" SOME_CONTRACT_ADDRESS = "0xaed599aadfee8e32cedb59db2b1120d33a7bacfd" - DUMMY_RAW_TX: RawTx = { "from": SOME_CONTRACT_ADDRESS, "to": SOME_CONTRACT_ADDRESS, @@ -161,7 +160,7 @@ def fast_forward(self, data: Optional[Dict[str, Any]] = None) -> None: ) assert self.current_behaviour.behaviour_id == self.behaviour_class.behaviour_id - def mock_keep3r_v1_call(self, contract_callable: str, data: Any) -> None: + def mock_read_keep3r_v1(self, contract_callable: str, data: Any) -> None: """Mock keep3r V1 contract call""" self.mock_contract_api_request( @@ -199,9 +198,10 @@ def mock_keep3r_v1_raw_tx(self, contract_callable: str, data: Any) -> None: ), ) - def mock_test_job_call(self, contract_callable: str, data: Any) -> None: - """Mock TestJob contract call""" + def mock_workable_call(self, data: bool) -> None: + """Mock TestJob workable contract call""" + contract_callable = "workable" self.mock_contract_api_request( request_kwargs=dict( performative=ContractApiMessage.Performative.GET_STATE, @@ -218,7 +218,7 @@ def mock_test_job_call(self, contract_callable: str, data: Any) -> None: ), ) - def mock_build_work_tx_call(self, data: Any) -> None: + def mock_build_work_tx_call(self, data: RawTx) -> None: """Mock build work transaction""" contract_callable = "build_work_tx" @@ -233,12 +233,11 @@ def mock_build_work_tx_call(self, data: Any) -> None: callable=contract_callable, raw_transaction=ContractApiMessage.RawTransaction( ledger_id="ethereum", - body={"data": data}, + body={"data": data}, # type: ignore ), ), ) - def mock_build_safe_raw_tx(self) -> None: """Mock build safe raw transaction""" @@ -289,7 +288,7 @@ class TestPathSelectionBehaviour(Keep3rJobFSMBehaviourBaseCase): def test_blacklisted(self) -> None: """Test path_selection to blacklisted.""" - self.mock_keep3r_v1_call("blacklist", True) + self.mock_read_keep3r_v1("blacklist", True) self.mock_a2a_transaction() self._test_done_flag_set() self.end_round(done_event=Event.BLACKLISTED) @@ -299,7 +298,7 @@ def test_blacklisted(self) -> None: def test_insufficient_funds(self) -> None: """Test path_selection to insufficient funds.""" - self.mock_keep3r_v1_call("blacklist", False) + self.mock_read_keep3r_v1("blacklist", False) self.mock_ethereum_get_balance(amount=-1) self.mock_a2a_transaction() self._test_done_flag_set() @@ -309,9 +308,9 @@ def test_insufficient_funds(self) -> None: def test_not_bonded(self) -> None: """Test path_selection to not bonded.""" - self.mock_keep3r_v1_call("blacklist", False) + self.mock_read_keep3r_v1("blacklist", False) self.mock_ethereum_get_balance(amount=0) - self.mock_keep3r_v1_call("bondings", 0) + self.mock_read_keep3r_v1("bondings", 0) self.mock_a2a_transaction() self._test_done_flag_set() self.end_round(done_event=Event.NOT_BONDED) @@ -320,10 +319,10 @@ def test_not_bonded(self) -> None: def test_not_activated(self) -> None: """Test path_selection to not activated.""" - self.mock_keep3r_v1_call("blacklist", False) + self.mock_read_keep3r_v1("blacklist", False) self.mock_ethereum_get_balance(amount=0) - self.mock_keep3r_v1_call("bondings", 1) - self.mock_keep3r_v1_call("BOND", 3 * SECONDS_PER_DAY) + self.mock_read_keep3r_v1("bondings", 1) + self.mock_read_keep3r_v1("BOND", 3 * SECONDS_PER_DAY) self.mock_get_latest_block(block={"timestamp": 0}) self.mock_a2a_transaction() self._test_done_flag_set() @@ -333,10 +332,10 @@ def test_not_activated(self) -> None: def test_healthy(self) -> None: """Test path_selection to healthy.""" - self.mock_keep3r_v1_call("blacklist", False) + self.mock_read_keep3r_v1("blacklist", False) self.mock_ethereum_get_balance(amount=0) - self.mock_keep3r_v1_call("bondings", 1) - self.mock_keep3r_v1_call("BOND", 3 * SECONDS_PER_DAY) + self.mock_read_keep3r_v1("bondings", 1) + self.mock_read_keep3r_v1("BOND", 3 * SECONDS_PER_DAY) self.mock_get_latest_block(block={"timestamp": 3 * SECONDS_PER_DAY + 1}) self.mock_a2a_transaction() self._test_done_flag_set() @@ -369,8 +368,8 @@ class TestWaitingBehaviour(Keep3rJobFSMBehaviourBaseCase): def test_waiting(self) -> None: """Test waiting""" - self.mock_keep3r_v1_call("bondings", 0) - self.mock_keep3r_v1_call("BOND", 1) + self.mock_read_keep3r_v1("bondings", 0) + self.mock_read_keep3r_v1("BOND", 1) self.mock_get_latest_block(block={"timestamp": 2}) self.mock_a2a_transaction() self._test_done_flag_set() @@ -403,7 +402,7 @@ class TestGetJobsBehaviour(Keep3rJobFSMBehaviourBaseCase): def test_get_jobs(self) -> None: """Test get_jobs.""" - self.mock_keep3r_v1_call("get_jobs", ["some_job_address"]) + self.mock_read_keep3r_v1("get_jobs", ["some_job_address"]) self.mock_a2a_transaction() self._test_done_flag_set() self.end_round(done_event=Event.DONE) @@ -419,6 +418,7 @@ def test_run(self) -> None: """Test perform work.""" self.mock_build_work_tx_call(DUMMY_RAW_TX) + self.mock_build_safe_raw_tx() self.mock_a2a_transaction() self._test_done_flag_set() self.end_round(done_event=Event.WORK_TX) @@ -462,8 +462,7 @@ def test_is_workable( ) -> None: """Test is_workable.""" - self.mock_test_job_call("workable", is_workable) - self.mock_build_safe_raw_tx() + self.mock_workable_call(is_workable) self.behaviour.act_wrapper() self.mock_a2a_transaction() self._test_done_flag_set() @@ -488,7 +487,7 @@ def test_is_profitable( ) -> None: """Test is_profitable.""" - self.mock_keep3r_v1_call("credits", credits) + self.mock_read_keep3r_v1("credits", credits) self.behaviour.act_wrapper() self.mock_a2a_transaction() self._test_done_flag_set() @@ -514,5 +513,5 @@ def test_top_up( self.behaviour.act_wrapper() self.mock_a2a_transaction() self._test_done_flag_set() - self.end_round(done_event=Event.TOP_UP) + self.end_round(done_event=event) assert self.current_behaviour.behaviour_id == next_round.round_id