def test_export_reserved_centers(tmp_path): centres_cherchés_dict = [{ "departement": "01", "nom": "Bugey Sud - Réservé aux médecins du groupe hospitalier", "url": "https://example.com/bugey-sud", "plateforme": "Doctolib", "prochain_rdv": "2021-04-10T00:00:00", "location": None, "metadata": None, "type": None, "appointment_by_phone_only": False, "appointment_count": 1, "internal_id": None, }] centres_cherchés = [ CenterInfo.from_dict(center) for center in centres_cherchés_dict ] out_dir = tmp_path / "out" out_dir.mkdir() outpath_format = str(out_dir / "{}.json") fake_now = dt.datetime(2021, 4, 4) get_start_date() with mock_datetime_now(fake_now): export_data(centres_cherchés, [], outpath_format=outpath_format) # Departements 01 and 59 should contain expected data. content = json.loads((out_dir / "01.json").read_text()) assert content == { "version": 1, "centres_disponibles": [], "centres_indisponibles": [], "last_scrap": [], "last_updated": "2021-04-04T00:00:00", }
def test_export_data_when_blocked(tmp_path): center_info1 = CenterInfo("59", "Clinique du Cambresis", "https://example.com/clinique-du-cambresis") center_info1.plateforme = "Maiia" center_info1.prochain_rdv = "2021-04-12:00:00" center_info1.erreur = None center_info1.appointment_count = 1 center_info2 = CenterInfo("14", "Hôpital magique", "https://example.com/hopital-magique") center_info2.plateforme = "Doctolib" center_info2.prochain_rdv = None center_info2.erreur = BlockedByDoctolibError( "https://example.com/hopital-magique") centres_cherchés = [center_info1, center_info2] out_dir = tmp_path / "out" out_dir.mkdir() outpath_format = str(out_dir / "{}.json") fake_now = dt.datetime(2021, 4, 4) with mock_datetime_now(fake_now): total, actifs, bloqués = export_data(centres_cherchés, [], outpath_format=outpath_format) # les totaux doivent être bons assert total == 2 assert actifs == 1 assert bloqués == 1 # Departements 14 and 59 should contain expected data. content = json.loads((out_dir / "14.json").read_text()) assert content == { "version": 1, "last_updated": "2021-04-04T00:00:00", "last_scrap": [], "centres_disponibles": [], "centres_indisponibles": [{ "departement": "14", "nom": "Hôpital magique", "url": "https://example.com/hopital-magique", "location": None, "metadata": None, "prochain_rdv": None, "type": None, "plateforme": "Doctolib", "appointment_count": 0, "internal_id": None, "vaccine_type": None, "appointment_by_phone_only": False, "erreur": "ERREUR DE SCRAPPING (Doctolib): Doctolib bloque nos appels: 403 https://example.com/hopital-magique", "last_scan_with_availabilities": None, "request_counts": None, }], "doctolib_bloqué": True, } content = json.loads((out_dir / "59.json").read_text()) assert content == { "version": 1, "last_scrap": [], "centres_disponibles": [ { "departement": "59", "nom": "Clinique du Cambresis", "url": "https://example.com/clinique-du-cambresis", "plateforme": "Maiia", "prochain_rdv": "2021-04-12:00:00", "location": None, "metadata": None, "type": None, "appointment_count": 1, "internal_id": None, "appointment_by_phone_only": False, "vaccine_type": None, "erreur": None, "last_scan_with_availabilities": None, "request_counts": None, }, ], "centres_indisponibles": [], "last_updated": "2021-04-04T00:00:00", }
def test_export_data(tmp_path): centres_cherchés_dict = [ { "departement": "01", "nom": "Bugey Sud", "url": "https://example.com/bugey-sud", "plateforme": "Doctolib", "prochain_rdv": "2021-04-10T00:00:00", "location": None, "metadata": None, "type": None, "appointment_count": 1, "internal_id": None, }, { "departement": "59", "nom": "CH Armentières", "url": "https://example.com/ch-armentieres", "plateforme": "Keldoc", "prochain_rdv": "2021-04-11:00:00", "erreur": None, "location": None, "metadata": None, "type": None, "appointment_count": 1, "internal_id": None, }, { "departement": "59", "nom": "Clinique du Cambresis", "url": "https://example.com/clinique-du-cambresis", "plateforme": "Maiia", "prochain_rdv": None, "erreur": None, "location": None, "metadata": None, "type": None, "appointment_count": 1, "internal_id": None, }, { "departement": "92", "nom": "Médiathèque Jacques GAUTIER", "url": "https://example.com/mediatheque-jacques-gautier", "plateforme": "Maiia", "prochain_rdv": "2021-04-11:00:00", "erreur": None, "location": None, "metadata": None, "type": None, "appointment_count": 0, "internal_id": None, }, { # Unknown departement (edge case) => should be skipped w/o failing "departement": "1234", "nom": "Hôpital magique", "url": "https://example.com/hopital-magique", "plateforme": "Doctolib", "prochain_rdv": "2021-04-12:00:00", "erreur": None, "location": None, "metadata": None, "type": None, "appointment_count": 1, "internal_id": None, }, { # Not technically a department, should be in om.json "departement": "975", "nom": "Exemple Saint Pierre et Miquelon", "url": "https://example.com/st-pierre-miquelon", "plateforme": "Doctolib", "prochain_rdv": "2021-05-10T00:00:00", "location": None, "metadata": None, "type": None, "appointment_by_phone_only": False, "appointment_count": 1, "internal_id": None, }, ] centres_cherchés = [ CenterInfo.from_dict(center) for center in centres_cherchés_dict ] for center in centres_cherchés: if center.nom != "Médiathèque Jacques GAUTIER": center.appointment_count = 1 out_dir = tmp_path / "out" out_dir.mkdir() outpath_format = str(out_dir / "{}.json") fake_now = dt.datetime(2021, 4, 4) get_start_date() with mock_datetime_now(fake_now): export_data(centres_cherchés, [], outpath_format=outpath_format) # All departements for which we don't have data should be empty. for departement in departementUtils.import_departements(): if departement in ("01", "59", "92"): continue content = json.loads((out_dir / f"{departement}.json").read_text()) assert content == { "version": 1, "last_scrap": [], "centres_disponibles": [], "centres_indisponibles": [], "last_updated": "2021-04-04T00:00:00", } # Departements 01 and 59 should contain expected data. content = json.loads((out_dir / "01.json").read_text()) assert content == { "version": 1, "centres_disponibles": [ { "departement": "01", "nom": "Bugey Sud", "url": "https://example.com/bugey-sud", "plateforme": "Doctolib", "prochain_rdv": "2021-04-10T00:00:00", "location": None, "metadata": None, "type": None, "appointment_by_phone_only": False, "appointment_count": 1, "internal_id": None, "appointment_by_phone_only": False, "vaccine_type": None, "erreur": None, "last_scan_with_availabilities": None, "request_counts": None, }, ], "centres_indisponibles": [], "last_scrap": [], "last_updated": "2021-04-04T00:00:00", } content = json.loads((out_dir / "59.json").read_text()) assert content == { "version": 1, "centres_disponibles": [ { "departement": "59", "nom": "CH Armentières", "url": "https://example.com/ch-armentieres", "plateforme": "Keldoc", "prochain_rdv": "2021-04-11:00:00", "location": None, "metadata": None, "appointment_by_phone_only": False, "type": None, "appointment_count": 1, "internal_id": None, "vaccine_type": None, "erreur": None, "last_scan_with_availabilities": None, "request_counts": None, }, ], "centres_indisponibles": [{ "departement": "59", "nom": "Clinique du Cambresis", "url": "https://example.com/clinique-du-cambresis", "plateforme": "Maiia", "prochain_rdv": None, "location": None, "metadata": None, "type": None, "appointment_count": 1, "internal_id": None, "appointment_by_phone_only": False, "vaccine_type": None, "erreur": None, "last_scan_with_availabilities": None, "request_counts": None, }], "last_scrap": [], "last_updated": "2021-04-04T00:00:00", } content = json.loads((out_dir / "92.json").read_text()) assert content == { "version": 1, "centres_disponibles": [], "centres_indisponibles": [ { "departement": "92", "nom": "Médiathèque Jacques GAUTIER", "url": "https://example.com/mediatheque-jacques-gautier", "location": None, "metadata": None, "prochain_rdv": "2021-04-11:00:00", "plateforme": "Maiia", "type": None, "appointment_by_phone_only": False, "appointment_count": 0, "internal_id": None, "vaccine_type": None, "erreur": None, "last_scan_with_availabilities": None, "request_counts": None, }, ], "last_scrap": [], "last_updated": "2021-04-04T00:00:00", } # outre-mer file should contain St Pierre et Miquelon data content = json.loads((out_dir / "om.json").read_text()) assert content == { "version": 1, "centres_disponibles": [ { "departement": "om", "nom": "Exemple Saint Pierre et Miquelon", "url": "https://example.com/st-pierre-miquelon", "plateforme": "Doctolib", "prochain_rdv": "2021-05-10T00:00:00", "location": None, "metadata": None, "type": None, "appointment_by_phone_only": False, "appointment_count": 1, "internal_id": None, "vaccine_type": None, "erreur": None, "last_scan_with_availabilities": None, "request_counts": None, }, ], "centres_indisponibles": [], "last_scrap": [], "last_updated": "2021-04-04T00:00:00", } # On test l'export vers le format inscrit sur la plateforme data.gouv.fr content = json.loads((out_dir / "centres_open_data.json").read_text()) assert content == [ { "departement": "01", "nom": "Bugey Sud", "url": "https://example.com/bugey-sud", "plateforme": "Doctolib" }, { "departement": "59", "nom": "CH Armentières", "url": "https://example.com/ch-armentieres", "plateforme": "Keldoc", }, { "departement": "59", "nom": "Clinique du Cambresis", "url": "https://example.com/clinique-du-cambresis", "plateforme": "Maiia", }, { "departement": "92", "nom": "Médiathèque Jacques GAUTIER", "url": "https://example.com/mediatheque-jacques-gautier", "plateforme": "Maiia", }, { "departement": "om", "nom": "Exemple Saint Pierre et Miquelon", "plateforme": "Doctolib", "url": "https://example.com/st-pierre-miquelon", }, ]