def test_fetch_got_data(self):
        queue_items = munchify({
            'items': [{
                'data': {
                    'id': 1
                },
                'meta': {
                    'type': 'user',
                    'sync': {
                        'event_type': 'created',
                        'ack_key': 'User-1234-1',
                        'revision': 1
                    }
                }
            }]
        })
        http_client = mock.create_autospec(basecrm.HttpClient)
        http_client.get.return_value = (200, {}, queue_items)

        sync = basecrm.SyncService(http_client)
        self.assertEquals(sync.fetch(self.device_uuid, self.session_id),
                          queue_items['items'])
        http_client.get.assert_called_once_with(
            "/sync/{session_id}/queues/main".format(
                session_id=self.session_id),
            params=None,
            headers={'X-Basecrm-Device-UUID': self.device_uuid},
            raw=True)
    def test_start_nothing_new(self):
        http_client = mock.create_autospec(basecrm.HttpClient)
        http_client.post.return_value = (204, {}, None)

        sync = basecrm.SyncService(http_client)
        self.assertEquals(sync.start(self.device_uuid), None)
        http_client.post.assert_called_once_with(
            '/sync/start',
            body=None,
            headers={'X-Basecrm-Device-UUID': self.device_uuid})
    def test_ack(self):
        ack_keys = ['User-1234-1', 'Source-1234-1']
        http_client = mock.create_autospec(basecrm.HttpClient)
        http_client.post.return_value = (202, {}, None)

        sync = basecrm.SyncService(http_client)
        self.assertTrue(sync.ack(self.device_uuid, ack_keys))
        http_client.post.assert_called_once_with(
            '/sync/ack',
            body={'ack_keys': ack_keys},
            headers={'X-Basecrm-Device-UUID': self.device_uuid})
    def test_start_got_session(self):
        session = munch.Munch(id=self.session_id)
        http_client = mock.create_autospec(basecrm.HttpClient)
        http_client.post.return_value = (200, {}, session)

        sync = basecrm.SyncService(http_client)
        self.assertEquals(sync.start(self.device_uuid), session)
        http_client.post.assert_called_once_with(
            '/sync/start',
            body=None,
            headers={'X-Basecrm-Device-UUID': self.device_uuid})
    def test_fetch_no_more_data(self):
        http_client = mock.create_autospec(basecrm.HttpClient)
        http_client.get.return_value = (204, {}, None)

        sync = basecrm.SyncService(http_client)
        self.assertEquals(sync.fetch(self.device_uuid, self.session_id), [])
        http_client.get.assert_called_once_with(
            "/sync/{session_id}/queues/main".format(
                session_id=self.session_id),
            params=None,
            headers={'X-Basecrm-Device-UUID': self.device_uuid},
            raw=True)