def test_on_ready(self):
        self.heard_event = False
        provider = Provider('valid-token')

        @provider.on('heardEvent')
        def fn(*args):
            self.assertTrue(provider.ready, 'Provider was not ready')
            self.heard_event = True

        @provider.on('heardSensor')
        def fn(*args):
            self.assertTrue(self.heard_event, 'Order was not preserved')
            provider.send_event('ping')

        @provider.on('pong')
        def fn(*args):
            self.packet_received.set()

        provider.send_event('test').send_sensor('test')
        provider.connect(**CONNECT_KWARGS)
        self.wait_for_packet(provider)
 def setUp(self):
     super(ProviderTestCase, self).setUp()
     self.client_type = 'provider'
     self.provider = Provider('valid-token')
     self.provider.connect(**CONNECT_KWARGS)
     self.client = self.provider
class ProviderTestCase(HeimdallrClientTestCase):
    def setUp(self):
        super(ProviderTestCase, self).setUp()
        self.client_type = 'provider'
        self.provider = Provider('valid-token')
        self.provider.connect(**CONNECT_KWARGS)
        self.client = self.provider

    def tearDown(self):
        super(ProviderTestCase, self).tearDown()

    def test_receives_packets(self):
        def fn(data):
            self.assertDictEqual(
                data,
                {'ping': 'data'},
                'Ping data did not match'
            )
            self.packet_received.set()

        self.provider.on('ping', fn)
        self.trigger('ping')
        self.wait_for_packet()

    def test_raises_exceptions(self):
        self.trigger('JSON-error')
        self.assertRaises(
            HeimdallrClientException,
            partial(self.wait_for_packet, self.provider)
        )
        self.trigger('js-error')
        self.assertRaises(
            HeimdallrClientException,
            partial(self.wait_for_packet, self.provider)
        )

    def test_decorates_callbacks(self):
        @self.provider.on('ping')
        def fn(data):
            self.assertDictEqual(
                data,
                {'ping': 'data'},
                'Ping data did not match'
            )
            self.packet_received.set()

        self.trigger('ping')
        self.wait_for_packet()

    def test_send_event(self):
        self.provider.on('heardEvent', self.set_packet_received)
        self.provider.send_event('test')
        self.wait_for_packet()

    def test_send_sensor(self):
        self.provider.on('heardSensor', self.set_packet_received)
        self.provider.send_sensor('test')
        self.wait_for_packet()

    def test_send_stream(self):
        self.provider.on('heardStream', self.set_packet_received)
        self.provider.send_stream('\x21')
        self.wait_for_packet()

    def test_on_ready(self):
        self.heard_event = False
        provider = Provider('valid-token')

        @provider.on('heardEvent')
        def fn(*args):
            self.assertTrue(provider.ready, 'Provider was not ready')
            self.heard_event = True

        @provider.on('heardSensor')
        def fn(*args):
            self.assertTrue(self.heard_event, 'Order was not preserved')
            provider.send_event('ping')

        @provider.on('pong')
        def fn(*args):
            self.packet_received.set()

        provider.send_event('test').send_sensor('test')
        provider.connect(**CONNECT_KWARGS)
        self.wait_for_packet(provider)

    def test_multiple_listeners(self):
        self.called_first = False

        @self.provider.on('ping')
        def fn(*args):
            self.called_first = True

        @self.provider.on('ping')
        def fn(*args):
            self.assertTrue(self.called_first, 'Order was not preserved')
            self.set_packet_received()

        self.trigger('ping')
        self.wait_for_packet()

    def test_remove_listener(self):
        def callback(*args):
            self.fail('Called removed listener')

        @self.provider.on('ping')
        def fn(*args):
            callback()

        @self.provider.on('ping')
        def fn(*args):
            callback()

        self.provider.remove_listener('ping')

        self.provider.on('ping', callback)

        @self.provider.on('ping')
        def fn(*args):
            self.set_packet_received()

        self.provider.remove_listener('ping', callback)
        self.trigger('ping')
        self.wait_for_packet()

    def test_completes_control(self):
        self.provider.on('completedControl', self.set_packet_received)
        self.provider.completed('test')
        self.wait_for_packet()