Skip to content

Commit e0e8463

Browse files
committed
add some tests
1 parent 8b20a84 commit e0e8463

File tree

5 files changed

+158
-38
lines changed

5 files changed

+158
-38
lines changed

test/base.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,47 @@
11
import os
2-
from typing import Optional
2+
from typing import Any, Optional
33

44
import leetcode.api.default_api
55
import leetcode.api_client
66
import leetcode.configuration
77

8+
def validate_stat_status_pair(stat_status_pair: Any) -> None:
9+
assert isinstance(stat_status_pair, leetcode.StatStatusPair)
10+
assert isinstance(stat_status_pair.difficulty, leetcode.Difficulty)
11+
assert isinstance(stat_status_pair.difficulty.level, int)
12+
assert isinstance(stat_status_pair.frequency, float)
13+
assert isinstance(stat_status_pair.is_favor, bool)
14+
assert isinstance(stat_status_pair.paid_only, bool)
15+
assert isinstance(stat_status_pair.stat, leetcode.Stat)
16+
if stat_status_pair.status is not None:
17+
assert isinstance(stat_status_pair.status, str)
18+
19+
assert isinstance(stat_status_pair.stat.frontend_question_id, int)
20+
assert isinstance(stat_status_pair.stat.is_new_question, bool)
21+
if stat_status_pair.stat.question__article__live is not None:
22+
assert isinstance(stat_status_pair.stat.question__article__live, bool)
23+
if stat_status_pair.stat.question__article__slug is not None:
24+
assert isinstance(stat_status_pair.stat.question__article__slug, str)
25+
assert isinstance(stat_status_pair.stat.question__hide, bool)
26+
assert isinstance(stat_status_pair.stat.question__title, str)
27+
assert isinstance(stat_status_pair.stat.question__title_slug, str)
28+
assert isinstance(stat_status_pair.stat.question_id, int)
29+
assert isinstance(stat_status_pair.stat.total_acs, int)
30+
assert isinstance(stat_status_pair.stat.total_submitted, int)
31+
32+
def validate_problems(problems: Any, category_slug: str) -> None:
33+
assert isinstance(problems, leetcode.Problems)
34+
assert isinstance(problems.ac_easy, int)
35+
assert isinstance(problems.ac_hard, int)
36+
assert isinstance(problems.ac_medium, int)
37+
assert problems.category_slug == category_slug
38+
assert isinstance(problems.num_solved, int)
39+
assert isinstance(problems.num_total, int)
40+
assert isinstance(problems.stat_status_pairs, list)
41+
42+
for stat_status_pair in problems.stat_status_pairs:
43+
validate_stat_status_pair(stat_status_pair)
44+
845

946
class BaseTest:
1047
_api_instance_containter: Optional[leetcode.api.default_api.DefaultApi] = None

test/test_default_api.py

Lines changed: 98 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,41 +12,120 @@
1212

1313
from __future__ import absolute_import
1414

15+
from time import sleep
1516
import unittest
17+
from leetcode.models.interpretation import Interpretation
18+
from leetcode.models.submission_id import SubmissionId
19+
import test.base
1620

1721
import leetcode
1822
from leetcode.api.default_api import DefaultApi # noqa: E501
1923
from leetcode.rest import ApiException
2024

2125

22-
class TestDefaultApi(unittest.TestCase):
23-
"""DefaultApi unit test stubs"""
24-
25-
def setUp(self):
26-
self.api = DefaultApi() # noqa: E501
26+
class TestDefaultApi(test.base.BaseTest):
27+
def test_api_problems_topic_get(self):
28+
result = self._api_instance.api_problems_topic_get(topic="algorithms")
29+
test.base.validate_problems(result, "algorithms")
2730

28-
def tearDown(self):
29-
pass
31+
result = self._api_instance.api_problems_topic_get(topic="nonexistent")
32+
test.base.validate_problems(result, "nonexistent")
3033

31-
def test_api_problems_topic_get(self):
32-
"""Test case for api_problems_topic_get"""
33-
pass
34+
try:
35+
self._api_instance.api_problems_topic_get(topic="")
36+
assert False
37+
except ApiException as e:
38+
assert e.status == 404
3439

3540
def test_graphql_post(self):
36-
"""Test case for graphql_post"""
3741
pass
3842

3943
def test_problems_problem_interpret_solution_post(self):
40-
"""Test case for problems_problem_interpret_solution_post"""
41-
pass
44+
code = """
45+
class Solution:
46+
def twoSum(self, nums, target):
47+
print("stdout")
48+
return [1]
49+
"""
50+
test_submission = leetcode.TestSubmission(
51+
data_input="[2,7,11,15]\n9",
52+
typed_code=code,
53+
question_id=1,
54+
test_mode=False,
55+
lang="python",
56+
)
57+
58+
result = self._api_instance.problems_problem_interpret_solution_post(
59+
problem="two-sum",
60+
body=test_submission,
61+
)
62+
63+
assert isinstance(result, Interpretation)
4264

43-
def test_problems_problem_submit_post(self):
44-
"""Test case for problems_problem_submit_post"""
45-
pass
4665

47-
def test_submissions_detail_id_check_get(self):
48-
"""Test case for submissions_detail_id_check_get"""
49-
pass
66+
def test_problems_problem_submit_post(self):
67+
code = """
68+
class Solution:
69+
def twoSum(self, nums, target):
70+
print("stdout")
71+
return [1]
72+
"""
73+
74+
submission = leetcode.Submission(
75+
judge_type="large",
76+
typed_code=code,
77+
question_id=1,
78+
test_mode=False,
79+
lang="python",
80+
)
81+
submission_id = self._api_instance.problems_problem_submit_post(
82+
problem="two-sum", body=submission
83+
)
84+
assert isinstance(submission_id, SubmissionId)
85+
86+
87+
sleep(5) # FIXME: should probably be a busy-waiting loop
88+
89+
submission_result = self._api_instance.submissions_detail_id_check_get(
90+
id=submission_id.submission_id
91+
)
92+
# assert isinstance(
93+
# submission_result,
94+
# leetcode.SubmissionResult,
95+
# ) or isinstance(
96+
# submission_result,
97+
# leetcode.TestSubmissionResult,
98+
# )
99+
100+
# if isinstance(submission_result, leetcode.SubmissionResult):
101+
# assert isinstance(submission_result.compare_result, str)
102+
# assert isinstance(submission_result.std_output, str)
103+
# assert isinstance(submission_result.last_testcase, str)
104+
# assert isinstance(submission_result.expected_output, str)
105+
# assert isinstance(submission_result.input_formatted, str)
106+
# assert isinstance(submission_result.input, str)
107+
# # Missing or incorrect fields
108+
# # task_name: str
109+
# # finished: bool
110+
# elif isinstance(submission_result, leetcode.TestSubmissionResult):
111+
# assert isinstance(submission_result.code_answer, list)
112+
# assert isinstance(submission_result.correct_answer, bool)
113+
# assert isinstance(submission_result.expected_status_code, int)
114+
# assert isinstance(submission_result.expected_lang, str)
115+
# assert isinstance(submission_result.expected_run_success, bool)
116+
# assert isinstance(submission_result.expected_status_runtime, str)
117+
# assert isinstance(submission_result.expected_memory, int)
118+
# assert isinstance(submission_result.expected_code_answer, list)
119+
# assert isinstance(submission_result.expected_code_output, list)
120+
# assert isinstance(submission_result.expected_elapsed_time, int)
121+
# assert isinstance(submission_result.expected_task_finish_time, int)
122+
123+
# def test_submissions_detail_id_check_get(self):
124+
# try:
125+
# self._api_instance.submissions_detail_id_check_get(id="nonexistent")
126+
# assert False
127+
# except ApiException as e:
128+
# assert e.status == 404
50129

51130

52131
if __name__ == "__main__":

test/test_difficulty.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@
1313
from __future__ import absolute_import
1414

1515
import unittest
16+
import test.base
1617

1718
import leetcode
1819
from leetcode.models.difficulty import Difficulty # noqa: E501
1920
from leetcode.rest import ApiException
2021

2122

22-
class TestDifficulty(unittest.TestCase):
23+
class TestDifficulty(test.base.BaseTest):
2324
"""Difficulty unit test stubs"""
2425

2526
def setUp(self):
@@ -29,9 +30,6 @@ def tearDown(self):
2930
pass
3031

3132
def testDifficulty(self):
32-
"""Test Difficulty"""
33-
# FIXME: construct object with mandatory attributes with example values
34-
# model = leetcode.models.difficulty.Difficulty() # noqa: E501
3533
pass
3634

3735

test/test_graphql_request_get_question_detail.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ def test_request(self) -> None:
101101
assert question.title == "Two Sum"
102102
assert question.title_slug == "two-sum"
103103
assert question.frequency == 0.0
104-
assert question.freq_bar > 0
104+
if question.freq_bar is not None: # only available for premium users
105+
assert question.freq_bar > 0
105106
assert len(question.content) > 10
106107
assert question.translated_title is None
107108
assert question.is_paid_only is False
@@ -124,12 +125,13 @@ def test_request(self) -> None:
124125
assert question.topic_tags[0].translated_name is None
125126
assert len(topic_tag.typename) > 0
126127

127-
tag_stat = list(json.loads(question.company_tag_stats).values())[0][0]
128+
if question.company_tag_stats is not None: # only available for premium users
129+
tag_stat = list(json.loads(question.company_tag_stats).values())[0][0]
128130

129-
assert tag_stat["taggedByAdmin"] in (True, False)
130-
assert len(tag_stat["name"]) > 0
131-
assert len(tag_stat["slug"]) > 0
132-
assert tag_stat["timesEncountered"] > 0
131+
assert tag_stat["taggedByAdmin"] in (True, False)
132+
assert len(tag_stat["name"]) > 0
133+
assert len(tag_stat["slug"]) > 0
134+
assert tag_stat["timesEncountered"] > 0
133135

134136
code_snippet = question.code_snippets[0]
135137

@@ -169,7 +171,7 @@ def test_request(self) -> None:
169171
assert question.has_solution in (True, False)
170172
assert question.has_video_solution in (True, False)
171173

172-
assert question.status in ("ac", "not_started", "tried")
174+
assert question.status in ("ac", "not_started", "tried", None)
173175

174176
assert len(question.sample_test_case) > 0
175177

test/test_graphql_request_problemset_question_list.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ def test_request(self) -> None:
125125
assert question.bound_topic_id is None
126126
assert question.title is not None
127127
assert question.frequency == 0.0
128-
assert question.freq_bar > 0
128+
if question.freq_bar is not None: # only available for premium users
129+
assert question.freq_bar > 0
129130
assert len(question.content) > 10
130131
assert question.translated_title is None
131132
assert question.is_paid_only in (True, False)
@@ -146,12 +147,13 @@ def test_request(self) -> None:
146147
assert question.topic_tags[0].translated_name is None
147148
assert len(topic_tag.typename) > 0
148149

149-
tag_stat = list(json.loads(question.company_tag_stats).values())[0][0]
150+
if question.company_tag_stats is not None: # only available for premium users
151+
tag_stat = list(json.loads(question.company_tag_stats).values())[0][0]
150152

151-
assert tag_stat["taggedByAdmin"] in (True, False)
152-
assert len(tag_stat["name"]) > 0
153-
assert len(tag_stat["slug"]) > 0
154-
assert tag_stat["timesEncountered"] > 0
153+
assert tag_stat["taggedByAdmin"] in (True, False)
154+
assert len(tag_stat["name"]) > 0
155+
assert len(tag_stat["slug"]) > 0
156+
assert tag_stat["timesEncountered"] > 0
155157

156158
code_snippet = question.code_snippets[0]
157159

@@ -176,7 +178,9 @@ def test_request(self) -> None:
176178
assert len(code_definition["text"]) > 0
177179
assert len(code_definition["defaultCode"]) > 0
178180

179-
assert [len(hint) > 0 for hint in question.hints]
181+
# TODO: check if the field has disappeared or if this is just a premium
182+
# feature
183+
# assert [len(hint) > 0 for hint in question.hints]
180184

181185
question.solution
182186

0 commit comments

Comments
 (0)