예제 #1
0
    def test_get_user_info(self):
        team_owner = TeamFactory(owner=self.user)
        team_member = TeamFactory(members=[self.user])
        response = self.fetch_with_headers("/user/info/%s" % self.user.email)

        expect(response.code).to_equal(200)

        body = response.body
        if isinstance(body, six.binary_type):
            body = body.decode('utf-8')
        body = loads(body)
        expect(body['user']['email']).to_equal(self.user.email)

        owner_team = [
            team for team in body['user']['teams'] if team['role'] == 'owner'
        ]
        member_team = [
            team for team in body['user']['teams'] if team['role'] == 'member'
        ]

        expect(owner_team).to_length(1)
        expect(member_team).to_length(1)

        expect(owner_team[0]['name']).to_equal(team_owner.name)
        expect(member_team[0]['name']).to_equal(team_member.name)
def test_team_update_delete_permissions(client, TwoChallengeSets, view):
    team = TeamFactory(
        challenge=TwoChallengeSets.ChallengeSet1.challenge,
        owner=TwoChallengeSets.ChallengeSet1.participant,
    )
    TeamFactory(
        challenge=TwoChallengeSets.ChallengeSet1.challenge,
        owner=TwoChallengeSets.ChallengeSet1.participant1,
    )
    validate_owner_or_admin_view(
        viewname=view,
        reverse_kwargs={'pk': team.pk},
        two_challenge_set=TwoChallengeSets,
        client=client,
    )
예제 #3
0
def test_update_or_create(monkeypatch, db):
    user = UserFactory()

    team_1 = TeamFactory(name=("Team 1"), _base_log_user=user)
    team_2 = TeamFactory(name=("Team 2"), _base_log_user=user)

    player = PlayerFactory(name=(player_name := "Player"),
                           team=team_1,
                           _base_log_user=user)

    def save_signal(sender, **kwargs):
        assert sender == Player
        assert kwargs["obj"].pk is player.pk
        assert kwargs["obj"].name == player_name
        assert kwargs["obj"].team == team_2
        assert kwargs["user"] == user

    monkeypatch.setattr("django_base_model.signals.base_create.send",
                        save_signal)

    Player.objects.update_or_create(name=player_name,
                                    team=team_1,
                                    defaults={"team": team_2},
                                    _base_log_user=user)

    assert Player.objects.count() == 1

    new_player_name = "Player 2"

    def save_signal(sender, **kwargs):
        assert sender == Player
        assert kwargs["obj"].pk is not None
        assert kwargs["obj"].name == new_player_name
        assert kwargs["obj"].team == team_2
        assert kwargs["user"] == user

    monkeypatch.setattr("django_base_model.signals.base_create.send",
                        save_signal)

    Player.objects.update_or_create(
        name=new_player_name,
        team=team_1,
        defaults={"team": team_2},
        _base_log_user=user,
    )

    assert Player.objects.count() == 2
def test_open_views(client, ChallengeSet):
    team = TeamFactory(challenge=ChallengeSet.challenge,
                       owner=ChallengeSet.participant)
    validate_open_view(
        viewname='teams:detail',
        reverse_kwargs={'pk': team.pk},
        challenge_set=ChallengeSet,
        client=client,
    )
예제 #5
0
def test_open_views(client, challenge_set):
    team = TeamFactory(
        challenge=challenge_set.challenge, owner=challenge_set.participant
    )
    validate_open_view(
        viewname="teams:detail",
        reverse_kwargs={"pk": team.pk},
        challenge_set=challenge_set,
        client=client,
    )
예제 #6
0
    def test_invalid_team(self):
        user = UserFactory()
        team = TeamFactory()
        member = TeamMemberFactory(user=user, role='owner')

        data = {
            'member_obj': member.pk
        }
        form = forms.TeamMemberRemoveForm(data=data, team=team)
        assert not form.is_valid()
예제 #7
0
    def test_duplicate(self):
        user = UserFactory()
        team = TeamFactory()
        TeamMemberFactory(user=user, team=team, role='owner')

        data = {
            'user': user.pk,
            'role': 'owner',
        }
        form = forms.TeamMemberAddForm(data=data, team=team)
        assert not form.is_valid()
예제 #8
0
    def test_save_add(self):
        team = TeamFactory()
        repository = RepositoryFactory()

        data = {
            'team': team.pk,
        }
        form = forms.RepositoryTeamForm(data, repository=repository)
        assert form.is_valid()
        form.save()

        assert repository.teams.count() == 1
def test_team_member_delete_permissions(client, TwoChallengeSets):
    team = TeamFactory(
        challenge=TwoChallengeSets.ChallengeSet1.challenge,
        owner=TwoChallengeSets.ChallengeSet1.participant,
    )
    team_member = TeamMemberFactory(
        team=team, user=TwoChallengeSets.ChallengeSet1.participant1)
    validate_member_owner_or_admin_view(
        viewname='teams:member-delete',
        reverse_kwargs={'pk': team_member.pk},
        two_challenge_set=TwoChallengeSets,
        client=client,
    )
예제 #10
0
    def test_save(self):
        user = UserFactory()
        team = TeamFactory()
        member = TeamMemberFactory(user=user, team=team, role='owner')

        data = {
            'member_obj': member.pk
        }
        form = forms.TeamMemberRemoveForm(data=data, team=team)
        assert form.is_valid()

        cleaned_data = form.clean()
        assert cleaned_data == {'member_obj': member}
예제 #11
0
def test_team_member_delete_permissions(client, two_challenge_sets):
    team = TeamFactory(
        challenge=two_challenge_sets.challenge_set_1.challenge,
        owner=two_challenge_sets.challenge_set_1.participant,
    )
    team_member = TeamMemberFactory(
        team=team, user=two_challenge_sets.challenge_set_1.participant1
    )
    validate_member_owner_or_admin_view(
        viewname="teams:member-delete",
        reverse_kwargs={"pk": team_member.pk},
        two_challenge_set=two_challenge_sets,
        client=client,
    )
def test_admin_or_participant_permissions(client, TwoChallengeSets, view):
    team = TeamFactory(
        challenge=TwoChallengeSets.ChallengeSet1.challenge,
        owner=TwoChallengeSets.ChallengeSet1.participant,
    )
    if view in ('teams:detail', 'teams:member-create'):
        pk = team.pk
    else:
        pk = None
    validate_admin_or_participant_view(
        viewname=view,
        reverse_kwargs={'pk': pk},
        two_challenge_set=TwoChallengeSets,
        client=client,
    )
예제 #13
0
def test_update(monkeypatch, db):
    user = UserFactory()

    team_1 = TeamFactory(name="Team 1", _base_log_user=user)
    team_2 = TeamFactory(name="Team 2", _base_log_user=user)

    def update_signal(sender, **kwargs):
        assert sender == Team

        objs = list(kwargs["objs"])
        assert len(objs) == 2

        assert objs[0].pk == team_1.pk
        assert objs[0].name == "Team"

        assert objs[1].pk == team_2.pk
        assert objs[1].name == "Team"

        assert kwargs["user"] == user

    monkeypatch.setattr("django_base_model.signals.base_update.send",
                        update_signal)

    Team.objects.all().update(name="Team", _base_log_user=user)
예제 #14
0
def test_admin_or_participant_permissions(client, two_challenge_sets, view):
    team = TeamFactory(
        challenge=two_challenge_sets.challenge_set_1.challenge,
        owner=two_challenge_sets.challenge_set_1.participant,
    )
    if view in ("teams:detail", "teams:member-create"):
        pk = team.pk
    else:
        pk = None
    validate_admin_or_participant_view(
        viewname=view,
        reverse_kwargs={"pk": pk},
        two_challenge_set=two_challenge_sets,
        client=client,
    )
예제 #15
0
    def test_save(self):
        user = UserFactory()
        team = TeamFactory()

        data = {
            'user': user.pk,
            'role': 'owner',
        }
        form = forms.TeamMemberAddForm(data=data, team=team)
        assert form.is_valid()

        form.save()
        assert team.users.count() == 1

        member = team.members.first()
        assert member.user == user
        assert member.role == 'owner'
예제 #16
0
def test_team_member_addition(client, TwoChallengeSets):
    team = TeamFactory(
        challenge=TwoChallengeSets.ChallengeSet1.challenge,
        owner=TwoChallengeSets.ChallengeSet1.participant,
    )
    assert TwoChallengeSets.ChallengeSet1.participant in team.get_members()
    assert TwoChallengeSets.ChallengeSet1.participant1 not in team.get_members()
    # Participant1 requests to join team
    response = get_view_for_user(
        viewname="teams:member-create",
        challenge=TwoChallengeSets.ChallengeSet1.challenge,
        client=client,
        method=client.post,
        user=TwoChallengeSets.ChallengeSet1.participant1,
        reverse_kwargs={"pk": team.pk},
    )
    assert TwoChallengeSets.ChallengeSet1.participant1 in team.get_members()
    assert response.status_code == 302
예제 #17
0
def test_get_or_create(monkeypatch, db):
    user = UserFactory()

    TeamFactory(name=(team_1_name := "Team 1"), _base_log_user=user)
    Team.objects.get_or_create(name=team_1_name, _base_log_user=user)

    assert Team.objects.count() == 1

    team_2_name = "Team 2"

    def save_signal(sender, **kwargs):
        assert sender == Team
        assert kwargs["obj"].pk is not None
        assert kwargs["obj"].name == team_2_name
        assert kwargs["user"] == user

    monkeypatch.setattr("django_base_model.signals.base_create.send",
                        save_signal)

    Team.objects.get_or_create(name=team_2_name, _base_log_user=user)

    assert Team.objects.count() == 2
예제 #18
0
def test_bulk_delete(monkeypatch, db):
    user = UserFactory()

    team_1 = TeamFactory(name=(team_1_name := "Team 1"), _base_log_user=user)
    team_2 = TeamFactory(name=(team_2_name := "Team 2"), _base_log_user=user)

    player_1 = PlayerFactory(name=(player_1_name := "Player 1"),
                             team=team_1,
                             _base_log_user=user)
    player_2 = PlayerFactory(name=(player_2_name := "Player 2"),
                             team=team_2,
                             _base_log_user=user)
    player_3 = PlayerFactory(
        name=(player_3_name := "Player 3"),
        team=team_2,
        is_active=True,
        _base_log_user=user,
    )

    # It is not possible to delete all teams because 3rd player is active and it is not possible
    # to delete him
    with pytest.raises(ValidationError):
        Team.objects.all().delete(_base_log_user=user)

    assert Team.objects.count() == 2
    assert Player.objects.count() == 3

    player_3.is_active = False
    player_3.save(_base_log_user=user)

    def bulk_delete_signal(sender, **kwargs):
        assert sender in (Team, Player)

        objs = list(kwargs["objs"])

        if sender == Team:
            assert len(objs) == 2

            assert objs[0].pk == team_1.pk
            assert objs[0].name == team_1_name

            assert objs[1].pk == team_2.pk
            assert objs[1].name == team_2_name

        if sender == Player:
            assert len(objs) == 3

            assert objs[0].pk == player_1.pk
            assert objs[0].name == player_1_name

            assert objs[1].pk == player_2.pk
            assert objs[1].name == player_2_name

            assert objs[2].pk == player_3.pk
            assert objs[2].name == player_3_name

        assert kwargs["user"] == user

    monkeypatch.setattr("django_base_model.signals.base_bulk_delete.send",
                        bulk_delete_signal)

    Team.objects.all().delete(_base_log_user=user)

    assert Team.objects.count() == 0
    assert Player.objects.count() == 0
def test_unique_membership(client, TwoChallengeSets):
    team = TeamFactory(
        challenge=TwoChallengeSets.ChallengeSet1.challenge,
        owner=TwoChallengeSets.ChallengeSet1.participant,
    )
    team1 = TeamFactory(
        challenge=TwoChallengeSets.ChallengeSet1.challenge,
        owner=TwoChallengeSets.ChallengeSet1.participant1,
    )
    # Try to create a new team, should be denied
    response = get_view_for_user(
        viewname='teams:create',
        challenge=TwoChallengeSets.ChallengeSet1.challenge,
        client=client,
        method=client.post,
        user=TwoChallengeSets.ChallengeSet1.participant,
        data={'name': 'thisteamshouldnotbecreated'},
    )
    assert response.status_code == 200
    assert 'You are already a member of another team for this challenge' in response.rendered_content
    # Participant1 requests to join team, should be denied
    response = get_view_for_user(
        viewname='teams:member-create',
        challenge=TwoChallengeSets.ChallengeSet1.challenge,
        client=client,
        method=client.post,
        user=TwoChallengeSets.ChallengeSet1.participant1,
        reverse_kwargs={'pk': team.pk},
    )
    assert response.status_code == 200
    assert 'You are already a member of another team for this challenge' in response.rendered_content
    # participant12 should be able to create a team in their challenge and join another
    response = get_view_for_user(
        viewname='teams:create',
        challenge=TwoChallengeSets.ChallengeSet2.challenge,
        client=client,
        method=client.post,
        user=TwoChallengeSets.participant12,
        data={'name': 'thisteamshouldbecreated'},
    )
    assert response.status_code == 302
    response = get_view_for_user(
        viewname='teams:member-create',
        challenge=TwoChallengeSets.ChallengeSet1.challenge,
        client=client,
        method=client.post,
        user=TwoChallengeSets.participant12,
        reverse_kwargs={'pk': team.pk},
    )
    assert response.status_code == 302
    assert TwoChallengeSets.participant12 in team.get_members()
    response = get_view_for_user(
        viewname='teams:member-create',
        challenge=TwoChallengeSets.ChallengeSet1.challenge,
        client=client,
        method=client.post,
        user=TwoChallengeSets.participant12,
        reverse_kwargs={'pk': team1.pk},
    )
    assert response.status_code == 200
    assert 'You are already a member of another team for this challenge' in response.rendered_content
예제 #20
0
def test_delete(monkeypatch, db):
    user = UserFactory()
    team = TeamFactory(name=(team_name := "Team"), _base_log_user=user)
    player = PlayerFactory(name=(player_name := "Player"),
                           team=team,
                           _base_log_user=user)

    def delete_signal(sender, **kwargs):
        assert sender == Team
        assert kwargs["obj"].pk is not None
        assert kwargs["obj"].name == team_name
        assert kwargs["user"] == user

    def bulk_delete_signal(sender, **kwargs):
        assert sender == Player
        assert kwargs["objs"].count() == 1
        assert kwargs["objs"][0].pk is not None
        assert kwargs["objs"][0].name == player_name
        assert kwargs["user"] == user

    monkeypatch.setattr("django_base_model.signals.base_delete.send",
                        delete_signal)
    monkeypatch.setattr("django_base_model.signals.base_bulk_delete.send",
                        bulk_delete_signal)

    # Test that Foreign Key CASCADE relations (in this case player) are deleted
    team.delete(_base_log_user=user)

    with pytest.raises(ObjectDoesNotExist):
        player.refresh_from_db()

    # ------------------------------------------------------------------------------------------- #

    team = TeamFactory(name=team_name, _base_log_user=user)
    player = PlayerFactory(name=player_name, team=team, _base_log_user=user)
    training = PlayerTrainingFactory(player=player,
                                     description=(description :=
                                                  "Description"),
                                     _base_log_user=user)

    def delete_signal(sender, **kwargs):
        assert sender in (Player, PlayerTraining)

        assert kwargs["obj"].pk is not None

        if sender == Player:
            assert kwargs["obj"].name == player_name
        elif sender == PlayerTraining:
            assert kwargs["obj"].description == description

        assert kwargs["user"] == user

    monkeypatch.setattr("django_base_model.signals.base_delete.send",
                        delete_signal)

    # Test that OneToOneField CASCADE relation (in this case training) is deleted
    player.delete(_base_log_user=user)

    with pytest.raises(ObjectDoesNotExist):
        training.refresh_from_db()

    # ------------------------------------------------------------------------------------------- #

    player = PlayerFactory(name=player_name, team=team, _base_log_user=user)
    training = PlayerTrainingFactory(player=player,
                                     description=description,
                                     is_active=True,
                                     _base_log_user=user)

    assert Player.objects.count() == 1
    assert PlayerTraining.objects.count() == 1

    # Test that error is raised because it is not possible to delete active training which
    # would be deleted because of CASCADE deletion
    with pytest.raises(ValidationError):
        player.delete(_base_log_user=user)

    assert Player.objects.count() == 1
    assert PlayerTraining.objects.count() == 1

    # ------------------------------------------------------------------------------------------- #

    player = PlayerFactory(name=player_name,
                           team=team,
                           is_active=True,
                           _base_log_user=user)

    assert Team.objects.count() == 1
    assert Player.objects.count() == 2

    def delete_signal(sender, **kwargs):
        assert sender == Team
        assert kwargs["obj"].pk is not None
        assert kwargs["obj"].name == team_name
        assert kwargs["user"] == user

    monkeypatch.setattr("django_base_model.signals.base_delete.send",
                        delete_signal)

    # Test that error is raised because it is not possible to delete active players who
    # would be deleted because of CASCADE deletion
    with pytest.raises(ValidationError):
        team.delete(_base_log_user=user)

    assert Team.objects.count() == 1
    assert Player.objects.count() == 2
예제 #21
0
def test_unique_membership(client, two_challenge_sets):
    team = TeamFactory(
        challenge=two_challenge_sets.challenge_set_1.challenge,
        owner=two_challenge_sets.challenge_set_1.participant,
    )
    team1 = TeamFactory(
        challenge=two_challenge_sets.challenge_set_1.challenge,
        owner=two_challenge_sets.challenge_set_1.participant1,
    )
    # Try to create a new team, should be denied
    response = get_view_for_user(
        viewname="teams:create",
        challenge=two_challenge_sets.challenge_set_1.challenge,
        client=client,
        method=client.post,
        user=two_challenge_sets.challenge_set_1.participant,
        data={"name": "thisteamshouldnotbecreated"},
    )
    assert response.status_code == 200
    assert (
        "You are already a member of another team for this challenge"
        in response.rendered_content
    )
    # Participant1 requests to join team, should be denied
    response = get_view_for_user(
        viewname="teams:member-create",
        challenge=two_challenge_sets.challenge_set_1.challenge,
        client=client,
        method=client.post,
        user=two_challenge_sets.challenge_set_1.participant1,
        reverse_kwargs={"pk": team.pk},
    )
    assert response.status_code == 200
    assert (
        "You are already a member of another team for this challenge"
        in response.rendered_content
    )
    # participant12 should be able to create a team in their challenge and join
    # another team
    response = get_view_for_user(
        viewname="teams:create",
        challenge=two_challenge_sets.challenge_set_2.challenge,
        client=client,
        method=client.post,
        user=two_challenge_sets.participant12,
        data={"name": "thisteamshouldbecreated"},
    )
    assert response.status_code == 302
    response = get_view_for_user(
        viewname="teams:member-create",
        challenge=two_challenge_sets.challenge_set_1.challenge,
        client=client,
        method=client.post,
        user=two_challenge_sets.participant12,
        reverse_kwargs={"pk": team.pk},
    )
    assert response.status_code == 302
    assert two_challenge_sets.participant12 in team.get_members()
    response = get_view_for_user(
        viewname="teams:member-create",
        challenge=two_challenge_sets.challenge_set_1.challenge,
        client=client,
        method=client.post,
        user=two_challenge_sets.participant12,
        reverse_kwargs={"pk": team1.pk},
    )
    assert response.status_code == 200
    assert (
        "You are already a member of another team for this challenge"
        in response.rendered_content
    )