diff --git a/test_files/test_plugin.py b/test_files/test_plugin.py index 9cd273e..c428e0f 100644 --- a/test_files/test_plugin.py +++ b/test_files/test_plugin.py @@ -1,42 +1,11 @@ -import collections.abc import os -import random -import string import pytest -import responses from mkdocs_bibtex.plugin import BibTexPlugin module_dir = os.path.dirname(os.path.abspath(__file__)) test_files_dir = os.path.abspath(os.path.join(module_dir, "..", "test_files")) -MOCK_ZOTERO_URL = "https://api.zotero.org/groups/FOO/collections/BAR/items?format=bibtex" - - -@pytest.fixture -def mock_zotero_api(request: pytest.FixtureRequest) -> collections.abc.Generator[responses.RequestsMock]: - zotero_api_url = "https://api.zotero.org/groups/FOO/collections/BAR/items?format=bibtex&limit=100" - bibtex_contents = generate_bibtex_entries(request.param) - - limit = 100 - pages = [bibtex_contents[i : i + limit] for i in range(0, len(bibtex_contents), limit)] - - with responses.RequestsMock() as mock_api: - for page_num, page in enumerate(pages): - current_start = "" if page_num == 0 else f"&start={page_num * limit}" - next_start = f"&start={(page_num + 1) * limit}" - mock_api.add( - responses.Response( - method="GET", - url=f"{zotero_api_url}{current_start}", - json="\n".join(page), - headers={} - if page_num == len(pages) - 1 - else {"Link": f"<{zotero_api_url}{next_start}>; rel='next'"}, - ) - ) - - yield mock_api @pytest.fixture @@ -75,38 +44,3 @@ def test_bibtex_loading_bibdir(): plugin.on_config(plugin.config) assert len(plugin.registry.bib_data.entries) == 2 - - -@pytest.mark.parametrize(("mock_zotero_api", "number_of_entries"), ((4, 4), (150, 150)), indirect=["mock_zotero_api"]) -def test_bibtex_loading_zotero(mock_zotero_api: responses.RequestsMock, number_of_entries: int) -> None: - plugin = BibTexPlugin() - plugin.load_config( - options={"bib_file": MOCK_ZOTERO_URL}, - config_file_path=test_files_dir, - ) - - plugin.on_config(plugin.config) - assert len(plugin.registry.bib_data.entries) == number_of_entries - - -def generate_bibtex_entries(n: int) -> list[str]: - """Generates n random bibtex entries.""" - - entries = [] - - for i in range(n): - author_first = "".join(random.choices(string.ascii_letters, k=8)) - author_last = "".join(random.choices(string.ascii_letters, k=8)) - title = "".join(random.choices(string.ascii_letters, k=10)) - journal = "".join(random.choices(string.ascii_uppercase, k=5)) - year = str(random.randint(1950, 2025)) - - entries.append(f""" -@article{{{author_last}_{i}}}, - title = {{{title}}}, - volume = {{1}}, - journal = {{{journal}}}, - author = {{{author_last}, {author_first}}}, - year = {{{year}}}, -""") - return entries diff --git a/test_files/test_utils.py b/test_files/test_utils.py index eba19e3..cc6bd69 100644 --- a/test_files/test_utils.py +++ b/test_files/test_utils.py @@ -1,11 +1,44 @@ import pytest -from mkdocs_bibtex.utils import ( - sanitize_zotero_query, -) +from mkdocs_bibtex.utils import sanitize_zotero_query, tempfile_from_zotero_url +import collections.abc +import os +import random +import string + +import responses +from pybtex.database import parse_file EXAMPLE_ZOTERO_API_ENDPOINT = "https://api.zotero.org/groups/FOO/collections/BAR/items" +MOCK_ZOTERO_URL = "https://api.zotero.org/groups/FOO/collections/BAR/items?format=bibtex" + + +@pytest.fixture +def mock_zotero_api(request: pytest.FixtureRequest) -> collections.abc.Generator[responses.RequestsMock]: + zotero_api_url = "https://api.zotero.org/groups/FOO/collections/BAR/items?format=bibtex&limit=100" + bibtex_contents = generate_bibtex_entries(request.param) + + limit = 100 + pages = [bibtex_contents[i : i + limit] for i in range(0, len(bibtex_contents), limit)] + + with responses.RequestsMock() as mock_api: + for page_num, page in enumerate(pages): + current_start = "" if page_num == 0 else f"&start={page_num * limit}" + next_start = f"&start={(page_num + 1) * limit}" + mock_api.add( + responses.Response( + method="GET", + url=f"{zotero_api_url}{current_start}", + json="\n".join(page), + headers={} + if page_num == len(pages) - 1 + else {"Link": f"<{zotero_api_url}{next_start}>; rel='next'"}, + ) + ) + + yield mock_api + @pytest.mark.parametrize( ("zotero_url", "expected_sanitized_url"), @@ -31,3 +64,38 @@ ) def test_sanitize_zotero_query(zotero_url: str, expected_sanitized_url: str) -> None: assert sanitize_zotero_query(url=zotero_url) == expected_sanitized_url + + +@pytest.mark.parametrize(("mock_zotero_api", "number_of_entries"), ((4, 4), (150, 150)), indirect=["mock_zotero_api"]) +def test_bibtex_loading_zotero(mock_zotero_api: responses.RequestsMock, number_of_entries: int) -> None: + bib_file = tempfile_from_zotero_url("Bib File", MOCK_ZOTERO_URL, ".bib") + + assert os.path.exists(bib_file) + assert os.path.getsize(bib_file) > 0 + + bibdata = parse_file(bib_file) + + assert len(bibdata.entries) == number_of_entries + + +def generate_bibtex_entries(n: int) -> list[str]: + """Generates n random bibtex entries.""" + + entries = [] + + for i in range(n): + author_first = "".join(random.choices(string.ascii_letters, k=8)) + author_last = "".join(random.choices(string.ascii_letters, k=8)) + title = "".join(random.choices(string.ascii_letters, k=10)) + journal = "".join(random.choices(string.ascii_uppercase, k=5)) + year = str(random.randint(1950, 2025)) + + entries.append(f""" +@article{{{author_last}_{i}}}, + title = {{{title}}}, + volume = {{1}}, + journal = {{{journal}}}, + author = {{{author_last}, {author_first}}}, + year = {{{year}}}, +""") + return entries