import json from datetime import date, datetime from flask import url_for from freezegun import freeze_time from tests import create_admin_authorization_header from tests.app.db import ( create_complaint, create_notification, create_service, create_template, ) def test_get_all_complaints_returns_complaints_for_multiple_services( client, notify_db_session ): service = create_service(service_name="service1") template = create_template(service=service) notification = create_notification(template=template) complaint_1 = create_complaint() # default service complaint_2 = create_complaint(service=service, notification=notification) response = client.get("/complaint", headers=[create_admin_authorization_header()]) assert response.status_code == 200 assert json.loads(response.get_data(as_text=True))["complaints"] == [ complaint_2.serialize(), complaint_1.serialize(), ] def test_get_all_complaints_returns_empty_complaints_list(client): response = client.get("/complaint", headers=[create_admin_authorization_header()]) assert response.status_code == 200 assert json.loads(response.get_data(as_text=True))["complaints"] == [] def test_get_all_complaints_returns_pagination_links(mocker, client, notify_db_session): mocker.patch.dict("app.dao.complaint_dao.current_app.config", {"PAGE_SIZE": 1}) service_1 = create_service(service_name="service1") service_2 = create_service(service_name="service2") create_complaint() create_complaint(service=service_1) create_complaint(service=service_2) response = client.get( url_for("complaint.get_all_complaints", page=2), headers=[create_admin_authorization_header()], ) assert response.status_code == 200 assert json.loads(response.get_data(as_text=True))["links"] == { "last": "/complaint?page=3", "next": "/complaint?page=3", "prev": "/complaint?page=1", } def test_get_complaint_with_start_and_end_date_passes_these_to_dao_function( mocker, client ): start_date = date(2018, 6, 11) end_date = date(2018, 6, 11) dao_mock = mocker.patch( "app.complaint.complaint_rest.fetch_count_of_complaints", return_value=3 ) response = client.get( url_for( "complaint.get_complaint_count", start_date=start_date, end_date=end_date ), headers=[create_admin_authorization_header()], ) dao_mock.assert_called_once_with(start_date=start_date, end_date=end_date) assert response.status_code == 200 assert json.loads(response.get_data(as_text=True)) == 3 @freeze_time("2018-06-01 11:00:00") def test_get_complaint_sets_start_and_end_date_to_today_if_not_specified( mocker, client ): dao_mock = mocker.patch( "app.complaint.complaint_rest.fetch_count_of_complaints", return_value=5 ) response = client.get( url_for("complaint.get_complaint_count"), headers=[create_admin_authorization_header()], ) dao_mock.assert_called_once_with( start_date=datetime.utcnow().date(), end_date=datetime.utcnow().date() ) assert response.status_code == 200 assert json.loads(response.get_data(as_text=True)) == 5 def test_get_complaint_with_invalid_data_returns_400_status_code(client): start_date = "1234-56-78" response = client.get( url_for("complaint.get_complaint_count", start_date=start_date), headers=[create_admin_authorization_header()], ) assert response.status_code == 400 assert response.json["errors"][0]["message"] == "start_date month must be in 1..12"