Skip to content

Test API

TestStationsRoute

Run tests on stations routes.

Notes

These tests could be done using test parameters to avoid repetition.

Asserts

The '/' route should return a status code of 200, and redirect user to the API documentation.

Source code in tests/test_api.py
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
class TestStationsRoute:
    """Run tests on stations routes.

    Notes
    -------
    These tests could be done using test parameters to avoid repetition.

    Asserts
    -------
    The '/' route should return a status code of 200, and redirect user to
    the API documentation.
    """

    def test_stations_route(
        self,
        test_client,
    ):
        """Test the '/stations' route for correct response structure and data.

        Parameters
        ----------
        test_client : TestClient
            An instance of TestClient for making requests to the FastAPI app.

        Asserts
        -------
        The '/stations' route should return a status code of 200, the response
        should be a list, and the data should match the expected column names
        and have more than one row.
        """
        response = test_client.get("/stations")

        response_json = response.json()

        response_df = pd.DataFrame(response_json)

        response_number_rows, _ = response_df.shape

        assert response.status_code == 200
        assert isinstance(response_json, list)
        assert response_df.columns.to_list() == [
            column for column in STATION_COLUMN_NAMES.values()
        ]
        assert response_number_rows > 1

    def test_station_route(
        self,
        test_client,
    ):
        """Test the '/stations/{IdStationWho}' route for correct response
        structure and data.

        Parameters
        ----------
        test_client : TestClient
            An instance of TestClient for making requests to the FastAPI app.

        Asserts
        -------
        The '/stations/{IdStationWho}' route should return a status code of
        200, the response should be a list, and the data should match the
        expected column names, contain exactly one row, and the 'IdStationWho'
        column should match the requested station ID.
        """
        response = test_client.get("/stations/A721")

        response_json = response.json()

        response_df = pd.DataFrame(response_json)

        response_number_rows, _ = response_df.shape

        assert response.status_code == 200
        assert isinstance(response_json, list)
        assert response_df.columns.to_list() == [
            column for column in STATION_COLUMN_NAMES.values()
        ]
        assert response_df["IdStationWho"][0] == "A721"
        assert response_number_rows == 1

    def test_station_invalid(
        self,
        test_client,
    ):
        """Test the '/stations/{IdStationWho}' route for an incorrect
        response.

        Parameters
        ----------
        test_client : TestClient
            An instance of TestClient for making requests to the FastAPI app.

        Asserts
        -------
        The '/stations/{IdStationWho}' route should return a status code of
        404 and deliver a message 'Station do not exist.' .
        """
        response = test_client.get("/stations/A000")

        response_json = response.json()

        assert response.status_code == 404
        assert response_json == {"detail": "Station do not exist."}

test_station_invalid(test_client)

Test the '/stations/{IdStationWho}' route for an incorrect response.

Parameters

test_client : TestClient An instance of TestClient for making requests to the FastAPI app.

Asserts

The '/stations/{IdStationWho}' route should return a status code of 404 and deliver a message 'Station do not exist.' .

Source code in tests/test_api.py
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
def test_station_invalid(
    self,
    test_client,
):
    """Test the '/stations/{IdStationWho}' route for an incorrect
    response.

    Parameters
    ----------
    test_client : TestClient
        An instance of TestClient for making requests to the FastAPI app.

    Asserts
    -------
    The '/stations/{IdStationWho}' route should return a status code of
    404 and deliver a message 'Station do not exist.' .
    """
    response = test_client.get("/stations/A000")

    response_json = response.json()

    assert response.status_code == 404
    assert response_json == {"detail": "Station do not exist."}

test_station_route(test_client)

Test the '/stations/{IdStationWho}' route for correct response structure and data.

Parameters

test_client : TestClient An instance of TestClient for making requests to the FastAPI app.

Asserts

The '/stations/{IdStationWho}' route should return a status code of 200, the response should be a list, and the data should match the expected column names, contain exactly one row, and the 'IdStationWho' column should match the requested station ID.

Source code in tests/test_api.py
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
def test_station_route(
    self,
    test_client,
):
    """Test the '/stations/{IdStationWho}' route for correct response
    structure and data.

    Parameters
    ----------
    test_client : TestClient
        An instance of TestClient for making requests to the FastAPI app.

    Asserts
    -------
    The '/stations/{IdStationWho}' route should return a status code of
    200, the response should be a list, and the data should match the
    expected column names, contain exactly one row, and the 'IdStationWho'
    column should match the requested station ID.
    """
    response = test_client.get("/stations/A721")

    response_json = response.json()

    response_df = pd.DataFrame(response_json)

    response_number_rows, _ = response_df.shape

    assert response.status_code == 200
    assert isinstance(response_json, list)
    assert response_df.columns.to_list() == [
        column for column in STATION_COLUMN_NAMES.values()
    ]
    assert response_df["IdStationWho"][0] == "A721"
    assert response_number_rows == 1

test_stations_route(test_client)

Test the '/stations' route for correct response structure and data.

Parameters

test_client : TestClient An instance of TestClient for making requests to the FastAPI app.

Asserts

The '/stations' route should return a status code of 200, the response should be a list, and the data should match the expected column names and have more than one row.

Source code in tests/test_api.py
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
def test_stations_route(
    self,
    test_client,
):
    """Test the '/stations' route for correct response structure and data.

    Parameters
    ----------
    test_client : TestClient
        An instance of TestClient for making requests to the FastAPI app.

    Asserts
    -------
    The '/stations' route should return a status code of 200, the response
    should be a list, and the data should match the expected column names
    and have more than one row.
    """
    response = test_client.get("/stations")

    response_json = response.json()

    response_df = pd.DataFrame(response_json)

    response_number_rows, _ = response_df.shape

    assert response.status_code == 200
    assert isinstance(response_json, list)
    assert response_df.columns.to_list() == [
        column for column in STATION_COLUMN_NAMES.values()
    ]
    assert response_number_rows > 1

TestWeatherRoute

Run tests on weather routes.

Notes

These tests could be done using test parameters to avoid repetition.

Source code in tests/test_api.py
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
class TestWeatherRoute:
    """Run tests on weather routes.

    Notes
    -------
    These tests could be done using test parameters to avoid repetition.
    """

    def test_weather_parquet_integrity(self):
        weather_parquet = f"{WEATHER_FILE}.parquet"
        weather_db = os.path.join(OUTPUT_PATH, weather_parquet)
        with open(weather_db, "rb") as f:
            f.seek(-4, 2)
            magic_bytes = f.read()
            print(magic_bytes)
            assert magic_bytes == b"PAR1"

    def test_get_correct_data(
        self,
        test_client,
    ):
        response = test_client.get("/weather/A721/2023-01-01/2023-01-02/")

        response_json = response.json()

        response_df = pd.DataFrame(response_json)

        response_df_columns = response_df.columns.to_list()

        assert response.status_code == 200
        assert isinstance(response_json, list)
        assert response_df_columns.sort() == WEATHER_DF_COLUMN_NAMES.sort()

    def test_get_more_than_5_weeks(
        self,
        test_client,
    ):
        response = test_client.get("/weather/A721/2023-01-01/2023-05-02/")
        response_json = response.json()

        assert response.status_code == 422
        assert response_json == {
            "detail": "Maximum period between start_date and end_date should be 5 weeks.",  # noqa
        }  # noqa

    def test_get_end_before_start(
        self,
        test_client,
    ):
        response = test_client.get("/weather/A721/2023-02-01/2023-01-02/")
        response_json = response.json()

        assert response.status_code == 422
        assert response_json == {
            "detail": "end_date should be after start_date.",
        }  # noqa

    def test_get_future_data(
        self,
        test_client,
    ):
        response = test_client.get("/weather/A721/2099-01-01/2099-01-02/")

        assert response.status_code == 422

    def test_empty_query(
        self,
        test_client,
    ):
        response = test_client.get("/weather/A721/1999-01-01/1999-01-02/")

        response_json = response.json()

        assert response.status_code == 422
        assert response_json == {
            "detail": "There is no data to show. Rewrite your query.",
        }

test_client()

Create a test client for the FastAPI application.

Yields

TestClient An instance of TestClient wrapped around the FastAPI app.

Source code in tests/test_api.py
16
17
18
19
20
21
22
23
24
25
26
@pytest.fixture
def test_client():
    """Create a test client for the FastAPI application.

    Yields
    -------
    TestClient
        An instance of TestClient wrapped around the FastAPI app.
    """
    with TestClient(app) as client:
        yield client

test_main_route(test_client)

Run tests on root route.

Parameters

test_client : TestClient An instance of TestClient for making requests to the FastAPI app.

Source code in tests/test_api.py
29
30
31
32
33
34
35
36
37
38
39
40
41
42
def test_main_route(test_client):
    """Run tests on root route.


    Parameters
    ----------
    test_client : TestClient
        An instance of TestClient for making requests to the FastAPI app.


    """
    response = test_client.get("/")
    assert response.status_code == 200
    assert response.url == "http://testserver/docs"