def test_get_queue(self):
        client = FakeClient()
        queue = client.send_message('req',
                                    'uri', {"item": "payload"},
                                    unique_id="1",
                                    get_queue=True)
        client.received_message(json.dumps({"id": "1", "test": "test"}))

        assert queue.get(block=True, timeout=1) == dict(id="1", test="test")
    def test_send_callback(self):
        obj = {}

        def callback(res):
            obj["res"] = res

        client = FakeClient()
        client.send_message('req',
                            'uri', {"item": "payload"},
                            callback=callback,
                            unique_id="1")
        client.received_message(json.dumps({"id": "1", "test": "test"}))

        assert obj["res"] == dict(id="1", test="test")
    def test_multiple_send(self):
        client = FakeClient()
        q1 = client.send_message('req',
                                 "uri",
                                 None,
                                 unique_id="1",
                                 get_queue=True)
        q2 = client.send_message('req',
                                 "uri",
                                 None,
                                 unique_id="2",
                                 get_queue=True)

        client.received_message(json.dumps({"id": "2", "test": "test2"}))
        client.received_message(json.dumps({"id": "1", "test": "test1"}))

        assert q1.get(block=True, timeout=1) == {"id": "1", "test": "test1"}
        assert q2.get(block=True, timeout=1) == {"id": "2", "test": "test2"}
    def test_subscription(self):
        result = []
        result_event = Event()

        def callback(obj):
            result.append(obj)
            result_event.set()

        client = FakeClient()
        client.subscribe('unique_uri', "123", callback)

        client.received_message(json.dumps({"id": "123", "payload": [1]}))
        client.received_message(json.dumps({"id": "123", "payload": [2]}))
        client.received_message(json.dumps({"id": "123", "payload": [3]}))

        result_event.wait()
        assert result == [[1], [2], [3]]

        result = []
        client.unsubscribe("123")

        client.received_message(json.dumps({"id": "123", "payload": [1]}))
        assert result == []

        with raises(ValueError):
            client.unsubscribe("123")
    def test_clear_waiters(self):
        client = FakeClient()
        q1 = client.send_message('req',
                                 "uri",
                                 None,
                                 unique_id="1",
                                 get_queue=True,
                                 cur_time=lambda: time.time() - 80)
        q2 = client.send_message('req',
                                 "uri",
                                 None,
                                 unique_id="2",
                                 get_queue=True,
                                 cur_time=lambda: time.time() - 20)

        client.received_message(json.dumps({"id": "2", "test": "test2"}))
        client.received_message(json.dumps({"id": "1", "test": "test1"}))

        with raises(Empty):
            assert q1.get(block=True, timeout=1)

        assert q2.get(block=True, timeout=1) == {"id": "2", "test": "test2"}