class RequestsAPITest(APITestCase):
    # request constants
    NUMBER_OF_REQUESTS = 4

    @classmethod
    def setUpClass(cls):
        clear_db()
        insert_feedbacks()

    @classmethod
    def tearDownClass(cls):
        clear_db()

    def setUp(self):
        self.client = APIClientWrapper()

    def test_get_requests(self):
        response, content = self.client.get("api/v1:feedback-list")
        self.assertTrue(response.status_code == status.HTTP_200_OK)
        self.assertTrue(len(content) == RequestsAPITest.NUMBER_OF_REQUESTS)

    def test_get_by_service_request_id(self):
        response, content = self.client.get("api/v1:feedback-list", {"service_request_id": "1982hglaqe8pdnpophff"})
        self.assertTrue(response.status_code == status.HTTP_200_OK)
        self.assertTrue(len(content) == 1)
        self.assertTrue(content[0]["service_request_id"] == "1982hglaqe8pdnpophff")

    def test_get_by_service_request_ids(self):
        response, content = self.client.get(
            "api/v1:feedback-list", {"service_request_id": "1982hglaqe8pdnpophff,2981hglaqe8pdnpoiuyt"}
        )
        self.assertTrue(response.status_code == status.HTTP_200_OK)
        self.assertTrue(len(content) == 2)
        self.assertTrue(content[0]["service_request_id"] == "1982hglaqe8pdnpophff")
        self.assertTrue(content[1]["service_request_id"] == "2981hglaqe8pdnpoiuyt")

    def test_get_by_unexisting_request_id(self):
        response, content = self.client.get("api/v1:feedback-list", {"service_request_id": "unexisting_req_id"})
        self.assertTrue(response.status_code == status.HTTP_200_OK)
        self.assertTrue(content == [])

    def test_get_by_service_code(self):
        service_code = "171"
        response, content = self.client.get("api/v1:feedback-list", {"service_code": service_code})
        self.assertTrue(response.status_code == status.HTTP_200_OK)
        for feedback in content:
            self.assertTrue(feedback["service_code"] == service_code)

    def test_get_by_start_date(self):
        start_date = "2015-06-23T15:51:11Z"
        expected_number_of_requests = 3
        response, content = self.client.get("api/v1:feedback-list", {"start_date": start_date})
        self.assertTrue(response.status_code == status.HTTP_200_OK)
        self.assertTrue(len(content) == expected_number_of_requests)
        for feedback in content:
            self.assertTrue(feedback["requested_datetime"] > start_date)

    def test_get_by_end_data(self):
        end_date = "2015-06-23T15:51:11Z"
        expected_number_of_requests = 1
        response, content = self.client.get("api/v1:feedback-list", {"end_date": end_date})
        self.assertTrue(response.status_code == status.HTTP_200_OK)
        self.assertTrue(len(content) == expected_number_of_requests)
        for request in content:
            self.assertTrue(request["requested_datetime"] < end_date)

    def test_get_by_status(self):
        feedback_status = "open"
        expected_number_of_requests = 2
        response, content = self.client.get("api/v1:feedback-list", {"status": feedback_status})
        self.assertTrue(response.status_code == status.HTTP_200_OK)
        self.assertTrue(len(content) == expected_number_of_requests)
        for feedback in content:
            self.assertTrue(feedback["status"] == feedback_status)

    def test_by_description(self):
        search = "some"
        response, content = self.client.get("api/v1:feedback-list", {"search": search})
        self.assertTrue(response.status_code == 200)
        self.assertTrue(search.lower() in content[0]["description"].lower())

    def test_get_with_extensions(self):
        response, content = self.client.get(
            "api/v1:feedback-list", {"service_request_id": "1982hglaqe8pdnpophff", "extensions": "true"}
        )
        self.assertTrue(response.status_code == status.HTTP_200_OK)
        self.assertTrue("extended_attributes" in content[0])

    def test_get_without_extensions(self):
        response, content = self.client.get("api/v1:feedback-list", {"service_request_id": "1982hglaqe8pdnpophff"})
        self.assertTrue(response.status_code == status.HTTP_200_OK)
        self.assertTrue("extended_attributes" not in content[0])

    def test_get_by_updated_after(self):
        updated_after = "2015-07-24T12:01:44Z"
        expected_number_of_requests = 3
        response, content = self.client.get("api/v1:feedback-list", {"updated_after": updated_after})
        self.assertTrue(response.status_code == status.HTTP_200_OK)
        self.assertTrue(len(content) == expected_number_of_requests)
        for feedback in content:
            self.assertTrue(feedback["updated_datetime"] > updated_after)

    def test_get_by_updated_before(self):
        updated_before = "2015-07-24T12:01:44Z"
        expected_number_of_requests = 1
        response, content = self.client.get("api/v1:feedback-list", {"updated_before": updated_before})
        self.assertTrue(response.status_code == status.HTTP_200_OK)
        self.assertTrue(len(content) == expected_number_of_requests)
        for feedback in content:
            self.assertTrue(feedback["updated_datetime"] < updated_before)

    def test_get_by_service_object(self):
        service_object_id = "10844"
        service_object_type = "http://www.hel.fi/servicemap/v2"
        response, content = self.client.get(
            "api/v1:feedback-list",
            {
                "extensions": "true",
                "service_object_id": "service_object_id",
                "service_object_type": "service_object_type",
            },
        )
        self.assertTrue(response.status_code == status.HTTP_200_OK)
        for feedback in content:
            self.assertTrue(feedback["extended_attributes"]["service_object_id"] == service_object_id)
            self.assertTrue(feedback["extended_attributes"]["service_object_type"] == service_object_type)

    def test_get_by_service_object_id_without_type(self):
        service_object_id = "10844"
        response, content = self.client.get("api/v1:feedback-list", {"service_object_id": service_object_id})
        self.assertTrue(response.status_code == status.HTTP_400_BAD_REQUEST)

    def test_get_within_radius(self):
        lat = 60.187394
        long = 24.940773
        radius = 1000
        expected_number_of_requests = 3
        response, content = self.client.get("api/v1:feedback-list", {"lat": lat, "long": long, "radius": radius})
        self.assertTrue(response.status_code == status.HTTP_200_OK)
        self.assertTrue(len(content) == expected_number_of_requests)

        for feedback in content:
            self.assertTrue(feedback["distance"] < 1000)
 def setUp(self):
     self.client = APIClientWrapper()