Skip to content

Commit

Permalink
Merge pull request #12 from shenxianpeng/feature/add-test
Browse files Browse the repository at this point in the history
feat: add more test
  • Loading branch information
shenxianpeng authored Apr 1, 2024
2 parents 2355775 + 488ab4e commit 1b2d2ad
Show file tree
Hide file tree
Showing 2 changed files with 136 additions and 25 deletions.
138 changes: 125 additions & 13 deletions tests/test_main.py
Original file line number Diff line number Diff line change
@@ -1,36 +1,148 @@
import pytest
from unittest.mock import MagicMock
import pytest_mock
from bs4 import BeautifulSoup
from used_by.main import (
get_soup,
get_repo_number,
get_dependents_number,
generate_badge_url,
generate_markdown_badge,
generate_rst_badge,
get_existing_badge,
update_existing_badge,
print_badge_content,
)
from used_by import COMMENT_MARKER

# test get_soup using pytest and pytest-mock


@pytest.fixture
def mock_requests_get(mocker):
mock_response = MagicMock()
mock_response = mocker.MagicMock()
mock_response.content = b"<html><body><a class='select-menu-item' href='/repo1'></a><a class='select-menu-item' href='/repo2'></a></body></html>"
mocker.patch("requests.get", return_value=mock_response)


@pytest.fixture
def mock_sub_soup(mocker):
mock_sub_soup = MagicMock()
mock_sub_soup.find.return_value = MagicMock(
get_text=MagicMock(return_value="3 repositories")
)
mocker.patch("used_by.main.get_soup", return_value=mock_sub_soup)


def test_get_soup(mock_requests_get):
url = "http://example.com"
soup = get_soup(url)
assert isinstance(soup, BeautifulSoup)


def test_get_dependents_number(mock_requests_get, mock_sub_soup):
def test_get_repo_number(mocker):
html_content = (
"<a class='btn-link selected' href='http://example.com'>4 Repositories</a>"
)
mock_soup = BeautifulSoup(html_content, "html.parser")
mocker.patch("used_by.main.get_soup", return_value=mock_soup)
repo_number = get_repo_number(mock_soup)
assert repo_number == 4


def test_get_dependents_number_when_menu_items_is_empty(mocker):
url = "http://example.com"
html_content = (
"<a class='btn-link selected' href='http://example.com'>4 Repositories</a>"
)
mock_soup = BeautifulSoup(html_content, "html.parser")
mocker.patch("used_by.main.get_soup", return_value=mock_soup)
dependents_number = get_dependents_number(url)
assert dependents_number == 4


def test_get_dependents_number_when_menu_items_is_not_empty(mocker):
url = "http://example.com"
html_content = b"<a class='select-menu-item' href='/repo1'><a class='btn-link selected' href='http://example.com'>4 Repositories</a></a><a class='select-menu-item' href='/repo2'><a class='btn-link selected' href='http://example.com'>4 Repositories</a></a>"
mock_soup = BeautifulSoup(html_content, "html.parser")
mocker.patch("used_by.main.get_soup", return_value=mock_soup)
dependents_number = get_dependents_number(url)
assert dependents_number == 8


def test_generate_badge_url():
deps_number = 4
badge_label = "Used By"
badge_color = "blue"
badge_logo = "github"
badge_url = "https://img.shields.io/static/v1?label=Used%20By&message=4&color=blue&logo=github"
assert badge_url == generate_badge_url(
deps_number, badge_label, badge_color, badge_logo
)


def test_generate_markdown_badge():
repo_name = "used-by"
deps_number = 4
badge_label = "Used By"
badge_color = "blue"
badge_logo = "github"
badge_content = "[![Used By](https://img.shields.io/static/v1?label=Used%20By&message=4&color=blue&logo=github)](https://github.com/used-by/network/dependents)"
assert badge_content == generate_markdown_badge(
repo_name, deps_number, badge_label, badge_color, badge_logo
)

assert dependents_number == 0

def test_generate_rst_badge():
repo_name = "used-by"
deps_number = 4
badge_label = "Used By"
badge_color = "blue"
badge_logo = "github"
assert (
f".. image:: {generate_badge_url(deps_number, badge_label, badge_color, badge_logo)}"
in generate_rst_badge(
repo_name, deps_number, badge_label, badge_color, badge_logo
)
)
assert (
f":target: https://github.com/{repo_name}/network/dependents"
in generate_rst_badge(
repo_name, deps_number, badge_label, badge_color, badge_logo
)
)
assert f":alt: {badge_label}" in generate_rst_badge(
repo_name, deps_number, badge_label, badge_color, badge_logo
)


def test_get_existing_badge(mocker):
file_path = "dummy_file.md"
badge_content = f"badge{COMMENT_MARKER}"
mocker.patch("builtins.open", mocker.mock_open(read_data=badge_content))
badge = get_existing_badge(file_path)
assert badge == "badge"


def test_update_existing_badge(mocker):
file_path = "dummy_file.md"
existing_badge = "existing_badge"
new_badge = "new_badge"
file_contents = f"{existing_badge}{COMMENT_MARKER}"
mocker.patch("builtins.open", mocker.mock_open(read_data=file_contents))
update_existing_badge(file_path, existing_badge, new_badge)
assert f"{new_badge}{COMMENT_MARKER}" != file_contents


def test_print_existing_badge(capfd):
badge_string = "badge_content"
print_badge_content(badge_string, flag=True)

captured = capfd.readouterr()

expected_output = (
"Existing Badge:\n" + "=" * 80 + f"\n{badge_string}\n" + "=" * 80 + "\n\n"
)
assert captured.out == expected_output


def test_print_new_badge(capfd):
badge_string = "badge_content"
print_badge_content(badge_string, flag=False)

captured = capfd.readouterr()

expected_output = (
"New Badge:\n" + "=" * 80 + f"\n{badge_string}\n" + "=" * 80 + "\n\n"
)
assert captured.out == expected_output
23 changes: 11 additions & 12 deletions used_by/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from used_by import COMMENT_MARKER


def get_parser():
def get_parser(): # pragma: no cover
parser = argparse.ArgumentParser(
prog="used-by",
description="Generate a Used By badge from GitHub dependents information.",
Expand Down Expand Up @@ -56,24 +56,23 @@ def get_soup(url: str) -> BeautifulSoup:
return soup


def get_repo_number(soup):
repo_text = soup.find("a", class_="btn-link selected").get_text(strip=True)
return int(repo_text.split()[0])


def get_dependents_number(url: str) -> int:
total_number = 0
soup = get_soup(url)
menu_items = soup.find_all("a", class_="select-menu-item")

if not menu_items: # if menu_items is empty
repo_text = soup.find("a", class_="btn-link selected").get_text(strip=True)
repo_number = int(repo_text.split()[0])
total_number += repo_number
else:
if menu_items: # menu_items is not empty
for menu_item in menu_items:
href = menu_item["href"]
sub_soup = get_soup(url=f"https://github.com{href}")
repo_text = sub_soup.find("a", class_="btn-link selected").get_text(
strip=True
)
repo_number = int(repo_text.split()[0])
total_number += repo_number
total_number += get_repo_number(sub_soup)
else:
total_number += get_repo_number(soup)

return total_number

Expand Down Expand Up @@ -139,7 +138,7 @@ def print_badge_content(badge_string, flag=False) -> None:
print("=" * 80 + "\n")


def main():
def main(): # pragma: no cover
parser = get_parser()
args = parser.parse_args()

Expand Down

0 comments on commit 1b2d2ad

Please sign in to comment.