fix(ci): typing

This commit is contained in:
Barrett Ruth 2025-09-22 20:46:27 -04:00
parent 87f9439607
commit eb3f7762de
9 changed files with 339 additions and 155 deletions

View file

@ -4,6 +4,8 @@ import pytest
@pytest.fixture
def mock_codeforces_html():
return """
<div class="time-limit">Time limit: 1 seconds</div>
<div class="memory-limit">Memory limit: 256 megabytes</div>
<div class="input">
<pre>
<div class="test-example-line-1">3</div>

View file

@ -1,61 +1,61 @@
from unittest.mock import Mock
from scrapers.codeforces import scrape, scrape_contest_problems, scrape_contests
from scrapers.codeforces import CodeforcesScraper
from scrapers.models import ContestSummary, ProblemSummary
def test_scrape_success(mocker, mock_codeforces_html):
mock_scraper = Mock()
mock_client = Mock()
mock_response = Mock()
mock_response.text = mock_codeforces_html
mock_scraper.get.return_value = mock_response
mock_client.get.return_value = mock_response
mocker.patch(
"scrapers.codeforces.cloudscraper.create_scraper", return_value=mock_scraper
)
scraper = CodeforcesScraper()
mocker.patch.object(scraper, "_create_client", return_value=mock_client)
result = scrape("https://codeforces.com/contest/1900/problem/A")
result = scraper.scrape_problem_tests("1900", "A")
assert len(result) == 1
assert result[0].input == "1\n3\n1 2 3"
assert result[0].expected == "6"
assert result.success == True
assert len(result.tests) == 1
assert result.tests[0].input == "1\n3\n1 2 3"
assert result.tests[0].expected == "6"
def test_scrape_contest_problems(mocker):
mock_scraper = Mock()
mock_client = Mock()
mock_response = Mock()
mock_response.text = """
<a href="/contest/1900/problem/A">A. Problem A</a>
<a href="/contest/1900/problem/B">B. Problem B</a>
"""
mock_scraper.get.return_value = mock_response
mock_client.get.return_value = mock_response
mocker.patch(
"scrapers.codeforces.cloudscraper.create_scraper", return_value=mock_scraper
)
scraper = CodeforcesScraper()
mocker.patch.object(scraper, "_create_client", return_value=mock_client)
result = scrape_contest_problems("1900")
result = scraper.scrape_contest_metadata("1900")
assert len(result) == 2
assert result[0] == ProblemSummary(id="a", name="A. Problem A")
assert result[1] == ProblemSummary(id="b", name="B. Problem B")
assert result.success == True
assert len(result.problems) == 2
assert result.problems[0] == ProblemSummary(id="a", name="A. Problem A")
assert result.problems[1] == ProblemSummary(id="b", name="B. Problem B")
def test_scrape_network_error(mocker):
mock_scraper = Mock()
mock_scraper.get.side_effect = Exception("Network error")
mock_client = Mock()
mock_client.get.side_effect = Exception("Network error")
mocker.patch(
"scrapers.codeforces.cloudscraper.create_scraper", return_value=mock_scraper
)
scraper = CodeforcesScraper()
mocker.patch.object(scraper, "_create_client", return_value=mock_client)
result = scrape("https://codeforces.com/contest/1900/problem/A")
result = scraper.scrape_problem_tests("1900", "A")
assert result == []
assert result.success == False
assert "network error" in result.error.lower()
def test_scrape_contests_success(mocker):
mock_scraper = Mock()
mock_client = Mock()
mock_response = Mock()
mock_response.json.return_value = {
"status": "OK",
@ -65,26 +65,26 @@ def test_scrape_contests_success(mocker):
{"id": 1949, "name": "Codeforces Global Round 26"},
],
}
mock_scraper.get.return_value = mock_response
mock_client.get.return_value = mock_response
mocker.patch(
"scrapers.codeforces.cloudscraper.create_scraper", return_value=mock_scraper
)
scraper = CodeforcesScraper()
mocker.patch.object(scraper, "_create_client", return_value=mock_client)
result = scrape_contests()
result = scraper.scrape_contest_list()
assert len(result) == 3
assert result[0] == ContestSummary(
assert result.success == True
assert len(result.contests) == 3
assert result.contests[0] == ContestSummary(
id="1951",
name="Educational Codeforces Round 168 (Rated for Div. 2)",
display_name="Educational Codeforces Round 168 (Rated for Div. 2)",
)
assert result[1] == ContestSummary(
assert result.contests[1] == ContestSummary(
id="1950",
name="Codeforces Round 936 (Div. 2)",
display_name="Codeforces Round 936 (Div. 2)",
)
assert result[2] == ContestSummary(
assert result.contests[2] == ContestSummary(
id="1949",
name="Codeforces Global Round 26",
display_name="Codeforces Global Round 26",
@ -92,28 +92,28 @@ def test_scrape_contests_success(mocker):
def test_scrape_contests_api_error(mocker):
mock_scraper = Mock()
mock_client = Mock()
mock_response = Mock()
mock_response.json.return_value = {"status": "FAILED", "result": []}
mock_scraper.get.return_value = mock_response
mock_client.get.return_value = mock_response
mocker.patch(
"scrapers.codeforces.cloudscraper.create_scraper", return_value=mock_scraper
)
scraper = CodeforcesScraper()
mocker.patch.object(scraper, "_create_client", return_value=mock_client)
result = scrape_contests()
result = scraper.scrape_contest_list()
assert result == []
assert result.success == False
assert "no contests found" in result.error.lower()
def test_scrape_contests_network_error(mocker):
mock_scraper = Mock()
mock_scraper.get.side_effect = Exception("Network error")
mock_client = Mock()
mock_client.get.side_effect = Exception("Network error")
mocker.patch(
"scrapers.codeforces.cloudscraper.create_scraper", return_value=mock_scraper
)
scraper = CodeforcesScraper()
mocker.patch.object(scraper, "_create_client", return_value=mock_client)
result = scrape_contests()
result = scraper.scrape_contest_list()
assert result == []
assert result.success == False
assert "network error" in result.error.lower()