def get_records_dev(challenges: [Challenge]): """Get the records to add to the database for development""" flags = [] for challenge in challenges: flags.append( Flag(challenge_id=challenge.id, is_regex=False, value='flag-JDIS')) flags.append( Flag(challenge_id=challenge.id, is_regex=True, value='regex-*')) return flags
def edit_challenge(current_admin: Administrator, challenge_id: int): """Edit a challenge and its associated ressources (flags, links, files)""" body = flask_rebar.get_validated_body() name = body["name"] points = body["points"] hidden = body["hidden"] description = body["description"] category_id = body["category_id"] flags = body["flags"] editable_challenge = Challenge.query.filter_by(id=challenge_id).first() if editable_challenge is None: raise errors.UnprocessableEntity("This challenge does not exist.") if not current_admin.is_admin_of_event( editable_challenge.category.event_id): raise errors.Unauthorized( "You do not have the permission to administer this challenge.") if category_id != editable_challenge.category_id: category = Category.query.filter_by( id=category_id, event_id=editable_challenge.category.event_id).first() if category is None: raise errors.UnprocessableEntity("The category doesn't exist.") if name != editable_challenge.name: if not name: raise errors.UnprocessableEntity("Name must not be empty.") challenge = Challenge.query.filter_by(name=name).first() if challenge is not None: raise errors.UnprocessableEntity( "A challenge with that name already exists.") if points != editable_challenge.points and points <= 0: raise errors.UnprocessableEntity("Points must be positive.") editable_challenge.name = name editable_challenge.points = points editable_challenge.hidden = hidden editable_challenge.description = description editable_challenge.category_id = category_id flag_objects = list( map(lambda flag: Flag(is_regex=flag['is_regex'], value=flag['value']), flags)) editable_challenge.flags = flag_objects DB.session.commit() return editable_challenge
def test_given_incorrect_flag_should_return_correct_false( self, flag_mock: MagicMock, _current_user_mock: MagicMock): _current_user_mock.get_team.return_value = A_TEAM flag_mock.query.filter_by.return_value.all.return_value = [ Flag(id=1, challenge_id=A_CHALLENGE.id, is_regex=True, value=self.REQUEST_BODY['flag'] + '1') ] result = submit_flag.func(event=A_EVENT, challenge=A_CHALLENGE) assert result == {'correct': False}
def test_given_non_correct_regex_flag_should_persist_submission_with_is_correct_false( self, _db_mock: MagicMock, flag_mock: MagicMock, _current_user_mock: MagicMock): _current_user_mock.get_team.return_value = A_TEAM flag_mock.query.filter_by.return_value.all.return_value = [ Flag(id=1, challenge_id=A_CHALLENGE.id, is_regex=True, value=self.REQUEST_BODY['flag'] + '1') ] submit_flag.func(event=A_EVENT, challenge=A_CHALLENGE) _db_mock.session.add.assert_called_with( Submission(team_id=A_TEAM.id, challenge_id=A_CHALLENGE.id, input=self.REQUEST_BODY['flag'], is_correct=False))
A_EVENT = Event(id=0, name="Test Event", teams=True) AN_ADMINISTRATOR = Administrator(id=0, is_platform_admin=True, user_id=0) AN_ADMINISTRATOR.event_administrators = \ [EventAdministrator(id=0, administrator_id=0, event_id=0, event=A_EVENT)] ANOTHER_ADMINISTRATOR = Administrator(id=1, is_platform_admin=False, user_id=1) A_CATEGORY = Category(id=0, event_id=A_EVENT.id, name="Category") A_CHALLENGE = Challenge(id=0, name="Challenge name", points=100, hidden=False, description="My description", category=A_CATEGORY, category_id=A_CATEGORY.id) A_FLAG = Flag(id=None, challenge_id=A_CHALLENGE.id, is_regex=False, value="JDIS-FLAG") A_CHALLENGE.flags = [A_FLAG] class TestGetChallenge: @fixture(autouse=True) def _challenge_mock(self, challenge_mock: MagicMock): challenge_mock.side_effect = lambda *args, **kwargs: Challenge( *args, **kwargs) def test_given_non_existent_challenge_id_should_raise_not_found_error( self, challenge_mock: MagicMock, flag_mock: MagicMock): challenge_mock.query.filter_by.return_value.join.return_value.join.return_value.first.return_value = None flag_mock.query.filter_by.return_value.first.return_value = None