Sith/club/tests.py

887 lines
34 KiB
Python
Raw Permalink Normal View History

#
# Copyright 2023 © AE UTBM
# ae@utbm.fr / ae.info@utbm.fr
#
# This file is part of the website of the UTBM Student Association (AE UTBM),
# https://ae.utbm.fr.
#
# You can find the source code of the website at https://github.com/ae-utbm/sith
#
# LICENSED UNDER THE GNU GENERAL PUBLIC LICENSE VERSION 3 (GPLv3)
2024-09-23 08:25:27 +00:00
# SEE : https://raw.githubusercontent.com/ae-utbm/sith/master/LICENSE
# OR WITHIN THE LOCAL FILE "LICENSE"
#
#
from datetime import timedelta
2019-05-09 16:06:11 +00:00
from django.conf import settings
from django.core.cache import cache
from django.test import TestCase
from django.urls import reverse
from django.utils import timezone
2024-10-02 22:21:16 +00:00
from django.utils.timezone import localdate, localtime, now
2024-06-24 11:07:36 +00:00
from django.utils.translation import gettext as _
from model_bakery import baker
2019-05-09 16:06:11 +00:00
from club.forms import MailingForm
2024-06-24 11:07:36 +00:00
from club.models import Club, Mailing, Membership
2024-09-04 14:21:42 +00:00
from core.baker_recipes import subscriber_user
2024-06-24 11:07:36 +00:00
from core.models import AnonymousUser, User
from sith.settings import SITH_BAR_MANAGER, SITH_MAIN_CLUB_ID
2016-03-22 08:01:24 +00:00
2017-06-12 06:54:48 +00:00
2024-07-23 22:39:26 +00:00
class TestClub(TestCase):
2024-07-12 07:34:16 +00:00
"""Set up data for test cases related to clubs and membership.
The generated dataset is the one created by the populate command,
plus the following modifications :
- `self.club` is a dummy club recreated for each test
- `self.club` has two board members : skia (role 3) and comptable (role 10)
- `self.club` has one regular member : richard
- `self.club` has one former member : sli (who had role 2)
- None of the `self.club` members are in the AE club.
"""
@classmethod
def setUpTestData(cls):
# subscribed users - initial members
cls.skia = User.objects.get(username="skia")
2024-06-26 09:39:07 +00:00
# by default, Skia is in the AE, which creates side effect
cls.skia.memberships.all().delete()
cls.richard = User.objects.get(username="rbatsbak")
cls.comptable = User.objects.get(username="comptable")
cls.sli = User.objects.get(username="sli")
cls.root = User.objects.get(username="root")
# subscribed users - not initial members
cls.krophil = User.objects.get(username="krophil")
cls.subscriber = User.objects.get(username="subscriber")
# old subscriber
cls.old_subscriber = User.objects.get(username="old_subscriber")
# not subscribed
cls.public = User.objects.get(username="public")
cls.ae = Club.objects.filter(pk=SITH_MAIN_CLUB_ID)[0]
2024-06-26 09:39:07 +00:00
cls.club = Club.objects.create(
name="Fake Club",
unix_name="fake-club",
address="5 rue de la République, 90000 Belfort",
)
2024-06-26 10:28:00 +00:00
cls.members_url = reverse("club:club_members", kwargs={"club_id": cls.club.id})
a_month_ago = now() - timedelta(days=30)
yesterday = now() - timedelta(days=1)
Membership.objects.create(
2024-06-26 09:39:07 +00:00
club=cls.club, user=cls.skia, start_date=a_month_ago, role=3
)
2024-06-26 09:39:07 +00:00
Membership.objects.create(club=cls.club, user=cls.richard, role=1)
Membership.objects.create(
2024-06-26 09:39:07 +00:00
club=cls.club, user=cls.comptable, start_date=a_month_ago, role=10
)
# sli was a member but isn't anymore
Membership.objects.create(
2024-06-26 09:39:07 +00:00
club=cls.club,
user=cls.sli,
start_date=a_month_ago,
end_date=yesterday,
role=2,
)
2024-06-26 09:39:07 +00:00
def setUp(self):
cache.clear()
2024-07-23 22:39:26 +00:00
class TestMembershipQuerySet(TestClub):
def test_ongoing(self):
2024-07-12 07:34:16 +00:00
"""Test that the ongoing queryset method returns the memberships that
are not ended.
"""
current_members = list(self.club.members.ongoing().order_by("id"))
expected = [
self.skia.memberships.get(club=self.club),
self.comptable.memberships.get(club=self.club),
self.richard.memberships.get(club=self.club),
]
expected.sort(key=lambda i: i.id)
assert current_members == expected
2024-09-04 14:21:42 +00:00
def test_ongoing_with_membership_ending_today(self):
"""Test that a membership ending the present day is considered as ended."""
2024-10-02 22:21:16 +00:00
today = localdate()
2024-09-04 14:21:42 +00:00
self.richard.memberships.filter(club=self.club).update(end_date=today)
current_members = list(self.club.members.ongoing().order_by("id"))
expected = [
self.skia.memberships.get(club=self.club),
self.comptable.memberships.get(club=self.club),
]
expected.sort(key=lambda i: i.id)
assert current_members == expected
def test_board(self):
2024-07-12 07:34:16 +00:00
"""Test that the board queryset method returns the memberships
of user in the club board.
"""
board_members = list(self.club.members.board().order_by("id"))
expected = [
self.skia.memberships.get(club=self.club),
self.comptable.memberships.get(club=self.club),
# sli is no more member, but he was in the board
self.sli.memberships.get(club=self.club),
]
expected.sort(key=lambda i: i.id)
assert board_members == expected
def test_ongoing_board(self):
2024-07-12 07:34:16 +00:00
"""Test that combining ongoing and board returns users
who are currently board members of the club.
"""
members = list(self.club.members.ongoing().board().order_by("id"))
expected = [
self.skia.memberships.get(club=self.club),
self.comptable.memberships.get(club=self.club),
]
expected.sort(key=lambda i: i.id)
assert members == expected
def test_update_invalidate_cache(self):
2024-07-12 07:34:16 +00:00
"""Test that the `update` queryset method properly invalidate cache."""
mem_skia = self.skia.memberships.get(club=self.club)
cache.set(f"membership_{mem_skia.club_id}_{mem_skia.user_id}", mem_skia)
self.skia.memberships.update(end_date=localtime(now()).date())
assert (
cache.get(f"membership_{mem_skia.club_id}_{mem_skia.user_id}")
== "not_member"
)
mem_richard = self.richard.memberships.get(club=self.club)
cache.set(
f"membership_{mem_richard.club_id}_{mem_richard.user_id}", mem_richard
)
self.richard.memberships.update(role=5)
new_mem = self.richard.memberships.get(club=self.club)
assert new_mem != "not_member"
assert new_mem.role == 5
2024-12-03 16:50:14 +00:00
def test_update_change_club_groups(self):
"""Test that `update` set the user groups accordingly."""
user = baker.make(User)
membership = baker.make(Membership, end_date=None, user=user, role=5)
members_group = membership.club.members_group
board_group = membership.club.board_group
assert user.groups.contains(members_group)
assert user.groups.contains(board_group)
user.memberships.update(role=1) # from board to simple member
assert user.groups.contains(members_group)
assert not user.groups.contains(board_group)
user.memberships.update(role=5) # from member to board
assert user.groups.contains(members_group)
assert user.groups.contains(board_group)
user.memberships.update(end_date=localdate()) # end the membership
assert not user.groups.contains(members_group)
assert not user.groups.contains(board_group)
def test_delete_invalidate_cache(self):
2024-07-12 07:34:16 +00:00
"""Test that the `delete` queryset properly invalidate cache."""
mem_skia = self.skia.memberships.get(club=self.club)
mem_comptable = self.comptable.memberships.get(club=self.club)
cache.set(f"membership_{mem_skia.club_id}_{mem_skia.user_id}", mem_skia)
cache.set(
f"membership_{mem_comptable.club_id}_{mem_comptable.user_id}", mem_comptable
)
# should delete the subscriptions of skia and comptable
self.club.members.ongoing().board().delete()
2024-06-26 10:28:00 +00:00
for membership in (mem_skia, mem_comptable):
cached_mem = cache.get(
f"membership_{membership.club_id}_{membership.user_id}"
)
assert cached_mem == "not_member"
2024-12-03 16:50:14 +00:00
def test_delete_remove_from_groups(self):
"""Test that `delete` removes from club groups"""
user = baker.make(User)
memberships = baker.make(Membership, role=iter([1, 5]), user=user, _quantity=2)
club_groups = {
memberships[0].club.members_group,
memberships[1].club.members_group,
memberships[1].club.board_group,
}
assert set(user.groups.all()) == club_groups
user.memberships.all().delete()
assert user.groups.all().count() == 0
2024-07-23 22:39:26 +00:00
class TestClubModel(TestClub):
def assert_membership_started_today(self, user: User, role: int):
2024-07-12 07:34:16 +00:00
"""Assert that the given membership is active and started today."""
membership = user.memberships.ongoing().filter(club=self.club).first()
assert membership is not None
assert localtime(now()).date() == membership.start_date
assert membership.end_date is None
assert membership.role == role
assert membership.club.get_membership_for(user) == membership
assert user.is_in_group(pk=self.club.members_group_id)
assert user.is_in_group(pk=self.club.board_group_id)
def assert_membership_ended_today(self, user: User):
2024-07-12 07:34:16 +00:00
"""Assert that the given user have a membership which ended today."""
today = localtime(now()).date()
assert user.memberships.filter(club=self.club, end_date=today).exists()
assert self.club.get_membership_for(user) is None
def test_access_unauthorized(self):
2024-07-12 07:34:16 +00:00
"""Test that users who never subscribed and anonymous users
cannot see the page.
"""
response = self.client.post(self.members_url)
assert response.status_code == 403
self.client.force_login(self.public)
response = self.client.post(self.members_url)
assert response.status_code == 403
def test_display(self):
2024-07-12 07:34:16 +00:00
"""Test that a GET request return a page where the requested
information are displayed.
"""
self.client.force_login(self.skia)
response = self.client.get(self.members_url)
assert response.status_code == 200
expected_html = (
"<table><thead><tr>"
"<td>Utilisateur</td><td>Rôle</td><td>Description</td>"
"<td>Depuis</td><td>Marquer comme ancien</td>"
"</tr></thead><tbody>"
)
memberships = self.club.members.ongoing().order_by("-role")
input_id = 0
for membership in memberships.select_related("user"):
user = membership.user
expected_html += (
f"<tr><td><a href=\"{reverse('core:user_profile', args=[user.id])}\">"
f"{user.get_display_name()}</a></td>"
f"<td>{settings.SITH_CLUB_ROLES[membership.role]}</td>"
f"<td>{membership.description}</td>"
f"<td>{membership.start_date}</td><td>"
)
if membership.role <= 3: # 3 is the role of skia
expected_html += (
'<input type="checkbox" name="users_old" '
f'value="{user.id}" '
f'id="id_users_old_{input_id}">'
)
input_id += 1
expected_html += "</td></tr>"
expected_html += "</tbody></table>"
self.assertInHTML(expected_html, response.content.decode())
def test_root_add_one_club_member(self):
2024-07-12 07:34:16 +00:00
"""Test that root users can add members to clubs, one at a time."""
self.client.force_login(self.root)
response = self.client.post(
self.members_url,
2024-10-20 19:28:25 +00:00
{"users": [self.subscriber.id], "role": 3},
2018-10-04 19:29:19 +00:00
)
self.assertRedirects(response, self.members_url)
self.subscriber.refresh_from_db()
self.assert_membership_started_today(self.subscriber, role=3)
2016-03-22 08:01:24 +00:00
def test_root_add_multiple_club_member(self):
2024-07-12 07:34:16 +00:00
"""Test that root users can add multiple members at once to clubs."""
self.client.force_login(self.root)
response = self.client.post(
self.members_url,
{
2024-10-20 19:28:25 +00:00
"users": (self.subscriber.id, self.krophil.id),
"role": 3,
},
)
self.assertRedirects(response, self.members_url)
self.subscriber.refresh_from_db()
self.assert_membership_started_today(self.subscriber, role=3)
self.assert_membership_started_today(self.krophil, role=3)
def test_add_unauthorized_members(self):
2024-07-12 07:34:16 +00:00
"""Test that users who are not currently subscribed
cannot be members of clubs.
"""
self.client.force_login(self.root)
2018-10-04 19:29:19 +00:00
response = self.client.post(
self.members_url,
{"users": self.public.id, "role": 1},
2018-10-04 19:29:19 +00:00
)
assert not self.public.memberships.filter(club=self.club).exists()
assert '<ul class="errorlist"><li>' in response.content.decode()
2016-03-22 08:01:24 +00:00
2018-10-04 19:29:19 +00:00
response = self.client.post(
self.members_url,
{"users": self.old_subscriber.id, "role": 1},
2018-10-04 19:29:19 +00:00
)
assert not self.public.memberships.filter(club=self.club).exists()
assert self.club.get_membership_for(self.public) is None
assert '<ul class="errorlist"><li>' in response.content.decode()
2016-03-22 08:01:24 +00:00
def test_add_members_already_members(self):
2024-07-12 07:34:16 +00:00
"""Test that users who are already members of a club
cannot be added again to this club.
"""
self.client.force_login(self.root)
current_membership = self.skia.memberships.ongoing().get(club=self.club)
nb_memberships = self.skia.memberships.count()
self.client.post(
self.members_url,
{"users": self.skia.id, "role": current_membership.role + 1},
)
self.skia.refresh_from_db()
assert nb_memberships == self.skia.memberships.count()
new_membership = self.skia.memberships.ongoing().get(club=self.club)
assert current_membership == new_membership
assert self.club.get_membership_for(self.skia) == new_membership
def test_add_not_existing_users(self):
2024-07-12 07:34:16 +00:00
"""Test that not existing users cannot be added in clubs.
If one user in the request is invalid, no membership creation at all
can take place.
"""
self.client.force_login(self.root)
nb_memberships = self.club.members.count()
response = self.client.post(
self.members_url,
{"users": [9999], "role": 1},
)
assert response.status_code == 200
assert '<ul class="errorlist"><li>' in response.content.decode()
self.club.refresh_from_db()
assert self.club.members.count() == nb_memberships
response = self.client.post(
self.members_url,
{
2024-10-20 19:28:25 +00:00
"users": (self.subscriber.id, 9999),
"start_date": "12/06/2016",
"role": 3,
},
)
assert response.status_code == 200
assert '<ul class="errorlist"><li>' in response.content.decode()
self.club.refresh_from_db()
assert self.club.members.count() == nb_memberships
def test_president_add_members(self):
2024-07-12 07:34:16 +00:00
"""Test that the president of the club can add members."""
president = self.club.members.get(role=10).user
nb_club_membership = self.club.members.count()
nb_subscriber_memberships = self.subscriber.memberships.count()
self.client.force_login(president)
response = self.client.post(
self.members_url,
{"users": self.subscriber.id, "role": 9},
)
self.assertRedirects(response, self.members_url)
self.club.refresh_from_db()
self.subscriber.refresh_from_db()
assert self.club.members.count() == nb_club_membership + 1
assert self.subscriber.memberships.count() == nb_subscriber_memberships + 1
self.assert_membership_started_today(self.subscriber, role=9)
def test_add_member_greater_role(self):
2024-07-12 07:34:16 +00:00
"""Test that a member of the club member cannot create
a membership with a greater role than its own.
"""
self.client.force_login(self.skia)
nb_memberships = self.club.members.count()
response = self.client.post(
self.members_url,
{"users": self.subscriber.id, "role": 10},
2018-10-04 19:29:19 +00:00
)
assert response.status_code == 200
self.assertInHTML(
"<li>Vous n'avez pas la permission de faire cela</li>",
response.content.decode(),
2018-10-04 19:29:19 +00:00
)
self.club.refresh_from_db()
assert nb_memberships == self.club.members.count()
assert not self.subscriber.memberships.filter(club=self.club).exists()
2016-03-22 08:01:24 +00:00
def test_add_member_without_role(self):
2024-07-12 07:34:16 +00:00
"""Test that trying to add members without specifying their role fails."""
self.client.force_login(self.root)
2018-10-04 19:29:19 +00:00
response = self.client.post(
self.members_url,
{"users": self.subscriber.id, "start_date": "12/06/2016"},
)
assert (
'<ul class="errorlist"><li>Vous devez choisir un r'
in response.content.decode()
)
def test_end_membership_self(self):
2024-07-12 07:34:16 +00:00
"""Test that a member can end its own membership."""
self.client.force_login(self.skia)
self.client.post(
self.members_url,
{"users_old": self.skia.id},
)
self.skia.refresh_from_db()
self.assert_membership_ended_today(self.skia)
def test_end_membership_lower_role(self):
2024-07-12 07:34:16 +00:00
"""Test that board members of the club can end memberships
of users with lower roles.
"""
# remainder : skia has role 3, comptable has role 10, richard has role 1
self.client.force_login(self.skia)
response = self.client.post(
self.members_url,
{"users_old": self.richard.id},
)
self.assertRedirects(response, self.members_url)
self.club.refresh_from_db()
self.assert_membership_ended_today(self.richard)
def test_end_membership_higher_role(self):
2024-07-12 07:34:16 +00:00
"""Test that board members of the club cannot end memberships
of users with higher roles.
"""
membership = self.comptable.memberships.filter(club=self.club).first()
self.client.force_login(self.skia)
self.client.post(
self.members_url,
{"users_old": self.comptable.id},
)
self.club.refresh_from_db()
new_membership = self.club.get_membership_for(self.comptable)
assert new_membership is not None
assert new_membership == membership
membership = self.comptable.memberships.filter(club=self.club).first()
assert membership.end_date is None
def test_end_membership_as_main_club_board(self):
2024-07-12 07:34:16 +00:00
"""Test that board members of the main club can end the membership
of anyone.
"""
# make subscriber a board member
2024-09-04 14:21:42 +00:00
subscriber = subscriber_user.make()
Membership.objects.create(club=self.ae, user=subscriber, role=3)
2024-09-04 14:21:42 +00:00
nb_memberships = self.club.members.ongoing().count()
self.client.force_login(subscriber)
response = self.client.post(
self.members_url,
{"users_old": self.comptable.id},
)
self.assertRedirects(response, self.members_url)
self.assert_membership_ended_today(self.comptable)
assert self.club.members.ongoing().count() == nb_memberships - 1
def test_end_membership_as_root(self):
2024-07-12 07:34:16 +00:00
"""Test that root users can end the membership of anyone."""
2024-09-04 14:21:42 +00:00
nb_memberships = self.club.members.ongoing().count()
self.client.force_login(self.root)
response = self.client.post(
self.members_url,
{"users_old": [self.comptable.id]},
)
self.assertRedirects(response, self.members_url)
self.assert_membership_ended_today(self.comptable)
assert self.club.members.ongoing().count() == nb_memberships - 1
def test_end_membership_as_foreigner(self):
2024-07-12 07:34:16 +00:00
"""Test that users who are not in this club cannot end its memberships."""
nb_memberships = self.club.members.count()
membership = self.richard.memberships.filter(club=self.club).first()
self.client.force_login(self.subscriber)
self.client.post(
self.members_url,
{"users_old": [self.richard.id]},
)
# nothing should have changed
new_mem = self.club.get_membership_for(self.richard)
assert self.club.members.count() == nb_memberships
assert membership == new_mem
def test_remove_from_club_group(self):
"""Test that when a membership ends, the user is removed from club groups."""
user = baker.make(User)
baker.make(Membership, user=user, club=self.club, end_date=None, role=3)
assert user.groups.contains(self.club.members_group)
assert user.groups.contains(self.club.board_group)
user.memberships.update(end_date=localdate())
assert not user.groups.contains(self.club.members_group)
assert not user.groups.contains(self.club.board_group)
def test_add_to_club_group(self):
"""Test that when a membership begins, the user is added to the club group."""
assert not self.subscriber.groups.contains(self.club.members_group)
assert not self.subscriber.groups.contains(self.club.board_group)
2024-12-03 16:50:14 +00:00
baker.make(Membership, club=self.club, user=self.subscriber, role=3)
assert self.subscriber.groups.contains(self.club.members_group)
assert self.subscriber.groups.contains(self.club.board_group)
2024-12-03 16:50:14 +00:00
def test_change_position_in_club(self):
"""Test that when moving from board to members, club group change"""
membership = baker.make(
Membership, club=self.club, user=self.subscriber, role=3
)
assert self.subscriber.groups.contains(self.club.members_group)
assert self.subscriber.groups.contains(self.club.board_group)
membership.role = 1
membership.save()
assert self.subscriber.groups.contains(self.club.members_group)
assert not self.subscriber.groups.contains(self.club.board_group)
def test_club_owner(self):
2024-07-12 07:34:16 +00:00
"""Test that a club is owned only by board members of the main club."""
anonymous = AnonymousUser()
assert not self.club.is_owned_by(anonymous)
assert not self.club.is_owned_by(self.subscriber)
# make sli a board member
self.sli.memberships.all().delete()
Membership(club=self.ae, user=self.sli, role=3).save()
assert self.club.is_owned_by(self.sli)
2019-05-09 16:06:11 +00:00
2024-07-23 22:39:26 +00:00
class TestMailingForm(TestCase):
2024-07-12 07:34:16 +00:00
"""Perform validation tests for MailingForm."""
2019-05-09 16:06:11 +00:00
@classmethod
def setUpTestData(cls):
cls.skia = User.objects.get(username="skia")
cls.rbatsbak = User.objects.get(username="rbatsbak")
cls.krophil = User.objects.get(username="krophil")
cls.comunity = User.objects.get(username="comunity")
cls.root = User.objects.get(username="root")
cls.bdf = Club.objects.get(unix_name=SITH_BAR_MANAGER["unix_name"])
cls.mail_url = reverse("club:mailing", kwargs={"club_id": cls.bdf.id})
2019-05-09 16:06:11 +00:00
def setUp(self):
Membership(
user=self.rbatsbak,
club=self.bdf,
start_date=timezone.now(),
role=settings.SITH_CLUB_ROLES_ID["Board member"],
).save()
def test_mailing_list_add_no_moderation(self):
# Test with Communication admin
self.client.force_login(self.comunity)
response = self.client.post(
self.mail_url,
2019-05-09 16:06:11 +00:00
{"action": MailingForm.ACTION_NEW_MAILING, "mailing_email": "foyer"},
)
self.assertRedirects(response, self.mail_url)
response = self.client.get(self.mail_url)
assert response.status_code == 200
assert "Liste de diffusion foyer@utbm.fr" in response.content.decode()
2019-05-09 16:06:11 +00:00
# Test with Root
self.client.force_login(self.root)
2019-05-09 16:06:11 +00:00
self.client.post(
self.mail_url,
2019-05-09 16:06:11 +00:00
{"action": MailingForm.ACTION_NEW_MAILING, "mailing_email": "mde"},
)
response = self.client.get(self.mail_url)
assert response.status_code == 200
assert "Liste de diffusion mde@utbm.fr" in response.content.decode()
2019-05-09 16:06:11 +00:00
def test_mailing_list_add_moderation(self):
self.client.force_login(self.rbatsbak)
2019-05-09 16:06:11 +00:00
self.client.post(
self.mail_url,
2019-05-09 16:06:11 +00:00
{"action": MailingForm.ACTION_NEW_MAILING, "mailing_email": "mde"},
)
response = self.client.get(self.mail_url)
assert response.status_code == 200
content = response.content.decode()
assert "Liste de diffusion mde@utbm.fr" not in content
assert "<p>Listes de diffusions en attente de modération</p>" in content
assert "<li>mde@utbm.fr" in content
2019-05-09 16:06:11 +00:00
def test_mailing_list_forbidden(self):
# With anonymous user
response = self.client.get(self.mail_url)
2019-05-09 16:06:11 +00:00
self.assertContains(response, "", status_code=403)
# With user not in club
self.client.force_login(self.krophil)
response = self.client.get(self.mail_url)
assert response.status_code == 403
2019-05-09 18:32:48 +00:00
def test_add_new_subscription_fail_not_moderated(self):
self.client.force_login(self.rbatsbak)
2019-05-09 18:32:48 +00:00
self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{"action": MailingForm.ACTION_NEW_MAILING, "mailing_email": "mde"},
)
self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{
"action": MailingForm.ACTION_NEW_SUBSCRIPTION,
"subscription_users": self.skia.id,
"subscription_mailing": Mailing.objects.get(email="mde").id,
},
)
response = self.client.get(self.mail_url)
assert response.status_code == 200
assert "skia@git.an" not in response.content.decode()
2019-05-09 18:32:48 +00:00
def test_add_new_subscription_success(self):
# Prepare mailing list
self.client.force_login(self.comunity)
2019-05-09 18:32:48 +00:00
self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{"action": MailingForm.ACTION_NEW_MAILING, "mailing_email": "mde"},
)
# Add single user
self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{
"action": MailingForm.ACTION_NEW_SUBSCRIPTION,
"subscription_users": self.skia.id,
"subscription_mailing": Mailing.objects.get(email="mde").id,
},
)
response = self.client.get(self.mail_url)
assert response.status_code == 200
assert "skia@git.an" in response.content.decode()
2019-05-09 18:32:48 +00:00
# Add multiple users
self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{
"action": MailingForm.ACTION_NEW_SUBSCRIPTION,
2024-10-20 19:28:25 +00:00
"subscription_users": (self.comunity.id, self.rbatsbak.id),
2019-05-09 18:32:48 +00:00
"subscription_mailing": Mailing.objects.get(email="mde").id,
},
)
response = self.client.get(self.mail_url)
assert response.status_code == 200
content = response.content.decode()
assert "richard@git.an" in content
assert "comunity@git.an" in content
assert "skia@git.an" in content
2019-05-09 18:32:48 +00:00
# Add arbitrary email
self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{
"action": MailingForm.ACTION_NEW_SUBSCRIPTION,
"subscription_email": "arbitrary@git.an",
"subscription_mailing": Mailing.objects.get(email="mde").id,
},
)
response = self.client.get(self.mail_url)
assert response.status_code == 200
content = response.content.decode()
assert "richard@git.an" in content
assert "comunity@git.an" in content
assert "skia@git.an" in content
assert "arbitrary@git.an" in content
2019-05-09 18:32:48 +00:00
# Add user and arbitrary email
self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{
"action": MailingForm.ACTION_NEW_SUBSCRIPTION,
"subscription_email": "more.arbitrary@git.an",
"subscription_users": self.krophil.id,
"subscription_mailing": Mailing.objects.get(email="mde").id,
},
)
response = self.client.get(self.mail_url)
assert response.status_code == 200
content = response.content.decode()
assert "richard@git.an" in content
assert "comunity@git.an" in content
assert "skia@git.an" in content
assert "arbitrary@git.an" in content
assert "more.arbitrary@git.an" in content
assert "krophil@git.an" in content
2019-05-09 18:32:48 +00:00
def test_add_new_subscription_fail_form_errors(self):
# Prepare mailing list
self.client.force_login(self.comunity)
2019-05-09 18:32:48 +00:00
self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{"action": MailingForm.ACTION_NEW_MAILING, "mailing_email": "mde"},
)
# Neither email or email is specified
response = self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{
"action": MailingForm.ACTION_NEW_SUBSCRIPTION,
"subscription_mailing": Mailing.objects.get(email="mde").id,
},
)
assert response.status_code
self.assertInHTML(
_("You must specify at least an user or an email address"),
response.content.decode(),
2019-05-09 18:32:48 +00:00
)
# No mailing specified
response = self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{
"action": MailingForm.ACTION_NEW_SUBSCRIPTION,
"subscription_users": self.krophil.id,
},
)
assert response.status_code == 200
assert _("This field is required") in response.content.decode()
2019-05-09 18:32:48 +00:00
# One of the selected users doesn't exist
response = self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{
"action": MailingForm.ACTION_NEW_SUBSCRIPTION,
2024-10-20 19:28:25 +00:00
"subscription_users": [789],
2019-05-09 18:32:48 +00:00
"subscription_mailing": Mailing.objects.get(email="mde").id,
},
)
assert response.status_code == 200
self.assertInHTML(
2024-10-20 19:28:25 +00:00
_("You must specify at least an user or an email address"),
response.content.decode(),
2019-05-09 18:32:48 +00:00
)
2024-10-20 19:28:25 +00:00
# An user has no email address
2019-05-09 18:32:48 +00:00
self.krophil.email = ""
self.krophil.save()
response = self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{
"action": MailingForm.ACTION_NEW_SUBSCRIPTION,
"subscription_users": self.krophil.id,
"subscription_mailing": Mailing.objects.get(email="mde").id,
},
)
assert response.status_code == 200
self.assertInHTML(
_("One of the selected users doesn't have an email address"),
response.content.decode(),
2019-05-09 18:32:48 +00:00
)
self.krophil.email = "krophil@git.an"
self.krophil.save()
# An user is added twice
self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{
"action": MailingForm.ACTION_NEW_SUBSCRIPTION,
"subscription_users": self.krophil.id,
"subscription_mailing": Mailing.objects.get(email="mde").id,
},
)
response = self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{
"action": MailingForm.ACTION_NEW_SUBSCRIPTION,
"subscription_users": self.krophil.id,
"subscription_mailing": Mailing.objects.get(email="mde").id,
},
)
assert response.status_code == 200
self.assertInHTML(
_("This email is already suscribed in this mailing"),
response.content.decode(),
2019-05-09 18:32:48 +00:00
)
def test_remove_subscription_success(self):
# Prepare mailing list
self.client.force_login(self.comunity)
2019-05-09 18:32:48 +00:00
self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{"action": MailingForm.ACTION_NEW_MAILING, "mailing_email": "mde"},
)
mde = Mailing.objects.get(email="mde")
self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{
"action": MailingForm.ACTION_NEW_SUBSCRIPTION,
2024-10-20 19:28:25 +00:00
"subscription_users": (
self.comunity.id,
self.rbatsbak.id,
self.krophil.id,
),
2019-05-09 18:32:48 +00:00
"subscription_mailing": mde.id,
},
)
response = self.client.get(self.mail_url)
assert response.status_code == 200
content = response.content.decode()
assert "comunity@git.an" in content
assert "richard@git.an" in content
assert "krophil@git.an" in content
2019-05-09 18:32:48 +00:00
# Delete one user
self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{
"action": MailingForm.ACTION_REMOVE_SUBSCRIPTION,
"removal_%d" % mde.id: mde.subscriptions.get(user=self.krophil).id,
},
)
response = self.client.get(self.mail_url)
assert response.status_code == 200
content = response.content.decode()
2019-05-09 18:32:48 +00:00
assert "comunity@git.an" in content
assert "richard@git.an" in content
assert "krophil@git.an" not in content
2019-05-09 18:32:48 +00:00
# Delete multiple users
self.client.post(
self.mail_url,
2019-05-09 18:32:48 +00:00
{
"action": MailingForm.ACTION_REMOVE_SUBSCRIPTION,
"removal_%d" % mde.id: [
2019-05-09 18:32:48 +00:00
user.id
for user in mde.subscriptions.filter(
user__in=[self.rbatsbak, self.comunity]
).all()
],
},
)
response = self.client.get(self.mail_url)
assert response.status_code == 200
content = response.content.decode()
2019-05-09 18:32:48 +00:00
assert "comunity@git.an" not in content
assert "richard@git.an" not in content
assert "krophil@git.an" not in content
2019-05-21 08:26:29 +00:00
2024-07-23 22:39:26 +00:00
class TestClubSellingView(TestCase):
2024-07-12 07:34:16 +00:00
"""Perform basics tests to ensure that the page is available."""
2019-05-21 08:26:29 +00:00
@classmethod
def setUpTestData(cls):
cls.ae = Club.objects.get(unix_name="ae")
cls.skia = User.objects.get(username="skia")
2019-05-21 08:26:29 +00:00
def test_page_not_internal_error(self):
2024-07-12 07:34:16 +00:00
"""Test that the page does not return and internal error."""
self.client.force_login(self.skia)
2019-05-21 08:26:29 +00:00
response = self.client.get(
reverse("club:club_sellings", kwargs={"club_id": self.ae.id})
)
assert response.status_code == 200