async def METHOD_NAME(backend, alice_ws, alice, bob):
    d1 = DateTime(2000, 1, 1)
    await apiv2v3_events_subscribe(alice_ws)
    # Good message
    with backend.event_bus.listen() as spy:
        await backend.message.send(
            bob.organization_id, bob.device_id, alice.user_id, d1, b"Hello from bob to alice"
        )
        await backend.message.send(
            bob.organization_id, bob.device_id, alice.user_id, d1, b"Goodbye from bob to alice"
        )
        # No guarantees those events occur before the commands' return
        await spy.wait_multiple_with_timeout(
            [BackendEventMessageReceived, BackendEventMessageReceived]
        )
    reps = [
        await apiv2v3_events_listen_nowait(alice_ws),
        await apiv2v3_events_listen_nowait(alice_ws),
        await apiv2v3_events_listen_nowait(alice_ws),
    ]
    assert reps == [
        ApiV2V3_EventsListenRepOk(ApiV2V3_APIEventMessageReceived(1)),
        ApiV2V3_EventsListenRepOk(ApiV2V3_APIEventMessageReceived(2)),
        ApiV2V3_EventsListenRepNoEvents(),
    ]
    # Message to self also trigger event (not as silly as at sound: see workspace reencryption)
    with backend.event_bus.listen() as spy:
        await backend.message.send(
            alice.organization_id, alice.device_id, alice.user_id, d1, b"Hello to myself"
        )
        # No guarantees those events occur before the commands' return
        await spy.wait_multiple_with_timeout([BackendEventMessageReceived])
    reps = [
        await apiv2v3_events_listen_nowait(alice_ws),
        await apiv2v3_events_listen_nowait(alice_ws),
    ]
    assert reps == [
        ApiV2V3_EventsListenRepOk(ApiV2V3_APIEventMessageReceived(3)),
        ApiV2V3_EventsListenRepNoEvents(),
    ]