Skip to content

Commit 63413d8

Browse files
authored
fix(spy): ensure __eq__ of rehearsal arg is preferred (#201)
1 parent 7189c56 commit 63413d8

File tree

2 files changed

+50
-3
lines changed

2 files changed

+50
-3
lines changed

decoy/spy_events.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,10 @@ def match_event(event: AnySpyEvent, rehearsal: SpyRehearsal) -> bool:
8383

8484
try:
8585
args_match = all(
86-
call.args[i] == value for i, value in enumerate(rehearsed_call.args)
86+
value == call.args[i] for i, value in enumerate(rehearsed_call.args)
8787
)
8888
kwargs_match = all(
89-
call.kwargs[key] == value
89+
value == call.kwargs[key]
9090
for key, value in rehearsed_call.kwargs.items()
9191
)
9292

@@ -95,4 +95,4 @@ def match_event(event: AnySpyEvent, rehearsal: SpyRehearsal) -> bool:
9595
except (IndexError, KeyError):
9696
return False
9797

98-
return event.payload == rehearsal.payload
98+
return rehearsal.payload == event.payload

tests/test_spy_events.py

+47
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,50 @@ def test_match_event(
176176
"""It should match a call to a rehearsal."""
177177
result = match_event(event, rehearsal)
178178
assert result is expected_result
179+
180+
181+
def test_match_eq_override() -> None:
182+
"""It should prefer __eq__ from the rehearsal."""
183+
184+
class _Matcher:
185+
def __eq__(self, other: object) -> bool:
186+
return True
187+
188+
class _Value:
189+
def __eq__(self, other: object) -> bool:
190+
return False
191+
192+
event_args = SpyEvent(
193+
spy=SpyInfo(id=42, name="my_spy", is_async=False),
194+
payload=SpyCall(args=(_Value(),), kwargs={}),
195+
)
196+
197+
event_kwargs = SpyEvent(
198+
spy=SpyInfo(id=42, name="my_spy", is_async=False),
199+
payload=SpyCall(args=(), kwargs={"value": _Value()}),
200+
)
201+
202+
rehearsal_ars = WhenRehearsal(
203+
spy=SpyInfo(id=42, name="my_spy", is_async=False),
204+
payload=SpyCall(args=(_Matcher(),), kwargs={}),
205+
)
206+
207+
rehearsal_kwargs = WhenRehearsal(
208+
spy=SpyInfo(id=42, name="my_spy", is_async=False),
209+
payload=SpyCall(args=(), kwargs={"value": _Matcher()}),
210+
)
211+
212+
rehearsal_args_ignore_extra = WhenRehearsal(
213+
spy=SpyInfo(id=42, name="my_spy", is_async=False),
214+
payload=SpyCall(args=(_Matcher(),), kwargs={}, ignore_extra_args=True),
215+
)
216+
217+
rehearsal_kwargs_ignore_extra = WhenRehearsal(
218+
spy=SpyInfo(id=42, name="my_spy", is_async=False),
219+
payload=SpyCall(args=(), kwargs={"value": _Matcher()}, ignore_extra_args=True),
220+
)
221+
222+
assert match_event(event_args, rehearsal_ars) is True
223+
assert match_event(event_kwargs, rehearsal_kwargs) is True
224+
assert match_event(event_args, rehearsal_args_ignore_extra) is True
225+
assert match_event(event_kwargs, rehearsal_kwargs_ignore_extra) is True

0 commit comments

Comments
 (0)