import io from itertools import groupby from pathlib import Path import pytest import requests import ee.digikey as dk basedir = Path(__file__).parent static_copies = basedir / "digikey" / "static-copies" # type: Path digikey = dk.Digikey() client = dk.DigikeyClient(digikey, cache_dir=basedir / "digikey" / "http_cache", on_download=print) @pytest.mark.digikey def test_digikey_1(tmpdir): content = cache_file("https://www.digikey.com/products/en?lang=en&site=us&pageSize=10", "TCR2LF18LM(CTTR-ND") res = client.parse_string(content) assert res.response_type == dk.SearchResponseTypes.SINGLE p = res.products[0] assert p.part_number == "TCR2LF18LM(CTTR-ND" assert p.mpn == "TCR2LF18,LM(CT" assert len(p.attributes) > 5 repo = dk.DigikeyRepository(digikey, str(tmpdir)) x = io.StringIO() p.to_ini(repo._make_configparser()).write(x) print(x.getvalue()) repo.save(p) repo = dk.DigikeyRepository(digikey, str(tmpdir)) repo.load_all() ps = repo.find_by_mpn(p.mpn) assert ps y = io.StringIO() p.to_ini(repo._make_configparser()).write(y) assert x.getvalue() == y.getvalue() @pytest.mark.digikey def test_digikey_2(): content = cache_file("https://www.digikey.com/products/en?lang=en&site=us&keywords=TCR2LF&pageSize=500", "TCR2LF") res = client.parse_string(content) assert res.response_type == dk.SearchResponseTypes.MANY [print("dpn={}, mpn={}".format(p.part_number, p.mpn)) for p in res.products] assert len(res.products) == 28 for mpn, parts in groupby(sorted(res.products, key=lambda p: p.mpn), lambda p: p.mpn): parts = list(parts) print("mpn={}, parts={}".format(mpn, [p.part_number for p in parts])) dpn = parts[0].part_number print("Downloading {} as {}".format(mpn, dpn)) content = cache_file("https://www.digikey.com/products/en?lang=en&site=us&pageSize=500", dpn) res = client.parse_string(content) assert res.response_type == dk.SearchResponseTypes.SINGLE p = res.products[0] assert p.part_number == dpn assert p.mpn == mpn @pytest.mark.digikey def test_digikey_3(): content = cache_file("https://www.digikey.com/products/en?lang=en&site=us&pageSize=10", "S1MTR") res = client.parse_string(content) assert res.response_type == dk.SearchResponseTypes.MANY [print("dpn={}, mpn={}".format(p.part_number, p.mpn)) for p in res.products] assert len(res.products) == 1 p = res.products[0] assert p.part_number == "1655-1506-1-ND" assert p.mpn == "S1MTR" assert p.url == "/product-detail/en/smc-diode-solutions/S1MTR/1655-1506-1-ND/6022951" def cache_file(url, keyword): path = static_copies / "search-{}.html".format(keyword) if not path.is_file(): path.parent.mkdir(parents=True, exist_ok=True) res = requests.get(url, params=dict(keywords=keyword)) assert res.status_code == 200 with open(path, "w") as f: f.write(res.text) assert path.stat().st_size > 0 with open(path, "r") as f: content = f.read() return content