import pytest import sys import os from bs4 import BeautifulSoup import requests from fontbakery.designers_pb2 import DesignerInfoProto from google.protobuf import text_format # TODO this could potentially be a fontbakery profile @pytest.fixture def profile_dir(): if len(sys.argv) != 3: print("Usage: python test_profiles fonts/catalog/designers/designerprofile") sys.exit(1) return sys.argv[-1] @pytest.fixture def proto_info(profile_dir): info_file = os.path.join(profile_dir, "info.pb") with open(info_file, "rb") as info: text = info.read() return load_info_proto(text) @pytest.fixture def bio(profile_dir): bio_file = os.path.join(profile_dir, "bio.html") with open(bio_file) as html: return BeautifulSoup(html.read(), features="lxml") def load_info_proto(text_data): message = DesignerInfoProto() text_format.Merge(text_data, message) return message def test_profile_dir_exists(profile_dir): assert os.path.exists(profile_dir) def test_profile_filenames_are_acscii(profile_dir): failed = [] for filename in os.listdir(profile_dir) + [profile_dir]: try: filename.encode("ascii") except: failed.append(filename) assert not failed, f"filenames {failed} must be ascii" def test_profile_dir_has_bio(profile_dir): assert "bio.html" in os.listdir(profile_dir), "bio.html is missing" def test_profile_dir_has_info(profile_dir): assert "info.pb" in os.listdir(profile_dir), "info.pb is missing" def test_profile_has_correct_img(profile_dir): assert not any(f for f in os.listdir(profile_dir) if f.endswith((".jpg", ".jpeg"))) assert any( f for f in os.listdir(profile_dir) if f.endswith(".png") ), "Profile is missing png image" def test_profile_info_image_link_is_correct(profile_dir, proto_info): img_path = proto_info.avatar.file_name assert img_path in os.listdir(profile_dir), "info.pb: image path is incorrect" def test_info_link(proto_info): link = proto_info.link assert ( "plus.google" not in link ), "Google+ links are no longer supported. Please replace." def test_info_link_works(proto_info): link = proto_info.link if "instagram.com" in link or not link: return assert requests.get(link).status_code == 200, "info.pb: link is not producing a 200 status code" def test_bio_links_work(bio): urls = bio.find_all("a", href=True) urls = [u["href"] for u in urls] for url in urls: if "instagram.com" in url: # these have a habit of raise a 4xx status code continue assert ( requests.get(url).status_code == 200 ), f"{url} is not producing a 200 status code"