diff --git a/main.py b/main.py index 7d9a2aa..afd8353 100644 --- a/main.py +++ b/main.py @@ -6,9 +6,8 @@ from json import loads class _ScraperData: - def __init__(self, data: dict[str, object], scraper: Scraper | None = None) -> None: + def __init__(self, data: dict[str, object]) -> None: self._data: dict[str, object] = data - self._scraper: Scraper | None = scraper def _getcontent(self) -> dict[str, object] | None: """_summary_ @@ -42,23 +41,15 @@ class _ScraperData: Returns: str: _description_ """ - current_value: dict[str, object] | None = self._getattributes() + attrs: dict[str, object] | None = self._getattributes() - if current_value is None: - return None + if attrs is not None: + app_dict: object | None = attrs.get("appellation") + if isinstance(app_dict, dict): + return cast(str, app_dict.get("value")) + return None - app_dict: dict[str, object] = cast( - dict[str, object], current_value.get("appellation") - ) - return cast(str, app_dict["value"]) - - def acceder(self, name: str) -> _ScraperData: - scraper: Scraper | None = self._scraper - if scraper is None: - scraper = Scraper() - return scraper.getjsondata(name) - - def _getvin(self, name: str) -> str | None: + def _getcritiques(self, name: str) -> str | None: """_summary_ Args: @@ -67,29 +58,30 @@ class _ScraperData: Returns: str | None: _description_ """ + current_value: dict[str, object] | None = self._getattributes() + if current_value is not None: + app_dict: dict[str, object] = cast( + dict[str, object], current_value.get(name) + ) + if not app_dict: + return None - if current_value is None: - return None + val = cast(str, app_dict.get("value")).rstrip("+").split("-") + if len(val) > 1: + val[0] = str((int(val[0]) + int(val[1])) / 2) - app_dict: dict[str, object] = cast( - dict[str, object], current_value.get(name) - ) - - val: list[str] = cast(str, app_dict.get("attributes")).rstrip("+").split("-") - # dans le cas où 93-94 -> [93, 94] -> 93.5 - if len(val) > 1: - val[0] = str((int(val[0]) + int(val[1])) / 2) - return val[0] + return val[0] + return None def parker(self) -> str | None: - return self._getvin("note_rp") + return self._getcritiques("note_rp") def robinson(self) -> str | None: - return self._getvin("note_jr") + return self._getcritiques("note_jr") def suckling(self) -> str | None: - return self._getvin("note_js") + return self._getcritiques("note_js") def getdata(self) -> dict[str, object]: return self._data @@ -228,5 +220,5 @@ class Scraper: continue raise ValueError(f"Clé manquante dans le JSON : {key}") - return _ScraperData(cast(dict[str, object], current_data), scraper=self) + return _ScraperData(cast(dict[str, object], current_data)) diff --git a/test_main.py b/test_main.py index 2766b4e..905e902 100644 --- a/test_main.py +++ b/test_main.py @@ -10,7 +10,47 @@ def mock_site(): with Mocker() as m: m.get( "https://www.millesima.fr/", - text="

MILLESIMA

", + text=f""" + + + + + + """, + ) + + m.get( + "https://www.millesima.fr/poubelle", + text=f""" + + +

POUBELLE

+ + + + """, ) json_data = { @@ -65,6 +105,18 @@ def mock_site(): } ], "attributes": { + "equivbtl": { + "valueId": "1", + "name": "equivbtl", + "value": "1", + "isSpirit": False, + }, + "nbunit": { + "valueId": "6", + "name": "nbunit", + "value": "6", + "isSpirit": False, + }, "appellation": { "valueId": "433", "name": "Appellation", @@ -80,9 +132,9 @@ def mock_site(): "isSpirit": False, }, "note_jr": { - "valueId": "17", + "valueId": "17+", "name": "J. Robinson", - "value": "17", + "value": "17+", "isSpirit": False, }, "note_js": { @@ -101,10 +153,12 @@ def mock_site(): html_product = f""" - - + +

MILLESIMA

+ + """ m.get( @@ -122,31 +176,51 @@ def scraper() -> Scraper: def test_soup(scraper: Scraper): - h1: Tag | None = scraper.getsoup("").find("h1") - - assert isinstance(h1, Tag) - assert h1.text == "MILLESIMA" - - -# def test_getProductName(scraper: Scraper): -# jsondata = scraper.getjsondata("nino-negri-5-stelle-sfursat-2022.html") -# assert jsondata["productName"] == "Nino Negri : 5 Stelle Sfursat 2022" -# assert isinstance(jsondata["items"], list) -# assert len(jsondata["items"]) > 0 -# assert jsondata["items"][0]["offerPrice"] == 390 + vide = scraper.getsoup("") + poubelle = scraper.getsoup("poubelle") + contenu = scraper.getsoup("nino-negri-5-stelle-sfursat-2022.html") + assert vide.find("h1") is None + assert str(poubelle.find("h1")) == "

POUBELLE

" + assert str(contenu.find("h1")) == "

MILLESIMA

" def test_appellation(scraper: Scraper): - appellation = scraper.getjsondata( - "nino-negri-5-stelle-sfursat-2022.html" - ) - assert appellation.appellation() == "Sforzato di Valtellina" + vide = scraper.getjsondata("") + poubelle = scraper.getjsondata("poubelle") + contenu = scraper.getjsondata("nino-negri-5-stelle-sfursat-2022.html") + assert vide.appellation() is None + assert poubelle.appellation() is None + assert contenu.appellation() == "Sforzato di Valtellina" + + +def test_fonctionprivee(scraper: Scraper): + vide = scraper.getjsondata("") + poubelle = scraper.getjsondata("poubelle") + contenu = scraper.getjsondata("nino-negri-5-stelle-sfursat-2022.html") + assert vide._getattributes() is not None + assert vide._getattributes() == {} + assert vide._getcontent() is not None + assert vide._getcontent() == {"items": [], "attributes": {}} + assert poubelle._getattributes() is None + assert poubelle._getcontent() is None + assert contenu._getcontent() is not None + assert contenu._getattributes() is not None + def test_critiques(scraper: Scraper): - critiques = scraper.getjsondata( - "nino-negri-5-stelle-sfursat-2022.html" - ) - assert critiques.parker() == "91" - assert critiques.robinson() == "17" - assert critiques.suckling() == "93.5" + vide = scraper.getjsondata("") + poubelle = scraper.getjsondata("poubelle") + contenu = scraper.getjsondata("nino-negri-5-stelle-sfursat-2022.html") + assert vide.parker() is None + assert vide.robinson() is None + assert vide.suckling() is None + assert vide._getcritiques("test_ts") is None + assert poubelle.parker() is None + assert poubelle.robinson() is None + assert poubelle.suckling() is None + assert poubelle._getcritiques("test_ts") is None + assert contenu.parker() == "91" + assert contenu.robinson() == "17" + assert contenu.suckling() == "93.5" + assert contenu._getcritiques("test_ts") is None