def test_submit(self, g_f_s_mock, g_i_mock): Utils.start_contest() self._insert_data() self.handler.generate_input(token='token', task='poldo', _ip='1.1.1.1') Database.c.execute( "INSERT INTO outputs (id, input, path, size, result) " "VALUES ('outputid', 'inputid', '/output', 42," ":result)", { "result": b'{\"score\":0.5,\"feedback\":{\"a\":1},' b'\"validation\":{\"b\":2}}' }) Database.c.execute("INSERT INTO sources (id, input, path, size) " "VALUES ('sourceid', 'inputid', '/source', 42)") response = self.handler.submit(output_id='outputid', source_id='sourceid', _ip='1.1.1.1') self.assertEqual("token", response["token"]) self.assertEqual("poldo", response["task"]) self.assertEqual(21, response["score"]) self.assertEqual("inputid", response["input"]["id"]) self.assertEqual("sourceid", response["source"]["id"]) self.assertEqual("outputid", response["output"]["id"]) self.assertEqual(1, response["feedback"]["a"]) self.assertEqual(2, response["output"]["validation"]["b"]) user_task = Database.get_user_task("token", "poldo") self.assertEqual(21, user_task["score"]) self.assertEqual(response["id"], Database.get_submission(response["id"])["id"])
def generate_input(self, task, user): """ POST /generate_input """ token = user["token"] if Database.get_user_task(token, task["name"])["current_attempt"]: self.raise_exc(Forbidden, "FORBIDDEN", "You already have a ready input!") attempt = Database.get_next_attempt(token, task["name"]) id, path = ContestManager.get_input(task["name"], attempt) size = StorageManager.get_file_size(path) Database.begin() try: Database.add_input(id, token, task["name"], attempt, path, size, autocommit=False) Database.set_user_attempt(token, task["name"], attempt, autocommit=False) Database.commit() except: Database.rollback() raise Logger.info( "CONTEST", "Generated input %s for user %s on task %s" % (id, token, task["name"])) return BaseHandler.format_dates(Database.get_input(id=id))
def get_user(self, user): """ GET /user/<token> """ token = user["token"] user["contest"] = self.get_contest() if not user["contest"]["has_started"]: del user["extra_time"] return user end_time = InfoHandler.get_end_time(user["extra_time"]) if user["contest_start_delay"] is not None: end_time = min( end_time, InfoHandler.get_window_end_time(user["extra_time"], user["contest_start_delay"]), ) user["end_time"] = end_time del user["extra_time"] user["tasks"] = {} tasks = Database.get_user_task(token) for task in tasks: task_name = task["task"] if task["current_attempt"] is not None: current_input = Database.get_input( token=token, task=task_name, attempt=task["current_attempt"]) else: current_input = None user["tasks"][task_name] = { "name": task_name, "score": task["score"], "current_input": current_input, } user["total_score"] = sum(task["score"] for task in tasks) return BaseHandler.format_dates(user, fields=["end_time"])
def test_read_from_disk(self): path = Utils.new_tmp_dir() self._prepare_contest_dir(path) Config.statementdir = Utils.new_tmp_dir() Config.contest_path = path with patch("gevent.spawn") as mock: ContestManager.read_from_disk() mock.assert_has_calls( [call(ContestManager.worker, "poldo")], any_order=True) self.assertEqual(18000, Database.get_meta( "contest_duration", type=int)) tasks = Database.get_tasks() self.assertEqual(1, len(tasks)) self.assertEqual("poldo", tasks[0]["name"]) self.assertEqual("Poldo", tasks[0]["title"]) self.assertEqual(42, tasks[0]["max_score"]) self.assertEqual(0, tasks[0]["num"]) users = Database.get_users() self.assertEqual(1, len(users)) self.assertEqual("token", users[0]["token"]) self.assertEqual("Test", users[0]["name"]) self.assertEqual("User", users[0]["surname"]) self.assertEqual(0, users[0]["extra_time"]) user_tasks = Database.get_user_task("token", "poldo") self.assertEqual("token", user_tasks["token"]) self.assertEqual("poldo", user_tasks["task"]) self.assertEqual(0, user_tasks["score"]) self.assertIsNone(user_tasks["current_attempt"]) self.assertTrue(Database.get_meta("contest_imported", type=bool)) self.assertTrue(ContestManager.has_contest) self.assertIn("poldo", ContestManager.tasks) self.assertIn("poldo", ContestManager.input_queue)
def update_user_score(token, task, score): task_score = Database.get_user_task(token, task) if task_score["score"] < score: Database.set_user_score(token, task, score, autocommit=False)