class WsClientMethodsTestCase(unittest.TestCase):
    def setUp(self):
        self.transport = StringTransport()
        self.handler = Handler()
        self.factory = WebSocketFactory(self.handler)
        self.proto = self.factory.buildProtocol(None)
        self.proto.makeConnection(self.transport)
        self.proto.dataReceived('HTTP/1.1 101 OK\r\n\r\n')
        self.proto.socket.rand = Random(1)
        self.transport.clear()

    def test_notify(self):
        self.transport.clear()
        defer = self.factory.notify('nt', {
            'a': 1,
            'b': 2
        },
                                    device_id='123',
                                    device_key='321')
        s = decode_ws_message(self.transport.value())
        self.assertEquals(
            {
                u'action': u'notification/insert',
                u'notification': {
                    u'notification': u'nt',
                    u'parameters': {
                        u'a': 1,
                        u'b': 2
                    }
                },
                u'deviceKey': u'321',
                u'deviceId': u'123',
                u'requestId': max(self.proto.msg_callbacks.keys())
            }, json.loads(s))

    def test_subscribe(self):
        self.transport.clear()
        defer = self.factory.subscribe('123', '321')
        s = decode_ws_message(self.transport.value())
        self.assertEquals(
            {
                u'action': u'command/subscribe',
                u'deviceId': u'123',
                u'deviceKey': u'321',
                u'requestId': max(self.proto.msg_callbacks.keys())
            }, json.loads(s))

    def test_unsubscribe(self):
        self.transport.clear()
        defer = self.factory.unsubscribe('123', '312')
        s = decode_ws_message(self.transport.value())
        self.assertEquals(
            {
                u'action': u'command/unsubscribe',
                u'deviceKey': u'312',
                u'deviceId': u'123',
                u'requestId': max(self.proto.msg_callbacks.keys())
            }, json.loads(s))

    def test_authenticate(self):
        self.transport.clear()
        defer = self.factory.authenticate('123', '321')
        s = decode_ws_message(self.transport.value())
        self.assertEquals(
            {
                u'action': u'authenticate',
                u'deviceId': u'123',
                u'deviceKey': u'321',
                u'requestId': max(self.proto.msg_callbacks.keys())
            }, json.loads(s))

    def test_device_save(self):
        class TestDev(object):
            implements(IDeviceInfo)
            id = 'td_id'
            key = 'td_key'
            name = 'td_name'
            equipment = []
            status = None
            network = None
            device_class = None

        self.transport.clear()
        # minimal message
        info = TestDev()
        self.factory.device_save(info)
        s = decode_ws_message(self.transport.value())
        self.assertEquals(
            {
                u'action': u'device/save',
                u'device': {
                    u'equipment': [],
                    u'name': u'td_name',
                    u'key': u'td_key'
                },
                u'deviceKey': u'td_key',
                u'deviceId': u'td_id',
                u'requestId': max(self.proto.msg_callbacks.keys())
            }, json.loads(s))
        # with equipment
        self.transport.clear()
        info.equipment = [
            devicehive.Equipment(name='en', code='cd', type='tp', data=None)
        ]
        self.factory.device_save(info)
        s = decode_ws_message(self.transport.value())
        self.assertEquals(
            {
                u'action': u'device/save',
                u'device': {
                    u'equipment': [{
                        u'name': u'en',
                        u'code': u'cd',
                        u'type': u'tp'
                    }],
                    u'name':
                    u'td_name',
                    u'key':
                    u'td_key'
                },
                u'deviceKey': u'td_key',
                u'deviceId': u'td_id',
                u'requestId': max(self.proto.msg_callbacks.keys())
            }, json.loads(s))
        # equipment with data
        self.transport.clear()
        info.equipment = [
            devicehive.Equipment(name='en', code='cd', type='tp', data='dt')
        ]
        self.factory.device_save(info)
        s = decode_ws_message(self.transport.value())
        self.assertEquals(
            {
                u'action': u'device/save',
                u'device': {
                    u'equipment': [{
                        u'name': u'en',
                        u'code': u'cd',
                        u'type': u'tp',
                        u'data': u'dt'
                    }],
                    u'name':
                    u'td_name',
                    u'key':
                    u'td_key'
                },
                u'deviceKey': u'td_key',
                u'deviceId': u'td_id',
                u'requestId': max(self.proto.msg_callbacks.keys())
            }, json.loads(s))
        # with network
        self.transport.clear()
        info.network = devicehive.Network(id='nid',
                                          key='nkey',
                                          name='nname',
                                          descr='ndesr')
        self.factory.device_save(info)
        s = decode_ws_message(self.transport.value())
        self.assertEquals(
            {
                u'action': u'device/save',
                u'device': {
                    u'equipment': [{
                        u'name': u'en',
                        u'code': u'cd',
                        u'type': u'tp',
                        u'data': u'dt'
                    }],
                    u'name':
                    u'td_name',
                    u'key':
                    u'td_key',
                    u'network': {
                        u'id': u'nid',
                        u'name': u'nname',
                        u'key': u'nkey',
                        u'description': 'ndesr'
                    }
                },
                u'deviceKey': u'td_key',
                u'deviceId': u'td_id',
                u'requestId': max(self.proto.msg_callbacks.keys())
            }, json.loads(s))
class WsClientMethodsTestCase(unittest.TestCase):
    def setUp(self):
        self.transport = StringTransport()
        self.handler = Handler()
        self.factory = WebSocketFactory(self.handler)
        self.proto = self.factory.buildProtocol(None)
        self.proto.makeConnection(self.transport)
        self.proto.dataReceived('HTTP/1.1 101 OK\r\n\r\n')
        self.proto.socket.rand = Random(1)
        self.transport.clear()
    
    def test_notify(self):
        self.transport.clear()
        defer = self.factory.notify('nt', {'a':1,'b':2}, device_id='123', device_key='321')
        s = decode_ws_message(self.transport.value())
        self.assertEquals({u'action': u'notification/insert',
                           u'notification': {u'notification': u'nt',
                                             u'parameters': {u'a': 1, u'b': 2}},
                           u'deviceKey': u'321',
                           u'deviceId': u'123',
                           u'requestId': max(self.proto.msg_callbacks.keys())}, json.loads(s))
    
    def test_subscribe(self):
        self.transport.clear()
        defer = self.factory.subscribe('123', '321')
        s = decode_ws_message(self.transport.value())
        self.assertEquals({u'action': u'command/subscribe',
                           u'deviceId': u'123',
                           u'deviceKey': u'321',
                           u'requestId': max(self.proto.msg_callbacks.keys())}, json.loads(s))
    
    def test_unsubscribe(self):
        self.transport.clear()
        defer = self.factory.unsubscribe('123', '312')
        s = decode_ws_message(self.transport.value())
        self.assertEquals({u'action': u'command/unsubscribe',
                           u'deviceKey': u'312',
                           u'deviceId': u'123',
                           u'requestId': max(self.proto.msg_callbacks.keys())}, json.loads(s))
    
    def test_authenticate(self):
        self.transport.clear()
        defer = self.factory.authenticate('123', '321')
        s = decode_ws_message(self.transport.value())
        self.assertEquals({u'action': u'authenticate',
                           u'deviceId': u'123',
                           u'deviceKey': u'321',
                           u'requestId': max(self.proto.msg_callbacks.keys())}, json.loads(s))
    
    def test_device_save(self):
        class TestDev(object):
            implements(IDeviceInfo)
            id = 'td_id'
            key = 'td_key'
            name = 'td_name'
            equipment = []
            status = None
            network = None
            device_class = None
        self.transport.clear()
        # minimal message
        info = TestDev()
        self.factory.device_save(info)
        s = decode_ws_message(self.transport.value())
        self.assertEquals({u'action': u'device/save',
                           u'device':
                                {u'equipment': [],
                                 u'name': u'td_name',
                                 u'key': u'td_key'},
                            u'deviceKey': u'td_key',
                            u'deviceId': u'td_id',
                            u'requestId': max(self.proto.msg_callbacks.keys())}, json.loads(s))
        # with equipment
        self.transport.clear()
        info.equipment = [devicehive.Equipment(name = 'en', code='cd', type='tp', data = None)]
        self.factory.device_save(info)
        s = decode_ws_message(self.transport.value())
        self.assertEquals({u'action': u'device/save',
                           u'device':
                                {u'equipment': [{u'name': u'en', u'code': u'cd', u'type': u'tp'}],
                                 u'name': u'td_name',
                                 u'key': u'td_key'},
                            u'deviceKey': u'td_key',
                            u'deviceId': u'td_id',
                            u'requestId': max(self.proto.msg_callbacks.keys())}, json.loads(s))
        # equipment with data
        self.transport.clear()
        info.equipment = [devicehive.Equipment(name = 'en', code='cd', type='tp', data = 'dt')]
        self.factory.device_save(info)
        s = decode_ws_message(self.transport.value())
        self.assertEquals({u'action': u'device/save',
                           u'device':
                                {u'equipment': [{u'name': u'en', u'code': u'cd', u'type': u'tp', u'data': u'dt'}],
                                 u'name': u'td_name',
                                 u'key': u'td_key'},
                            u'deviceKey': u'td_key',
                            u'deviceId': u'td_id',
                            u'requestId': max(self.proto.msg_callbacks.keys())}, json.loads(s))
        # with network
        self.transport.clear()
        info.network = devicehive.Network(id = 'nid', key = 'nkey', name = 'nname', descr = 'ndesr')
        self.factory.device_save(info)
        s = decode_ws_message(self.transport.value())
        self.assertEquals({u'action': u'device/save',
                           u'device':
                                {u'equipment': [{u'name': u'en', u'code': u'cd', u'type': u'tp', u'data': u'dt'}],
                                 u'name': u'td_name',
                                 u'key': u'td_key',
                                 u'network': {u'id': u'nid',
                                              u'name': u'nname',
                                              u'key': u'nkey',
                                              u'description': 'ndesr'}},
                            u'deviceKey': u'td_key',
                            u'deviceId': u'td_id',
                            u'requestId': max(self.proto.msg_callbacks.keys())}, json.loads(s))