175 lines
7.4 KiB
Python
175 lines
7.4 KiB
Python
"""
|
|
Tests d'intégration pour le registry avec les stores réels.
|
|
|
|
Teste la détection automatique du bon store pour des URLs
|
|
Amazon, Cdiscount, Backmarket et AliExpress.
|
|
"""
|
|
|
|
import pytest
|
|
|
|
from pricewatch.app.core.registry import StoreRegistry
|
|
from pricewatch.app.stores.amazon.store import AmazonStore
|
|
from pricewatch.app.stores.cdiscount.store import CdiscountStore
|
|
from pricewatch.app.stores.backmarket.store import BackmarketStore
|
|
from pricewatch.app.stores.aliexpress.store import AliexpressStore
|
|
|
|
|
|
class TestRegistryRealStores:
|
|
"""Tests d'intégration avec les 4 stores réels."""
|
|
|
|
@pytest.fixture
|
|
def registry_with_all_stores(self) -> StoreRegistry:
|
|
"""Fixture: Registry avec les 4 stores réels enregistrés."""
|
|
registry = StoreRegistry()
|
|
registry.register(AmazonStore())
|
|
registry.register(CdiscountStore())
|
|
registry.register(BackmarketStore())
|
|
registry.register(AliexpressStore())
|
|
return registry
|
|
|
|
def test_all_stores_registered(self, registry_with_all_stores):
|
|
"""Vérifie que les 4 stores sont enregistrés."""
|
|
assert len(registry_with_all_stores) == 4
|
|
stores = registry_with_all_stores.list_stores()
|
|
assert "amazon" in stores
|
|
assert "cdiscount" in stores
|
|
assert "backmarket" in stores
|
|
assert "aliexpress" in stores
|
|
|
|
def test_detect_amazon_fr(self, registry_with_all_stores):
|
|
"""Détecte Amazon.fr correctement."""
|
|
url = "https://www.amazon.fr/dp/B08N5WRWNW"
|
|
store = registry_with_all_stores.detect_store(url)
|
|
assert store is not None
|
|
assert store.store_id == "amazon"
|
|
|
|
def test_detect_amazon_com(self, registry_with_all_stores):
|
|
"""Détecte Amazon.com correctement."""
|
|
url = "https://www.amazon.com/dp/B08N5WRWNW"
|
|
store = registry_with_all_stores.detect_store(url)
|
|
assert store is not None
|
|
assert store.store_id == "amazon"
|
|
|
|
def test_detect_amazon_with_product_name(self, registry_with_all_stores):
|
|
"""Détecte Amazon avec nom de produit dans l'URL."""
|
|
url = "https://www.amazon.fr/Product-Name-Here/dp/B08N5WRWNW/ref=sr_1_1"
|
|
store = registry_with_all_stores.detect_store(url)
|
|
assert store is not None
|
|
assert store.store_id == "amazon"
|
|
|
|
def test_detect_cdiscount(self, registry_with_all_stores):
|
|
"""Détecte Cdiscount correctement."""
|
|
url = "https://www.cdiscount.com/informatique/clavier-souris-webcam/example/f-1070123-example.html"
|
|
store = registry_with_all_stores.detect_store(url)
|
|
assert store is not None
|
|
assert store.store_id == "cdiscount"
|
|
|
|
def test_detect_backmarket(self, registry_with_all_stores):
|
|
"""Détecte Backmarket correctement."""
|
|
url = "https://www.backmarket.fr/fr-fr/p/iphone-15-pro"
|
|
store = registry_with_all_stores.detect_store(url)
|
|
assert store is not None
|
|
assert store.store_id == "backmarket"
|
|
|
|
def test_detect_backmarket_locale_en(self, registry_with_all_stores):
|
|
"""Détecte Backmarket avec locale anglais."""
|
|
url = "https://www.backmarket.fr/en-fr/p/macbook-air-15-2024"
|
|
store = registry_with_all_stores.detect_store(url)
|
|
assert store is not None
|
|
assert store.store_id == "backmarket"
|
|
|
|
def test_detect_aliexpress_fr(self, registry_with_all_stores):
|
|
"""Détecte AliExpress.fr correctement."""
|
|
url = "https://fr.aliexpress.com/item/1005007187023722.html"
|
|
store = registry_with_all_stores.detect_store(url)
|
|
assert store is not None
|
|
assert store.store_id == "aliexpress"
|
|
|
|
def test_detect_aliexpress_com(self, registry_with_all_stores):
|
|
"""Détecte AliExpress.com correctement."""
|
|
url = "https://www.aliexpress.com/item/1005007187023722.html"
|
|
store = registry_with_all_stores.detect_store(url)
|
|
assert store is not None
|
|
assert store.store_id == "aliexpress"
|
|
|
|
def test_detect_unknown_store(self, registry_with_all_stores):
|
|
"""URL inconnue retourne None."""
|
|
url = "https://www.ebay.com/itm/123456789"
|
|
store = registry_with_all_stores.detect_store(url)
|
|
assert store is None
|
|
|
|
def test_detect_invalid_url(self, registry_with_all_stores):
|
|
"""URL invalide retourne None."""
|
|
url = "not-a-valid-url"
|
|
store = registry_with_all_stores.detect_store(url)
|
|
assert store is None
|
|
|
|
def test_detect_priority_amazon_over_others(self, registry_with_all_stores):
|
|
"""Amazon.fr doit avoir le meilleur score pour ses URLs."""
|
|
url = "https://www.amazon.fr/dp/B08N5WRWNW"
|
|
store = registry_with_all_stores.detect_store(url)
|
|
# Amazon.fr devrait avoir score 0.9, les autres 0.0
|
|
assert store.store_id == "amazon"
|
|
|
|
def test_each_store_matches_only_own_urls(self, registry_with_all_stores):
|
|
"""Chaque store ne matche que ses propres URLs."""
|
|
test_cases = [
|
|
("https://www.amazon.fr/dp/B08N5WRWNW", "amazon"),
|
|
("https://www.cdiscount.com/product", "cdiscount"),
|
|
("https://www.backmarket.fr/fr-fr/p/product", "backmarket"),
|
|
("https://fr.aliexpress.com/item/12345.html", "aliexpress"),
|
|
]
|
|
|
|
for url, expected_store_id in test_cases:
|
|
store = registry_with_all_stores.detect_store(url)
|
|
assert store is not None, f"Aucun store détecté pour {url}"
|
|
assert store.store_id == expected_store_id, (
|
|
f"Mauvais store pour {url}: "
|
|
f"attendu {expected_store_id}, obtenu {store.store_id}"
|
|
)
|
|
|
|
def test_get_store_by_id(self, registry_with_all_stores):
|
|
"""Récupère chaque store par son ID."""
|
|
amazon = registry_with_all_stores.get_store("amazon")
|
|
assert amazon is not None
|
|
assert isinstance(amazon, AmazonStore)
|
|
|
|
cdiscount = registry_with_all_stores.get_store("cdiscount")
|
|
assert cdiscount is not None
|
|
assert isinstance(cdiscount, CdiscountStore)
|
|
|
|
backmarket = registry_with_all_stores.get_store("backmarket")
|
|
assert backmarket is not None
|
|
assert isinstance(backmarket, BackmarketStore)
|
|
|
|
aliexpress = registry_with_all_stores.get_store("aliexpress")
|
|
assert aliexpress is not None
|
|
assert isinstance(aliexpress, AliexpressStore)
|
|
|
|
def test_unregister_store(self, registry_with_all_stores):
|
|
"""Désenregistre un store et vérifie qu'il n'est plus détecté."""
|
|
assert len(registry_with_all_stores) == 4
|
|
|
|
# Désenregistrer Amazon
|
|
removed = registry_with_all_stores.unregister("amazon")
|
|
assert removed is True
|
|
assert len(registry_with_all_stores) == 3
|
|
|
|
# Amazon ne doit plus être détecté
|
|
store = registry_with_all_stores.detect_store("https://www.amazon.fr/dp/B08N5WRWNW")
|
|
assert store is None
|
|
|
|
# Les autres stores doivent toujours fonctionner
|
|
store = registry_with_all_stores.detect_store("https://www.cdiscount.com/product")
|
|
assert store is not None
|
|
assert store.store_id == "cdiscount"
|
|
|
|
def test_repr_includes_all_stores(self, registry_with_all_stores):
|
|
"""La représentation string inclut tous les stores."""
|
|
repr_str = repr(registry_with_all_stores)
|
|
assert "StoreRegistry" in repr_str
|
|
assert "amazon" in repr_str
|
|
assert "cdiscount" in repr_str
|
|
assert "backmarket" in repr_str
|
|
assert "aliexpress" in repr_str
|