From 5546eb8f7eca2b9c7b28890436b0fe8c62cb1cef Mon Sep 17 00:00:00 2001 From: Johanna England Date: Fri, 21 Jun 2024 14:47:42 +0200 Subject: [PATCH] Add tests for fake event API command --- tests/api/legacy_test.py | 75 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/tests/api/legacy_test.py b/tests/api/legacy_test.py index e5f0b6d18..9eae84f5a 100644 --- a/tests/api/legacy_test.py +++ b/tests/api/legacy_test.py @@ -25,6 +25,8 @@ ) from zino.time import now +DEVICE_NAME = "example-gw.example.org" + class TestZino1BaseServerProtocol: def test_should_init_without_error(self): @@ -892,6 +894,79 @@ async def test_when_authenticated_should_list_all_pm_ids(self, authenticated_pro assert re.search(pattern_string.format(id), response), f"Expected response to contain id {id}" +class TestZino1TestProtocolFakeEventCommand: + @pytest.mark.asyncio + @pytest.mark.parametrize( + "subindex,event_class", + [ + ("yellow", "alarm"), + (123, "bfd"), + ("127.0.0.1", "bgp"), + (123, "portstate"), + ("None", "reachability"), + ], + ) + async def test_fakevent_should_create_event(self, subindex, event_class): + protocol = ZinoTestProtocol() + fake_transport = Mock() + protocol.connection_made(fake_transport) + protocol.user = "foo" + fake_transport.write = Mock() + command = f"FAKEEVENT {DEVICE_NAME} {subindex} {event_class} ignored" + await protocol.message_received(command) + + assert fake_transport.write.called + response = fake_transport.write.call_args[0][0].decode("utf-8") + assert response.startswith("200 ") + + event_id = re.search(r"event created with id (?P\d+)", response).group("id") + assert event_id + assert protocol._state.events.events.get(int(event_id), None) + + @pytest.mark.asyncio + @pytest.mark.parametrize( + "subindex,event_class,event_state", + [ + (123, "invalid-event-type", "ignored"), + ("blue", "alarm", "ignored"), + (123, "portstate", "invalid-state"), + ("abc", "portstate", "ignored"), + ("abc", "bgp", "ignored"), + ], + ) + async def test_fakevent_should_fail_on_invalid_input(self, subindex, event_class, event_state): + protocol = ZinoTestProtocol() + fake_transport = Mock() + protocol.connection_made(fake_transport) + protocol.user = "foo" + fake_transport.write = Mock() + command = f"FAKEEVENT {DEVICE_NAME} {subindex} {event_class} {event_state}" + await protocol.message_received(command) + + assert fake_transport.write.called + response = fake_transport.write.call_args[0][0].decode("utf-8") + assert response.startswith("500 ") + + @pytest.mark.asyncio + async def test_fakevent_should_fail_if_event_with_given_index_exists_already(self): + protocol = ZinoTestProtocol() + fake_transport = Mock() + protocol.connection_made(fake_transport) + protocol.user = "foo" + fake_transport.write = Mock() + + event = ReachabilityEvent(router=DEVICE_NAME, state=EventState.OPEN) + protocol._state.events.commit(event=event) + + command = f"FAKEEVENT {DEVICE_NAME} None reachability open" + await protocol.message_received(command) + + assert fake_transport.write.called + response = fake_transport.write.call_args[0][0].decode("utf-8") + assert response.startswith("500 ") + assert "An event with the given parameters already exists" in response + + def test_requires_authentication_should_set_function_attribute(): @requires_authentication def throwaway():