Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tests: add tests for mech interact states/base and models #191

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
2 changes: 1 addition & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ In order to run a local demo service based on the IEKit:
2. Fetch the IEKit.

```bash
autonomy fetch valory/impact_evaluator:0.1.0:bafybeihig5bdamlnm5m6nbyeunku3bmugzn2r5xkemsqwgvh7fiq6sguqm --service
autonomy fetch valory/impact_evaluator:0.1.0:bafybeiazidghbbfiuxzqpuy3rlpqthejwpyl57tkqshaba7oshordufsym --service
```

3. Build the Docker image of the service agents
Expand Down
12 changes: 6 additions & 6 deletions packages/packages.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,22 @@
"connection/valory/openai/0.1.0": "bafybeigyehjbahya5mp7vyp5tjvn36rey4btvzskp3ql3mgxp3zu6gwq5a",
"connection/valory/farcaster/0.1.0": "bafybeibbdas7lxbipksodaphjms3uop7vnzjqkroktjq2g6wbvgtlldaxi",
"skill/valory/dynamic_nft_abci/0.1.0": "bafybeietq6nqkeze6esw5dwa4cjajluzd2tvg24hlg2pihxz2v67vxorpu",
"skill/valory/twitter_scoring_abci/0.1.0": "bafybeiedultjq4wokxuchbr4nv7m3y3mqq6qwtir6m5epggnbgew6yb24i",
"skill/valory/twitter_scoring_abci/0.1.0": "bafybeibviksrbdkg5ewyhy7iz7ob5eqks3dxethmrhbff264mtul5um7am",
"skill/valory/ceramic_read_abci/0.1.0": "bafybeiede3ehp4bfpbk23gncj52goq62rd3rm5wwlbyaexxrfohucdcpia",
"skill/valory/ceramic_write_abci/0.1.0": "bafybeiemid3ipekyqupbqpfw55g7b2wwx56g2ita73rjalk6fyqgneroam",
"skill/valory/impact_evaluator_abci/0.1.0": "bafybeifbgoisaa553l6oi5odt5d24hqwdz3ev6eqffh4tqkfzd73l3f6uu",
"skill/valory/impact_evaluator_abci/0.1.0": "bafybeiebnecjdt46qfwhtk5ok5l3fu2y3vka76k2ickazkmkktjkt2wihi",
"skill/valory/generic_scoring_abci/0.1.0": "bafybeidxytbreu7sudoggnfjxpbfxsxwbis6dipokkq6uo23xaautnwca4",
"skill/valory/twitter_write_abci/0.1.0": "bafybeid377kr5f3dmb5nyhvucglyaaqkuhthxkfosgl54zskwmsuwz56ie",
"skill/valory/llm_abci/0.1.0": "bafybeibmckwphs5zqdfnutktwgq7bxfw2auhsxezoopkep5dadkuwqvwgy",
"skill/valory/decision_making_abci/0.1.0": "bafybeigsywkfb4lujy4y2c5tsmr2iulq7s6uad7uv2fbiwv7awxz5wfbi4",
"skill/valory/olas_week_abci/0.1.0": "bafybeifvhx6issf3xzesjihtbl63ymfrdvzfp4lqrg7liesyes4aiaydfm",
"skill/valory/mech_interact_abci/0.1.0": "bafybeigto5ssrbrbqmeoc6wijcly2klmrhfcnaioa5u3wsofdm7bccowcq",
"skill/valory/mech_interact_abci/0.1.0": "bafybeiesl4k7lkvubzf42hduoxrmruwlmimscxltw6l5nq57shfb3l632y",
"skill/valory/farcaster_write_abci/0.1.0": "bafybeihiayft7ovmijrstdo6m7fd5pqnqi7z2mximljpeskambbgo6476q",
"skill/valory/farcaster_test_abci/0.1.0": "bafybeidkrbog6z54364dor5irf5tlebhaxy4btnmb2cgobpswqfh6cfk5i",
"agent/valory/impact_evaluator/0.1.0": "bafybeifhygewmf2pdq4vyeiwucoutziaw6nral34pxjtwjgybjp5rfu4aq",
"agent/valory/impact_evaluator/0.1.0": "bafybeia7bsxknskfv623j2jdqdrarenim3kuffnlyle72r7fipdtf2p4x4",
"agent/valory/farcaster_test/0.1.0": "bafybeihelkwq4ocgpdkiglclwhigklp67clhjkaabg7dkiduw5apb6zwbe",
"service/valory/impact_evaluator/0.1.0": "bafybeihig5bdamlnm5m6nbyeunku3bmugzn2r5xkemsqwgvh7fiq6sguqm",
"service/valory/impact_evaluator_local/0.1.0": "bafybeiflg7sn26pqmvkvm7feohjolorwtutqqwc3kk7d4uqamr3qzi5xpq"
"service/valory/impact_evaluator/0.1.0": "bafybeiazidghbbfiuxzqpuy3rlpqthejwpyl57tkqshaba7oshordufsym",
"service/valory/impact_evaluator_local/0.1.0": "bafybeiflgpcafwijrrvsokzx32gbn2tkajgfrpprdkzcogcbsyw426offe"
},
"third_party": {
"protocol/open_aea/signing/1.0.0": "bafybeihv62fim3wl2bayavfcg3u5e5cxu3b7brtu4cn5xoxd6lqwachasi",
Expand Down
6 changes: 3 additions & 3 deletions packages/valory/agents/impact_evaluator/aea-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ protocols:
skills:
- valory/abstract_abci:0.1.0:bafybeieeaseuy5rbbw465knz27vccvpkfge43q7isl7fkdlfapwd7bpi24
- valory/abstract_round_abci:0.1.0:bafybeib733xfbndtpvkf44mtk7oyodnficgloo6xhn7xmqxxeos33es65u
- valory/impact_evaluator_abci:0.1.0:bafybeifbgoisaa553l6oi5odt5d24hqwdz3ev6eqffh4tqkfzd73l3f6uu
- valory/impact_evaluator_abci:0.1.0:bafybeiebnecjdt46qfwhtk5ok5l3fu2y3vka76k2ickazkmkktjkt2wihi
- valory/generic_scoring_abci:0.1.0:bafybeidxytbreu7sudoggnfjxpbfxsxwbis6dipokkq6uo23xaautnwca4
- valory/twitter_scoring_abci:0.1.0:bafybeiedultjq4wokxuchbr4nv7m3y3mqq6qwtir6m5epggnbgew6yb24i
- valory/twitter_scoring_abci:0.1.0:bafybeibviksrbdkg5ewyhy7iz7ob5eqks3dxethmrhbff264mtul5um7am
- valory/ceramic_read_abci:0.1.0:bafybeiede3ehp4bfpbk23gncj52goq62rd3rm5wwlbyaexxrfohucdcpia
- valory/ceramic_write_abci:0.1.0:bafybeiemid3ipekyqupbqpfw55g7b2wwx56g2ita73rjalk6fyqgneroam
- valory/dynamic_nft_abci:0.1.0:bafybeietq6nqkeze6esw5dwa4cjajluzd2tvg24hlg2pihxz2v67vxorpu
Expand All @@ -57,7 +57,7 @@ skills:
- valory/decision_making_abci:0.1.0:bafybeigsywkfb4lujy4y2c5tsmr2iulq7s6uad7uv2fbiwv7awxz5wfbi4
- valory/llm_abci:0.1.0:bafybeibmckwphs5zqdfnutktwgq7bxfw2auhsxezoopkep5dadkuwqvwgy
- valory/olas_week_abci:0.1.0:bafybeifvhx6issf3xzesjihtbl63ymfrdvzfp4lqrg7liesyes4aiaydfm
- valory/mech_interact_abci:0.1.0:bafybeigto5ssrbrbqmeoc6wijcly2klmrhfcnaioa5u3wsofdm7bccowcq
- valory/mech_interact_abci:0.1.0:bafybeiesl4k7lkvubzf42hduoxrmruwlmimscxltw6l5nq57shfb3l632y
default_ledger: ethereum
required_ledgers:
- ethereum
Expand Down
2 changes: 1 addition & 1 deletion packages/valory/services/impact_evaluator/service.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ license: Apache-2.0
fingerprint:
README.md: bafybeign56hilwuoa6bgos3uqabss4gew4vadkik7vhj3ucpqw6nxtqtpe
fingerprint_ignore_patterns: []
agent: valory/impact_evaluator:0.1.0:bafybeifhygewmf2pdq4vyeiwucoutziaw6nral34pxjtwjgybjp5rfu4aq
agent: valory/impact_evaluator:0.1.0:bafybeia7bsxknskfv623j2jdqdrarenim3kuffnlyle72r7fipdtf2p4x4
number_of_agents: 4
deployment:
agent:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ license: Apache-2.0
fingerprint:
README.md: bafybeign56hilwuoa6bgos3uqabss4gew4vadkik7vhj3ucpqw6nxtqtpe
fingerprint_ignore_patterns: []
agent: valory/impact_evaluator:0.1.0:bafybeifhygewmf2pdq4vyeiwucoutziaw6nral34pxjtwjgybjp5rfu4aq
agent: valory/impact_evaluator:0.1.0:bafybeia7bsxknskfv623j2jdqdrarenim3kuffnlyle72r7fipdtf2p4x4
number_of_agents: 1
deployment:
agent:
Expand Down
4 changes: 2 additions & 2 deletions packages/valory/skills/impact_evaluator_abci/skill.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ skills:
- valory/abstract_round_abci:0.1.0:bafybeib733xfbndtpvkf44mtk7oyodnficgloo6xhn7xmqxxeos33es65u
- valory/ceramic_read_abci:0.1.0:bafybeiede3ehp4bfpbk23gncj52goq62rd3rm5wwlbyaexxrfohucdcpia
- valory/generic_scoring_abci:0.1.0:bafybeidxytbreu7sudoggnfjxpbfxsxwbis6dipokkq6uo23xaautnwca4
- valory/twitter_scoring_abci:0.1.0:bafybeiedultjq4wokxuchbr4nv7m3y3mqq6qwtir6m5epggnbgew6yb24i
- valory/twitter_scoring_abci:0.1.0:bafybeibviksrbdkg5ewyhy7iz7ob5eqks3dxethmrhbff264mtul5um7am
- valory/ceramic_write_abci:0.1.0:bafybeiemid3ipekyqupbqpfw55g7b2wwx56g2ita73rjalk6fyqgneroam
- valory/dynamic_nft_abci:0.1.0:bafybeietq6nqkeze6esw5dwa4cjajluzd2tvg24hlg2pihxz2v67vxorpu
- valory/registration_abci:0.1.0:bafybeibc7duasoaw5b4ene5oxfba2dmdzstsrws6ipi57ymgdtoxjadn54
Expand All @@ -37,7 +37,7 @@ skills:
- valory/llm_abci:0.1.0:bafybeibmckwphs5zqdfnutktwgq7bxfw2auhsxezoopkep5dadkuwqvwgy
- valory/twitter_write_abci:0.1.0:bafybeid377kr5f3dmb5nyhvucglyaaqkuhthxkfosgl54zskwmsuwz56ie
- valory/olas_week_abci:0.1.0:bafybeifvhx6issf3xzesjihtbl63ymfrdvzfp4lqrg7liesyes4aiaydfm
- valory/mech_interact_abci:0.1.0:bafybeigto5ssrbrbqmeoc6wijcly2klmrhfcnaioa5u3wsofdm7bccowcq
- valory/mech_interact_abci:0.1.0:bafybeiesl4k7lkvubzf42hduoxrmruwlmimscxltw6l5nq57shfb3l632y
behaviours:
main:
args: {}
Expand Down
5 changes: 3 additions & 2 deletions packages/valory/skills/mech_interact_abci/skill.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,13 @@ fingerprint:
states/request.py: bafybeifdkqn4o2tx57yflnxfhy6eoy42z7bdpadcevre64aw7l2hh2kpjy
states/response.py: bafybeibaxnp2oxwjptoq7qzm6o7ww2qrdj2vnxzg2qt523vz2ftqzx5hyi
tests/__init__.py: bafybeifojfnffwlsv6aiku25nwyjwm7h4m45yci3fgmaawpeoyoogzonum
tests/test_behaviours.py: bafybeidj7git7zaego7k75eejtxlr3usj6wnnqisu7urqwvalpwh5w7nyq
tests/test_behaviours.py: bafybeid34kv6ho6xzynppy3olrsuoau5ia6gpxy5ii4wkog2piqn2rmfre
tests/test_dialogues.py: bafybeig6uzk7fklieyxapemiobdvv5tyx7hgdkdpl4vnacohgw2ecphdpq
tests/test_handlers.py: bafybeidwrmekr5tydmehvkolyksw37sah5js7buy3ca5fxkpgkppmgb3wi
tests/test_models.py: bafybeid3cvcttdxlklwvr6tqmiurb2qywvmgr5bnsn62pb5gl5p552eagy
tests/test_models.py: bafybeifakxkpvq6p6nkva3kpy7odnefvjnjurcva5anwlxv6qlo6agxtyu
tests/test_payloads.py: bafybeiakqhgochfu4ra4hp65hi7jvxtjd7fdub5wqmhlccrc4va26hb7da
tests/test_rounds.py: bafybeiauu5adaoxu7yvtrfa6uwdw4sxr5gn2pj7qjh6vowd556iji6vtca
tests/test_states_base.py: bafybeigognrbwfajutxxzssprfnwu3s67zfuhckerwhzdf6d2wbgt7zg24
fingerprint_ignore_patterns: []
connections: []
contracts:
Expand Down
134 changes: 117 additions & 17 deletions packages/valory/skills/mech_interact_abci/tests/test_behaviours.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------------------------
#
# Copyright 2023 Valory AG
# Copyright 2023-2024 Valory AG
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand All @@ -21,15 +21,22 @@

from dataclasses import dataclass, field
from pathlib import Path
from typing import Any, Dict, Hashable, Optional, Type
from typing import Any, Dict, Hashable, Optional, Type, cast
from unittest import mock
from unittest.mock import MagicMock

import pytest

from packages.valory.protocols.contract_api import ContractApiMessage
from packages.valory.skills.abstract_round_abci.base import AbciAppDB
from packages.valory.skills.abstract_round_abci.behaviour_utils import (
make_degenerate_behaviour,
)
from packages.valory.skills.abstract_round_abci.behaviours import BaseBehaviour
from packages.valory.skills.abstract_round_abci.test_tools.base import (
FSMBehaviourBaseCase,
)
from packages.valory.skills.abstract_round_abci.tests.test_common import dummy_generator
from packages.valory.skills.mech_interact_abci.behaviours.base import (
MechInteractBaseBehaviour,
)
Expand All @@ -42,10 +49,14 @@
from packages.valory.skills.mech_interact_abci.behaviours.round_behaviour import (
MechInteractRoundBehaviour,
)
from packages.valory.skills.mech_interact_abci.models import SharedState
from packages.valory.skills.mech_interact_abci.states.base import (
Event,
SynchronizedData,
)
from packages.valory.skills.mech_interact_abci.states.final_states import (
FinishedMechRequestRound,
)


@dataclass
Expand All @@ -55,6 +66,7 @@ class BehaviourTestCase:
name: str
initial_data: Dict[str, Hashable]
event: Event
return_value: Any
kwargs: Dict[str, Any] = field(default_factory=dict)


Expand All @@ -80,11 +92,14 @@ def fast_forward(self, data: Optional[Dict[str, Any]] = None) -> None:

data = data if data is not None else {}
self.fast_forward_to_behaviour(
self.behaviour,
self.behaviour_class.behaviour_id,
self.behaviour, # type: ignore
self.behaviour_class.auto_behaviour_id(),
SynchronizedData(AbciAppDB(setup_data=AbciAppDB.data_to_lists(data))),
)
assert self.current_behaviour_id == self.behaviour_class.behaviour_id
assert (
self.behaviour.current_behaviour.auto_behaviour_id() # type: ignore
== self.behaviour_class.auto_behaviour_id()
)

def complete(self, event: Event) -> None:
"""Complete test"""
Expand All @@ -93,25 +108,110 @@ def complete(self, event: Event) -> None:
self.mock_a2a_transaction()
self._test_done_flag_set()
self.end_round(done_event=event)
assert self.current_behaviour_id == self.next_behaviour_class.behaviour_id
assert (
self.behaviour.current_behaviour.auto_behaviour_id() # type: ignore
== self.next_behaviour_class.auto_behaviour_id()
)


class TestMechRequestBehaviour(BaseMechInteractTest):
"""Tests MechRequestBehaviour"""

# TODO: set next_behaviour_class
behaviour_class: Type[BaseBehaviour] = MechRequestBehaviour
next_behaviour_class: Type[BaseBehaviour] = ...

# TODO: provide test cases
@pytest.mark.parametrize("test_case", [])
def test_run(self, test_case: BehaviourTestCase) -> None:
next_behaviour_class: Type[BaseBehaviour] = make_degenerate_behaviour(
FinishedMechRequestRound
)

@pytest.mark.parametrize(
"test_case, kwargs",
[
(
BehaviourTestCase(
"Happy path - no mech request",
initial_data=dict(mech_requests=[]),
event=Event.DONE,
return_value={
"ledger": None,
"contract": None,
"metadata_hash": None,
"multisend_safe_tx_hash": None,
},
),
{},
),
(
BehaviourTestCase(
"Happy path",
initial_data=dict(
mech_requests='[{"prompt": "dummy_prompt_1", "tool": "dummy_tool_1", "nonce": "dummy_nonce_1"}, {"prompt": "dummy_prompt_2", "tool": "dummy_tool_2", "nonce": "dummy_nonce_2"}]',
safe_contract_address="mock_safe_contract_address",
),
event=Event.DONE,
return_value={
"ledger": MagicMock(
state=MagicMock(body={"get_balance_result": "10"})
),
"contract": MagicMock(
performative=ContractApiMessage.Performative.RAW_TRANSACTION,
raw_transaction=MagicMock(
body={
"token": 10,
"wallet": "mock_safe_contract_address",
"data": "0x0000deadbeef0000",
"request_data": "dummy_request_data",
}
),
),
"metadata_hash": "QmTzQ1iVRmDDeh8aW5HX99o9dsPwzUo9tb5w1DLT8PaJfM",
"multisend_safe_tx_hash": MagicMock(
performative=ContractApiMessage.Performative.STATE,
state=MagicMock(
body={
"tx_hash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
),
),
},
),
{},
),
],
)
def test_run(self, test_case: BehaviourTestCase, kwargs) -> None:
"""Run tests."""

self.fast_forward(test_case.initial_data)
# TODO: mock the necessary calls
# self.mock_ ...
self.complete(test_case.event)
with mock.patch.object(
MechRequestBehaviour,
"get_ledger_api_response",
dummy_generator(test_case.return_value["ledger"]),
), mock.patch.object(
MechRequestBehaviour,
"get_contract_api_response",
dummy_generator(test_case.return_value["contract"]),
), mock.patch.object(
MechRequestBehaviour,
"send_to_ipfs",
dummy_generator(test_case.return_value["metadata_hash"]),
):
params = cast(SharedState, self._skill.skill_context.params)
params.__dict__["_frozen"] = False
params.mech_request_price = 1
params.mech_contract_address = "dummy_mech_contract_address"
self.fast_forward(test_case.initial_data)
self.behaviour.act_wrapper()
self.behaviour.act_wrapper()
self.behaviour.act_wrapper()
self.behaviour.act_wrapper()
self.behaviour.act_wrapper()
self.behaviour.act_wrapper()
self.behaviour.act_wrapper()

with mock.patch.object(
MechRequestBehaviour,
"get_contract_api_response",
dummy_generator(test_case.return_value["multisend_safe_tx_hash"]),
):
self.behaviour.act_wrapper()
self.complete(test_case.event)


class TestMechResponseBehaviour(BaseMechInteractTest):
Expand Down
Loading
Loading