Skip to content

Commit c50fc25

Browse files
committed
feat: add reaming files updates
1 parent 02413c8 commit c50fc25

4 files changed

Lines changed: 377 additions & 0 deletions

File tree

tests/test_detector.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from unittest.mock import patch
2+
3+
from sync.detector import SubmissionDetector
4+
from leetcode.models import Submission
5+
6+
7+
def test_find_new_first_run():
8+
9+
detector = SubmissionDetector()
10+
11+
detector.state = {
12+
"last_submission_id": None
13+
}
14+
15+
submissions = [
16+
Submission(
17+
id="3",
18+
title="C",
19+
slug="c",
20+
timestamp=3,
21+
),
22+
Submission(
23+
id="2",
24+
title="B",
25+
slug="b",
26+
timestamp=2,
27+
),
28+
Submission(
29+
id="1",
30+
title="A",
31+
slug="a",
32+
timestamp=1,
33+
),
34+
]
35+
36+
new = detector.find_new(submissions)
37+
38+
assert len(new) == 3
39+
40+
41+
@patch("sync.detector.StateManager.save")
42+
def test_update_state(mock_save, sample_submission):
43+
44+
detector = SubmissionDetector()
45+
46+
detector.update(sample_submission)
47+
48+
mock_save.assert_called_once_with(
49+
sample_submission.id
50+
)
51+
52+
53+
def test_find_new_after_update(sample_submission):
54+
55+
detector = SubmissionDetector()
56+
57+
detector.state = {
58+
"last_submission_id": sample_submission.id
59+
}
60+
61+
submissions = [
62+
sample_submission,
63+
]
64+
65+
new = detector.find_new(submissions)
66+
67+
assert new == []

tests/test_downloader.py

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
import json
2+
3+
from leetcode.downloader import SubmissionDownloader
4+
5+
6+
def test_create_problem_directory(
7+
tmp_path,
8+
sample_submission_detail,
9+
):
10+
11+
downloader = SubmissionDownloader()
12+
13+
downloader.solutions_dir = tmp_path
14+
15+
folder = downloader.create_problem_directory(
16+
sample_submission_detail
17+
)
18+
19+
assert folder.exists()
20+
21+
assert folder.is_dir()
22+
23+
24+
def test_save_solution(
25+
tmp_path,
26+
sample_submission_detail,
27+
):
28+
29+
downloader = SubmissionDownloader()
30+
31+
downloader.solutions_dir = tmp_path
32+
33+
folder = downloader.create_problem_directory(
34+
sample_submission_detail
35+
)
36+
37+
solution = downloader.save_solution(
38+
folder,
39+
sample_submission_detail,
40+
)
41+
42+
assert solution.exists()
43+
44+
assert solution.name == "solution.py"
45+
46+
assert (
47+
solution.read_text(encoding="utf-8")
48+
== sample_submission_detail.code
49+
)
50+
51+
52+
def test_save_metadata(
53+
tmp_path,
54+
sample_submission_detail,
55+
):
56+
57+
downloader = SubmissionDownloader()
58+
59+
downloader.solutions_dir = tmp_path
60+
61+
folder = downloader.create_problem_directory(
62+
sample_submission_detail
63+
)
64+
65+
metadata = downloader.save_metadata(
66+
folder,
67+
sample_submission_detail,
68+
)
69+
70+
assert metadata.exists()
71+
72+
data = json.loads(
73+
metadata.read_text(
74+
encoding="utf-8"
75+
)
76+
)
77+
78+
assert data["question_id"] == "295"
79+
80+
assert data["language"] == "python3"
81+
82+
assert data["status_code"] == 10
83+
84+
85+
def test_download(
86+
tmp_path,
87+
sample_submission_detail,
88+
):
89+
90+
downloader = SubmissionDownloader()
91+
92+
downloader.solutions_dir = tmp_path
93+
94+
folder = downloader.download(
95+
sample_submission_detail
96+
)
97+
98+
assert folder.exists()
99+
100+
assert (
101+
folder / "solution.py"
102+
).exists()
103+
104+
assert (
105+
folder / "metadata.json"
106+
).exists()

tests/test_git.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
from pathlib import Path
2+
from unittest.mock import patch, MagicMock
3+
4+
from github_sync.manager import GitManager
5+
6+
7+
def test_status():
8+
9+
manager = GitManager(Path("."))
10+
11+
with patch(
12+
"subprocess.run"
13+
) as mock_run:
14+
15+
mock = MagicMock()
16+
17+
mock.returncode = 0
18+
19+
mock.stdout = "M main.py"
20+
21+
mock_run.return_value = mock
22+
23+
assert manager.status() == "M main.py"
24+
25+
26+
def test_add():
27+
28+
manager = GitManager(Path("."))
29+
30+
with patch(
31+
"subprocess.run"
32+
) as mock_run:
33+
34+
mock = MagicMock()
35+
36+
mock.returncode = 0
37+
38+
mock.stdout = ""
39+
40+
mock_run.return_value = mock
41+
42+
manager.add()
43+
44+
assert mock_run.called
45+
46+
47+
def test_commit():
48+
49+
manager = GitManager(Path("."))
50+
51+
with patch(
52+
"subprocess.run"
53+
) as mock_run:
54+
55+
mock = MagicMock()
56+
57+
mock.returncode = 0
58+
59+
mock.stdout = ""
60+
61+
mock_run.return_value = mock
62+
63+
manager.commit(
64+
"test commit"
65+
)
66+
67+
assert mock_run.called
68+
69+
70+
def test_push():
71+
72+
manager = GitManager(Path("."))
73+
74+
with patch(
75+
"subprocess.run"
76+
) as mock_run:
77+
78+
mock = MagicMock()
79+
80+
mock.returncode = 0
81+
82+
mock.stdout = ""
83+
84+
mock_run.return_value = mock
85+
86+
manager.push()
87+
88+
assert mock_run.called

tests/test_sync_manager.py

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
from unittest.mock import MagicMock, patch
2+
3+
from sync.manager import SyncManager
4+
5+
from leetcode.models import Submission
6+
from leetcode.models import SubmissionDetail
7+
8+
9+
@patch("sync.manager.GitManager")
10+
@patch("sync.manager.SubmissionDownloader")
11+
@patch("sync.manager.SubmissionDetector")
12+
@patch("sync.manager.LeetCodeAPI")
13+
@patch("sync.manager.LeetCodeClient")
14+
@patch("sync.manager.LeetCodeAuth")
15+
def test_sync_manager_run(
16+
mock_auth,
17+
mock_client,
18+
mock_api,
19+
mock_detector,
20+
mock_downloader,
21+
mock_git,
22+
):
23+
24+
manager = SyncManager()
25+
26+
submission = Submission(
27+
id="1",
28+
title="Two Sum",
29+
slug="two-sum",
30+
timestamp=1780000000,
31+
)
32+
33+
detail = SubmissionDetail(
34+
submission_id="1",
35+
question_id="1",
36+
title_slug="two-sum",
37+
language="python3",
38+
language_verbose="Python3",
39+
runtime=45,
40+
runtime_display="45 ms",
41+
memory=17000000,
42+
memory_display="17 MB",
43+
status_code=10,
44+
code="print('hello')",
45+
timestamp=1780000000,
46+
)
47+
48+
manager.api.get_recent_submissions = MagicMock(
49+
return_value=[submission]
50+
)
51+
52+
manager.detector.find_new = MagicMock(
53+
return_value=[submission]
54+
)
55+
56+
manager.api.get_submission_detail = MagicMock(
57+
return_value=detail
58+
)
59+
60+
manager.downloader.download = MagicMock()
61+
62+
manager.git.add = MagicMock()
63+
64+
manager.git.commit = MagicMock()
65+
66+
manager.git.push = MagicMock()
67+
68+
manager.detector.update = MagicMock()
69+
70+
manager.run()
71+
72+
manager.api.get_recent_submissions.assert_called_once()
73+
74+
manager.detector.find_new.assert_called_once()
75+
76+
manager.api.get_submission_detail.assert_called_once()
77+
78+
manager.downloader.download.assert_called_once()
79+
80+
manager.git.add.assert_called_once()
81+
82+
manager.git.commit.assert_called_once()
83+
84+
manager.git.push.assert_called_once()
85+
86+
manager.detector.update.assert_called_once()
87+
88+
89+
@patch("sync.manager.GitManager")
90+
@patch("sync.manager.SubmissionDownloader")
91+
@patch("sync.manager.SubmissionDetector")
92+
@patch("sync.manager.LeetCodeAPI")
93+
@patch("sync.manager.LeetCodeClient")
94+
@patch("sync.manager.LeetCodeAuth")
95+
def test_sync_manager_no_new_submissions(
96+
mock_auth,
97+
mock_client,
98+
mock_api,
99+
mock_detector,
100+
mock_downloader,
101+
mock_git,
102+
):
103+
104+
manager = SyncManager()
105+
106+
manager.api.get_recent_submissions = MagicMock(
107+
return_value=[]
108+
)
109+
110+
manager.detector.find_new = MagicMock(
111+
return_value=[]
112+
)
113+
114+
manager.run()
115+
116+
manager.detector.find_new.assert_called_once()

0 commit comments

Comments
 (0)