class TestExceptions(unittest.TestCase):

    def setUp(self):
        self.wrapper = TestTapiocaClient()

    @responses.activate
    def test_adapter_raises_response_process_exception_on_400s(self):
        responses.add(responses.GET, self.wrapper.test().data(),
            body='{"erros": "Server Error"}',
            status=400,
            content_type='application/json')

        response = requests.get(self.wrapper.test().data())

        with self.assertRaises(ResponseProcessException):
            TestClientAdapter().process_response(response)

    @responses.activate
    def test_adapter_raises_response_process_exception_on_500s(self):
        responses.add(responses.GET, self.wrapper.test().data(),
            body='{"erros": "Server Error"}',
            status=500,
            content_type='application/json')

        response = requests.get(self.wrapper.test().data())

        with self.assertRaises(ResponseProcessException):
            TestClientAdapter().process_response(response)


    @responses.activate
    def test_raises_request_error(self):
        responses.add(responses.GET, self.wrapper.test().data(),
            body='{"data": {"key": "value"}}',
            status=400,
            content_type='application/json')

        with self.assertRaises(ClientError):
            self.wrapper.test().get()

    @responses.activate
    def test_raises_server_error(self):
        responses.add(responses.GET, self.wrapper.test().data(),
            status=500,
            content_type='application/json')

        with self.assertRaises(ServerError):
            self.wrapper.test().get()
 def setUp(self):
     self.wrapper = TestTapiocaClient()
class TestTapioca(unittest.TestCase):

    def setUp(self):
        self.wrapper = TestTapiocaClient()

    def test_resource_executor_data_should_be_composed_url(self):
        expected_url = 'https://api.test.com/test/'
        resource = self.wrapper.test()

        self.assertEqual(resource.data(), expected_url)

    def test_when_executor_has_no_response(self):
        with self.assertRaisesRegexp(Exception, "has no response"):
            self.wrapper.test().response()

    @responses.activate
    def test_get_request(self):
        responses.add(responses.GET, self.wrapper.test().data(),
            body='{"data": {"key": "value"}}',
            status=200,
            content_type='application/json')

        response = self.wrapper.test().get()

        self.assertEqual(response().data(), {'data': {'key': 'value'}})

    @responses.activate
    def test_access_response_field(self):
        responses.add(responses.GET, self.wrapper.test().data(),
            body='{"data": {"key": "value"}}',
            status=200,
            content_type='application/json')

        response = self.wrapper.test().get()

        response_data = response.data()

        self.assertEqual(response_data.data(), {'key': 'value'})

    def test_fill_url_template(self):
        expected_url = 'https://api.test.com/user/123/'

        resource = self.wrapper.user(id='123')

        self.assertEqual(resource.data(), expected_url)

    @responses.activate
    def test_post_request(self):
        responses.add(responses.POST, self.wrapper.test().data(),
            body='{"data": {"key": "value"}}',
            status=201,
            content_type='application/json')

        response = self.wrapper.test().post()

        self.assertEqual(response().data(), {'data': {'key': 'value'}})

    @responses.activate
    def test_put_request(self):
        responses.add(responses.PUT, self.wrapper.test().data(),
            body='{"data": {"key": "value"}}',
            status=201,
            content_type='application/json')

        response = self.wrapper.test().put()

        self.assertEqual(response().data(), {'data': {'key': 'value'}})

    @responses.activate
    def test_patch_request(self):
        responses.add(responses.PATCH, self.wrapper.test().data(),
            body='{"data": {"key": "value"}}',
            status=201,
            content_type='application/json')

        response = self.wrapper.test().patch()

        self.assertEqual(response().data(), {'data': {'key': 'value'}})

    @responses.activate
    def test_delete_request(self):
        responses.add(responses.DELETE, self.wrapper.test().data(),
            body='{"data": {"key": "value"}}',
            status=201,
            content_type='application/json')

        response = self.wrapper.test().delete()

        self.assertEqual(response().data(), {'data': {'key': 'value'}})

    @responses.activate
    def test_simple_iterator(self):
        next_url = 'http://api.teste.com/next_batch'

        responses.add(responses.GET, self.wrapper.test().data(),
            body='{"data": [{"key": "value"}], "paging": {"next": "%s"}}' % next_url,
            status=200,
            content_type='application/json')

        responses.add(responses.GET, next_url,
            body='{"data": [{"key": "value"}], "paging": {"next": ""}}',
            status=200,
            content_type='application/json')

        response = self.wrapper.test().get()

        iterations_count = 0
        for item in response:
            self.assertIn(item.key().data(), 'value')
            iterations_count += 1

        self.assertEqual(iterations_count, 2)

    def test_docs(self):
        self.assertEqual('\n'.join(self.wrapper.resource.__doc__.split('\n')[1:]),
                          'Resource: ' + self.wrapper.resource._resource['resource'] + '\n'
                          'Docs: ' + self.wrapper.resource._resource['docs'] + '\n'
                          'Foo: ' + self.wrapper.resource._resource['foo'] + '\n'
                          'Spam: ' + self.wrapper.resource._resource['spam'])