from pathlib import Path from unittest.mock import patch import pytest from aiohttp import ClientSession from connectors import GestionSportsConnector def make_landing_request_success(aioresponses, connector, landing_response): aioresponses.get( connector.landing_url, status=200, headers={"Set-Cookie": "PHPSESSID=987512"}, body=landing_response, ) def make_login_request_fail(aioresponses, connector, login_failure_response): aioresponses.post( connector.login_url, status=200, payload=login_failure_response, ) def make_login_request_success(aioresponses, connector, login_success_response): aioresponses.post( connector.login_url, status=200, headers={"Set-Cookie": "COOK_COMPTE=e2be1;" "COOK_ID_CLUB=22;COOK_ID_USER=666"}, payload=login_success_response, ) def set_booking_request(aioresponses, connector, booking_response): aioresponses.post(connector.booking_url, status=200, payload=booking_response) def set_full_booking_requests_responses(aioresponses, connector, responses_list): make_landing_request_success(aioresponses, connector, responses_list[0]) make_login_request_success(aioresponses, connector, responses_list[1]) for response in responses_list[2:]: set_booking_request(aioresponses, connector, response) def set_ongoing_bookings_response( aioresponses, connector, user_bookings_get_response, user_bookings_post_response ): set_hash_response(aioresponses, connector, user_bookings_get_response) set_bookings_response(aioresponses, connector, user_bookings_post_response) def set_hash_response(aioresponses, connector, user_bookings_get_response): aioresponses.get( connector.user_bookings_url, status=200, body=user_bookings_get_response ) def set_bookings_response(aioresponses, connector, user_bookings_post_response): aioresponses.post( connector.user_bookings_url, status=200, payload=user_bookings_post_response ) def set_full_user_bookings_responses(aioresponses, connector, responses): make_landing_request_success(aioresponses, connector, responses[0]) make_login_request_success(aioresponses, connector, responses[1]) set_ongoing_bookings_response(aioresponses, connector, *responses[2:]) def set_cancellation_response(aioresponses, connector, response): aioresponses.post(connector.booking_cancellation_url, status=200, payload=response) def set_full_cancellation_by_id_responses(aioresponses, connector, responses): make_landing_request_success(aioresponses, connector, responses[0]) make_login_request_success(aioresponses, connector, responses[1]) set_hash_response(aioresponses, connector, responses[2]) set_cancellation_response(aioresponses, connector, responses[3]) def set_full_cancellation_responses(aioresponses, connector, responses): make_landing_request_success(aioresponses, connector, responses[0]) make_login_request_success(aioresponses, connector, responses[1]) # the request to get the hash is made twice set_hash_response(aioresponses, connector, responses[2]) set_hash_response(aioresponses, connector, responses[2]) set_bookings_response(aioresponses, connector, responses[3]) set_cancellation_response(aioresponses, connector, responses[4]) def test_urls(connector, club): base_url = club.booking_platform.url relative_urls = club.booking_platform.urls relative_landing_url = relative_urls.get("landing-page").path assert connector.landing_url == f"{base_url}/{relative_landing_url}" relative_login_url = relative_urls.get("login").path assert connector.login_url == f"{base_url}/{relative_login_url}" relative_booking_url = relative_urls.get("booking").path assert connector.booking_url == f"{base_url}/{relative_booking_url}" relative_user_bookings_url = relative_urls.get("user-bookings").path assert connector.user_bookings_url == f"{base_url}/{relative_user_bookings_url}" relative_cancel_url = relative_urls.get("cancellation").path assert connector.booking_cancellation_url == f"{base_url}/{relative_cancel_url}" @patch("config.get_resources_folder") def test_urls_payload_templates(mock_resources, club): path_to_resources = Path("some/path/to/resource") mock_resources.return_value = path_to_resources connector = GestionSportsConnector(club) relative_urls = club.booking_platform.urls login_payload = relative_urls.get("login").payload_template assert connector.login_template == path_to_resources / login_payload booking_payload = relative_urls.get("booking").payload_template assert connector.booking_template == path_to_resources / booking_payload user_bookings_payload = relative_urls.get("user-bookings").payload_template assert connector.user_bookings_template == path_to_resources / user_bookings_payload cancel_payload = relative_urls.get("cancellation").payload_template assert connector.booking_cancel_template == path_to_resources / cancel_payload @pytest.mark.asyncio async def test_landing_page(aioresponses, connector, landing_response): make_landing_request_success(aioresponses, connector, landing_response) async with ClientSession() as session: response = await connector.land(session) assert response.status == 200 assert response.cookies.get("PHPSESSID").value == "987512" assert await response.text() == landing_response @pytest.mark.asyncio async def test_login_success(aioresponses, connector, user, login_success_response): make_login_request_success(aioresponses, connector, login_success_response) async with ClientSession() as session: response = await connector.login(session, user) assert response.status == 200 assert response.cookies.get("COOK_COMPTE").value == "e2be1" assert response.cookies.get("COOK_ID_CLUB").value == "22" assert response.cookies.get("COOK_ID_USER").value == "666" assert await response.json() == login_success_response @pytest.mark.asyncio async def test_login_failure(aioresponses, connector, user, login_failure_response): make_login_request_fail(aioresponses, connector, login_failure_response) async with ClientSession() as session: response = await connector.login(session, user) assert response.status == 200 assert len(response.cookies) == 0 assert await response.json() == login_failure_response @pytest.mark.asyncio async def test_booking_success( aioresponses, connector, user, booking_filter, booking_success_from_start, ): set_full_booking_requests_responses( aioresponses, connector, booking_success_from_start ) court_booked = await connector.book(user, booking_filter) assert court_booked.id == 2 @pytest.mark.asyncio async def test_booking_failure( aioresponses, connector, user, booking_filter, booking_failure_from_start, ): set_full_booking_requests_responses( aioresponses, connector, booking_failure_from_start ) court_booked = await connector.book(user, booking_filter) assert court_booked is None @pytest.mark.asyncio async def test_get_ongoing_bookings( aioresponses, connector, user, user_bookings_get_response, user_bookings_list, ): set_ongoing_bookings_response( aioresponses, connector, user_bookings_get_response, user_bookings_list ) async with ClientSession() as session: bookings = await connector.get_ongoing_bookings(session) assert len(bookings) == 2 @pytest.mark.asyncio async def test_get_ongoing_bookings( aioresponses, connector, user, user_bookings_get_response, user_bookings_list, ): set_ongoing_bookings_response( aioresponses, connector, user_bookings_get_response, user_bookings_list ) async with ClientSession() as session: bookings = await connector.get_ongoing_bookings(session) assert len(bookings) == 2 @pytest.mark.asyncio async def test_has_user_ongoing_bookings( aioresponses, connector, user, user_has_ongoing_bookings_from_start, ): set_full_user_bookings_responses( aioresponses, connector, user_has_ongoing_bookings_from_start ) has_bookings = await connector.has_user_ongoing_booking(user) assert has_bookings @pytest.mark.asyncio async def test_has_user_ongoing_bookings( aioresponses, connector, user, user_has_no_ongoing_bookings_from_start, ): set_full_user_bookings_responses( aioresponses, connector, user_has_no_ongoing_bookings_from_start ) has_bookings = await connector.has_user_ongoing_booking(user) assert not has_bookings @pytest.mark.asyncio async def test_cancellation_request( aioresponses, connector, user_bookings_get_response, cancellation_response ): set_hash_response(aioresponses, connector, user_bookings_get_response) set_cancellation_response(aioresponses, connector, cancellation_response) async with ClientSession() as session: response = await connector.send_cancellation_request(session, 123) assert await response.json() == cancellation_response @pytest.mark.asyncio async def test_cancel_booking_id( aioresponses, connector, user, cancellation_by_id_from_start ): set_full_cancellation_by_id_responses( aioresponses, connector, cancellation_by_id_from_start ) response = await connector.cancel_booking_id(user, 132) assert await response.json() == cancellation_by_id_from_start[3] @pytest.mark.asyncio async def test_cancel_booking_success( aioresponses, connector, user, cancellation_success_booking_filter, cancellation_success_from_start, ): set_full_cancellation_responses( aioresponses, connector, cancellation_success_from_start ) response = await connector.cancel_booking(user, cancellation_success_booking_filter) assert await response.json() == cancellation_success_from_start[4]