Skip to content

Commit

Permalink
convert integration test into unit test
Browse files Browse the repository at this point in the history
  • Loading branch information
shyamd committed Jan 16, 2025
1 parent 66a7fb5 commit c1c27dd
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 69 deletions.
66 changes: 0 additions & 66 deletions test_files/test_plugin.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
74 changes: 71 additions & 3 deletions test_files/test_utils.py
Original file line number Diff line number Diff line change
@@ -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"),
Expand All @@ -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

0 comments on commit c1c27dd

Please sign in to comment.