diff --git a/api/src/pcapi/core/educational/repository.py b/api/src/pcapi/core/educational/repository.py index 8ef80902124..ab7d360228d 100644 --- a/api/src/pcapi/core/educational/repository.py +++ b/api/src/pcapi/core/educational/repository.py @@ -1079,7 +1079,11 @@ def get_educational_domains_from_ids(ids: typing.Iterable[int]) -> list[educatio def get_all_educational_domains_ordered_by_name() -> list[educational_models.EducationalDomain]: - return educational_models.EducationalDomain.query.order_by(educational_models.EducationalDomain.name).all() + return ( + educational_models.EducationalDomain.query.order_by(educational_models.EducationalDomain.name) + .options(sa.orm.joinedload(educational_models.EducationalDomain.nationalPrograms)) + .all() + ) def get_all_educational_institutions(offset: int = 0, limit: int = 0) -> tuple[tuple, int]: diff --git a/api/src/pcapi/core/providers/repository.py b/api/src/pcapi/core/providers/repository.py index 457bb27ec95..fd0d39cbf6a 100644 --- a/api/src/pcapi/core/providers/repository.py +++ b/api/src/pcapi/core/providers/repository.py @@ -194,7 +194,12 @@ def is_cinema_external_ticket_applicable(offer: offers_models.Offer) -> bool: def get_providers_venues(provider_id: int) -> BaseQuery: - return Venue.query.join(models.VenueProvider).filter(models.VenueProvider.providerId == provider_id) + return ( + Venue.query.join(models.VenueProvider) + .outerjoin(models.VenueProvider.externalUrls) + .options(sqla_orm.contains_eager(Venue.venueProviders).contains_eager(models.VenueProvider.externalUrls)) + .filter(models.VenueProvider.providerId == provider_id) + ) def _get_future_provider_events_requiring_a_ticketing_system_query( diff --git a/api/tests/routes/public/booking_token/v2/get_booking_by_token_v2_test.py b/api/tests/routes/public/booking_token/v2/get_booking_by_token_v2_test.py index 6fffd0dab72..cd16afa2659 100644 --- a/api/tests/routes/public/booking_token/v2/get_booking_by_token_v2_test.py +++ b/api/tests/routes/public/booking_token/v2/get_booking_by_token_v2_test.py @@ -4,12 +4,12 @@ from dateutil.relativedelta import relativedelta import pytest +from pcapi.core import testing import pcapi.core.bookings.factories as bookings_factories from pcapi.core.categories import subcategories_v2 as subcategories import pcapi.core.offerers.factories as offerers_factories import pcapi.core.offers.factories as offers_factories -from pcapi.utils.date import format_into_utc_date -from pcapi.utils.date import utc_datetime_to_department_timezone +from pcapi.utils import date from pcapi.utils.human_ids import humanize @@ -17,8 +17,16 @@ class Returns200Test: + num_queries = 1 # select user + num_queries += 1 # select booking + num_queries += 1 # check user has rights on offerer + num_queries += 1 # check if a pricing processed or invoiced exists for this booking + num_queries += 1 # select stock + num_queries += 1 # select offer + num_queries += 1 # select user + num_queries += 1 # select venue + def test_when_user_has_rights_and_regular_offer(self, client): - # Given past = datetime.utcnow() - timedelta(days=2) booking = bookings_factories.BookingFactory( user__email="beneficiary@example.com", @@ -40,17 +48,17 @@ def test_when_user_has_rights_and_regular_offer(self, client): user_offerer = offerers_factories.UserOffererFactory(offerer=booking.offerer) pro_user = user_offerer.user - # When client = client.with_basic_auth(pro_user.email) - response = client.get(f"/v2/bookings/token/{booking.token}") + booking_token = booking.token + with testing.assert_num_queries(self.num_queries): + response = client.get(f"/v2/bookings/token/{booking_token}") + assert response.status_code == 200 - # Then assert response.headers["Content-type"] == "application/json" - assert response.status_code == 200 assert response.json == { "bookingId": humanize(booking.id), "dateOfBirth": booking.user.birth_date.isoformat(), - "datetime": format_into_utc_date(booking.stock.beginningDatetime), + "datetime": date.format_into_utc_date(booking.stock.beginningDatetime), "ean13": None, "email": "beneficiary@example.com", "formula": "ABO", @@ -76,34 +84,39 @@ def test_when_user_has_rights_and_regular_offer(self, client): } def test_when_api_key_is_provided_and_rights_and_regular_offer(self, client): - # Given booking = bookings_factories.BookingFactory() + booking_token = booking.token offerers_factories.ApiKeyFactory(offerer=booking.offerer, prefix="test_prefix") - # When - url = f"/v2/bookings/token/{booking.token}" - response = client.get(url, headers={"Authorization": "Bearer test_prefix_clearSecret"}) - - # Then - assert response.status_code == 200 + url = f"/v2/bookings/token/{booking_token}" + with testing.assert_num_queries(self.num_queries): + response = client.get(url, headers={"Authorization": "Bearer test_prefix_clearSecret"}) + assert response.status_code == 200 def test_when_user_has_rights_and_regular_offer_and_token_in_lower_case(self, client): - # Given booking = bookings_factories.BookingFactory( stock__beginningDatetime=datetime.utcnow() - timedelta(days=2), ) + booking_token = booking.token.lower() user_offerer = offerers_factories.UserOffererFactory(offerer=booking.offerer) pro_user = user_offerer.user - # When client = client.with_basic_auth(pro_user.email) - response = client.get(f"/v2/bookings/token/{booking.token.lower()}") - - # Then - assert response.status_code == 200 + with testing.assert_num_queries(self.num_queries): + response = client.get(f"/v2/bookings/token/{booking_token}") + assert response.status_code == 200 class NonStandardGetTest: + num_queries = 1 # select user + num_queries += 1 # select booking + num_queries += 1 # check user has rights on offerer + num_queries += 1 # check if a pricing processed or invoiced exists for this booking + num_queries += 1 # select stock + num_queries += 1 # select offer + num_queries += 1 # select user + num_queries += 1 # select venue + def test_non_standard_get_on_token_endpoint(self, client): # This is a test following the incident caused by a check on the JSON sent by API user (PR #12928 introduced the bug, PR #13062 fixed it) # Some legacy users are sending us an invalid JSON in a GET request to /v2/bookings/token/ @@ -111,75 +124,84 @@ def test_non_standard_get_on_token_endpoint(self, client): booking = bookings_factories.BookingFactory() offerers_factories.ApiKeyFactory(offerer=booking.offerer, prefix="test_prefix") - # When url = f"/v2/bookings/token/{booking.token}" - response = client.get_with_invalid_json_body( - url, - headers={"Authorization": "Bearer test_prefix_clearSecret"}, - raw_json="ABC", # both sad an irritating - ) - - # Then - assert response.status_code == 200 + with testing.assert_num_queries(self.num_queries): + response = client.get_with_invalid_json_body( + url, + headers={"Authorization": "Bearer test_prefix_clearSecret"}, + raw_json="ABC", # both sad an irritating + ) + assert response.status_code == 200 class Returns401Test: def test_when_user_no_auth_nor_api_key(self, client): - response = client.get("/v2/bookings/token/TOKEN") - assert response.status_code == 401 + with testing.assert_num_queries(0): + response = client.get("/v2/bookings/token/TOKEN") + assert response.status_code == 401 def test_when_wrong_api_key(self, client): url = "/v2/bookings/token/FAKETOKEN" - response = client.get(url, headers={"Authorization": "Bearer WrongApiKey1234567"}) - assert response.status_code == 401 + num_queries = 1 # select api_key + with testing.assert_num_queries(num_queries): + response = client.get(url, headers={"Authorization": "Bearer WrongApiKey1234567"}) + assert response.status_code == 401 class Returns403Test: def test_when_user_doesnt_have_rights_and_token_exists(self, client): - # Given booking = bookings_factories.BookingFactory() another_pro_user = offerers_factories.UserOffererFactory().user - # When url = f"/v2/bookings/token/{booking.token}" - response = client.with_basic_auth(another_pro_user.email).get(url) + client = client.with_basic_auth(another_pro_user.email) + num_queries = 1 # select user + num_queries += 1 # select booking + num_queries += 1 # check user has rights on offerer + with testing.assert_num_queries(num_queries): + response = client.get(url) + assert response.status_code == 403 - # Then - assert response.status_code == 403 assert response.json["user"] == [ "Vous n’avez pas les droits suffisants pour valider cette contremarque car cette réservation n'a pas été faite sur une de vos offres, ou que votre rattachement à la structure est encore en cours de validation" ] def test_when_given_api_key_not_related_to_booking_offerer(self, client): - # Given booking = bookings_factories.BookingFactory() offerers_factories.ApiKeyFactory() # another offerer's API key - # When auth = "Bearer development_prefix_clearSecret" url = f"/v2/bookings/token/{booking.token}" - response = client.get(url, headers={"Authorization": auth}) + num_queries = 1 # select api_key + num_queries += 1 # select feature + num_queries += 1 # select booking + with testing.assert_num_queries(num_queries): + response = client.get(url, headers={"Authorization": auth}) + assert response.status_code == 403 - # Then - assert response.status_code == 403 assert response.json["user"] == [ "Vous n’avez pas les droits suffisants pour valider cette contremarque car cette réservation n'a pas été faite sur une de vos offres, ou que votre rattachement à la structure est encore en cours de validation" ] def test_when_booking_not_confirmed(self, client): - # Given next_week = datetime.utcnow() + timedelta(weeks=1) booking = bookings_factories.BookingFactory(stock__beginningDatetime=next_week) pro_user = offerers_factories.UserOffererFactory(offerer=booking.offerer).user - # When url = f"/v2/bookings/token/{booking.token}" - response = client.with_basic_auth(pro_user.email).get(url) + num_queries = 1 # Select user + num_queries += 1 # Select booking + num_queries += 1 # check user has rights on offerer + num_queries += 1 # check if a pricing processed or invoiced exists for this booking + num_queries += 1 # select stock + num_queries += 1 # select venue + client = client.with_basic_auth(pro_user.email) + with testing.assert_num_queries(num_queries): + response = client.get(url) + assert response.status_code == 403 - # Then - assert response.status_code == 403 cancellation_limit_date = datetime.strftime( - utc_datetime_to_department_timezone(booking.cancellationLimitDate, booking.venue.departementCode), + date.utc_datetime_to_department_timezone(booking.cancellationLimitDate, booking.venue.departementCode), "%d/%m/%Y à %H:%M", ) assert ( @@ -188,37 +210,49 @@ def test_when_booking_not_confirmed(self, client): ) def test_when_booking_is_refunded(self, client): - # Given booking = bookings_factories.ReimbursedBookingFactory() pro_user = offerers_factories.UserOffererFactory(offerer=booking.offerer).user - # When url = f"/v2/bookings/token/{booking.token}" - response = client.with_basic_auth(pro_user.email).get(url) + num_queries = 1 # Select user + num_queries += 1 # Select booking + num_queries += 1 # check user has rights on offerer + client = client.with_basic_auth(pro_user.email) + with testing.assert_num_queries(num_queries): + response = client.get(url) + assert response.status_code == 403 - # Then - assert response.status_code == 403 assert response.json["payment"] == ["Cette réservation a été remboursée"] class Returns404Test: def test_missing_token(self, client): - response = client.get("/v2/bookings/token/") - assert response.status_code == 404 + with testing.assert_num_queries(0): + response = client.get("/v2/bookings/token/") + assert response.status_code == 404 def test_basic_auth_but_unknown_token(self, client): user = offerers_factories.UserOffererFactory().user client = client.with_basic_auth(user.email) - response = client.get("/v2/bookings/token/UNKNOWN") + num_queries = 1 # select user + num_queries += 1 # select booking + with testing.assert_num_queries(num_queries): + response = client.get("/v2/bookings/token/UNKNOWN") + assert response.status_code == 404 - assert response.status_code == 404 assert response.json["global"] == ["Cette contremarque n'a pas été trouvée"] def test_authenticated_with_api_key_but_token_not_found(self, client): offerers_factories.ApiKeyFactory(prefix="test_prefix") - response = client.get("/v2/bookings/token/12345", headers={"Authorization": "Bearer test_prefix_clearSecret"}) + num_queries = 1 # select api_key + num_queries += 1 # select feature + num_queries += 1 # select booking + with testing.assert_num_queries(num_queries): + response = client.get( + "/v2/bookings/token/12345", headers={"Authorization": "Bearer test_prefix_clearSecret"} + ) + assert response.status_code == 404 - assert response.status_code == 404 assert response.json["global"] == ["Cette contremarque n'a pas été trouvée"] @@ -228,20 +262,29 @@ def test_when_booking_is_already_validated(self, client): user = offerers_factories.UserOffererFactory(offerer=booking.offerer).user client = client.with_basic_auth(user.email) - response = client.get(f"/v2/bookings/token/{booking.token}") + num_queries = 1 # Select user + num_queries += 1 # Select booking + num_queries += 1 # check user has rights on offerer + num_queries += 1 # check if a pricing processed or invoiced exists for this booking + token = booking.token + with testing.assert_num_queries(num_queries): + response = client.get(f"/v2/bookings/token/{token}") + assert response.status_code == 410 - assert response.status_code == 410 assert response.json["booking"] == ["Cette réservation a déjà été validée"] def test_when_booking_is_cancelled(self, client): - # Given booking = bookings_factories.CancelledBookingFactory() pro_user = offerers_factories.UserOffererFactory(offerer=booking.offerer).user - # When url = f"/v2/bookings/token/{booking.token}" - response = client.with_basic_auth(pro_user.email).get(url) + num_queries = 1 # Select user + num_queries += 1 # Select booking + num_queries += 1 # check user has rights on offerer + num_queries += 1 # check if a pricing processed or invoiced exists for this booking + client = client.with_basic_auth(pro_user.email) + with testing.assert_num_queries(num_queries): + response = client.get(url) + assert response.status_code == 410 - # Then - assert response.status_code == 410 assert response.json["booking_cancelled"] == ["Cette réservation a été annulée"] diff --git a/api/tests/routes/public/collective/endpoints/get_collective_offer_public_provider_test.py b/api/tests/routes/public/collective/endpoints/get_collective_offer_public_provider_test.py index bb6b0b8e527..152a1ea940d 100644 --- a/api/tests/routes/public/collective/endpoints/get_collective_offer_public_provider_test.py +++ b/api/tests/routes/public/collective/endpoints/get_collective_offer_public_provider_test.py @@ -5,6 +5,7 @@ from pcapi.core.educational import factories as educational_factories from pcapi.core.offerers import factories as offerers_factories from pcapi.core.providers import factories as provider_factories +from pcapi.core.testing import assert_num_queries from tests.routes.public.helpers import PublicAPIEndpointBaseHelper @@ -15,8 +16,13 @@ class CollectiveOffersPublicGetOfferTest(PublicAPIEndpointBaseHelper): endpoint_method = "get" default_path_params = {"offer_id": 1} + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select collective_offer and collective_stock + sucessful_num_queries = num_queries + 1 # select national_program + sucessful_num_queries += 1 # select educational_institution + def test_get_offer(self, client): - # Given venue_provider = provider_factories.VenueProviderFactory() offerers_factories.ApiKeyFactory(provider=venue_provider.provider) @@ -34,29 +40,28 @@ def test_get_offer(self, client): collectiveStock__collectiveOffer__formats=["CONCERT"], ) offer = booking.collectiveStock.collectiveOffer - # When - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( - f"/v2/collective/offers/{offer.id}" - ) + offer_id = offer.id + + with assert_num_queries(self.sucessful_num_queries): + response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( + f"/v2/collective/offers/{offer_id}" + ) + assert response.status_code == 200 - # Then - assert response.status_code == 200 assert sort_response_offer_json(response.json) == expected_serialized_offer(offer) def test_offer_does_not_exists(self, client): - # Given venue_provider = provider_factories.VenueProviderFactory() offerers_factories.ApiKeyFactory(provider=venue_provider.provider) - # When - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get("/v2/collective/offers/-1") - - # Then - assert response.status_code == 404 + with assert_num_queries(self.num_queries): + response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( + "/v2/collective/offers/25" + ) + assert response.status_code == 404 def test_offer_without_stock(self, client): - # Given venue_provider = provider_factories.VenueProviderFactory() offerers_factories.VenueFactory(venueProviders=[venue_provider]) @@ -68,22 +73,22 @@ def test_offer_without_stock(self, client): collectiveOffer__provider=venue_provider.provider, ) offer = educational_factories.CollectiveOfferFactory() + offer_id = offer.id - # When - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( - f"/v2/collective/offers/{offer.id}" - ) - - # Then - assert response.status_code == 404 + with assert_num_queries(self.num_queries): + response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( + f"/v2/collective/offers/{offer_id}" + ) + assert response.status_code == 404 def test_user_not_logged_in(self, client): offer = educational_factories.CollectiveStockFactory().collectiveOffer - response = client.get(f"/v2/collective/offers/{offer.id}") - assert response.status_code == 401 + + with assert_num_queries(0): + response = client.get(f"/v2/collective/offers/{offer.id}") + assert response.status_code == 401 def test_user_no_access_to_user(self, client): - # Given venue_provider = provider_factories.VenueProviderFactory() offerers_factories.ApiKeyFactory(provider=venue_provider.provider) @@ -91,15 +96,13 @@ def test_user_no_access_to_user(self, client): stock = educational_factories.CollectiveStockFactory( collectiveOffer__provider=venue_provider2.provider, ) - offer = stock.collectiveOffer - - # When - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( - f"/v2/collective/offers/{offer.id}" - ) + offer_id = stock.collectiveOffer.id - # Then - assert response.status_code == 403 + with assert_num_queries(self.num_queries): + response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( + f"/v2/collective/offers/{offer_id}" + ) + assert response.status_code == 403 def sort_response_offer_json(response_offer): diff --git a/api/tests/routes/public/collective/endpoints/get_collective_offers_categories_test.py b/api/tests/routes/public/collective/endpoints/get_collective_offers_categories_test.py index b552911b553..aab95e85d22 100644 --- a/api/tests/routes/public/collective/endpoints/get_collective_offers_categories_test.py +++ b/api/tests/routes/public/collective/endpoints/get_collective_offers_categories_test.py @@ -1,23 +1,22 @@ -from flask import url_for import pytest +from pcapi.core import testing import pcapi.core.offerers.factories as offerers_factories @pytest.mark.usefixtures("db_session") class CollectiveOffersGetCategoriesTest: def test_list_categories(self, client): - # Given offerer = offerers_factories.OffererFactory() offerers_factories.ApiKeyFactory(offerer=offerer) - # When - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( - url_for("public_api.list_categories") - ) - - # Then - assert response.status_code == 200 + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( + "/v2/collective/categories" + ) + assert response.status_code == 200 assert response.json == [ {"id": "BEAUX_ARTS", "name": "Beaux-arts"}, @@ -37,21 +36,15 @@ def test_list_categories(self, client): ] def test_list_categories_user_auth_returns_401(self, client): - # Given user_offerer = offerers_factories.UserOffererFactory() offerers_factories.ApiKeyFactory(offerer=user_offerer.offerer) - # When - response = client.with_session_auth(user_offerer.user.email).get(url_for("public_api.list_categories")) - - # Then - assert response.status_code == 401 + client = client.with_session_auth(user_offerer.user.email) + with testing.assert_num_queries(testing.AUTHENTICATION_QUERIES): + response = client.get("/v2/collective/categories") + assert response.status_code == 401 def test_list_categories_anonymous_returns_401(self, client): - # Given - - # When - response = client.get(url_for("public_api.list_categories")) - - # Then - assert response.status_code == 401 + with testing.assert_num_queries(0): + response = client.get("/v2/collective/categories") + assert response.status_code == 401 diff --git a/api/tests/routes/public/collective/endpoints/get_collective_offers_educational_domains_test.py b/api/tests/routes/public/collective/endpoints/get_collective_offers_educational_domains_test.py index 2fee052f441..8182445fbd0 100644 --- a/api/tests/routes/public/collective/endpoints/get_collective_offers_educational_domains_test.py +++ b/api/tests/routes/public/collective/endpoints/get_collective_offers_educational_domains_test.py @@ -2,8 +2,8 @@ import pytest +from pcapi.core import testing import pcapi.core.educational.factories as educational_factories -import pcapi.core.offerers.factories as offerers_factories from tests.routes.public.helpers import PublicAPIEndpointBaseHelper @@ -13,8 +13,11 @@ class CollectiveOffersGetEducationalDomainsTest(PublicAPIEndpointBaseHelper): endpoint_url = "/v2/collective/educational-domains" endpoint_method = "get" + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select educational_domain + def test_list_educational_domains(self, client): - # Given plain_api_key, _ = self.setup_provider() programs = educational_factories.NationalProgramFactory.create_batch(2) @@ -22,11 +25,9 @@ def test_list_educational_domains(self, client): domain1 = educational_factories.EducationalDomainFactory(name="Arts numériques", nationalPrograms=programs) domain2 = educational_factories.EducationalDomainFactory(name="Cinéma, audiovisuel") - # When - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) - - # Then - assert response.status_code == 200 + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 response_list = sorted(response.json, key=itemgetter("id")) domain1_programs = [{"id": p.id, "name": p.name} for p in programs] @@ -36,23 +37,11 @@ def test_list_educational_domains(self, client): ] def test_list_educational_domains_empty(self, client): - # Given plain_api_key, _ = self.setup_provider() - # When - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + client = client.with_explicit_token(plain_api_key) + with testing.assert_num_queries(self.num_queries): + response = client.get(self.endpoint_url) + assert response.status_code == 200 - # Then - assert response.status_code == 200 assert response.json == [] - - def test_list_educational_domains_user_auth_returns_401(self, client): - # Given - user_offerer = offerers_factories.UserOffererFactory() - offerers_factories.ApiKeyFactory(offerer=user_offerer.offerer) - - # When - response = client.with_session_auth(user_offerer.user.email).get(self.endpoint_url) - - # Then - assert response.status_code == 401 diff --git a/api/tests/routes/public/collective/endpoints/get_collective_offers_students_levels_test.py b/api/tests/routes/public/collective/endpoints/get_collective_offers_students_levels_test.py index 79a35e3653f..7c7a73cf07c 100644 --- a/api/tests/routes/public/collective/endpoints/get_collective_offers_students_levels_test.py +++ b/api/tests/routes/public/collective/endpoints/get_collective_offers_students_levels_test.py @@ -1,5 +1,6 @@ import pytest +from pcapi.core import testing import pcapi.core.educational.models as educational_models import pcapi.core.offerers.factories as offerers_factories @@ -12,14 +13,13 @@ class CollectiveOffersGetStudentsLevelsTest(PublicAPIEndpointBaseHelper): endpoint_method = "get" def test_list_students_levels(self, client): - # Given plain_api_key, _ = self.setup_provider() - # When - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) - - # Then - assert response.status_code == 200 + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + with testing.assert_num_queries(2): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 response_list = response.json assert {"id": "GENERAL0", "name": "Lycée - Terminale"} in response_list @@ -29,12 +29,10 @@ def test_list_students_levels(self, client): ] def test_list_students_levels_user_auth_returns_401(self, client): - # Given user_offerer = offerers_factories.UserOffererFactory() offerers_factories.ApiKeyFactory(offerer=user_offerer.offerer) - # When - response = client.with_session_auth(user_offerer.user.email).get(self.endpoint_url) - - # Then - assert response.status_code == 401 + client = client.with_session_auth(user_offerer.user.email) + with testing.assert_num_queries(testing.AUTHENTICATION_QUERIES): + response = client.get(self.endpoint_url) + assert response.status_code == 401 diff --git a/api/tests/routes/public/collective/endpoints/get_collective_offers_test.py b/api/tests/routes/public/collective/endpoints/get_collective_offers_test.py index fd119a588c0..9eb6cb422ae 100644 --- a/api/tests/routes/public/collective/endpoints/get_collective_offers_test.py +++ b/api/tests/routes/public/collective/endpoints/get_collective_offers_test.py @@ -2,10 +2,10 @@ import pytest +from pcapi.core import testing from pcapi.core.educational import factories as educational_factories from pcapi.core.offerers import factories as offerers_factories from pcapi.core.providers import factories as provider_factories -from pcapi.core.testing import assert_num_queries from pcapi.models.offer_mixin import OfferValidationStatus from tests.routes.public.helpers import PublicAPIEndpointBaseHelper @@ -16,8 +16,11 @@ class CollectiveOffersPublicGetOfferTest(PublicAPIEndpointBaseHelper): endpoint_url = "/v2/collective/offers/" endpoint_method = "get" + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offers and bookings + def test_get_offers(self, client): - # Given venue_provider = provider_factories.VenueProviderFactory() offerers_factories.ApiKeyFactory(provider=venue_provider.provider) @@ -30,17 +33,11 @@ def test_get_offers(self, client): ).collectiveStock.collectiveOffer booking2 = offer2.collectiveStock.collectiveBookings[0] - # When - # 1. fetch api key - # 2. fetch data - # 3. fetch FF - with assert_num_queries(3): + with testing.assert_num_queries(self.num_queries): response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( "/v2/collective/offers/" ) - - # Then - assert response.status_code == 200 + assert response.status_code == 200 assert response.json == [ { @@ -80,7 +77,6 @@ def test_get_offers(self, client): ] def test_get_offers_filter_by_status(self, client): - # Given venue_provider = provider_factories.VenueProviderFactory() offerers_factories.ApiKeyFactory(provider=venue_provider.provider) @@ -96,13 +92,11 @@ def test_get_offers_filter_by_status(self, client): ) offer2 = stock2.collectiveOffer - # When - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( - "/v2/collective/offers/?status=ACTIVE" - ) - - # Then - assert response.status_code == 200 + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( + "/v2/collective/offers/?status=ACTIVE" + ) + assert response.status_code == 200 assert response.json == [ { @@ -126,31 +120,29 @@ def test_get_offers_filter_by_status(self, client): ] def test_no_offers(self, client): - # Given venue_provider = provider_factories.VenueProviderFactory() offerers_factories.ApiKeyFactory(provider=venue_provider.provider) - # When - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get("/v2/collective/offers/") + client = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY) + with testing.assert_num_queries(self.num_queries): + response = client.get("/v2/collective/offers/") + assert response.status_code == 200 - # Then - assert response.status_code == 200 assert not response.json def test_offer_without_stock(self, client): - # Given venue_provider = provider_factories.VenueProviderFactory() offerers_factories.ApiKeyFactory(provider=venue_provider.provider) stock = educational_factories.CollectiveStockFactory(collectiveOffer__provider=venue_provider.provider) offer = stock.collectiveOffer - # When - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get("/v2/collective/offers/") + client = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY) + with testing.assert_num_queries(self.num_queries): + response = client.get("/v2/collective/offers/") + assert response.status_code == 200 - # Then - assert response.status_code == 200 assert response.json == [ { "id": offer.id, @@ -164,7 +156,6 @@ def test_offer_without_stock(self, client): ] def test_other_offerer_offers_not_visible(self, client): - # Given venue_provider = provider_factories.VenueProviderFactory() offerers_factories.ApiKeyFactory(provider=venue_provider.provider) @@ -175,11 +166,11 @@ def test_other_offerer_offers_not_visible(self, client): venue_provider2 = provider_factories.VenueProviderFactory() educational_factories.CollectiveStockFactory(collectiveOffer__provider=venue_provider2.provider) - # When - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get("/v2/collective/offers/") + client = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY) + with testing.assert_num_queries(self.num_queries): + response = client.get("/v2/collective/offers/") + assert response.status_code == 200 - # Then - assert response.status_code == 200 assert response.json == [ { "id": offer1.id, @@ -193,7 +184,6 @@ def test_other_offerer_offers_not_visible(self, client): ] def test_draft_offers_not_visible(self, client): - # Given venue_provider = provider_factories.VenueProviderFactory() offerers_factories.ApiKeyFactory(provider=venue_provider.provider) @@ -205,11 +195,11 @@ def test_draft_offers_not_visible(self, client): collectiveOffer__validation=OfferValidationStatus.DRAFT, ) - # When - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get("/v2/collective/offers/") + client = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY) + with testing.assert_num_queries(self.num_queries): + response = client.get("/v2/collective/offers/") + assert response.status_code == 200 - # Then - assert response.status_code == 200 assert response.json == [ { "id": offer1.id, @@ -222,30 +212,18 @@ def test_draft_offers_not_visible(self, client): }, ] - def test_user_not_logged_in(self, client): - # Given - venue_provider = provider_factories.VenueProviderFactory() - offerers_factories.ApiKeyFactory(provider=venue_provider.provider) - - educational_factories.CollectiveStockFactory(collectiveOffer__provider=venue_provider.provider) - # When - response = client.get("/v2/collective/offers/") - - # Then - assert response.status_code == 401 - def test_user_did_not_create_offer_using_the_api(self, client): """Ensure that a user cannot fetch an offer that he did not created with the API""" venue_provider = provider_factories.VenueProviderFactory() offerers_factories.ApiKeyFactory(provider=venue_provider.provider) - offer = educational_factories.CollectiveStockFactory().collectiveOffer + offer_id = educational_factories.CollectiveStockFactory().collectiveOffer.id api_client = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY) - response = api_client.get(f"/v2/collective/offers/{offer.id}") - - assert response.status_code == 403 + with testing.assert_num_queries(self.num_queries): + response = api_client.get(f"/v2/collective/offers/{offer_id}") + assert response.status_code == 403 def test_offer_venue_has_an_empty_string_venue_id(self, client): # TODO(jeremieb): remove this test once there is no empty @@ -253,20 +231,17 @@ def test_offer_venue_has_an_empty_string_venue_id(self, client): venue_provider = provider_factories.VenueProviderFactory() offerers_factories.ApiKeyFactory(provider=venue_provider.provider) - offer = educational_factories.CollectiveStockFactory( + stock = educational_factories.CollectiveStockFactory( collectiveOffer__provider=venue_provider.provider, collectiveOffer__offerVenue={"venueId": "", "addressType": "offererVenue", "otherAddress": ""}, - ).collectiveOffer - - # 1. fetch api key - # 2. fetch data - # 3. fetch FF - with assert_num_queries(3): + ) + offer_id = stock.collectiveOffer.id + with testing.assert_num_queries(self.num_queries): response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( - f"/v2/collective/offers/{offer.id}" + f"/v2/collective/offers/{offer_id}" ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json["offerVenue"] == { "venueId": None, "addressType": "offererVenue", diff --git a/api/tests/routes/public/collective/endpoints/get_collective_offers_venues_test.py b/api/tests/routes/public/collective/endpoints/get_collective_offers_venues_test.py index c90b6456c44..d48b0402b9f 100644 --- a/api/tests/routes/public/collective/endpoints/get_collective_offers_venues_test.py +++ b/api/tests/routes/public/collective/endpoints/get_collective_offers_venues_test.py @@ -1,10 +1,10 @@ from operator import itemgetter -from flask import url_for import pytest import pcapi.core.offerers.factories as offerers_factories import pcapi.core.providers.factories as providers_factories +from pcapi.core.testing import assert_num_queries from pcapi.utils.date import format_into_utc_date @@ -12,8 +12,11 @@ class CollectiveOffersGetVenuesTest: + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select venue + def test_list_venues(self, client): - # Given provider = providers_factories.ProviderFactory() venue1 = providers_factories.VenueProviderFactory(provider=provider).venue venue2 = providers_factories.VenueProviderFactory(provider=provider).venue @@ -21,13 +24,9 @@ def test_list_venues(self, client): offerers_factories.VenueFactory() # excluded from results - # When - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( - url_for("public_api.list_venues") - ) - - # Then - assert response.status_code == 200 + with assert_num_queries(self.num_queries): + response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get("/v2/collective/venues") + assert response.status_code == 200 response_list = sorted(response.json, key=itemgetter("id")) assert response_list == [ @@ -64,27 +63,27 @@ def test_list_venues_empty(self, client): offerers_factories.VenueFactory() # excluded from results - # When - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( - url_for("public_api.list_venues") - ) + with assert_num_queries(self.num_queries): + response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get("/v2/collective/venues") + assert response.status_code == 200 - # Then - assert response.status_code == 200 assert response.json == [] def test_list_venues_anonymous_returns_401(self, client): - # Given offerers_factories.VenueFactory() - # When - response = client.get(url_for("public_api.list_venues")) - - # Then - assert response.status_code == 401 + with assert_num_queries(0): + response = client.get("/v2/collective/venues") + assert response.status_code == 401 class GetOfferersVenuesTest: + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offerer + num_queries += 1 # select provider + num_queries += 1 # select venue_provider_external_urls + def test_get_offerers_venues(self, client): provider = providers_factories.ProviderFactory() venue = providers_factories.VenueProviderFactory(provider=provider).venue @@ -92,11 +91,11 @@ def test_get_offerers_venues(self, client): offerers_factories.VenueFactory() # excluded from results - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( - url_for("public_api.get_offerer_venues") - ) - - assert response.status_code == 200 + with assert_num_queries(self.num_queries): + response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( + "/public/offers/v1/offerer_venues" + ) + assert response.status_code == 200 offerer = venue.managingOfferer assert response.json == [ @@ -145,11 +144,11 @@ def test_filter_offerers_venues_by_siren(self, client): providers_factories.VenueProviderFactory(provider=provider) # excluded - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( - url_for("public_api.get_offerer_venues", siren=siren) - ) - - assert response.status_code == 200 + with assert_num_queries(self.num_queries): + response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( + "/public/offers/v1/offerer_venues?siren=123456789" + ) + assert response.status_code == 200 assert len(response.json) == 1 assert response.json[0]["offerer"]["siren"] == siren @@ -158,5 +157,6 @@ def test_filter_offerers_venues_by_siren(self, client): assert response.json[0]["venues"][0]["id"] == venue.id def test_unauthenticated_client(self, client): - response = client.get(url_for("public_api.get_offerer_venues", siren="123456789")) - assert response.status_code == 401 + with assert_num_queries(0): + response = client.get("/public/offers/v1/offerer_venues?siren=123456789") + assert response.status_code == 401 diff --git a/api/tests/routes/public/collective/endpoints/get_educational_institutions_test.py b/api/tests/routes/public/collective/endpoints/get_educational_institutions_test.py index b0e831116d8..c0cc16b294f 100644 --- a/api/tests/routes/public/collective/endpoints/get_educational_institutions_test.py +++ b/api/tests/routes/public/collective/endpoints/get_educational_institutions_test.py @@ -1,5 +1,6 @@ import pytest +from pcapi.core import testing from pcapi.core.educational import factories as educational_factories from tests.conftest import TestClient @@ -11,8 +12,11 @@ class CollectiveOffersGetEducationalInstitutionTest(PublicAPIEndpointBaseHelper) endpoint_url = "/v2/collective/educational-institutions/" endpoint_method = "get" + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select educational_institution + def test_list_educational_institutions(self, client: TestClient): - # Given plain_api_key, _ = self.setup_provider() expected_json = [] for _ in range(0, 6): @@ -28,25 +32,25 @@ def test_list_educational_institutions(self, client: TestClient): } ) - # When - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 - # Then - assert response.status_code == 200 assert response.json == expected_json def test_search_educational_institutions_postal_code(self, client: TestClient): - # Given plain_api_key, _ = self.setup_provider() educational_institution1 = educational_factories.EducationalInstitutionFactory(postalCode="44100") educational_factories.EducationalInstitutionFactory() # complete postal code - response = client.with_explicit_token(plain_api_key).get( - f"/v2/collective/educational-institutions/?postalCode={educational_institution1.postalCode}" - ) + postal_code = educational_institution1.postalCode + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get( + f"/v2/collective/educational-institutions/?postalCode={postal_code}" + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == [ { "id": educational_institution1.id, @@ -76,18 +80,15 @@ def test_search_educational_institutions_postal_code(self, client: TestClient): ] def test_search_educational_institutions_id(self, client: TestClient): - # Given plain_api_key, _ = self.setup_provider() educational_institution1 = educational_factories.EducationalInstitutionFactory() educational_factories.EducationalInstitutionFactory() - # When - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"id": educational_institution1.id} - ) + institution_id = educational_institution1.id + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"id": institution_id}) + assert response.status_code == 200 - # Then - assert response.status_code == 200 assert response.json == [ { "id": educational_institution1.id, @@ -100,17 +101,18 @@ def test_search_educational_institutions_id(self, client: TestClient): ] def test_search_educational_institutions_name(self, client: TestClient): - # Given plain_api_key, _ = self.setup_provider() educational_institution1 = educational_factories.EducationalInstitutionFactory(name="pouet") educational_factories.EducationalInstitutionFactory() + institution_name = educational_institution1.name # test complete name - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"name": educational_institution1.name} - ) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"name": institution_name} + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == [ { "id": educational_institution1.id, @@ -123,9 +125,10 @@ def test_search_educational_institutions_name(self, client: TestClient): ] # test incomplete name - response = client.with_explicit_token(plain_api_key).get("/v2/collective/educational-institutions/?name=oue") + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"name": "oue"}) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == [ { "id": educational_institution1.id, @@ -138,17 +141,18 @@ def test_search_educational_institutions_name(self, client: TestClient): ] def test_search_educational_institutions_city(self, client: TestClient): - # Given plain_api_key, _ = self.setup_provider() educational_institution1 = educational_factories.EducationalInstitutionFactory(city="pouet") educational_factories.EducationalInstitutionFactory() + institution_city = educational_institution1.city # test complete city - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"city": educational_institution1.city} - ) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"city": institution_city} + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == [ { "id": educational_institution1.id, @@ -161,9 +165,10 @@ def test_search_educational_institutions_city(self, client: TestClient): ] # test incomplete city - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"city": "oue"}) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"city": "oue"}) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == [ { "id": educational_institution1.id, @@ -176,17 +181,18 @@ def test_search_educational_institutions_city(self, client: TestClient): ] def test_search_educational_institutions_institution_type(self, client: TestClient): - # Given plain_api_key, _ = self.setup_provider() educational_institution1 = educational_factories.EducationalInstitutionFactory(institutionType="pouet") educational_factories.EducationalInstitutionFactory() # test complete city - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"institutionType": educational_institution1.institutionType} - ) + institution_type = educational_institution1.institutionType + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"institutionType": institution_type} + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == [ { "id": educational_institution1.id, @@ -199,9 +205,13 @@ def test_search_educational_institutions_institution_type(self, client: TestClie ] # test incomplete city - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"institutionType": "oue"}) - assert response.status_code == 200 + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"institutionType": "oue"} + ) + assert response.status_code == 200 + assert response.json == [ { "id": educational_institution1.id, @@ -214,7 +224,6 @@ def test_search_educational_institutions_institution_type(self, client: TestClie ] def test_search_educational_institutions_multiple_filters(self, client: TestClient): - # Given plain_api_key, _ = self.setup_provider() educational_institution1 = educational_factories.EducationalInstitutionFactory( name="tralala", @@ -229,11 +238,12 @@ def test_search_educational_institutions_multiple_filters(self, client: TestClie educational_factories.EducationalInstitutionFactory() # test incomplete city - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"institutionType": "oue", "name": "rala", "postalCode": "41", "city": "lou"} - ) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"institutionType": "oue", "name": "rala", "postalCode": "41", "city": "lou"} + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == [ { "id": educational_institution1.id, @@ -246,16 +256,14 @@ def test_search_educational_institutions_multiple_filters(self, client: TestClie ] def test_limit_educational_institutions(self, client: TestClient): - # Given plain_api_key, _ = self.setup_provider() educational_institution1 = educational_factories.EducationalInstitutionFactory() educational_factories.EducationalInstitutionFactory() - # When - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"limit": 1}) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"limit": 1}) + assert response.status_code == 200 - # Then - assert response.status_code == 200 assert response.json == [ { "id": educational_institution1.id, @@ -268,21 +276,18 @@ def test_limit_educational_institutions(self, client: TestClient): ] def test_max_limit_educational_institutions(self, client: TestClient): - # Given plain_api_key, _ = self.setup_provider() educational_factories.EducationalInstitutionFactory.create_batch(25) - # When - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"limit": 23}) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"limit": 23}) + assert response.status_code == 200 - # Then - assert response.status_code == 200 assert len(response.json) == 20 - # When - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 - # Then - assert response.status_code == 200 assert len(response.json) == 20 diff --git a/api/tests/routes/public/collective/endpoints/get_list_subcategories_test.py b/api/tests/routes/public/collective/endpoints/get_list_subcategories_test.py index d0758da6222..9beee7a8857 100644 --- a/api/tests/routes/public/collective/endpoints/get_list_subcategories_test.py +++ b/api/tests/routes/public/collective/endpoints/get_list_subcategories_test.py @@ -1,22 +1,23 @@ import pytest +from pcapi.core import testing import pcapi.core.offerers.factories as offerers_factories @pytest.mark.usefixtures("db_session") class CollectiveOffersGetCategoriesTest: + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + def test_list_sub_categories(self, client): - # Given offerer = offerers_factories.OffererFactory() offerers_factories.ApiKeyFactory(offerer=offerer) - # When - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( - "/v2/collective/subcategories" - ) - - # Then - assert response.status_code == 200 + with testing.assert_num_queries(2): + response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( + "/v2/collective/subcategories" + ) + assert response.status_code == 200 assert response.json == [ {"id": "CINE_PLEIN_AIR", "label": "Cinéma plein air", "category": "Cinéma", "categoryId": "CINEMA"}, @@ -119,21 +120,16 @@ def test_list_sub_categories(self, client): ] def test_list_sub_categories_user_auth_returns_401(self, client): - # Given user_offerer = offerers_factories.UserOffererFactory() + email_user = user_offerer.user.email offerers_factories.ApiKeyFactory(offerer=user_offerer.offerer) - # When - response = client.with_session_auth(user_offerer.user.email).get("/v2/collective/subcategories") - - # Then - assert response.status_code == 401 + client = client.with_session_auth(email_user) + with testing.assert_num_queries(2): + response = client.get("/v2/collective/subcategories") + assert response.status_code == 401 def test_list_sub_categories_anonymous_returns_401(self, client): - # Given - - # When - response = client.get("/v2/collective/subcategories") - - # Then - assert response.status_code == 401 + with testing.assert_num_queries(0): + response = client.get("/v2/collective/subcategories") + assert response.status_code == 401 diff --git a/api/tests/routes/public/collective/endpoints/get_national_programs_test.py b/api/tests/routes/public/collective/endpoints/get_national_programs_test.py index d3ff885e615..ad57a104c02 100644 --- a/api/tests/routes/public/collective/endpoints/get_national_programs_test.py +++ b/api/tests/routes/public/collective/endpoints/get_national_programs_test.py @@ -1,5 +1,6 @@ import pytest +from pcapi.core import testing import pcapi.core.educational.factories as educational_factories from tests.routes.public.helpers import PublicAPIEndpointBaseHelper @@ -10,13 +11,17 @@ class GetNationalProgramsTest(PublicAPIEndpointBaseHelper): endpoint_url = "/v2/collective/national-programs/" endpoint_method = "get" + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select national_program + def test_list_national_programs(self, client): plain_api_key, _ = self.setup_provider() programs = educational_factories.NationalProgramFactory.create_batch(2) - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) - - assert response.status_code == 200 + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 program_names = {program["name"] for program in response.json} assert program_names == {program.name for program in programs} diff --git a/api/tests/routes/public/helpers.py b/api/tests/routes/public/helpers.py index a8634181bc2..c09a9f8626d 100644 --- a/api/tests/routes/public/helpers.py +++ b/api/tests/routes/public/helpers.py @@ -3,6 +3,7 @@ import pytest +from pcapi.core import testing from pcapi.core.categories import subcategories_v2 as subcategories from pcapi.core.offerers import factories as offerers_factories from pcapi.core.offerers import models as offerers_models @@ -10,7 +11,6 @@ from pcapi.core.offers import models as offers_models from pcapi.core.providers import factories as providers_factories from pcapi.core.providers import models as providers_models -from pcapi.core.testing import override_settings from tests.conftest import TestClient @@ -55,10 +55,10 @@ def test_should_raise_401_because_not_authenticated(self, client: TestClient): if self.default_path_params: url = url.format(**self.default_path_params) + with testing.assert_num_queries(0): + response = client_method(url) + assert response.status_code == 401 - response = client_method(url) - - assert response.status_code == 401 assert response.json == {"auth": "API key required"} def _setup_api_key(self, offerer, provider=None) -> str: @@ -132,7 +132,7 @@ def setup_active_venue_provider( class PublicAPIRestrictedEnvEndpointHelper(PublicAPIEndpointBaseHelper): - @override_settings(IS_PROD=True) + @testing.override_settings(IS_PROD=True) def test_should_not_be_usable_from_production_env(self, client): plain_api_key, _ = self.setup_provider() authenticated_client = client.with_explicit_token(plain_api_key) diff --git a/api/tests/routes/public/individual_offers/v1/get_all_titelive_music_types_test.py b/api/tests/routes/public/individual_offers/v1/get_all_titelive_music_types_test.py index 8846000028b..c7777d0b1f7 100644 --- a/api/tests/routes/public/individual_offers/v1/get_all_titelive_music_types_test.py +++ b/api/tests/routes/public/individual_offers/v1/get_all_titelive_music_types_test.py @@ -1,5 +1,6 @@ import pytest +from pcapi.core import testing from pcapi.core.providers.constants import GTL_ID_BY_TITELIVE_MUSIC_GENRE from tests.routes.public.helpers import PublicAPIEndpointBaseHelper @@ -12,20 +13,23 @@ class GetAllTiteliveMusicTypesTest(PublicAPIEndpointBaseHelper): endpoint_url = "/public/offers/v1/music_types/all" endpoint_method = "get" + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + def test_returns_all_titelive_music_types(self, client): plain_api_key, _ = self.setup_provider() + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) - - assert response.status_code == 200 assert set(music_type["id"] for music_type in response.json) == set(GTL_ID_BY_TITELIVE_MUSIC_GENRE) def test_music_serialization(self, client): plain_api_key, _ = self.setup_provider() - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) - - assert response.status_code == 200 + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 response = next(music_type for music_type in response.json if music_type["id"] == "VIDEOS_MUSICALES") assert response == {"id": "VIDEOS_MUSICALES", "label": "Vidéos musicales"} diff --git a/api/tests/routes/public/individual_offers/v1/get_booking_test.py b/api/tests/routes/public/individual_offers/v1/get_booking_test.py index 4c939f44c63..956b108b115 100644 --- a/api/tests/routes/public/individual_offers/v1/get_booking_test.py +++ b/api/tests/routes/public/individual_offers/v1/get_booking_test.py @@ -3,6 +3,7 @@ from dateutil.relativedelta import relativedelta import pytest +from pcapi.core import testing from pcapi.core.bookings import factories as bookings_factories from pcapi.core.finance import utils as finance_utils from pcapi.core.offers import factories as offers_factories @@ -38,30 +39,53 @@ def setup_base_resource(self, venue=None): user__postalCode="75001", stock=stock, ) + return offer, stock, booking def test_should_raise_404_because_has_no_access_to_venue(self, client: TestClient): plain_api_key, _ = self.setup_provider() _, _, booking = self.setup_base_resource() - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(token=booking.token)) - assert response.status_code == 404 + token = booking.token + num_queries = 1 # select api_key + num_queries += 1 # select features + num_queries += 1 # select booking + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(token=token)) + assert response.status_code == 404 def test_should_raise_404_because_venue_provider_is_inactive(self, client: TestClient): plain_api_key, venue_provider = self.setup_inactive_venue_provider() _, _, booking = self.setup_base_resource(venue=venue_provider.venue) - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(token=booking.token)) - assert response.status_code == 404 + token = booking.token + num_queries = 1 # select api_key + num_queries += 1 # select features + num_queries += 1 # select booking + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(token=token)) + assert response.status_code == 404 def test_should_raise_404_because_of_missing_token(self, client): - response = client.get("/public/bookings/v1/token/") - assert response.status_code == 404 + with testing.assert_num_queries(0): + response = client.get("/public/bookings/v1/token/") + assert response.status_code == 404 def test_key_has_rights_and_regular_product_offer(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() offer, stock, booking = self.setup_base_resource(venue=venue_provider.venue) - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(token=booking.token)) - assert response.status_code == 200 + token = booking.token + num_queries = 1 # select api_key + num_queries += 1 # select features + num_queries += 1 # select booking + num_queries += 1 # check pricing exists + num_queries += 1 # select stock + num_queries += 1 # select offer + num_queries += 1 # select user + num_queries += 1 # select venue + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(token=token)) + assert response.status_code == 200 + assert response.json == { "confirmationDate": date_utils.format_into_utc_date(booking.cancellationLimitDate), "creationDate": date_utils.format_into_utc_date(booking.dateCreated), @@ -104,10 +128,21 @@ def test_key_has_rights_and_regular_event_offer(self, client): user__postalCode="69100", stock=event_stock, ) + booking_token = booking.token + num_queries = 1 # select api_key + num_queries += 1 # select features + num_queries += 1 # select booking + num_queries += 1 # check pricing exists + num_queries += 1 # select stock + num_queries += 1 # select offer + num_queries += 1 # select user + num_queries += 1 # select price_category + num_queries += 1 # select price_category_label + num_queries += 1 # select venue + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(token=booking_token)) + assert response.status_code == 200 - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(token=booking.token)) - - assert response.status_code == 200 assert response.json == { "confirmationDate": date_utils.format_into_utc_date(booking.cancellationLimitDate), "creationDate": date_utils.format_into_utc_date(booking.dateCreated), @@ -141,7 +176,16 @@ def test_should_raise_403_when_booking_not_confirmed(self, client): stock = offers_factories.StockFactory(offer=offer, beginningDatetime=next_week) booking = bookings_factories.BookingFactory(stock=stock) - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(token=booking.token)) + booking_token = booking.token + num_queries = 1 # select api_key + num_queries += 1 # select features + num_queries += 1 # select booking + num_queries += 1 # check pricing exists + num_queries += 1 # select stock + num_queries += 1 # select venue + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(token=booking_token)) + assert response.status_code == 403 cancellation_limit_date = datetime.datetime.strftime( date_utils.utc_datetime_to_department_timezone( @@ -153,32 +197,37 @@ def test_should_raise_403_when_booking_not_confirmed(self, client): assert response.json == { "booking": f"Vous pourrez valider cette contremarque à partir du {cancellation_limit_date}, une fois le délai d’annulation passé." } - assert response.status_code == 403 def test_should_raise_403_when_booking_is_refunded(self, client): - # Given plain_api_key, venue_provider = self.setup_active_venue_provider() offer = offers_factories.ThingOfferFactory(venue=venue_provider.venue) stock = offers_factories.StockFactory(offer=offer) - booking = bookings_factories.ReimbursedBookingFactory(stock=stock) + booking_token = bookings_factories.ReimbursedBookingFactory(stock=stock).token - # When - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(token=booking.token)) + num_queries = 1 # select api_key + num_queries += 1 # select features + num_queries += 1 # select booking + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(token=booking_token)) + assert response.status_code == 403 - # Then - assert response.status_code == 403 assert response.json == {"payment": "This booking has already been reimbursed"} def test_should_raise_410_when_booking_is_already_validated(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() product_offer = offers_factories.ThingOfferFactory(venue=venue_provider.venue) product_stock = offers_factories.StockFactory(offer=product_offer) - booking = bookings_factories.UsedBookingFactory(stock=product_stock) + booking_token = bookings_factories.UsedBookingFactory(stock=product_stock).token - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(token=booking.token)) + num_queries = 1 # select api_key + num_queries += 1 # select features + num_queries += 1 # select booking + num_queries += 1 # check pricing exists + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(token=booking_token)) + assert response.status_code == 410 - assert response.status_code == 410 assert response.json == {"booking": "This booking has already been validated"} def test_should_raise_410_when_booking_is_cancelled(self, client): @@ -186,8 +235,14 @@ def test_should_raise_410_when_booking_is_cancelled(self, client): product_offer = offers_factories.ThingOfferFactory(venue=venue_provider.venue) product_stock = offers_factories.StockFactory(offer=product_offer) booking = bookings_factories.CancelledBookingFactory(stock=product_stock) + booking_token = booking.token - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(token=booking.token)) + num_queries = 1 # select api_key + num_queries += 1 # select features + num_queries += 1 # select booking + num_queries += 1 # check pricing exists + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(token=booking_token)) + assert response.status_code == 410 - assert response.status_code == 410 assert response.json == {"booking": "This booking has been cancelled"} diff --git a/api/tests/routes/public/individual_offers/v1/get_bookings_test.py b/api/tests/routes/public/individual_offers/v1/get_bookings_test.py index 199b9ea87c1..376a0f0883d 100644 --- a/api/tests/routes/public/individual_offers/v1/get_bookings_test.py +++ b/api/tests/routes/public/individual_offers/v1/get_bookings_test.py @@ -3,6 +3,7 @@ from dateutil.relativedelta import relativedelta import pytest +from pcapi.core import testing from pcapi.core.bookings import factories as bookings_factories from pcapi.core.offers import factories as offers_factories @@ -29,14 +30,26 @@ def setup_base_resource(self, venue=None): def test_should_raise_404_because_has_no_access_to_venue(self, client: TestClient): plain_api_key, _ = self.setup_provider() offer = self.setup_base_resource() - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"offer_id": offer.id}) - assert response.status_code == 404 + + offer_id = offer.id + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offer + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"offer_id": offer_id}) + assert response.status_code == 404 def test_should_raise_404_because_venue_provider_is_inactive(self, client: TestClient): plain_api_key, venue_provider = self.setup_inactive_venue_provider() offer = self.setup_base_resource(venue=venue_provider.venue) - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"offer_id": offer.id}) - assert response.status_code == 404 + + offer_id = offer.id + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offer + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"offer_id": offer_id}) + assert response.status_code == 404 def test_should_raise_404_because_offer_not_found(self, client: TestClient): plain_api_key, venue_provider = self.setup_active_venue_provider() @@ -47,11 +60,15 @@ def test_should_raise_404_because_offer_not_found(self, client: TestClient): extraData={"ean": "1234567890123"}, ) - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"offer_id": product_offer.id + 1} - ) - - assert response.status_code == 404 + product_offer_id = product_offer.id + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offer + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"offer_id": product_offer_id + 1} + ) + assert response.status_code == 404 assert response.json == {"offer": "we could not find this offer id"} def test_request_not_existing_page(self, client: TestClient): @@ -67,11 +84,18 @@ def test_request_not_existing_page(self, client: TestClient): stock=product_stock, ) - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, - params={"offer_id": offer.id, "firstIndex": booking.id + 1}, - ) - assert response.status_code == 200 + offer_id = offer.id + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offer + num_queries += 1 # select bookings + booking_id = booking.id + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get( + f"/public/bookings/v1/bookings?offer_id={offer_id}&firstIndex={booking_id + 1}", + ) + assert response.status_code == 200 + assert response.json == {"bookings": []} def test_key_has_rights_and_regular_product_offer(self, client: TestClient): @@ -92,10 +116,20 @@ def test_key_has_rights_and_regular_product_offer(self, client: TestClient): stock=product_stock, ) - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"offer_id": product_offer.id} - ) - assert response.status_code == 200 + product_offer_id = product_offer.id + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offer + num_queries += 1 # select bookings + num_queries += 1 # select stock + num_queries += 1 # select user + num_queries += 1 # select venue + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"offer_id": product_offer_id} + ) + assert response.status_code == 200 + assert response.json == { "bookings": [ { @@ -149,9 +183,23 @@ def test_multiple_event_bookings(self, client: TestClient): stock=event_stock, ) - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"offer_id": event_offer.id}) + event_offer_id = event_offer.id + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offer + num_queries += 1 # select bookings + num_queries += 1 # select stock + num_queries += 1 # select user + num_queries += 1 # select price_category + num_queries += 1 # select price_category_label + num_queries += 1 # select venue + num_queries += 1 # select second user + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"offer_id": event_offer_id} + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == { "bookings": [ { @@ -233,11 +281,25 @@ def test_filter_price_category_event_bookings(self, client): stock=event_stock, ) - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"offer_id": event_offer.id, "price_category_id": price_category.id} - ) + event_offer_id = event_offer.id + price_category_id = price_category.id + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offer + num_queries += 1 # select bookings + num_queries += 1 # select stock + num_queries += 1 # select user + num_queries += 1 # select price_category + num_queries += 1 # select price_category_label + num_queries += 1 # select venue + num_queries += 1 # select second user + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"offer_id": event_offer_id, "price_category_id": price_category_id} + ) + + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == { "bookings": [ { @@ -322,11 +384,22 @@ def test_filter_stock_event_bookings(self, client): stock=event_stock_2, ) - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"offer_id": event_offer.id, "stock_id": event_stock.id} - ) + event_offer_id = event_offer.id + event_stock_id = event_stock.id + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offer + num_queries += 1 # select bookings + num_queries += 1 # select user + num_queries += 1 # select price_category + num_queries += 1 # select price_category_label + num_queries += 1 # select venue + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"offer_id": event_offer_id, "stock_id": event_stock_id} + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == { "bookings": [ { @@ -387,11 +460,22 @@ def test_filter_stock_begining_datetime_bookings(self, client): stock=event_stock_2, ) - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"offer_id": event_offer.id, "beginning_datetime": past} - ) + event_offer_id = event_offer.id + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offer + num_queries += 1 # select bookings + num_queries += 1 # select stock + num_queries += 1 # select user + num_queries += 1 # select price_category + num_queries += 1 # select price_category_label + num_queries += 1 # select venue + with testing.assert_num_queries(9): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"offer_id": event_offer_id, "beginning_datetime": past} + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == { "bookings": [ { @@ -453,11 +537,22 @@ def test_filter_status_event_bookings(self, client): stock=event_stock_2, ) - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"offer_id": event_offer.id, "status": "REIMBURSED"} - ) + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offer + num_queries += 1 # select bookings + num_queries += 1 # select stock + num_queries += 1 # select user + num_queries += 1 # select price_category + num_queries += 1 # select price_category_label + num_queries += 1 # select venue + event_offer_id = event_offer.id + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"offer_id": event_offer_id, "status": "REIMBURSED"} + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == { "bookings": [ { @@ -525,16 +620,27 @@ def test_multiple_filters_bookings(self, client): stock=event_stock_2, ) - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, - params={ - "offer_id": event_offer.id, - "status": "USED", - "beginning_datetime": past + datetime.timedelta(days=2), - }, - ) + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offer + num_queries += 1 # select bookings + num_queries += 1 # select stock + num_queries += 1 # select user + num_queries += 1 # select price_category + num_queries += 1 # select price_category_label + num_queries += 1 # select venue + event_offer_id = event_offer.id + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, + params={ + "offer_id": event_offer_id, + "status": "USED", + "beginning_datetime": past + datetime.timedelta(days=2), + }, + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == { "bookings": [ { @@ -595,11 +701,23 @@ def test_multiple_pages(self, client): stock=event_stock, ) - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"offer_id": event_offer.id, "limit": 2} - ) + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offer + num_queries += 1 # select bookings + num_queries += 1 # select stock + num_queries += 1 # select user + num_queries += 1 # select price_category + num_queries += 1 # select price_category_label + num_queries += 1 # select venue + num_queries += 1 # select second user + event_offer_id = event_offer.id + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"offer_id": event_offer_id, "limit": 2} + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == { "bookings": [ { @@ -684,11 +802,24 @@ def test_second_page(self, client): stock=event_stock, ) - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"offer_id": event_offer.id, "limit": 2, "firstIndex": booking_2.id} - ) + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offer + num_queries += 1 # select bookings + num_queries += 1 # select stock + num_queries += 1 # select user + num_queries += 1 # select price_category + num_queries += 1 # select price_category_label + num_queries += 1 # select venue + num_queries += 1 # select second user + event_offer_id = event_offer.id + booking_2_id = booking_2.id + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"offer_id": event_offer_id, "limit": 2, "firstIndex": booking_2_id} + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == { "bookings": [ { @@ -751,10 +882,17 @@ def test_offer_has_no_bookings(self, client): extraData={"ean": "1234567890123"}, ) - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"offer_id": product_offer.id} - ) - assert response.status_code == 200 + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offer + num_queries += 1 # select bookings + product_offer_id = product_offer.id + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"offer_id": product_offer_id} + ) + assert response.status_code == 200 + assert response.json == {"bookings": []} def test_should_raise_400_because_no_offer_id_provided(self, client): @@ -763,7 +901,9 @@ def test_should_raise_400_because_no_offer_id_provided(self, client): product_stock = offers_factories.StockFactory(offer=product_offer) bookings_factories.UsedBookingFactory(stock=product_stock) - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) - assert response.status_code == 400 assert response.json == {"offerId": ["field required"]} diff --git a/api/tests/routes/public/individual_offers/v1/get_event_categories_test.py b/api/tests/routes/public/individual_offers/v1/get_event_categories_test.py index b9a705321ad..f676c273f1a 100644 --- a/api/tests/routes/public/individual_offers/v1/get_event_categories_test.py +++ b/api/tests/routes/public/individual_offers/v1/get_event_categories_test.py @@ -1,5 +1,6 @@ import pytest +from pcapi.core import testing from pcapi.core.categories import subcategories_v2 as subcategories from pcapi.core.offerers import factories as offerers_factories @@ -8,15 +9,19 @@ pytestmark = pytest.mark.usefixtures("db_session") +num_queries = 1 # select api_key, offerer and provider +num_queries += 1 # select features + def test_returns_all_selectable_categories(client): utils.create_offerer_provider_linked_to_venue() - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( - "/public/offers/v1/events/categories" - ) + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( + "/public/offers/v1/events/categories" + ) + assert response.status_code == 200 - assert response.status_code == 200 assert set(subcategory["id"] for subcategory in response.json) == set( subcategory_id for subcategory_id, subcategory in subcategories.EVENT_SUBCATEGORIES.items() @@ -27,11 +32,12 @@ def test_returns_all_selectable_categories(client): def test_category_serialization(client): utils.create_offerer_provider_linked_to_venue() - response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( - "/public/offers/v1/events/categories" - ) + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).get( + "/public/offers/v1/events/categories" + ) + assert response.status_code == 200 - assert response.status_code == 200 assert all({"id", "conditionalFields"} == set(category_response.keys()) for category_response in response.json) concert_response = next(subcategory for subcategory in response.json if subcategory["id"] == "CONCERT") diff --git a/api/tests/routes/public/individual_offers/v1/get_event_show_types_test.py b/api/tests/routes/public/individual_offers/v1/get_event_show_types_test.py index d53d517a96c..ee54b4e00e9 100644 --- a/api/tests/routes/public/individual_offers/v1/get_event_show_types_test.py +++ b/api/tests/routes/public/individual_offers/v1/get_event_show_types_test.py @@ -1,5 +1,6 @@ import pytest +from pcapi.core import testing from pcapi.domain import show_types from tests.routes.public.helpers import PublicAPIEndpointBaseHelper @@ -12,22 +13,25 @@ class GetShowTypesTest(PublicAPIEndpointBaseHelper): endpoint_url = "/public/offers/v1/show_types" endpoint_method = "get" + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + def test_returns_all_show_types(self, client): plain_api_key, _ = self.setup_provider() + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) - - assert response.status_code == 200 assert set(show_type["id"] for show_type in response.json) == set(show_types.SHOW_SUB_TYPES_BY_SLUG) def test_show_type_serialization(self, client): plain_api_key, _ = self.setup_provider() - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 - assert response.status_code == 200 assert all({"id", "label"} == set(show_type_response.keys()) for show_type_response in response.json) - musical_response = next( show_type for show_type in response.json if show_type["id"] == "SPECTACLE_MUSICAL-COMEDIE_MUSICALE" ) diff --git a/api/tests/routes/public/individual_offers/v1/get_event_stocks_test.py b/api/tests/routes/public/individual_offers/v1/get_event_stocks_test.py index 8b2a7a7e7c9..e54eae3462a 100644 --- a/api/tests/routes/public/individual_offers/v1/get_event_stocks_test.py +++ b/api/tests/routes/public/individual_offers/v1/get_event_stocks_test.py @@ -18,6 +18,12 @@ class GetEventStocksTest(PublicAPIVenueEndpointHelper): endpoint_method = "get" default_path_params = {"event_id": 1} + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offers + num_queries_with_stocks = num_queries + 1 # Select stock ids + num_queries_with_stocks += 1 # Select stocks + def setup_base_resource(self, venue=None, provider=None) -> tuple[offers_models.Offer, offers_models.Stock]: event = offers_factories.EventOfferFactory(venue=venue or self.setup_venue(), lastProvider=provider) price_category = offers_factories.PriceCategoryFactory( @@ -37,14 +43,20 @@ def setup_base_resource(self, venue=None, provider=None) -> tuple[offers_models. def test_should_raise_404_because_has_no_access_to_venue(self, client: TestClient): plain_api_key, _ = self.setup_provider() event, _ = self.setup_base_resource() - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event.id)) - assert response.status_code == 404 + event_id = event.id + + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_id)) + assert response.status_code == 404 def test_should_raise_404_because_venue_provider_is_inactive(self, client: TestClient): plain_api_key, venue_provider = self.setup_inactive_venue_provider() event, _ = self.setup_base_resource(venue=venue_provider.venue, provider=venue_provider.provider) - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event.id)) - assert response.status_code == 404 + event_id = event.id + + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_id)) + assert response.status_code == 404 def test_event_with_dates(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() @@ -78,10 +90,10 @@ def test_event_with_dates(self, client): offers_factories.EventStockFactory(offer=event_offer, isSoftDeleted=True) # deleted stock, not returned bookings_factories.BookingFactory(stock=bookable_stock) - with testing.assert_no_duplicated_queries(): + with testing.assert_num_queries(self.num_queries_with_stocks): response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer_id)) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json["dates"] == [ { "beginningDatetime": date_utils.format_into_utc_date(two_weeks_from_now), @@ -115,10 +127,10 @@ def test_event_without_dates(self, client): event_offer_id = event_offer.id offers_factories.EventStockFactory(offer=event_offer, isSoftDeleted=True) # deleted stock, not returned - with testing.assert_no_duplicated_queries(): + with testing.assert_num_queries(self.num_queries_with_stocks): response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer_id)) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == {"dates": []} def test_should_return_no_result_when_first_index_is_too_high(self, client: TestClient): @@ -127,10 +139,10 @@ def test_should_return_no_result_when_first_index_is_too_high(self, client: Test event_id = event.id out_of_range_index = stock.id + 1 - with testing.assert_no_duplicated_queries(): + with testing.assert_num_queries(self.num_queries_with_stocks): response = client.with_explicit_token(plain_api_key).get( self.endpoint_url.format(event_id=event_id), params={"firstIndex": out_of_range_index} ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == {"dates": []} diff --git a/api/tests/routes/public/individual_offers/v1/get_event_test.py b/api/tests/routes/public/individual_offers/v1/get_event_test.py index cf0fad36484..a3a444e231e 100644 --- a/api/tests/routes/public/individual_offers/v1/get_event_test.py +++ b/api/tests/routes/public/individual_offers/v1/get_event_test.py @@ -19,6 +19,11 @@ class GetEventTest(PublicAPIVenueEndpointHelper): endpoint_method = "get" default_path_params = {"event_id": 1} + num_queries_with_error = 1 # retrieve API key + num_queries_with_error += 1 # retrieve offer + num_queries_with_error += 1 # retrieve feature_flags for api key validation + num_queries = num_queries_with_error + 1 # future_offer (a backref) + def setup_base_resource(self, venue=None) -> offers_models.Offer: venue = venue or self.setup_venue() product = offers_factories.ProductFactory(thumbCount=1) @@ -34,27 +39,32 @@ def setup_base_resource(self, venue=None) -> offers_models.Offer: def test_should_raise_404_because_has_no_access_to_venue(self, client: TestClient): plain_api_key, _ = self.setup_provider() - event_offer = self.setup_base_resource() - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer.id)) - assert response.status_code == 404 + event_offer_id = self.setup_base_resource().id + + # 1. api_key + # 2. feature + # 3. offer + with testing.assert_num_queries(self.num_queries_with_error): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer_id)) + assert response.status_code == 404 def test_should_raise_404_because_venue_provider_is_inactive(self, client: TestClient): plain_api_key, venue_provider = self.setup_inactive_venue_provider() - event_offer = self.setup_base_resource(venue_provider.venue) - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer.id)) - assert response.status_code == 404 + event_offer_id = self.setup_base_resource(venue_provider.venue).id + + # 1. api_key + # 2. feature + # 3. offer + with testing.assert_num_queries(self.num_queries_with_error): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer_id)) + assert response.status_code == 404 def test_get_event(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() event_offer = self.setup_base_resource(venue=venue_provider.venue) event_offer_id = event_offer.id - num_query = 1 # retrieve API key - num_query += 1 # retrieve offer - num_query += 1 # retrieve feature_flags for api key validation - num_query += 1 # future_offer (a backref) - - with testing.assert_num_queries(num_query): + with testing.assert_num_queries(self.num_queries): response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer_id)) assert response.status_code == 200 @@ -98,12 +108,7 @@ def test_get_future_event(self, client): publicationDate=publication_date, ) - num_query = 1 # retrieve API key - num_query += 1 # retrieve offer - num_query += 1 # retrieve feature_flags for api key validation - num_query += 1 # future_offer (a backref) - - with testing.assert_num_queries(num_query): + with testing.assert_num_queries(self.num_queries): response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer_id)) assert response.status_code == 200 @@ -115,34 +120,38 @@ def test_event_with_not_selectable_category_can_be_retrieved(self, client): venue=venue_provider.venue, subcategoryId=subcategories.DECOUVERTE_METIERS.id, ) - - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer.id)) + event_offer_id = event_offer.id + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer_id)) assert response.status_code == 200 assert response.json["categoryRelatedFields"]["category"] == "DECOUVERTE_METIERS" def test_get_event_without_ticket(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() - event_offer = offers_factories.EventOfferFactory( + event_offer_id = offers_factories.EventOfferFactory( subcategoryId=subcategories.CONCERT.id, venue=venue_provider.venue, withdrawalType=offers_models.WithdrawalTypeEnum.ON_SITE, - ) + ).id + + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer_id)) + assert response.status_code == 200 - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer.id)) - assert response.status_code == 200 assert response.json["hasTicket"] is False def test_get_music_offer_without_music_type(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() - event_offer = offers_factories.EventOfferFactory( + event_offer_id = offers_factories.EventOfferFactory( subcategoryId=subcategories.CONCERT.id, extraData=None, venue=venue_provider.venue, - ) + ).id - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer.id)) - assert response.status_code == 200 + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer_id)) + assert response.status_code == 200 assert response.json["categoryRelatedFields"] == { "author": None, "category": "CONCERT", @@ -152,24 +161,26 @@ def test_get_music_offer_without_music_type(self, client): def test_ticket_collection_in_app(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() - event_offer = offers_factories.EventOfferFactory( + event_offer_id = offers_factories.EventOfferFactory( venue=venue_provider.venue, withdrawalType=offers_models.WithdrawalTypeEnum.IN_APP, - ) + ).id - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer.id)) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer_id)) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json["hasTicket"] == True def test_ticket_collection_no_ticket(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() - event_offer = offers_factories.EventOfferFactory( + event_offer_id = offers_factories.EventOfferFactory( venue=venue_provider.venue, withdrawalType=offers_models.WithdrawalTypeEnum.NO_TICKET, - ) + ).id - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer.id)) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(event_id=event_offer_id)) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json["hasTicket"] == False diff --git a/api/tests/routes/public/individual_offers/v1/get_event_titelive_music_types_test.py b/api/tests/routes/public/individual_offers/v1/get_event_titelive_music_types_test.py index 7be50c3c6f6..67b76677045 100644 --- a/api/tests/routes/public/individual_offers/v1/get_event_titelive_music_types_test.py +++ b/api/tests/routes/public/individual_offers/v1/get_event_titelive_music_types_test.py @@ -1,5 +1,6 @@ import pytest +from pcapi.core import testing from pcapi.core.providers.constants import GTL_ID_BY_TITELIVE_MUSIC_GENRE from tests.routes.public.helpers import PublicAPIEndpointBaseHelper @@ -12,12 +13,16 @@ class GetAllTiteliveMusicTypesTest(PublicAPIEndpointBaseHelper): endpoint_url = "/public/offers/v1/music_types/event" endpoint_method = "get" + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + def test_returns_event_titelive_music_types(self, client): plain_api_key, _ = self.setup_provider() - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 - assert response.status_code == 200 assert set(music_type["id"] for music_type in response.json) == { genre for genre, gtl_id in GTL_ID_BY_TITELIVE_MUSIC_GENRE.items() @@ -27,9 +32,9 @@ def test_returns_event_titelive_music_types(self, client): def test_music_serialization(self, client): plain_api_key, _ = self.setup_provider() - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) - - assert response.status_code == 200 + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 response = next(music_type for music_type in response.json if music_type["id"] == "FUNK-SOUL-RNB-DISCO") assert response == {"id": "FUNK-SOUL-RNB-DISCO", "label": "Funk / Soul / RnB / Disco"} diff --git a/api/tests/routes/public/individual_offers/v1/get_events_test.py b/api/tests/routes/public/individual_offers/v1/get_events_test.py index b4c5274aa71..6de5a8a2c8e 100644 --- a/api/tests/routes/public/individual_offers/v1/get_events_test.py +++ b/api/tests/routes/public/individual_offers/v1/get_events_test.py @@ -6,7 +6,6 @@ from pcapi.core.categories import subcategories_v2 as subcategories from pcapi.core.offers import factories as offers_factories from pcapi.core.offers import models as offers_models -from pcapi.core.testing import assert_no_duplicated_queries from tests.routes.public.helpers import PublicAPIVenueEndpointHelper @@ -16,30 +15,39 @@ class GetEventsTest(PublicAPIVenueEndpointHelper): endpoint_url = "/public/offers/v1/events" endpoint_method = "get" + num_queries_with_error = 1 # select api_key, offerer and provider + num_queries_with_error += 1 # select features + num_queries_with_error += 1 # check provider EXISTS + num_queries = num_queries_with_error + 1 # select offers + def test_should_raise_404_because_has_no_access_to_venue(self, client): plain_api_key, _ = self.setup_provider() - venue = self.setup_venue() - response = client.with_explicit_token(plain_api_key).get("%s?venueId=%s" % (self.endpoint_url, venue.id)) - assert response.status_code == 404 + venue_id = self.setup_venue().id + + with testing.assert_num_queries(self.num_queries_with_error): + response = client.with_explicit_token(plain_api_key).get("%s?venueId=%s" % (self.endpoint_url, venue_id)) + assert response.status_code == 404 def test_should_raise_404_because_venue_provider_is_inactive(self, client): plain_api_key, venue_provider = self.setup_inactive_venue_provider() - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"venueId": venue_provider.venueId} - ) - assert response.status_code == 404 + venue_id = venue_provider.venueId + + with testing.assert_num_queries(self.num_queries_with_error): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"venueId": venue_id}) + assert response.status_code == 404 def test_get_first_page_old_behavior_when_permission_system_not_enforced(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() offers = offers_factories.EventOfferFactory.create_batch(6, venue=venue_provider.venue) offers_factories.ThingOfferFactory.create_batch(3, venue=venue_provider.venue) # not returned - with testing.assert_no_duplicated_queries(): + venue_id = venue_provider.venueId + with testing.assert_num_queries(self.num_queries): response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"venueId": venue_provider.venueId, "limit": 5} + self.endpoint_url, params={"venueId": venue_id, "limit": 5} ) + assert response.status_code == 200 - assert response.status_code == 200 assert [event["id"] for event in response.json["events"]] == [offer.id for offer in offers[0:5]] def test_get_first_page(self, client): @@ -47,17 +55,19 @@ def test_get_first_page(self, client): offers = offers_factories.EventOfferFactory.create_batch(6, venue=venue_provider.venue) offers_factories.ThingOfferFactory.create_batch(3, venue=venue_provider.venue) # not returned - with testing.assert_no_duplicated_queries(): + venue_id = venue_provider.venueId + with testing.assert_num_queries(self.num_queries): response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"venueId": venue_provider.venueId, "limit": 5} + self.endpoint_url, params={"venueId": venue_id, "limit": 5} ) + assert response.status_code == 200 - assert response.status_code == 200 assert [event["id"] for event in response.json["events"]] == [offer.id for offer in offers[0:5]] # This test should be removed when our database has consistant data def test_get_offers_with_missing_fields(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() + venue_id = venue_provider.venueId offer = offers_factories.EventOfferFactory( venue=venue_provider.venue, subcategoryId=subcategories.CONCERT.id, @@ -74,15 +84,17 @@ def test_get_offers_with_missing_fields(self, client): withdrawalType=offers_models.WithdrawalTypeEnum.ON_SITE, ) - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"venueId": venue_provider.venueId, "limit": 5} - ) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"venueId": venue_id, "limit": 5} + ) + assert response.status_code == 200 - assert response.status_code == 200 assert len(response.json["events"]) == 2 def test_get_events_without_sub_types(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() + venue_id = venue_provider.venueId offers_factories.EventOfferFactory( subcategoryId=subcategories.CONCERT.id, venue=venue_provider.venue, @@ -93,10 +105,13 @@ def test_get_events_without_sub_types(self, client): venue=venue_provider.venue, extraData={"showType": "800"}, ) - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, params={"venueId": venue_provider.venueId, "limit": 5} - ) - assert response.status_code == 200 + + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, params={"venueId": venue_id, "limit": 5} + ) + assert response.status_code == 200 + assert len(response.json["events"]) == 2 def test_get_events_using_ids_at_provider(self, client): @@ -118,15 +133,16 @@ def test_get_events_using_ids_at_provider(self, client): idAtProvider=id_at_provider_3, ) - with assert_no_duplicated_queries(): + venue_id = venue_provider.venueId + with testing.assert_num_queries(self.num_queries): response = client.with_explicit_token(plain_api_key).get( self.endpoint_url, params={ - "venueId": venue_provider.venueId, + "venueId": venue_id, "limit": 5, "idsAtProvider": f"{id_at_provider_1},{id_at_provider_2}", }, ) + assert response.status_code == 200 - assert response.status_code == 200 assert [event["id"] for event in response.json["events"]] == [event_1.id, event_2.id] diff --git a/api/tests/routes/public/individual_offers/v1/get_music_types_test.py b/api/tests/routes/public/individual_offers/v1/get_music_types_test.py index 84e65f6d86d..6f8153fbd4f 100644 --- a/api/tests/routes/public/individual_offers/v1/get_music_types_test.py +++ b/api/tests/routes/public/individual_offers/v1/get_music_types_test.py @@ -1,5 +1,6 @@ import pytest +from pcapi.core import testing from pcapi.domain import music_types from tests.routes.public.helpers import PublicAPIEndpointBaseHelper @@ -12,20 +13,24 @@ class GetMusicTypesTest(PublicAPIEndpointBaseHelper): endpoint_url = "/public/offers/v1/music_types" endpoint_method = "get" + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + def test_returns_all_music_types(self, client): plain_api_key, _ = self.setup_provider() - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 - assert response.status_code == 200 assert set(music_type["id"] for music_type in response.json) == set(music_types.MUSIC_SUB_TYPES_BY_SLUG) def test_music_serialization(self, client): plain_api_key, _ = self.setup_provider() - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) - - assert response.status_code == 200 + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 response = next(music_type for music_type in response.json if music_type["id"] == "JAZZ-MANOUCHE") assert response == {"id": "JAZZ-MANOUCHE", "label": "Manouche"} diff --git a/api/tests/routes/public/individual_offers/v1/get_offerer_venue_test.py b/api/tests/routes/public/individual_offers/v1/get_offerer_venue_test.py index b6fbe6fec67..999d68cfb5c 100644 --- a/api/tests/routes/public/individual_offers/v1/get_offerer_venue_test.py +++ b/api/tests/routes/public/individual_offers/v1/get_offerer_venue_test.py @@ -2,6 +2,7 @@ import pytest +from pcapi.core import testing from pcapi.core.offerers import factories as offerers_factories from pcapi.core.offerers import models as offerers_models from pcapi.core.providers import factories as providers_factories @@ -77,8 +78,19 @@ def test_get_offerer_venues(self, client): other_physical_venue, ) = self.create_multiple_venue_providers() - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) - assert response.status_code == 200 + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offerer + num_queries += 1 # check provider exists + num_queries += 1 # select venue_provider_external_urls + num_queries += 1 # check provider exists + num_queries += 1 # select venue_provider_external_urls + num_queries += 1 # check provider exists + num_queries += 1 # select venue_provider_external_urls + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 + assert len(response.json) == 2 assert response.json[0] == { "offerer": { @@ -173,8 +185,13 @@ def test_does_not_return_inactive_venue_providers(self, client): venue = self.setup_venue() providers_factories.VenueProviderFactory(venue=venue, provider=provider, isActive=False) - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) - assert response == 200 + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offerer + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 + assert response.json == [] def test_get_filtered_offerer_venues(self, client): @@ -186,12 +203,22 @@ def test_get_filtered_offerer_venues(self, client): _, _, ) = self.create_multiple_venue_providers() + offerer_with_two_venues_siren = offerer_with_two_venues.siren + + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offerer + num_queries += 1 # check provider exists + num_queries += 1 # select venue_provider_external_urls + num_queries += 1 # check provider exists + num_queries += 1 # select venue_provider_external_urls + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url, + params={"siren": offerer_with_two_venues_siren}, + ) + assert response.status_code == 200 - response = client.with_explicit_token(plain_api_key).get( - self.endpoint_url, - params={"siren": offerer_with_two_venues.siren}, - ) - assert response == 200 json_dict = response.json assert len(json_dict) == 1 assert json_dict[0]["offerer"]["siren"] == offerer_with_two_venues.siren @@ -199,19 +226,34 @@ def test_get_filtered_offerer_venues(self, client): def test_get_filtered_offerer_venues_with_siren_more_than_9_characters(self, client: TestClient): plain_api_key, _ = self.setup_provider() - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"siren": "1234567890"}) - assert response == 400 + + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"siren": "1234567890"}) + assert response == 400 + assert response.json == {"siren": ['string does not match regex "^\\d{9}$"']} def test_get_filtered_offerer_venues_with_siren_less_than_9_characters(self, client: TestClient): plain_api_key, _ = self.setup_provider() - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"siren": "1234890"}) - assert response == 400 + + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url, params={"siren": "1234890"}) + assert response == 400 + assert response.json == {"siren": ['string does not match regex "^\\d{9}$"']} def test_when_no_venues(self, client): plain_api_key, _ = self.setup_provider() - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) - assert response == 200 + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offerer + with testing.assert_num_queries(num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 + assert response.json == [] diff --git a/api/tests/routes/public/individual_offers/v1/get_product_by_ean_test.py b/api/tests/routes/public/individual_offers/v1/get_product_by_ean_test.py index a5de3101d65..b827a67945b 100644 --- a/api/tests/routes/public/individual_offers/v1/get_product_by_ean_test.py +++ b/api/tests/routes/public/individual_offers/v1/get_product_by_ean_test.py @@ -1,5 +1,6 @@ import pytest +from pcapi.core import testing from pcapi.core.categories import subcategories_v2 as subcategories from pcapi.core.offers import factories as offers_factories @@ -11,9 +12,15 @@ class GetProductByEanTest(PublicAPIVenueEndpointHelper): endpoint_url = "/public/offers/v1/products/ean" endpoint_method = "get" + num_queries_400 = 1 # select api_key, offerer and provider + num_queries_400 += 1 # select features + num_queries_404 = num_queries_400 + 1 # check venue_provider exists + num_queries_success = num_queries_404 + 1 # select offers + def test_should_raise_404_because_has_no_access_to_venue(self, client): plain_api_key, _ = self.setup_provider() venue = self.setup_venue() + venue_id = venue.id product_offer = offers_factories.ThingOfferFactory( venue=venue, subcategoryId=subcategories.SUPPORT_PHYSIQUE_FILM.id, @@ -21,14 +28,17 @@ def test_should_raise_404_because_has_no_access_to_venue(self, client): name="Vieux motard que jamais", extraData={"ean": "1234567890123"}, ) - response = client.with_explicit_token(plain_api_key).get( - f"{self.endpoint_url}?eans={product_offer.extraData['ean']}&venueId={venue.id}" - ) - assert response.status_code == 404 + ean = product_offer.extraData["ean"] + with testing.assert_num_queries(self.num_queries_404): + response = client.with_explicit_token(plain_api_key).get( + f"{self.endpoint_url}?eans={ean}&venueId={venue_id}" + ) + assert response.status_code == 404 def test_should_raise_404_because_venue_provider_is_inactive(self, client): plain_api_key, venue_provider = self.setup_inactive_venue_provider() venue = venue_provider.venue + venue_id = venue.id product_offer = offers_factories.ThingOfferFactory( venue=venue, subcategoryId=subcategories.SUPPORT_PHYSIQUE_FILM.id, @@ -36,14 +46,17 @@ def test_should_raise_404_because_venue_provider_is_inactive(self, client): name="Vieux motard que jamais", extraData={"ean": "1234567890123"}, ) - response = client.with_explicit_token(plain_api_key).get( - f"{self.endpoint_url}?eans={product_offer.extraData['ean']}&venueId={venue.id}" - ) - assert response.status_code == 404 + ean = product_offer.extraData["ean"] + with testing.assert_num_queries(self.num_queries_404): + response = client.with_explicit_token(plain_api_key).get( + f"{self.endpoint_url}?eans={ean}&venueId={venue_id}" + ) + assert response.status_code == 404 def test_valid_ean(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() venue = venue_provider.venue + venue_id = venue.id product_offer = offers_factories.ThingOfferFactory( venue=venue, subcategoryId=subcategories.SUPPORT_PHYSIQUE_FILM.id, @@ -51,12 +64,13 @@ def test_valid_ean(self, client): name="Vieux motard que jamais", extraData={"ean": "1234567890123"}, ) + ean = product_offer.extraData["ean"] + with testing.assert_num_queries(self.num_queries_success): + response = client.with_explicit_token(plain_api_key).get( + f"/public/offers/v1/products/ean?eans={ean}&venueId={venue_id}" + ) + assert response.status_code == 200 - response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products/ean?eans={product_offer.extraData['ean']}&venueId={venue.id}" - ) - - assert response.status_code == 200 assert response.json == { "products": [ { @@ -90,6 +104,7 @@ def test_valid_ean(self, client): def test_multiple_valid_eans(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() venue = venue_provider.venue + venue_id = venue.id product_offer = offers_factories.ThingOfferFactory( venue=venue, subcategoryId=subcategories.SUPPORT_PHYSIQUE_FILM.id, @@ -114,11 +129,16 @@ def test_multiple_valid_eans(self, client): extraData={"ean": "2345678901234"}, ) - response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products/ean?eans={product_offer.extraData['ean']},{product_offer_2.extraData['ean']},{product_offer_3.extraData['ean']}&venueId={venue.id}" - ) + ean_1 = product_offer.extraData["ean"] + ean_2 = product_offer_2.extraData["ean"] + ean_3 = product_offer_3.extraData["ean"] + + with testing.assert_num_queries(self.num_queries_success): + response = client.with_explicit_token(plain_api_key).get( + f"/public/offers/v1/products/ean?eans={ean_1},{ean_2},{ean_3}&venueId={venue_id}" + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == { "products": [ { @@ -202,76 +222,93 @@ def test_multiple_valid_eans(self, client): def test_get_newest_ean_product(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() venue = venue_provider.venue + venue_id = venue.id offers_factories.ThingOfferFactory(venue=venue, extraData={"ean": "1234567890123"}, isActive=False) newest_product_offer = offers_factories.ThingOfferFactory( venue=venue, extraData={"ean": "1234567890123"}, isActive=False ) + ean = newest_product_offer.extraData["ean"] - response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products/ean?eans={newest_product_offer.extraData['ean']}&venueId={venue.id}" - ) + with testing.assert_num_queries(self.num_queries_success): + response = client.with_explicit_token(plain_api_key).get( + f"/public/offers/v1/products/ean?eans={ean}&venueId={venue_id}" + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json["products"][0]["id"] == newest_product_offer.id def test_400_when_wrong_ean_format(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() venue = venue_provider.venue + venue_id = venue.id product_offer = offers_factories.ThingOfferFactory(venue=venue, extraData={"ean": "123456789"}) + ean = product_offer.extraData["ean"] - response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products/ean?eans={product_offer.extraData['ean']}&venueId={venue.id}" - ) + with testing.assert_num_queries(self.num_queries_400): + response = client.with_explicit_token(plain_api_key).get( + f"/public/offers/v1/products/ean?eans={ean}&venueId={venue_id}" + ) + + assert response.status_code == 400 - assert response.status_code == 400 assert response.json == {"eans": ["Only 13 characters EAN are accepted"]} def test_400_when_one_wrong_ean_format_in_list(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() venue = venue_provider.venue + venue_id = venue.id product_offer = offers_factories.ThingOfferFactory(venue=venue, extraData={"ean": "1234567891234"}) product_offer_2 = offers_factories.ThingOfferFactory(venue=venue, extraData={"ean": "0123456789123"}) product_offer_3 = offers_factories.ThingOfferFactory(venue=venue, extraData={"ean": "123455678"}) product_offer_4 = offers_factories.ThingOfferFactory(venue=venue, extraData={"ean": "0987654321123"}) + ean_1 = product_offer.extraData["ean"] + ean_2 = product_offer_2.extraData["ean"] + ean_3 = product_offer_3.extraData["ean"] + ean_4 = product_offer_4.extraData["ean"] - response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products/ean?eans={product_offer.extraData['ean']},{product_offer_2.extraData['ean']},{product_offer_3.extraData['ean']},{product_offer_4.extraData['ean']}&venueId={venue.id}" - ) + with testing.assert_num_queries(self.num_queries_400): + response = client.with_explicit_token(plain_api_key).get( + f"/public/offers/v1/products/ean?eans={ean_1},{ean_2},{ean_3},{ean_4}&venueId={venue_id}" + ) + assert response.status_code == 400 - assert response.status_code == 400 assert response.json == {"eans": ["Only 13 characters EAN are accepted"]} def test_400_when_missing_venue_id(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() venue = venue_provider.venue product_offer = offers_factories.ThingOfferFactory(venue=venue, extraData={"ean": "1234567891234"}) + ean = product_offer.extraData["ean"] - response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products/ean?eans={product_offer.extraData['ean']}" - ) + with testing.assert_num_queries(self.num_queries_400): + response = client.with_explicit_token(plain_api_key).get(f"/public/offers/v1/products/ean?eans={ean}") + + assert response.status_code == 400 - assert response.status_code == 400 assert response.json == {"venueId": ["field required"]} def test_no_404_when_ean_not_found(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() venue = venue_provider.venue + venue_id = venue.id offers_factories.ThingOfferFactory( venue=venue, description="Un livre de contrepèterie", name="Vieux motard que jamais", ) - response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products/ean?eans=1234567890123&venueId={venue.id}" - ) + with testing.assert_num_queries(self.num_queries_success): + response = client.with_explicit_token(plain_api_key).get( + f"/public/offers/v1/products/ean?eans=1234567890123&venueId={venue_id}" + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == {"products": []} def test_200_when_one_ean_in_list_not_found(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() venue = venue_provider.venue + venue_id = venue.id product_offer = offers_factories.ThingOfferFactory( venue=venue, @@ -280,12 +317,14 @@ def test_200_when_one_ean_in_list_not_found(self, client): name="Vieux motard que jamais", extraData={"ean": "1234567890123"}, ) + ean = product_offer.extraData["ean"] - response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products/ean?eans={product_offer.extraData['ean']},0123456789123&venueId={venue.id}" - ) + with testing.assert_num_queries(self.num_queries_success): + response = client.with_explicit_token(plain_api_key).get( + f"/public/offers/v1/products/ean?eans={ean},0123456789123&venueId={venue_id}" + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == { "products": [ { @@ -319,6 +358,7 @@ def test_200_when_one_ean_in_list_not_found(self, client): def test_200_when_none_disabilities(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() venue = venue_provider.venue + venue_id = venue.id product_offer = offers_factories.ThingOfferFactory( venue=venue, @@ -328,12 +368,14 @@ def test_200_when_none_disabilities(self, client): visualDisabilityCompliant=None, extraData={"ean": "1234567890123"}, ) + ean = product_offer.extraData["ean"] - response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products/ean?eans={product_offer.extraData['ean']}&venueId={venue.id}" - ) + with testing.assert_num_queries(self.num_queries_success): + response = client.with_explicit_token(plain_api_key).get( + f"/public/offers/v1/products/ean?eans={ean}&venueId={venue_id}" + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json["products"][0]["accessibility"] == { "audioDisabilityCompliant": None, "mentalDisabilityCompliant": None, @@ -344,10 +386,14 @@ def test_200_when_none_disabilities(self, client): def test_400_when_eans_list_is_empty(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() venue = venue_provider.venue + venue_id = venue.id offers_factories.OfferFactory(venue=venue) - response = client.with_explicit_token(plain_api_key).get(f"/public/offers/v1/products/ean?venueId={venue.id}") + with testing.assert_num_queries(self.num_queries_400): + response = client.with_explicit_token(plain_api_key).get( + f"/public/offers/v1/products/ean?venueId={venue_id}" + ) + assert response.status_code == 400 - assert response.status_code == 400 assert response.json == {"eans": ["field required"]} diff --git a/api/tests/routes/public/individual_offers/v1/get_product_categories_test.py b/api/tests/routes/public/individual_offers/v1/get_product_categories_test.py index b956e9e0ce4..764a6552dd2 100644 --- a/api/tests/routes/public/individual_offers/v1/get_product_categories_test.py +++ b/api/tests/routes/public/individual_offers/v1/get_product_categories_test.py @@ -1,5 +1,6 @@ import pytest +from pcapi.core import testing from pcapi.routes.public.individual_offers.v1.serialization import ALLOWED_PRODUCT_SUBCATEGORIES from tests.routes.public.helpers import PublicAPIEndpointBaseHelper @@ -12,12 +13,16 @@ class GetProductCategoriesTest(PublicAPIEndpointBaseHelper): endpoint_url = "/public/offers/v1/products/categories" endpoint_method = "get" + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + def test_returns_all_selectable_categories(self, client): plain_api_key, _ = self.setup_provider() - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 - assert response.status_code == 200 assert set(subcategory["id"] for subcategory in response.json) == set( subcategory.id for subcategory in ALLOWED_PRODUCT_SUBCATEGORIES ) @@ -25,9 +30,10 @@ def test_returns_all_selectable_categories(self, client): def test_category_serialization(self, client): plain_api_key, _ = self.setup_provider() - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(self.endpoint_url) + assert response.status_code == 200 - assert response.status_code == 200 assert all( {"id", "conditionalFields", "locationType"} == set(category_response.keys()) for category_response in response.json diff --git a/api/tests/routes/public/individual_offers/v1/get_product_test.py b/api/tests/routes/public/individual_offers/v1/get_product_test.py index ca73253b1df..dc62a27abc2 100644 --- a/api/tests/routes/public/individual_offers/v1/get_product_test.py +++ b/api/tests/routes/public/individual_offers/v1/get_product_test.py @@ -18,32 +18,40 @@ class GetProductTest(PublicAPIVenueEndpointHelper): endpoint_method = "get" default_path_params = {"product_id": 1} + num_queries = 1 # select api_key, offerer and provider + num_queries += 1 # select features + num_queries += 1 # select offers + def test_should_raise_404_because_has_no_access_to_venue(self, client): plain_api_key, _ = self.setup_provider() venue = self.setup_venue() - product_offer = offers_factories.ThingOfferFactory( + product_offer_id = offers_factories.ThingOfferFactory( venue=venue, description="Un livre de contrepèterie", name="Vieux motard que jamais", idAtProvider="provider_id_at_provider", - ) - - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(product_id=product_offer.id)) + ).id - assert response.status_code == 404 + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url.format(product_id=product_offer_id) + ) + assert response.status_code == 404 def test_should_raise_404_because_venue_provider_is_inactive(self, client): plain_api_key, venue_provider = self.setup_inactive_venue_provider() - product_offer = offers_factories.ThingOfferFactory( + product_offer_id = offers_factories.ThingOfferFactory( venue=venue_provider.venue, description="Un livre de contrepèterie", name="Vieux motard que jamais", idAtProvider="provider_id_at_provider", - ) + ).id - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(product_id=product_offer.id)) - - assert response.status_code == 404 + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url.format(product_id=product_offer_id) + ) + assert response.status_code == 404 def test_product_without_stock(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() @@ -54,10 +62,14 @@ def test_product_without_stock(self, client): name="Vieux motard que jamais", idAtProvider="provider_id_at_provider", ) + product_offer_id = product_offer.id - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(product_id=product_offer.id)) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url.format(product_id=product_offer_id) + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == { "bookingContact": None, "bookingEmail": None, @@ -87,12 +99,16 @@ def test_books_can_be_retrieved(self, client): product_offer = offers_factories.ThingOfferFactory( venue=venue, subcategoryId=subcategories.LIVRE_PAPIER.id, extraData=None ) + product_offer_id = product_offer.id # This overpriced stock can be removed once all stocks have a price under 300 € offers_factories.StockFactory(offer=product_offer, price=decimal.Decimal("400.12")) - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(product_id=product_offer.id)) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url.format(product_id=product_offer_id) + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json["categoryRelatedFields"] == { "author": None, "category": "LIVRE_PAPIER", @@ -103,14 +119,17 @@ def test_books_can_be_retrieved(self, client): def test_product_with_not_selectable_category_can_be_retrieved(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() venue = venue_provider.venue - product_offer = offers_factories.ThingOfferFactory( + product_offer_id = offers_factories.ThingOfferFactory( venue=venue, subcategoryId=subcategories.ABO_LUDOTHEQUE.id, - ) + ).id - response = client.with_explicit_token(plain_api_key).get(self.endpoint_url.format(product_id=product_offer.id)) + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get( + self.endpoint_url.format(product_id=product_offer_id) + ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json["categoryRelatedFields"] == {"category": "ABO_LUDOTHEQUE"} def test_product_with_stock_and_image(self, client): @@ -125,11 +144,7 @@ def test_product_with_stock_and_image(self, client): mediation = offers_factories.MediationFactory(offer=product_offer, credit="Ph. Oto") product_offer_id = product_offer.id - num_query = 1 # retrieve API key - num_query += 1 # retrieve offer - num_query += 1 # retrieve feature_flags for api key validation - - with testing.assert_num_queries(num_query): + with testing.assert_num_queries(self.num_queries): response = client.with_explicit_token(plain_api_key).get(f"/public/offers/v1/products/{product_offer_id}") assert response.status_code == 200 @@ -148,9 +163,9 @@ def test_product_with_stock_and_image(self, client): def test_404_when_requesting_an_event(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() venue = venue_provider.venue - event_offer = offers_factories.EventOfferFactory(venue=venue) - - response = client.with_explicit_token(plain_api_key).get(f"/public/offers/v1/products/{event_offer.id}") + event_offer_id = offers_factories.EventOfferFactory(venue=venue).id - assert response.status_code == 404 + with testing.assert_num_queries(self.num_queries): + response = client.with_explicit_token(plain_api_key).get(f"/public/offers/v1/products/{event_offer_id}") + assert response.status_code == 404 assert response.json == {"product_id": ["The product offer could not be found"]} diff --git a/api/tests/routes/public/individual_offers/v1/get_products_test.py b/api/tests/routes/public/individual_offers/v1/get_products_test.py index e456b93e4b6..d513f7d731c 100644 --- a/api/tests/routes/public/individual_offers/v1/get_products_test.py +++ b/api/tests/routes/public/individual_offers/v1/get_products_test.py @@ -11,41 +11,52 @@ class GetProductsTest(PublicAPIVenueEndpointHelper): endpoint_url = "/public/offers/v1/products" endpoint_method = "get" + num_queries_400 = 1 # select api_key, offerer and provider + num_queries_400 += 1 # select features + num_queries_404 = num_queries_400 + 1 # check venue_provider exists + num_queries_success = num_queries_404 + 1 # select offer + def test_should_raise_404_because_has_no_access_to_venue(self, client): plain_api_key, _ = self.setup_provider() - venue = self.setup_venue() - response = client.with_explicit_token(plain_api_key).get("%s?venueId=%s" % (self.endpoint_url, venue.id)) - assert response.status_code == 404 + venue_id = self.setup_venue().id + + with testing.assert_num_queries(self.num_queries_404): + response = client.with_explicit_token(plain_api_key).get("%s?venueId=%s" % (self.endpoint_url, venue_id)) + assert response.status_code == 404 def test_should_raise_404_because_venue_provider_is_inactive(self, client): plain_api_key, venue_provider = self.setup_inactive_venue_provider() - response = client.with_explicit_token(plain_api_key).get( - "%s?venueId=%s" % (self.endpoint_url, venue_provider.venueId) - ) - assert response.status_code == 404 + venue_id = venue_provider.venueId + + with testing.assert_num_queries(self.num_queries_404): + response = client.with_explicit_token(plain_api_key).get("%s?venueId=%s" % (self.endpoint_url, venue_id)) + assert response.status_code == 404 def test_get_first_page(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() offers = offers_factories.ThingOfferFactory.create_batch(12, venue=venue_provider.venue) - with testing.assert_no_duplicated_queries(): + venue_id = venue_provider.venueId + with testing.assert_num_queries(self.num_queries_success): response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products?venueId={venue_provider.venueId}&limit=5" + f"/public/offers/v1/products?venueId={venue_id}&limit=5" ) + assert response.status_code == 200 - assert response.status_code == 200 assert [product["id"] for product in response.json["products"]] == [offer.id for offer in offers[0:5]] def test_get_last_page(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() offers = offers_factories.ThingOfferFactory.create_batch(12, venue=venue_provider.venue) - with testing.assert_no_duplicated_queries(): + venue_id = venue_provider.venueId + first_index = offers[10].id + with testing.assert_num_queries(self.num_queries_success): response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products?venueId={venue_provider.venueId}&limit=5&firstIndex={int(offers[10].id)}" + f"/public/offers/v1/products?venueId={venue_id}&limit=5&firstIndex={first_index}" ) + assert response.status_code == 200 - assert response.status_code == 200 assert [product["id"] for product in response.json["products"]] == [offer.id for offer in offers[10:12]] def test_get_product_using_ids_at_provider(self, client): @@ -58,12 +69,13 @@ def test_get_product_using_ids_at_provider(self, client): offer_2 = offers_factories.OfferFactory(idAtProvider=id_at_provider_2, venue=venue_provider.venue) offers_factories.OfferFactory(idAtProvider=id_at_provider_3, venue=venue_provider.venue) - with testing.assert_no_duplicated_queries(): + venue_id = venue_provider.venueId + with testing.assert_num_queries(self.num_queries_success): response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products?venueId={venue_provider.venueId}&limit=5&idsAtProvider={id_at_provider_1},{id_at_provider_2}" + f"/public/offers/v1/products?venueId={venue_id}&limit=5&idsAtProvider={id_at_provider_1},{id_at_provider_2}" ) + assert response.status_code == 200 - assert response.status_code == 200 assert [product["id"] for product in response.json["products"]] == [offer_1.id, offer_2.id] def test_should_return_a_200_event_if_the_offer_name_is_longer_than_90_signs_long(self, client): @@ -72,34 +84,34 @@ def test_should_return_a_200_event_if_the_offer_name_is_longer_than_90_signs_lon "Bébé, apprends-moi à devenir ton parent : naissance, sommeil, attachement, pleurs, développement" ) offers_factories.ThingOfferFactory(venue=venue_provider.venue, name=name_more_than_90_signs_long) + venue_id = venue_provider.venueId - with testing.assert_no_duplicated_queries(): - response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products?venueId={venue_provider.venueId}" - ) + with testing.assert_num_queries(self.num_queries_success): + response = client.with_explicit_token(plain_api_key).get(f"/public/offers/v1/products?venueId={venue_id}") + assert response.status_code == 200 - assert response.status_code == 200 assert response.json["products"][0]["name"] == name_more_than_90_signs_long def test_404_when_the_page_is_too_high(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() - with testing.assert_no_duplicated_queries(): + venue_id = venue_provider.venueId + with testing.assert_num_queries(self.num_queries_success): response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products?venueId={venue_provider.venueId}&limit=5&firstIndex=1" + f"/public/offers/v1/products?venueId={venue_id}&limit=5&firstIndex=1" ) - assert response.status_code == 200 + assert response.status_code == 200 assert response.json == {"products": []} def test_200_for_first_page_if_no_items(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() - - with testing.assert_no_duplicated_queries(): + venue_id = venue_provider.venueId + with testing.assert_num_queries(self.num_queries_success): response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products?venueId={venue_provider.venueId}&limit=5" + f"/public/offers/v1/products?venueId={venue_id}&limit=5" ) + assert response.status_code == 200 - assert response.status_code == 200 assert response.json == { "products": [], } @@ -107,12 +119,13 @@ def test_200_for_first_page_if_no_items(self, client): def test_400_when_limit_is_too_high(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() - with testing.assert_no_duplicated_queries(): + venue_id = venue_provider.venueId + with testing.assert_num_queries(self.num_queries_400): response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products?venueId={venue_provider.venueId}&limit=51" + f"/public/offers/v1/products?venueId={venue_id}&limit=51" ) + assert response.status_code == 400 - assert response.status_code == 400 assert response.json == {"limit": ["ensure this value is less than or equal to 50"]} def test_get_filtered_venue_offer(self, client): @@ -121,19 +134,19 @@ def test_get_filtered_venue_offer(self, client): offers_factories.ThingOfferFactory( venue__managingOfferer=venue_provider.venue.managingOfferer ) # offer attached to other venue + venue_id = venue_provider.venueId - with testing.assert_no_duplicated_queries(): - response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products?venueId={venue_provider.venueId}" - ) + with testing.assert_num_queries(self.num_queries_success): + response = client.with_explicit_token(plain_api_key).get(f"/public/offers/v1/products?venueId={venue_id}") + assert response.status_code == 200 - assert response.status_code == 200 assert [product["id"] for product in response.json["products"]] == [offer.id] def test_get_offer_with_more_than_1000_description(self, client): plain_api_key, venue_provider = self.setup_active_venue_provider() + venue_id = venue_provider.venueId offers_factories.ThingOfferFactory(venue=venue_provider.venue, description="a" * 1001) - response = client.with_explicit_token(plain_api_key).get( - f"/public/offers/v1/products?venueId={venue_provider.venueId}" - ) - assert response.status_code == 200 + + with testing.assert_num_queries(self.num_queries_success): + response = client.with_explicit_token(plain_api_key).get(f"/public/offers/v1/products?venueId={venue_id}") + assert response.status_code == 200 diff --git a/api/tests/routes/public/individual_offers/v1/patch_product_test.py b/api/tests/routes/public/individual_offers/v1/patch_product_test.py index de12c311a8d..a86c0f30fe4 100644 --- a/api/tests/routes/public/individual_offers/v1/patch_product_test.py +++ b/api/tests/routes/public/individual_offers/v1/patch_product_test.py @@ -1,6 +1,5 @@ import datetime -from flask import url_for import pytest from pcapi import settings @@ -375,13 +374,13 @@ def test_update_name_and_description(self, client): # 7. reload offer and related data (before serialization) with assert_num_queries(7): response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).patch( - url_for("public_api.edit_product"), + "/public/offers/v1/products", json={"offerId": offer_id, "name": new_name, "description": new_desc}, ) assert response.status_code == 200 - assert response.json["name"] == new_name - assert response.json["description"] == new_desc + assert response.json["name"] == new_name + assert response.json["description"] == new_desc db.session.refresh(product_offer) assert product_offer.name == new_name