Skip to content
This repository has been archived by the owner on Nov 22, 2023. It is now read-only.

Commit

Permalink
(PC-9355) Add error handling for reimbursement period query params
Browse files Browse the repository at this point in the history
  • Loading branch information
schable committed Aug 13, 2021
1 parent fc154e8 commit 92c6914
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 3 deletions.
8 changes: 5 additions & 3 deletions src/pcapi/routes/pro/reimbursements.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from datetime import date
from itertools import chain

from flask import request
Expand All @@ -12,6 +11,7 @@
from pcapi.routes.serialization.reimbursement_csv_serialize import find_all_offerer_reimbursement_details
from pcapi.routes.serialization.reimbursement_csv_serialize import generate_reimbursement_details_csv
from pcapi.routes.serialization.reimbursement_csv_serialize import legacy_find_all_offerer_reimbursement_details
from pcapi.routes.serialization.reimbursement_csv_serialize import validate_reimbursement_period
from pcapi.utils.human_ids import dehumanize


Expand All @@ -32,8 +32,10 @@ def get_reimbursements_csv():
all_validated_offerers_for_the_current_user = []

if FeatureToggle.PRO_REIMBURSEMENTS_FILTERS.is_active():
reimbursement_period_beginning_date = date.fromisoformat(request.args.get("reimbursementPeriodBeginningDate"))
reimbursement_period_ending_date = date.fromisoformat(request.args.get("reimbursementPeriodEndingDate"))
reimbursement_period_field_names = ("reimbursementPeriodBeginningDate", "reimbursementPeriodEndingDate")
reimbursement_period_beginning_date, reimbursement_period_ending_date = validate_reimbursement_period(
reimbursement_period_field_names, request.args.get
)
venue_id = dehumanize(request.args.get("venueId"))

reimbursement_details = chain(
Expand Down
17 changes: 17 additions & 0 deletions src/pcapi/routes/serialization/reimbursement_csv_serialize.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
import csv
from datetime import date
from io import StringIO
from typing import Callable
from typing import Optional

from pcapi.models import ApiErrors
from pcapi.models.payment_status import TransactionStatus
from pcapi.repository.reimbursement_queries import find_all_offerer_payments
from pcapi.repository.reimbursement_queries import legacy_find_all_offerer_payments
Expand Down Expand Up @@ -139,3 +141,18 @@ def _get_reimbursement_current_status_in_details(current_status: str, current_st
return human_friendly_status

return f"{human_friendly_status} : {current_status_details}"


def validate_reimbursement_period(
reimbursement_period_field_names: tuple[str, str], get_query_param: Callable
) -> list[date]:
api_errors = ApiErrors()
reimbursement_period_dates = []
for field_name in reimbursement_period_field_names:
try:
reimbursement_period_dates.append(date.fromisoformat(get_query_param(field_name)))
except (TypeError, ValueError):
api_errors.add_error(field_name, "Vous devez renseigner une date au format ISO (ex. 2021-12-24)")
if len(api_errors.errors) > 0:
raise api_errors
return reimbursement_period_dates or [None, None]
20 changes: 20 additions & 0 deletions tests/routes/pro/get_reimbursements_csv_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,3 +150,23 @@ def test_with_reimbursement_period_filter(app):
assert response.headers["Content-Disposition"] == "attachment; filename=remboursements_pass_culture.csv"
rows = response.data.decode("utf-8").splitlines()
assert len(rows) == 1 + 2 # header + payments


@pytest.mark.usefixtures("db_session")
@override_features(PRO_REIMBURSEMENTS_FILTERS=True)
def test_with_non_given_reimbursement_period(app):
user_offerer = offers_factories.UserOffererFactory()
pro = user_offerer.user

# When
client = TestClient(app.test_client()).with_auth(pro.email)
response = client.get("/reimbursements/csv")

# Then
assert response.status_code == 400
assert response.json["reimbursementPeriodBeginningDate"] == [
"Vous devez renseigner une date au format ISO (ex. 2021-12-24)"
]
assert response.json["reimbursementPeriodEndingDate"] == [
"Vous devez renseigner une date au format ISO (ex. 2021-12-24)"
]

0 comments on commit 92c6914

Please sign in to comment.