Exemplo n.º 1
0
def get_records_dev(categories: [Category]):
    """Get the records to add to the database for development"""
    challenges = []
    for category in categories:
        challenges.append(
            Challenge(
                category_id=category.id,
                name='Super Duper Challenge',
                description='## title 2\n\nA **really** *cool* challenge for'
                'everyone https://google.ca',
                points=50,
                hidden=False))
        challenges.append(
            Challenge(category_id=category.id,
                      name='Pretty hard challenge',
                      description='A pretty hard challenge for veterans',
                      points=100,
                      hidden=True))
        challenges.append(
            Challenge(category_id=category.id,
                      name="You Better Know What You're Doing Challenge",
                      description='A challenge for very specific skill sets',
                      points=300,
                      hidden=False))
        challenges.append(
            Challenge(category_id=category.id,
                      name='Hope You Had Nothing Else To Do Challenge',
                      description='A challenge that takes a whole week',
                      points=5000,
                      hidden=True))

    return challenges
Exemplo n.º 2
0
def create_challenge(current_admin: Administrator):
    """Add 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"]

    category = Category.query.filter_by(id=category_id).first()

    if category is None:
        raise errors.UnprocessableEntity("The category doesn't exist.")

    if not current_admin.is_admin_of_event(category.event_id):
        raise errors.Unauthorized(
            "You do not have the permission to administer this challenge.")

    challenge = Challenge.query.filter_by(name=name).first()

    if challenge is not None:
        raise errors.UnprocessableEntity(
            "A challenge with that name already exists.")

    if not name:
        raise errors.UnprocessableEntity("Name must not be empty.")

    if points <= 0:
        raise errors.UnprocessableEntity("Points must be positive.")

    flag_objects = list(
        map(lambda flag: Flag(is_regex=flag['is_regex'], value=flag['value']),
            flags))

    challenge = Challenge(name=name,
                          points=points,
                          hidden=hidden,
                          description=description,
                          category_id=category_id,
                          flags=flag_objects)

    DB.session.add(challenge)
    DB.session.commit()

    return challenge
Exemplo n.º 3
0
 def _challenge_mock(self, challenge_mock: MagicMock):
     challenge_mock.side_effect = lambda *args, **kwargs: Challenge(
         *args, **kwargs)
Exemplo n.º 4
0
class TestEditChallenge:
    REQUEST_BODY = {
        "name": "Edited challenge",
        "points": 999,
        "hidden": True,
        "description": "Edited Description",
        "category_id": 1,
        "flags": [{
            'value': 'JDIS-FLAG',
            'is_regex': False
        }]
    }
    AN_EDITED_CHALLENGE = Challenge(id=0,
                                    name=REQUEST_BODY["name"],
                                    points=REQUEST_BODY["points"],
                                    hidden=REQUEST_BODY["hidden"],
                                    description=REQUEST_BODY["description"],
                                    category_id=REQUEST_BODY["category_id"],
                                    flags=[A_FLAG])

    @fixture(autouse=True)
    def _rebar_mock(self, rebar_mock: MagicMock):
        rebar_mock.get_validated_body.return_value = self.REQUEST_BODY
        yield rebar_mock

    @fixture(autouse=True)
    def _category_mock(self, category_mock: MagicMock):
        category_mock.query.filter_by.return_value.first.return_value = A_CATEGORY
        yield category_mock

    @fixture(autouse=True)
    def _challenge_mock(self, challenge_mock: MagicMock):
        challenge_mock.side_effect = lambda A_CHALLENGE, **kwargs: Challenge(
            *args, **kwargs)

    def test_given_invalid_challenge_id_should_raise_unprocessable_entity_error(
            self, challenge_mock: MagicMock):
        challenge_mock.query.filter_by.return_value.first.return_value = None

        with raises(errors.UnprocessableEntity):
            inspect.unwrap(challenges.edit_challenge)(AN_ADMINISTRATOR, -1)

    def test_given_an_administrator_of_another_event_should_raise_unauthorized_error(
            self, challenge_mock: MagicMock, flag_mock: MagicMock):
        with raises(errors.Unauthorized):
            inspect.unwrap(challenges.edit_challenge)(ANOTHER_ADMINISTRATOR, 1)

    def test_given_invalid_category_should_raise_unprocessable_entity_error(
            self, challenge_mock: MagicMock, category_mock: MagicMock):
        challenge_mock.query.filter_by.return_value.first.side_effect = [
            A_CHALLENGE, None
        ]
        category_mock.query.filter_by.return_value.first.return_value = None

        with raises(errors.UnprocessableEntity):
            inspect.unwrap(challenges.edit_challenge)(AN_ADMINISTRATOR, 1)

    def test_given_blank_name_should_raise_unprocessable_entity_error(
            self, challenge_mock: MagicMock, rebar_mock: MagicMock):
        challenge_mock.query.filter_by.return_value.first.side_effect = [
            A_CHALLENGE, None
        ]
        rebar_mock.get_validated_body.return_value = \
            {"name": "", "points": 999, "hidden": True, "description": "Edited Description", "category_id": 1, "flags": [{'value': 'JDIS-FLAG', 'is_regex': False}]}

        with raises(errors.UnprocessableEntity):
            inspect.unwrap(challenges.edit_challenge)(AN_ADMINISTRATOR, 1)

    def test_given_already_used_name_should_raise_unprocessable_entity_error(
            self, challenge_mock: MagicMock):
        challenge_mock.query.filter_by.return_value.first.side_effect = [
            A_CHALLENGE, A_CHALLENGE
        ]

        with raises(errors.UnprocessableEntity):
            inspect.unwrap(challenges.edit_challenge)(AN_ADMINISTRATOR, 1)

    def test_given_negative_points_should_raise_unprocessable_entity_error(
            self, challenge_mock: MagicMock, rebar_mock: MagicMock):
        challenge_mock.query.filter_by.return_value.first.side_effect = [
            A_CHALLENGE, None
        ]

        rebar_mock.get_validated_body.return_value = \
            {"name": "Edited challenge", "points": -1, "hidden": True, "description": "Edited Description", "category_id": 1, "flags": [{'value': 'JDIS-FLAG', 'is_regex': False}]}

        with raises(errors.UnprocessableEntity):
            inspect.unwrap(challenges.edit_challenge)(AN_ADMINISTRATOR, 1)

    def test_should_edit_challenge(self, db_mock: MagicMock,
                                   challenge_mock: MagicMock,
                                   category_mock: MagicMock):
        challenge_mock.query.filter_by.return_value.first.side_effect = [
            A_CHALLENGE, None
        ]
        category_mock.query.filter_by.return_value.first.return_value = A_CATEGORY

        inspect.unwrap(challenges.edit_challenge)(AN_ADMINISTRATOR, 1)

        db_mock.session.commit.assert_called_once()

    def test_should_return_challenge(self, db_mock: MagicMock,
                                     challenge_mock: MagicMock,
                                     category_mock: MagicMock):
        challenge_mock.query.filter_by.return_value.first.side_effect = [
            A_CHALLENGE, None
        ]
        category_mock.query.filter_by.return_value.first.return_value = A_CATEGORY

        result = inspect.unwrap(challenges.edit_challenge)(AN_ADMINISTRATOR, 1)

        assert result == self.AN_EDITED_CHALLENGE
Exemplo n.º 5
0
def current_user_mock():
    with local_patch("current_user") as mock:
        yield mock


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)
Exemplo n.º 6
0

@fixture
def submission_mock():
    with local_patch('Submission') as mock:
        yield mock


EVENT_ID = 1
A_TEAM = Team(id=1, event_id=EVENT_ID, name='Team 1')
REQUEST_BODY = {"team_id": 1, "flag": "JDIS"}
A_EVENT = Event(id=EVENT_ID, name="Test Event", teams=True)
A_USER = User(id=0, username="******", email="*****@*****.**")
A_CHALLENGE = Challenge(id=1,
                        category_id=1,
                        name='Challenge',
                        description='Description',
                        points=100,
                        hidden=False)
A_CATEGORY = Category(id=1, event_id=1, name='Category')


class TestGetAllChallengesForEvent:
    @fixture(autouse=True)
    def _submission_mock(self, submission_mock: MagicMock):
        submission_mock.query.filter.return_value.exists.return_value.label.return_value = 1
        yield submission_mock

    @fixture(autouse=True)
    def _event_mock(self, event_mock: MagicMock):
        event_mock.query.filter_by.return_value.first.return_value = 1
        yield event_mock
Exemplo n.º 7
0
A_CLOSED_EVENT = Event(id=AN_EVENT_ID,
                       name='',
                       teams=True,
                       is_visible=True,
                       is_open=False)
AN_INVISIBLE_EVENT = Event(id=AN_EVENT_ID,
                           name='',
                           teams=True,
                           is_visible=False,
                           is_open=False)
A_CATEGORY_WITH_INVISIBLE_EVENT = Category(event_id=AN_INVISIBLE_EVENT,
                                           name="event invisible")
A_CATEGORY = Category(event_id=AN_EVENT, name="event invisible")
A_CHALLENGE_WITH_INVISIBLE_EVENT = Challenge(
    id=1,
    name='A chall',
    category_id=A_CATEGORY_WITH_INVISIBLE_EVENT.id,
    category=A_CATEGORY_WITH_INVISIBLE_EVENT)
A_CHALLENGE = Challenge(id=1,
                        name='A chall2',
                        category_id=A_CATEGORY_WITH_INVISIBLE_EVENT.id,
                        category=A_CATEGORY_WITH_INVISIBLE_EVENT)
AN_ADMINISTRATOR = Administrator(id=0, is_platform_admin=True, user_id=0)
ANOTHER_ADMINISTRATOR = Administrator(id=1, is_platform_admin=False, user_id=1)

A_ROLE = 'role'


def has_current_administrator(*_, **kwargs):
    return 'current_admin' in kwargs