class TestAtCoderClientReal(unittest.TestCase): def setUp(self): self.temp_dir = tempfile.mkdtemp() self.client = AtCoderClient() def test_submit_source_code(self): problem_list = self.client.download_problem_list(Contest("arc002")) self.assertEqual( ['arc002_1', 'arc002_2', 'arc002_3', 'arc002_4'], [p.problem_id for p in problem_list]) def test_download_problem_content(self): content = self.client.download_problem_content( Problem(Contest("arc002"), "C", "arc002_3")) self.assertEqual("N\nc_{1}c_{2}...c_{N}\n", content.input_format_text) self.assertEqual(3, len(content.samples)) def test_login_failed(self): def fake_supplier(): return "@@@ invalid user name @@@", "@@@ password @@@" try: self.client.login(credential_supplier=fake_supplier, use_local_session_cache=False) self.fail("Unexpectedly, this test succeeded to login.") except LoginError: pass def test_download_all_contests(self): contests = self.client.download_all_contests() # Check if the number of contests is more than the number when I wrote # this unit test. self.assertGreaterEqual(len(contests), 523) # Make sure there is no duplication self.assertEqual( len(set([c.get_id() for c in contests])), len(contests)) def test_check_logging_in_is_false(self): self.assertFalse(self.client.check_logging_in()) def test_cookie_save_and_load(self): cookie_path = os.path.join(self.temp_dir, "cookie.txt") session = requests.Session() loaded = load_cookie_to(session, cookie_path) self.assertFalse(loaded) save_cookie(session, cookie_path) new_session = requests.Session() loaded = load_cookie_to(new_session, cookie_path) self.assertTrue(loaded)
class TestAtCoderClientMock(unittest.TestCase): def setUp(self): self.temp_dir = tempfile.mkdtemp() self.client = AtCoderClient() @restore_client_after_run def test_download_submission_list(self): contest = Contest("arc001") self.client._request = create_fake_request_func({ contest.get_my_submissions_url(1): fake_resp("my_submissions/1.html"), contest.get_my_submissions_url(2): fake_resp("my_submissions/2.html"), contest.get_my_submissions_url(3): fake_resp("my_submissions/3.html") }) submissions = self.client.download_submission_list(Contest("arc001")) submission_ids = [x.submission_id for x in submissions] self.assertEqual(33, len(submission_ids)) self.assertEqual(sorted(submission_ids, reverse=True), submission_ids) @restore_client_after_run def test_submit_source_code(self): contest = Contest("arc001") problem = Problem(contest, "A", "arc001_1") self.client._request = create_fake_request_func( {contest.get_submit_url(): fake_resp("submit/after_get.html")}, {contest.get_submit_url(): fake_resp("submit/after_post.html")}) # test two patterns (str, Language object) for parameter lang for lang in [CPP, "C++14 (GCC 5.4.1)"]: submission = self.client.submit_source_code( contest, problem, lang, "x") self.assertEqual(3905485, submission.submission_id) self.assertEqual("arc001_1", submission.problem_id) @restore_client_after_run def test_login_success(self): self.client._request = create_fake_request_func( post_url_to_resp={ "https://arc001.contest.atcoder.jp/login": fake_resp("after_login.html") }) def fake_supplier(): return "@@@ invalid user name @@@", "@@@ password @@@" self.client.login(credential_supplier=fake_supplier, use_local_session_cache=False) @restore_client_after_run def test_check_logging_in_success(self): setting_url = "https://arc001.contest.atcoder.jp/settings" self.client._request = create_fake_request_func( {setting_url: MockResponse(url=setting_url)}) self.assertTrue(self.client.check_logging_in())
def main(lang='ja'): alphabet = str(Path('.').absolute().name) contest_id = str(Path('.').absolute().parent.name) client = AtCoderClient() client.login() ic(client.check_logging_in()) contest = Contest(ic(contest_id)) ic(contest.get_url()) problem_list = client.download_problem_list(ic(contest)) problem = problem_list[['A', 'B', 'C', 'D', 'E', 'F'].index(ic(alphabet))] html_doc = client.download_problem_content(problem).original_html soup = BeautifulSoup(html_doc, 'html.parser') title = soup.find(class_="h2").get_text() task_statement = soup.find(id="task-statement") if lang == 'ja': task_statement = task_statement.find(class_='lang-ja') def sanitize_html_for_ipynb(html_doc): replace_dict = { '<var>': '$', '</var>': '$', '<pre>': '<pre><code>', '</pre>': '</code></pre>' } for old_word, new_word in replace_dict.items(): html_doc = html_doc.replace(old_word, new_word) return ic(html_doc) title = str(sanitize_html_for_ipynb(str(title))) title = title.lstrip().split('\n')[0] task_statement = Tomd(sanitize_html_for_ipynb(str(task_statement))) with open('problem.md', 'w+') as f: f.write(f"## {ic(title)}\n") f.write('---\n') f.write(task_statement.markdown)