class ZipserviceDeleteTests(TestCase):

    def setUp(self):
        self.address1 = Address()
        self.address1.zip_code = '12345000'
        self.address1.address = 'Spam and Eggs street'
        self.address1.neighborhood = 'Flying Circus'
        self.address1.city = 'Xpto'
        self.address1.state = 'AC'
        self.address1.save()

        self.address2 = Address()
        self.address2.zip_code = '12345999'
        self.address2.address = 'Spam and Eggs avenue'
        self.address2.neighborhood = 'Swimming Circus'
        self.address2.city = 'Foobar'
        self.address2.state = 'RO'
        self.address2.save()

    def tearDown(self):
        self.address = Address.objects.all()
        self.address.delete()

    # SUCCESS scenarios

    def test_delete_existing_address(self):
        client = Client()

        response = client.get('/zipcode/')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 2)

        response2 = client.delete('/zipcode/12345999/')

        self.assertEqual(response2.status_code, 204)

        response3 = client.get('/zipcode/')
        self.assertEqual(response3.status_code, 200)
        self.assertEqual(len(response3.data), 1)

    # ERROR scenarios

    def test_delete_inexistent_zipcode(self):
        client = Client()

        response = client.get('/zipcode/')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 2)

        response2 = client.delete('/zipcode/99999000/')

        self.assertEqual(response2.status_code, 404)
        self.assertIn('Zip code not found', response2.content)

        response3 = client.get('/zipcode/')
        self.assertEqual(response3.status_code, 200)
        self.assertEqual(len(response3.data), 2)
    def setUp(self):
        self.address1 = Address()
        self.address1.zip_code = '12345000'
        self.address1.address = 'Spam and Eggs street'
        self.address1.neighborhood = 'Flying Circus'
        self.address1.city = 'Xpto'
        self.address1.state = 'AC'
        self.address1.save()

        self.address2 = Address()
        self.address2.zip_code = '12345999'
        self.address2.address = 'Spam and Eggs avenue'
        self.address2.neighborhood = 'Swimming Circus'
        self.address2.city = 'Foobar'
        self.address2.state = 'RO'
        self.address2.save()
class ZipserviceGetTests(TestCase):

    def setUp(self):
        self.address1 = Address()
        self.address1.zip_code = '12345000'
        self.address1.address = 'Spam and Eggs street'
        self.address1.neighborhood = 'Flying Circus'
        self.address1.city = 'Xpto'
        self.address1.state = 'AC'
        self.address1.save()

        self.address2 = Address()
        self.address2.zip_code = '12345999'
        self.address2.address = 'Spam and Eggs avenue'
        self.address2.neighborhood = 'Swimming Circus'
        self.address2.city = 'Foobar'
        self.address2.state = 'RO'
        self.address2.save()

    def tearDown(self):
        self.address = Address.objects.all()
        self.address.delete()

    # SUCCESS scenarios

    def test_health_check(self):
        client = Client()
        response = client.get('/health/')

        self.assertEqual(response.status_code, 200)

    def test_get_all_addresses(self):
        client = Client()

        response = client.get('/zipcode/')

        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 2)

    def test_get_limited_addresses(self):
        client = Client()

        response = client.get('/zipcode/?limit=1')

        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 1)

    # ERROR scenarios

    def test_get_addresses_with_wrong_query_string(self):
        client = Client()

        response = client.get('/zipcode/?state=sp')

        self.assertEqual(response.status_code, 400)
        self.assertIn('Invalid query filter', response.content)

    def test_get_addresses_with_one_extra_query_string(self):
        client = Client()

        response = client.get('/zipcode/?limit=1&state=sp')

        self.assertEqual(response.status_code, 400)
        self.assertIn('Invalid query filter', response.content)

    def test_get_addresses_with_wrong_query_string_value(self):
        client = Client()

        response = client.get('/zipcode/?limit=char')

        self.assertEqual(response.status_code, 400)
        self.assertIn('Invalid query filter value', response.content)