def test_getReasons():
    # Test offline
    def app(request: httpx.Request) -> httpx.Response:
        assert (re.match(
            r"/v1/solar/entities/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/reasons",
            request.url.path,
        ) != None)

        path = Path("tests/fixtures/ordoclic/reasons.json")
        return httpx.Response(200, json=json.loads(path.read_text()))

    client = httpx.Client(transport=httpx.MockTransport(app))
    data_file = Path("tests/fixtures/ordoclic/reasons.json")
    data = json.loads(data_file.read_text())
    assert get_reasons("e9c4990e-711f-4af6-aee2-354de59c9e4e", client) == data

    # Test erreur HTTP
    def app(request: httpx.Request) -> httpx.Response:
        return httpx.Response(403, json={})

    client = httpx.Client(transport=httpx.MockTransport(app))
    assert get_reasons("e9c4990e-711f-4af6-aee2-354de59c9e4e", client) is None

    # Test timeout
    def app2(request: httpx.Request) -> httpx.Response:
        raise httpx.TimeoutException(message="Timeout", request=request)

    client = httpx.Client(transport=httpx.MockTransport(app2))
    assert get_reasons("e9c4990e-711f-4af6-aee2-354de59c9e4e", client) is None

    # Test online
    schema_file = Path("tests/fixtures/ordoclic/reasons.schema")
    schema = json.loads(schema_file.read_text())
    live_data = get_reasons("e9c4990e-711f-4af6-aee2-354de59c9e4e")
    validate(instance=live_data, schema=schema)
Beispiel #2
0
def test_search():
    # Test offline
    def app(request: httpx.Request) -> httpx.Response:
        assert request.url.path == "/api/Organizations/public/covid"
        path = Path("tests/fixtures/avecmondoc/search-result.json")
        return httpx.Response(200,
                              json=json.loads(path.read_text(encoding="utf8")))

    client = httpx.Client(transport=httpx.MockTransport(app))
    data_file = Path("tests/fixtures/avecmondoc/search-result.json")
    data = json.loads(data_file.read_text(encoding="utf8"))
    assert search(client=client) == data

    # Test erreur HTTP
    def response_unavailable(request: httpx.Request) -> httpx.Response:
        return httpx.Response(403, json={})

    client = httpx.Client(transport=httpx.MockTransport(response_unavailable))
    assert search(client) is None

    # Test timeout
    def response_timeout(request: httpx.Request) -> httpx.Response:
        raise httpx.TimeoutException(message="Timeout", request=request)

    client = httpx.Client(transport=httpx.MockTransport(response_timeout))
    assert search(client) is None

    # Test online
    schema_file = Path("tests/fixtures/avecmondoc/search-result.schema")
    schema = json.loads(schema_file.read_text())
    live_data = search()
    if live_data:
        validate(instance=live_data, schema=schema)
Beispiel #3
0
def test_keldoc_requests():
    # Timeout test
    def app_timeout(request: httpx.Request) -> httpx.Response:
        raise httpx.TimeoutException(message="Timeout", request=request)

    client = httpx.Client(transport=httpx.MockTransport(app_timeout))
    scraper = KeldocCenterScraper(session=client)
    assert not scraper.send_keldoc_request("https://keldoc.com")

    # Status test
    def app_status(request: httpx.Request) -> httpx.Response:
        res = httpx.Response(403, json={})
        raise httpx.HTTPStatusError(message="status error",
                                    request=request,
                                    response=res)

    client = httpx.Client(transport=httpx.MockTransport(app_status))
    scraper = KeldocCenterScraper(session=client)
    assert not scraper.send_keldoc_request("https://keldoc.com")

    # Remote error test
    def app_remote_error(request: httpx.Request) -> httpx.Response:
        res = httpx.Response(403, json={})
        raise httpx.RemoteProtocolError(message="status error",
                                        request=request)

    client = httpx.Client(transport=httpx.MockTransport(app_remote_error))
    scraper = KeldocCenterScraper(session=client)
    assert not scraper.send_keldoc_request("https://keldoc.com")
Beispiel #4
0
def test_fetch():
    def app(requested: httpx.Request) -> httpx.Response:
        assert "User-Agent" in requested.headers
        return httpx.Response(responsecode, json=slots)

    bimedoc.PLATFORM_ENABLED = True

    center_data = dict()
    center_data = json.load(io.open(TEST_CENTRE_INFO, "r", encoding="utf-8-sig"))

    center_info = CenterInfo.from_csv_data(center_data)

    # This center has availabilities and should return a date, non null appointment_count and vaccines
    request = ScraperRequest(
        "https://server.bimedoc.com/vmd/pharmacy-with-slots/9cf46288-0080-4a8d-8856-8e9998ced9f7?start_date=2021-08-10&end_date=2021-08-17",
        "2021-08-10",
        center_info,
    )
    slots = json.load(io.open(Path("tests", "fixtures", "bimedoc", "slots_available.json"), "r", encoding="utf-8-sig"))

    # Response 200
    responsecode = 200
    client = httpx.Client(transport=httpx.MockTransport(app))
    center_with_availability = bimedoc.BimedocSlots(client=client)
    response = center_with_availability.fetch(request)
    assert response == "2021-08-11T08:15:00Z"

    # Response 403

    responsecode = 403
    client = httpx.Client(transport=httpx.MockTransport(app))
    center_with_availability = bimedoc.BimedocSlots(client=client)
    with pytest.raises(Exception):
        response = center_with_availability.fetch(request)
        assert response == None
def test_fetch():
    def app(requested: httpx.Request) -> httpx.Response:
        assert "User-Agent" in requested.headers
        return httpx.Response(responsecode, json=slots)

    valwin.PLATFORM_ENABLED = True

    center_data = dict()
    center_data = json.load(io.open(TEST_CENTRE_INFO, "r", encoding="utf-8-sig"))

    center_info = CenterInfo.from_csv_data(center_data)

    # This center has availabilities and should return a date, non null appointment_count and vaccines
    request = ScraperRequest(
        "https://pharma-api.epharmacie.pro/global/api/meetings/v2/pharmabest75-plateau-lyon/slots",
        "2021-08-10",
        center_info,
    )
    slots = json.load(io.open(Path("tests", "fixtures", "valwin", "slots_available.json"), "r", encoding="utf-8-sig"))

    # Response 200
    responsecode = 200
    client = httpx.Client(transport=httpx.MockTransport(app))
    center_with_availability = valwin.Slots(client=client)
    response = center_with_availability.fetch(request)
    assert response == "2021-09-17T10:00:00"

    # Response 403

    responsecode = 403
    client = httpx.Client(transport=httpx.MockTransport(app))
    center_with_availability = valwin.Slots(client=client)
    with pytest.raises(Exception):
        response = center_with_availability.fetch(request)
        assert response == None
Beispiel #6
0
async def test_mounted_transport():
    transport = httpx.MockTransport(unmounted)
    mounts = {"custom://": httpx.MockTransport(mounted)}

    async with httpx.AsyncClient(transport=transport, mounts=mounts) as client:
        response = await client.get("https://www.example.com")
        assert response.status_code == 200
        assert response.json() == {"app": "unmounted"}

        response = await client.get("custom://www.example.com")
        assert response.status_code == 200
        assert response.json() == {"app": "mounted"}
def test_fetch():
    mesoigner.PLATFORM_ENABLED = True

    center_data = dict()
    center_data = json.load(
        io.open(TEST_CENTRE_INFO, "r", encoding="utf-8-sig"))

    center_info = CenterInfo.from_csv_data(center_data)

    # This center has availabilities and should return a date, non null appointment_count and vaccines
    request = ScraperRequest(
        "https://pharmacie-des-pyrenees.pharmaxv.fr/rendez-vous/vaccination/269-vaccination-covid-19/pre-inscription",
        "2021-06-16",
        center_info,
    )
    slots = json.load(
        io.open(Path("tests", "fixtures", "mesoigner", "slots_available.json"),
                "r",
                encoding="utf-8-sig"))

    def app(requested: httpx.Request) -> httpx.Response:
        assert "User-Agent" in requested.headers

        return httpx.Response(200, json=slots)

    client = httpx.Client(transport=httpx.MockTransport(app))

    center_with_availability = mesoigner.MesoignerSlots(client=client)

    response = center_with_availability.fetch(request)
    assert response == "2021-06-16T14:50:00+02:00"
Beispiel #8
0
def test_keldoc_timeout():
    center1_url = "https://vaccination-covid.keldoc.com/centre-hospitalier-regional/foo/bar?specialty=no"

    def app(request: httpx.Request) -> httpx.Response:
        if request.url.path == "/centre-hospitalier-regional/foo/bar":
            raise TimeoutError
        if request.url.path == "/api/patients/v2/searches/resource":
            raise TimeoutError
        if request.url.path == "/api/patients/v2/clinics/1/specialties/1/cabinets":
            raise TimeoutError
        return httpx.Response(200, json={})

    client = httpx.Client(transport=httpx.MockTransport(app))
    request = ScraperRequest(center1_url, "2020-04-04")
    test_center_1 = KeldocCenter(request, client=client)

    # Test center info TA
    with pytest.raises(TimeoutError):
        test_center_1.parse_resource()
    with pytest.raises(TimeoutError):
        test_center_1.fetch_center_data()

    # Test cabinet TA
    test_center_1.id = 1
    test_center_1.vaccine_specialties = [1]
    with pytest.raises(TimeoutError):
        test_center_1.fetch_vaccine_cabinets()
    assert not test_center_1.vaccine_cabinets
Beispiel #9
0
def test_blocked_by_doctolib_par_availabilities():
    # Cas de base.

    start_date = "2021-04-03"
    base_url = "https://partners.doctolib.fr/centre-de-vaccinations-internationales/ville1/centre1?pid=practice-165752&enable_cookies_consent=1"  # noqa
    scrap_request = ScraperRequest(base_url, start_date)

    def app(request: httpx.Request) -> httpx.Response:
        assert "User-Agent" in request.headers

        if request.url.path == "/booking/centre1.json":
            path = Path("tests", "fixtures", "doctolib", "basic-booking.json")
            return httpx.Response(200, json=json.loads(path.read_text()))

        return httpx.Response(403, text="Anti dDos")

    client = httpx.Client(transport=httpx.MockTransport(app))
    slots = DoctolibSlots(client=client, cooldown_interval=0)

    error = None
    try:
        next_date = slots.fetch(scrap_request)
    except Exception as e:
        error = e
    assert True is isinstance(error, BlockedByDoctolibError)
Beispiel #10
0
def test_doctolib_motive_categories():
    # Certains centres opèrent une distinction de motifs pour les professionnels de santé /
    # non professionnels de santé.
    # On doit gérer ces cas-là.

    start_date = "2021-04-03"
    base_url = "https://partners.doctolib.fr/centre-de-vaccinations-internationales/ville1/centre1?pid=practice-165752&enable_cookies_consent=1"  # noqa
    scrap_request = ScraperRequest(base_url, start_date)

    def app(request: httpx.Request) -> httpx.Response:
        assert "User-Agent" in request.headers

        if request.url.path == "/booking/centre1.json":
            path = Path("tests", "fixtures", "doctolib",
                        "category-booking.json")
            return httpx.Response(200, json=json.loads(path.read_text()))

        assert request.url.path == "/availabilities.json"
        path = Path("tests", "fixtures", "doctolib",
                    "category-availabilities.json")
        return httpx.Response(200, json=json.loads(path.read_text()))

    client = httpx.Client(transport=httpx.MockTransport(app))
    slots = DoctolibSlots(client=client, cooldown_interval=0)

    next_date = slots.fetch(scrap_request)
    assert next_date == '2021-04-10'
def test_keldoc_parse_center():
    center1_url = "https://vaccination-covid.keldoc.com/centre-hospitalier-regional/lorient-56100/groupe-hospitalier-bretagne-sud-lorient-hopital-du-scorff?cabinet=16913&specialty=144"
    path = Path("tests", "fixtures", "keldoc", "center1-cabinet-16913.json")
    input_data = json.loads(path.read_text(encoding="utf-8"))
    request = ScraperRequest(center1_url, "2020-04-04", input_data=input_data)
    client = httpx.Client(transport=httpx.MockTransport(app_center1))
    test_center_1 = KeldocCenter(request, client=client)
    # Fetch vaccine cabinets
    cabinets = filter_vaccine_motives(test_center_1.appointment_motives)
    agendas = []
    for match in cabinets:
        agendas.extend(match.get("agendas"))
    agendas = list(set(agendas))
    assert agendas == [51414, 49335]

    # Fetch motives
    motives = filter_vaccine_motives(test_center_1.appointment_motives)

    assert motives == json.loads(
        Path("tests", "fixtures", "keldoc",
             "center1-motives.json").read_text())

    # Find first availability date
    fake_now = dt.datetime(2020, 4, 4, 8, 15)
    with mock_datetime_now(fake_now):
        date, count = test_center_1.find_first_availability("2020-04-04")
    assert not date
    test_center_1.vaccine_motives = motives
    with mock_datetime_now(fake_now):
        date, count = test_center_1.find_first_availability("2020-04-04")
    tz = datetime.timezone(datetime.timedelta(seconds=7200))
    assert date == datetime.datetime(2021, 4, 20, 16, 55, tzinfo=tz)
Beispiel #12
0
def test_blocked_by_doctolib_par_centre():
    # Cas de base.

    start_date = "2021-04-03"
    base_url = "https://partners.doctolib.fr/centre-de-vaccinations-internationales/ville1/centre1?pid=practice-165752&enable_cookies_consent=1"  # noqa
    scrap_request = ScraperRequest(base_url, start_date)

    def app(request: httpx.Request) -> httpx.Response:
        assert "User-Agent" in request.headers

        if request.url.path == "/booking/centre1.json":
            path = Path("tests", "fixtures", "doctolib", "basic-booking.json")
            return httpx.Response(403, text="Anti dDos")

        assert request.url.path == "/availabilities.json"
        params = dict(httpx.QueryParams(request.url.query))
        assert params == {
            "start_date": start_date,
            "visit_motive_ids": "2",
            "agenda_ids": "3",
            "insurance_sector": "public",
            "practice_ids": "4",
            "destroy_temporary": "true",
            "limit": str(DOCTOLIB_CONF.pagination["pages"]),
        }
        path = Path("tests", "fixtures", "doctolib", "basic-availabilities.json")
        return httpx.Response(200, json=json.loads(path.read_text(encoding="utf-8")))

    client = httpx.Client(transport=httpx.MockTransport(app))
    slots = DoctolibSlots(client=client, cooldown_interval=0)

    with pytest.raises(BlockedByDoctolibError):
        slots.fetch(scrap_request)
Beispiel #13
0
async def test_async_event_hooks():
    events = []

    async def on_request(request):
        events.append({"event": "request", "headers": dict(request.headers)})

    async def on_response(response):
        events.append({"event": "response", "headers": dict(response.headers)})

    event_hooks = {"request": [on_request], "response": [on_response]}

    async with httpx.AsyncClient(
        event_hooks=event_hooks, transport=httpx.MockTransport(app)
    ) as http:
        await http.get("http://127.0.0.1:8000/", auth=("username", "password"))

    assert events == [
        {
            "event": "request",
            "headers": {
                "host": "127.0.0.1:8000",
                "user-agent": f"python-httpx/{httpx.__version__}",
                "accept": "*/*",
                "accept-encoding": "gzip, deflate, br",
                "connection": "keep-alive",
                "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
            },
        },
        {
            "event": "response",
            "headers": {"server": "testserver"},
        },
    ]
Beispiel #14
0
def test_fragment_redirect():
    client = httpx.Client(transport=httpx.MockTransport(redirects))
    response = client.get("https://example.org/relative_redirect#fragment",
                          follow_redirects=True)
    assert response.status_code == httpx.codes.OK
    assert response.url == "https://example.org/#fragment"
    assert len(response.history) == 1
Beispiel #15
0
def test_redirect_302():
    client = httpx.Client(transport=httpx.MockTransport(redirects))
    response = client.post("https://example.org/redirect_302",
                           follow_redirects=True)
    assert response.status_code == httpx.codes.OK
    assert response.url == "https://example.org/"
    assert len(response.history) == 1
Beispiel #16
0
def test_doctolib():
    # Cas de base.

    start_date = "2021-04-03"
    rdv_site_web = "https://partners.doctolib.fr/centre-de-vaccinations-internationales/ville1/centre1?pid=practice-165752&enable_cookies_consent=1"  # noqa

    def app(request: httpx.Request) -> httpx.Response:
        assert "X-Covid-Tracker-Key" in request.headers

        if request.url.path == "/booking/centre1.json":
            path = Path("tests", "fixtures", "doctolib", "basic-booking.json")
            return httpx.Response(200, json=json.loads(path.read_text()))

        assert request.url.path == "/availabilities.json"
        params = dict(httpx.QueryParams(request.url.query))
        assert params == {
            "start_date": start_date,
            "visit_motive_ids": "2",
            "agenda_ids": "3",
            "insurance_sector": "public",
            "practice_ids": "4",
            "destroy_temporary": "true",
            "limit": str(DOCTOLIB_SLOT_LIMIT),
        }
        path = Path("tests", "fixtures", "doctolib",
                    "basic-availabilities.json")
        return httpx.Response(200, json=json.loads(path.read_text()))

    client = httpx.Client(transport=httpx.MockTransport(app))
    slots = DoctolibSlots(client=client)

    next_date = slots.fetch(rdv_site_web, start_date)
    assert next_date == "2021-04-10"
Beispiel #17
0
def test_blocked_by_doctolib_par_availabilities():
    # Cas de base.

    start_date = "2021-04-03"
    base_url = "https://partners.doctolib.fr/centre-de-vaccinations-internationales/ville1/centre1?pid=practice-165752&enable_cookies_consent=1"  # noqa
    center_info = CenterInfo(departement="07",
                             nom="Mon Super Centre",
                             url=base_url)
    scrap_request = ScraperRequest(base_url, start_date, center_info)

    def app(request: httpx.Request) -> httpx.Response:
        assert "User-Agent" in request.headers

        if request.url.path == "/booking/centre1.json":
            path = Path("tests", "fixtures", "doctolib", "basic-booking.json")
            return httpx.Response(200,
                                  json=json.loads(
                                      path.read_text(encoding="utf-8")))

        return httpx.Response(403, text="Anti dDos")

    client = httpx.Client(transport=httpx.MockTransport(app))
    slots = DoctolibSlots(client=client, cooldown_interval=0)

    with pytest.raises(Blocked403):
        slots.fetch(scrap_request)
def test_keldoc_parse_complex():
    center1_url = "https://vaccination-covid.keldoc.com/centre-hospitalier-regional/lorient-56100/groupe-hospitalier-bretagne-sud-lorient-hopital-du-scorff?cabinet=16913&specialty=144"
    path = Path("tests", "fixtures", "keldoc", "center1-cabinet-16913.json")
    input_data = json.loads(path.read_text(encoding="utf-8"))
    request = ScraperRequest(center1_url, "2020-04-04", input_data=input_data)
    client = httpx.Client(transport=httpx.MockTransport(app_center1))
    test_center_1 = KeldocCenter(request, client=client)
    # Fetch vaccine cabinets
    cabinets = filter_vaccine_motives(test_center_1.appointment_motives)

    appointments = []
    data = {
        "availabilities": {
            "2021-04-20": [
                {
                    "start_time": "2021-04-20T16:53:00.000000+0200"
                },
                {
                    "start_time": "2021-04-20T16:50:00.000000+0200"
                },
                {
                    "start_time": "2021-04-20T18:59:59.000000+0200"
                },
            ],
            "2021-04-21": [{
                "start_time": "2021-04-21T08:12:12.000000+0200"
            }],
        }
    }
    availability, new_count = parse_keldoc_availability(
        test_center_1, data, appointments)
    assert availability.isoformat() == "2021-04-20T16:50:00+02:00"
Beispiel #19
0
def test_cross_domain_redirect_with_auth_header():
    client = httpx.Client(transport=httpx.MockTransport(redirects))
    url = "https://example.com/cross_domain"
    headers = {"Authorization": "abc"}
    response = client.get(url, headers=headers, follow_redirects=True)
    assert response.url == "https://example.org/cross_domain_target"
    assert "authorization" not in response.json()["headers"]
Beispiel #20
0
def test_client_decode_text_using_explicit_encoding():
    # Ensure that a 'default_encoding="..."' on the response is used for text decoding
    # when no "Content-Type: text/plain; charset=..."" info is present.
    #
    # Here we have some french text encoded with ISO-8859-1, rather than UTF-8.
    text = (
        "Non-seulement Despréaux ne se trompait pas, mais de tous les écrivains "
        "que la France a produits, sans excepter Voltaire lui-même, imprégné de "
        "l'esprit anglais par son séjour à Londres, c'est incontestablement "
        "Molière ou Poquelin qui reproduit avec l'exactitude la plus vive et la "
        "plus complète le fond du génie français."
    )

    def cp1252_but_no_content_type(request):
        content = text.encode("ISO-8859-1")
        return httpx.Response(200, content=content)

    transport = httpx.MockTransport(cp1252_but_no_content_type)
    with httpx.Client(transport=transport, default_encoding=autodetect) as client:
        response = client.get("http://www.example.com")

        assert response.status_code == 200
        assert response.reason_phrase == "OK"
        assert response.encoding == "ISO-8859-1"
        assert response.text == text
def test_keldoc_motives_connect_error():
    center1_url = (
        "https://vaccination-covid.keldoc.com/centre-hospitalier-regional/lorient-56100/groupe-hospitalier"
        "-bretagne-sud-lorient-hopital-du-scorff?specialty=144 ")

    center1_data = json.loads(
        Path("tests", "fixtures", "keldoc", "center1-info.json").read_text())

    request = ScraperRequest(center1_url, "2020-04-04")

    def mock_client(request: httpx.Request) -> httpx.Response:
        if request.url.path == "/api/patients/v2/searches/resource":
            raise httpx.ConnectError("Unable to connect", request=request)
        if (request.url.path ==
                "/centre-hospitalier-regional/lorient-56100/groupe-hospitalier-bretagne-sud-lorient-hopital-du-scorff"
            ):
            return httpx.Response(
                302,
                headers={
                    "Location":
                    "https://vaccination-covid.keldoc.com/redirect/?dom=centre-hospitalier-regional&inst=lorient-56100&user=groupe-hospitalier-bretagne-sud-lorient-hopital-du-scorff&specialty=144 "
                },
            )
        for path in CENTER1_KELDOC:
            if request.url.path == path:
                return httpx.Response(200,
                                      json=get_test_data(CENTER1_KELDOC[path]))
        return httpx.Response(200, json={})

    client = httpx.Client(transport=httpx.MockTransport(mock_client))
    test_center_1 = KeldocCenter(request, client=client)

    assert not test_center_1.vaccine_motives
Beispiel #22
0
def test_malformed_redirect():
    # https://github.com/encode/httpx/issues/771
    client = httpx.Client(transport=httpx.MockTransport(redirects))
    response = client.get("http://example.org/malformed_redirect")
    assert response.status_code == httpx.codes.OK
    assert response.url == "https://example.org:443/"
    assert len(response.history) == 1
def test_no_center_data():
    path_centerinfo = Path("tests", "fixtures", "keldoc",
                           "cabinet-16913-centerinfo.json")
    centerinfo_1 = json.loads(path_centerinfo.read_text(encoding="utf-8"))

    center_info = CenterInfo.from_csv_data(centerinfo_1)

    center1_url = "https://www.keldoc.com/centre-hospitalier-regional/lorient-56100/groupe-hospitalier-bretagne-sud-lorient-hopital-du-scorff?specialty=144"
    request = ScraperRequest(center1_url,
                             "2020-04-04",
                             center_info=center_info)

    def app(request: httpx.Request) -> httpx.Response:
        if (request.url.path ==
                "/centre-hospitalier-regional/lorient-56100/groupe-hospitalier-bretagne-sud-lorient-hopital-du-scorff"
            ):
            return httpx.Response(
                302,
                headers={
                    "Location":
                    "https://vaccination-covid.keldoc.com/redirect/?dom=centre-hospitalier-regional&inst=lorient-56100&user=groupe-hospitalier-bretagne-sud-lorient-hopital-du-scorff&specialty=144 "
                },
            )
        if request.url.path == "/redirect/":
            return httpx.Response(200, json={})
        return httpx.Response(403, json={})

    keldoc.session = httpx.Client(transport=httpx.MockTransport(app))
    date = fetch_slots(request)
    assert not date
Beispiel #24
0
def test_same_domain_redirect():
    client = httpx.Client(transport=httpx.MockTransport(redirects))
    url = "https://example.org/cross_domain"
    headers = {"Authorization": "abc"}
    response = client.get(url, headers=headers)
    assert response.url == "https://example.org/cross_domain_target"
    assert response.json()["headers"]["authorization"] == "abc"
def test_fetch_slots():
    def app(request: httpx.Request) -> httpx.Response:
        try:
            with open(Path("tests", "fixtures", "mapharma", "slots.json"),
                      encoding="utf8") as f:
                return httpx.Response(200, content=f.read())
        except IOError:
            return httpx.Response(404, content="")

    client = httpx.Client(transport=httpx.MockTransport(app))

    request = ScraperRequest("https://mapharma.net/97200?c=60&l=1",
                             "2021-04-14")
    first_availability = fetch_slots(request,
                                     client,
                                     opendata_file=TEST_OPEN_DATA_FILE)
    assert first_availability == "2021-04-19T17:15:00"

    # test campagne["total_libres"]: 0
    request = ScraperRequest("https://mapharma.net/88400?c=92&l=1",
                             "2021-04-14")
    first_availability = fetch_slots(request,
                                     client,
                                     opendata_file=TEST_OPEN_DATA_FILE)
    assert first_availability == None
Beispiel #26
0
def test_can_stream_if_no_redirect():
    client = httpx.Client(transport=httpx.MockTransport(redirects))
    url = "https://example.org/redirect_301"
    with client.stream("GET", url, allow_redirects=False) as response:
        assert not response.is_closed
    assert response.status_code == httpx.codes.MOVED_PERMANENTLY
    assert response.headers["location"] == "https://example.org/"
Beispiel #27
0
def test_doctolib_next_slot():
    # Cas de repli : c'est surprenant, mais parfois la liste des dispos
    # est vide, mais il y a un champ 'next_slot' qui contient la date de
    # la prochaine visite, que l'on utilise dans ce cas.

    start_date = "2021-04-03"
    base_url = "https://partners.doctolib.fr/centre-de-vaccinations-internationales/ville1/centre1?pid=practice-165752&enable_cookies_consent=1"  # noqa
    scrap_request = ScraperRequest(base_url, start_date)

    def app(request: httpx.Request) -> httpx.Response:
        assert "User-Agent" in request.headers

        if request.url.path == "/booking/centre1.json":
            path = Path("tests", "fixtures", "doctolib",
                        "next-slot-booking.json")
            return httpx.Response(200, json=json.loads(path.read_text()))

        assert request.url.path == "/availabilities.json"
        path = Path("tests", "fixtures", "doctolib",
                    "next-slot-availabilities.json")
        return httpx.Response(200, json=json.loads(path.read_text()))

    client = httpx.Client(transport=httpx.MockTransport(app))
    slots = DoctolibSlots(client=client, cooldown_interval=0)

    next_date = slots.fetch(scrap_request)
    # Next slot should not be used
    assert next_date is None
Beispiel #28
0
def test_redirect_cookie_behavior():
    client = httpx.Client(transport=httpx.MockTransport(cookie_sessions))

    # The client is not logged in.
    response = client.get("https://example.com/")
    assert response.url == "https://example.com/"
    assert response.text == "Not logged in"

    # Login redirects to the homepage, setting a session cookie.
    response = client.post("https://example.com/login")
    assert response.url == "https://example.com/"
    assert response.text == "Logged in"

    # The client is logged in.
    response = client.get("https://example.com/")
    assert response.url == "https://example.com/"
    assert response.text == "Logged in"

    # Logout redirects to the homepage, expiring the session cookie.
    response = client.post("https://example.com/logout")
    assert response.url == "https://example.com/"
    assert response.text == "Not logged in"

    # The client is not logged in.
    response = client.get("https://example.com/")
    assert response.url == "https://example.com/"
    assert response.text == "Not logged in"
Beispiel #29
0
def test_doctolib():
    # Cas de base.

    start_date = "2021-04-03"
    base_url = "https://partners.doctolib.fr/centre-de-vaccinations-internationales/ville1/centre1?pid=practice-165752&enable_cookies_consent=1"  # noqa
    scrap_request = ScraperRequest(base_url, start_date)

    def app(request: httpx.Request) -> httpx.Response:
        assert "User-Agent" in request.headers

        if request.url.path == "/booking/centre1.json":
            path = Path("tests", "fixtures", "doctolib", "basic-booking.json")
            return httpx.Response(200, json=json.loads(path.read_text()))

        assert request.url.path == "/availabilities.json"
        params = dict(httpx.QueryParams(request.url.query))
        path = Path("tests", "fixtures", "doctolib",
                    "basic-availabilities.json")
        return httpx.Response(200, json=json.loads(path.read_text()))

    client = httpx.Client(transport=httpx.MockTransport(app))
    slots = DoctolibSlots(client=client, cooldown_interval=0)

    next_date = slots.fetch(scrap_request)
    assert next_date == '2021-04-10'
Beispiel #30
0
def test_setting_client_cookies_to_cookiejar() -> None:
    """
    Send a request including a cookie, using a `CookieJar` instance.
    """

    url = "http://example.org/echo_cookies"
    cookies = CookieJar()
    cookie = Cookie(
        version=0,
        name="example-name",
        value="example-value",
        port=None,
        port_specified=False,
        domain="",
        domain_specified=False,
        domain_initial_dot=False,
        path="/",
        path_specified=True,
        secure=False,
        expires=None,
        discard=True,
        comment=None,
        comment_url=None,
        rest={"HttpOnly": ""},
        rfc2109=False,
    )
    cookies.set_cookie(cookie)

    client = httpx.Client(
        cookies=cookies, transport=httpx.MockTransport(get_and_set_cookies)
    )
    response = client.get(url)

    assert response.status_code == 200
    assert response.json() == {"cookies": "example-name=example-value"}