def setUp(self):
     gan_token = 'h027MapNNujPH0gV+sXAdmzZTDffHOpJEHaBtrD3NXtNqI4dT3NLXhyTwiZr7PUOGZJNSGv/b9xVyaguX0nDrONGhudPkxtl5EoXrM4SOZHswebpSy2ehh0edrGVF7dVJVZLIlRwgViY3n3/2hMQ5Njp9JFywnOy7gMeaoKw0hYLRbd+wVqvl2oOnspXwGTTcZ9Y+cdP8jIhUUoXOieXst0IXVclAHXa+K1d15gKLcpmXzK+jx14wGEmb4t8MSU'
     self.api = Api(token=gan_token)
     self.api.batch_size = 2
     self.attribute_manager = AttributeManager(self.api)
     self.start_path = '/v3'
class ContactManagerTest(unittest.TestCase):
    def setUp(self):
        gan_token = 'h027MapNNujPH0gV+sXAdmzZTDffHOpJEHaBtrD3NXtNqI4dT3NLXhyTwiZr7PUOGZJNSGv/b9xVyaguX0nDrONGhudPkxtl5EoXrM4SOZHswebpSy2ehh0edrGVF7dVJVZLIlRwgViY3n3/2hMQ5Njp9JFywnOy7gMeaoKw0hYLRbd+wVqvl2oOnspXwGTTcZ9Y+cdP8jIhUUoXOieXst0IXVclAHXa+K1d15gKLcpmXzK+jx14wGEmb4t8MSU'
        self.api = Api(token=gan_token)
        self.api.batch_size = 2
        self.attribute_manager = AttributeManager(self.api)
        self.start_path = '/v3'

    @all_requests
    def get_existing_attribute_mock(self, url, request):
        self.assertEqual(url.path, self.start_path + '/attributes/attribute/')
        status_code = 200
        content = '{"url":"https://api.getanewsletter.com/v3/attributes/attribute/","name":"attribute","code":"attribute","usage_count":0}'
        return {'status_code': status_code,
                'content': content}

    def test_get_existing_attribute(self):
        with HTTMock(self.get_existing_attribute_mock):
            attribute = self.attribute_manager.get('attribute')
        self.assertTrue(isinstance(attribute, Attribute))
        self.assertEqual(attribute.name, 'attribute')
        self.assertEqual(attribute.code, 'attribute')

    @all_requests
    def get_non_existing_attribute_mock(self, url, request):
        self.assertEqual(url.path, self.start_path + '/attributes/non_existing/')
        status_code = 404
        content = '{"detail":"Not found."}'
        return {'status_code': status_code,
                'content': content}

    def test_get_non_existing_attribute(self):
        with HTTMock(self.get_non_existing_attribute_mock):
            self.assertRaises(HTTPError, self.attribute_manager.get, 'non_existing')

    @all_requests
    def create_attribute_mock(self, url, request):
        self.assertEqual(url.path, self.start_path + '/attributes/')
        self.assertEqual(request.body, '{"name": "Attribute2"}')
        status_code = 201
        content = '{"url":"https://api.getanewsletter.com/v3/attributes/attribute2/","name":"Attribute2","code":"attribute2","usage_count":0}'
        return {'status_code': status_code,
                'content': content}

    def test_create_attribute(self):
        attribute = self.attribute_manager.create()
        attribute.name = 'Attribute2'
        with HTTMock(self.create_attribute_mock):
            saved_attribute = attribute.save()
        self.assertTrue(isinstance(saved_attribute, Attribute))
        self.assertEqual(saved_attribute.name, 'Attribute2')

    @all_requests
    def update_existing_attribute_mock(self, url, request):
        self.assertEqual(url.path, self.start_path + '/attributes/attribute/')
        self.assertEqual(request.body, '{"name": "changed attribute"}')
        self.assertEqual(request.method, 'PATCH')
        status_code = 201
        content = '{"url":"https://api.getanewsletter.com/v3/attributes/changed-attribute/","name":"changed attribute","code":"changed-attribute","usage_count":0}'
        return {'status_code': status_code,
                'content': content}

    def test_update_existing_attribute(self):
        attribute = self.attribute_manager.create()
        attribute.code = 'attribute'
        attribute.name = 'changed attribute'
        attribute.set_persisted()
        with HTTMock(self.update_existing_attribute_mock):
            updated_attribute = attribute.save()
        self.assertTrue(updated_attribute.name, 'changed attribute')
        self.assertTrue(updated_attribute.code, 'changed-attribute')

    @all_requests
    def delete_attribute_mock(self, url, request):
        self.assertEqual(url.path, self.start_path + '/attributes/changed-attribute/')
        self.assertEqual(request.method, 'DELETE')
        status_code = 204
        content = ''
        return {'status_code': status_code,
                'content': content}

    def test_delete_attribute(self):
        attribute = self.attribute_manager.create()
        attribute.code = 'changed-attribute'
        with HTTMock(self.delete_attribute_mock):
            attribute.delete()

    @all_requests
    def get_paginated_attributes_mock(self, url, request):
        self.assertEqual(url.path, self.start_path + '/attributes/')
        self.assertEqual(url.query, '')
        content = '{"count":16,"next":"https://api.getanewsletter.com/v3/attributes/?page=2","previous":null,"results":[{"url":"https://api.getanewsletter.com/v3/attributes/attribute/","name":"attribute","code":"attribute","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/attribute2/","name":"Attribute2","code":"attribute2","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/bu/","name":"bu","code":"bu","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/bu1/","name":"bu1","code":"bu1","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/bu2/","name":"bu2","code":"bu2","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/bu3/","name":"bu3","code":"bu3","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/bu4/","name":"bu4","code":"bu4","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/bu5/","name":"bu5","code":"bu5","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/bu6/","name":"bu6","code":"bu6","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/bu7/","name":"bu7","code":"bu7","usage_count":0}]}'
        status_code = 200
        return {'content': content,
                'status_code': status_code}

    def get_paginated_attributes_page2_mock(self, url, request):
        self.assertEqual(url.path, self.start_path + '/attributes/')
        self.assertEqual(url.query, 'page=2')
        content = '{"count":16,"next":null,"previous":"https://api.getanewsletter.com/v3/attributes/","results":[{"url":"https://api.getanewsletter.com/v3/attributes/bu8/","name":"bu8","code":"bu8","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/bu9/","name":"bu9","code":"bu9","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/bu10/","name":"bu10","code":"bu10","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/bu11/","name":"bu11","code":"bu11","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/bu12/","name":"bu12","code":"bu12","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/bu13/","name":"bu13","code":"bu13","usage_count":0}]}'
        status_code = 200
        return {'content': content,
                'status_code': status_code}

    def test_get_paginated_attributes(self):
        with HTTMock(self.get_paginated_attributes_mock):
            paginated_result_set = self.attribute_manager.query({})
        self.assertEqual(len(paginated_result_set.entities), 10)
        self.assertTrue(isinstance(paginated_result_set.entities[0], Attribute))

        with HTTMock(self.get_paginated_attributes_page2_mock):
            next_results_list = paginated_result_set.next()
        self.assertEqual(len(next_results_list), 6)

        self.assertEqual(len(paginated_result_set.entities), 6)

        self.assertRaises(StopIteration, paginated_result_set.next)

    @all_requests
    def get_all_attr_mock(self, url, request):
        status_code = 200
        if url.query == 'paginate_by=2':
            content = '{"count":8,"next":"https://api.getanewsletter.com/v3/attributes/?page=2&paginate_by=2","previous":null,"results":[{"url":"https://api.getanewsletter.com/v3/attributes/attribute/","name":"attr0","code":"attribute","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/attribute2/","name":"attr1","code":"attribute2","usage_count":0}]}'
        elif url.query in ['page=2&paginate_by=2'] :
            content = '{"count":8,"next":"https://api.getanewsletter.com/v3/attributes/?page=3&paginate_by=2","previous":"https://api.getanewsletter.com/v3/attributes/?paginate_by=2","results":[{"url":"https://api.getanewsletter.com/v3/attributes/bu/","name":"attr2","code":"bu","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/bu1/","name":"attr3","code":"bu1","usage_count":0}]}'

        elif url.query == 'page=3&paginate_by=2' or url.query == 'paginate_by=2&page=3':
            content = '{"count":8,"next":"https://api.getanewsletter.com/v3/attributes/?page=4&paginate_by=2","previous":"https://api.getanewsletter.com/v3/attributes/?page=2&paginate_by=2","results":[{"url":"https://api.getanewsletter.com/v3/attributes/bu2/","name":"attr4","code":"bu2","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/bu3/","name":"bu3","code":"bu3","usage_count":0}]}'

        elif url.query == 'page=4&paginate_by=2':
            content = '{"count":8,"next":"https://api.getanewsletter.com/v3/attributes/?page=5&paginate_by=2","previous":"https://api.getanewsletter.com/v3/attributes/?page=3&paginate_by=2","results":[{"url":"https://api.getanewsletter.com/v3/attributes/bu4/","name":"bu4","code":"bu4","usage_count":0},{"url":"https://api.getanewsletter.com/v3/attributes/bu5/","name":"bu5","code":"bu5","usage_count":0}]}'
        else:
            return {'status_code': 404}

        return {'content': content,
                'status_code': status_code}

    def test_get_all_attributes(self):
        with HTTMock(self.get_all_attr_mock):
            all_attributes = self.attribute_manager.all()
            attrs = [attr for attr in all_attributes]
            self.assertEqual(len(attrs), 8)

    def test_get_between_attributes(self):
        with HTTMock(self.get_all_attr_mock):
            self.assertEqual(self.api.batch_size, 2)
            # should get entities from page 3 and 4
            attributes_between = self.attribute_manager.all(start=4, stop=7)
            attrs = [attr for attr in attributes_between]
            self.assertEqual(len(attrs), 4)
            self.assertEqual(attrs[0].name, 'attr4')
            self.assertTrue(isinstance(attrs[0], Attribute))

    def test_get_too_high_start(self):
        with HTTMock(self.get_all_attr_mock):
            attributes_between = self.attribute_manager.all(start=9)
            attrs = [attr for attr in attributes_between]
            self.assertEqual(len(attrs), 0)