302 lignes
11 KiB
Python
302 lignes
11 KiB
Python
from io import BytesIO
|
|
|
|
from django.contrib.messages import get_messages
|
|
from django.urls import reverse, reverse_lazy
|
|
|
|
import pytest
|
|
from bs4 import BeautifulSoup as bs
|
|
|
|
from benevalibre.utils.tests import (
|
|
RE_DELETE_BTN,
|
|
StaffOnlyViewMixin,
|
|
count_text_in_content,
|
|
)
|
|
|
|
|
|
@pytest.mark.django_db
|
|
class TestInstanceCategory(StaffOnlyViewMixin):
|
|
url = reverse_lazy('instance:instance_category:index')
|
|
title = "Liste des catégories"
|
|
|
|
def test_post_create_update_delete(self, client, user, superuser):
|
|
# 0. on fetch les catégories d'instance
|
|
client.force_login(superuser)
|
|
response = client.get(self.url)
|
|
|
|
# 1. on créé une catégories d'instance
|
|
url = (
|
|
bs(response.content, 'html.parser')
|
|
.find(class_='title-buttons')
|
|
.find('a')
|
|
.attrs['href']
|
|
)
|
|
data = {'name': 'categorie de test'}
|
|
response = client.post(url, data, follow=True)
|
|
assert response.status_code == 200
|
|
assert count_text_in_content(response, "categorie de test")
|
|
messages = [m.message for m in get_messages(response.wsgi_request)]
|
|
assert len(messages) == 1
|
|
assert "« categorie de test » a été ajouté" in messages[0]
|
|
|
|
# 2. on update
|
|
url = (
|
|
bs(response.content, 'html.parser')
|
|
.find('tbody')
|
|
.find_all('a', class_='update-link')[-1]
|
|
.attrs['href']
|
|
)
|
|
data = {'name': 'categorie de lutte'}
|
|
response = client.post(url, data, follow=True)
|
|
assert response.status_code == 200
|
|
assert count_text_in_content(response, "lutte")
|
|
messages = [m.message for m in get_messages(response.wsgi_request)]
|
|
assert len(messages) == 1
|
|
assert "« categorie de lutte » a été modifié" in messages[0]
|
|
|
|
# 3. on delete
|
|
response = client.get(url, follow=True)
|
|
url = (
|
|
bs(response.content, 'html.parser')
|
|
.find('a', string=RE_DELETE_BTN)
|
|
.attrs['href']
|
|
)
|
|
data = {'confirm': True}
|
|
response = client.post(url, data, follow=True)
|
|
assert response.status_code == 200
|
|
messages = [m.message for m in get_messages(response.wsgi_request)]
|
|
assert len(messages) == 1
|
|
assert "« categorie de lutte » a été supprimé" in messages[0]
|
|
|
|
def test_protected_deletion(self, client, user, superuser):
|
|
# 0. on fetch les catégories d'instance
|
|
client.force_login(superuser)
|
|
response = client.get(self.url)
|
|
|
|
# 1. on charge la page d'édition
|
|
url = (
|
|
bs(response.content, 'html.parser')
|
|
.find('tbody')
|
|
.find_all('a', class_='update-link')[0]
|
|
.attrs['href']
|
|
)
|
|
response = client.get(url, follow=True)
|
|
|
|
# 2. on poste la confirmation de deletion
|
|
url = (
|
|
bs(response.content, 'html.parser')
|
|
.find('a', string=RE_DELETE_BTN)
|
|
.attrs['href']
|
|
)
|
|
data = {'confirm': True}
|
|
response = client.post(url, data, follow=True)
|
|
|
|
assert count_text_in_content(response, "actuellement référencé")
|
|
assert count_text_in_content(response, "intégrité des données")
|
|
|
|
|
|
@pytest.mark.django_db
|
|
class TestDefaultCategory(StaffOnlyViewMixin):
|
|
url = reverse_lazy('instance:category:index')
|
|
title = "Liste des catégories"
|
|
|
|
def test_post_create_update_delete(self, client, user, superuser):
|
|
# 0. on fetch les catégories
|
|
client.force_login(superuser)
|
|
response = client.get(self.url)
|
|
|
|
# 1. on créé une catégorie
|
|
url = (
|
|
bs(response.content, 'html.parser')
|
|
.find(class_='title-buttons')
|
|
.find('a')
|
|
.attrs['href']
|
|
)
|
|
data = {'name': 'categorie de test', 'instance_category': 1}
|
|
response = client.post(url, data, follow=True)
|
|
assert response.status_code == 200
|
|
assert count_text_in_content(response, "categorie de test")
|
|
messages = [m.message for m in get_messages(response.wsgi_request)]
|
|
assert len(messages) == 1
|
|
assert "« categorie de test » a été ajouté" in messages[0]
|
|
|
|
# 2. on update
|
|
url = (
|
|
bs(response.content, 'html.parser')
|
|
.find('tbody')
|
|
.find_all('a', class_='update-link')[-1]
|
|
.attrs['href']
|
|
)
|
|
data = {'name': 'categorie de lutte', 'instance_category': 1}
|
|
response = client.post(url, data, follow=True)
|
|
assert response.status_code == 200
|
|
assert count_text_in_content(response, "lutte")
|
|
messages = [m.message for m in get_messages(response.wsgi_request)]
|
|
assert len(messages) == 1
|
|
assert "« categorie de lutte » a été modifié" in messages[0]
|
|
|
|
# 3. on delete
|
|
response = client.get(url, follow=True)
|
|
url = (
|
|
bs(response.content, 'html.parser')
|
|
.find('a', string=RE_DELETE_BTN)
|
|
.attrs['href']
|
|
)
|
|
data = {'confirm': True}
|
|
response = client.post(url, data, follow=True)
|
|
assert response.status_code == 200
|
|
messages = [m.message for m in get_messages(response.wsgi_request)]
|
|
assert len(messages) == 1
|
|
assert "« categorie de lutte » a été supprimé" in messages[0]
|
|
|
|
|
|
@pytest.mark.django_db
|
|
class TestDefaultRole(StaffOnlyViewMixin):
|
|
url = reverse_lazy('instance:role:index')
|
|
title = "Liste des rôles"
|
|
|
|
def test_post_create_update_delete(self, client, user, superuser):
|
|
# 0. on fetch les rôles
|
|
client.force_login(superuser)
|
|
response = client.get(self.url)
|
|
|
|
# 1. on créé un rôle
|
|
url = (
|
|
bs(response.content, 'html.parser')
|
|
.find(class_='title-buttons')
|
|
.find('a')
|
|
.attrs['href']
|
|
)
|
|
data = {'name': 'rôle de test'}
|
|
response = client.post(url, data, follow=True)
|
|
assert response.status_code == 200
|
|
assert count_text_in_content(response, "rôle de test")
|
|
messages = [m.message for m in get_messages(response.wsgi_request)]
|
|
assert len(messages) == 1
|
|
assert "« rôle de test » a été ajouté" in messages[0]
|
|
|
|
# 2. on update
|
|
url = (
|
|
bs(response.content, 'html.parser')
|
|
.find('tbody')
|
|
.find_all('a', class_='update-link')[-1]
|
|
.attrs['href']
|
|
)
|
|
data = {'name': 'rôle de lutte'}
|
|
response = client.post(url, data, follow=True)
|
|
assert response.status_code == 200
|
|
assert count_text_in_content(response, "lutte")
|
|
messages = [m.message for m in get_messages(response.wsgi_request)]
|
|
assert len(messages) == 1
|
|
assert "« rôle de lutte » a été modifié" in messages[0]
|
|
|
|
# 3. on delete
|
|
response = client.get(url, follow=True)
|
|
url = (
|
|
bs(response.content, 'html.parser')
|
|
.find('a', string=RE_DELETE_BTN)
|
|
.attrs['href']
|
|
)
|
|
data = {'confirm': True}
|
|
response = client.post(url, data, follow=True)
|
|
assert response.status_code == 200
|
|
messages = [m.message for m in get_messages(response.wsgi_request)]
|
|
assert len(messages) == 1
|
|
assert "« rôle de lutte » a été supprimé" in messages[0]
|
|
|
|
|
|
@pytest.mark.django_db
|
|
class TestDefaultLevel(StaffOnlyViewMixin):
|
|
url = reverse_lazy('instance:level:index')
|
|
title = "Liste des niveaux"
|
|
|
|
def test_post_create_update_delete(self, client, user, superuser):
|
|
# 0. on fetch les niveaux
|
|
client.force_login(superuser)
|
|
response = client.get(self.url)
|
|
|
|
# 1. on créé un niveau
|
|
url = (
|
|
bs(response.content, 'html.parser')
|
|
.find(class_='title-buttons')
|
|
.find('a')
|
|
.attrs['href']
|
|
)
|
|
data = {'name': 'niveau de test'}
|
|
response = client.post(url, data, follow=True)
|
|
assert response.status_code == 200
|
|
assert count_text_in_content(response, "niveau de test")
|
|
messages = [m.message for m in get_messages(response.wsgi_request)]
|
|
assert len(messages) == 1
|
|
assert "« niveau de test » a été ajouté" in messages[0]
|
|
|
|
# 2. on update
|
|
url = (
|
|
bs(response.content, 'html.parser')
|
|
.find('tbody')
|
|
.find_all('a', class_='update-link')[-1]
|
|
.attrs['href']
|
|
)
|
|
data = {'name': 'niveau de lutte'}
|
|
response = client.post(url, data, follow=True)
|
|
assert response.status_code == 200
|
|
assert count_text_in_content(response, "lutte")
|
|
messages = [m.message for m in get_messages(response.wsgi_request)]
|
|
assert len(messages) == 1
|
|
assert "« niveau de lutte » a été modifié" in messages[0]
|
|
|
|
# 3. on delete
|
|
response = client.get(url, follow=True)
|
|
url = (
|
|
bs(response.content, 'html.parser')
|
|
.find('a', string=RE_DELETE_BTN)
|
|
.attrs['href']
|
|
)
|
|
data = {'confirm': True}
|
|
response = client.post(url, data, follow=True)
|
|
assert response.status_code == 200
|
|
messages = [m.message for m in get_messages(response.wsgi_request)]
|
|
assert len(messages) == 1
|
|
assert "« niveau de lutte » a été supprimé" in messages[0]
|
|
|
|
|
|
@pytest.mark.django_db
|
|
class TestTermsOfUsePage:
|
|
def test_terms_page_redirects_not_logged_users(self, client):
|
|
response = client.get(reverse('instance:terms_of_use'))
|
|
assert response.status_code == 302
|
|
assert response.url == "/account/login/?next=/instance/charte/"
|
|
|
|
def test_terms_page_displays_403_to_non_superusers(self, client, user):
|
|
client.force_login(user)
|
|
response = client.get(reverse('instance:terms_of_use'))
|
|
assert response.status_code == 403
|
|
|
|
def test_superusers_access_terms_page(self, client, superuser):
|
|
client.force_login(superuser)
|
|
response = client.get(reverse('instance:terms_of_use'))
|
|
assert "Téléverser une nouvelle charte" in response.content.decode()
|
|
|
|
@pytest.mark.parametrize(
|
|
'content, name, expected',
|
|
(
|
|
('test', 'test.txt', 200),
|
|
('%PDF-1.5', 'test.txt', 200),
|
|
('test', 'test.pdf', 200),
|
|
('%PDF-1.5', 'test.pdf', 302),
|
|
),
|
|
)
|
|
def test_terms_of_use_validation(
|
|
self, client, superuser, content, name, expected
|
|
):
|
|
client.force_login(superuser)
|
|
_file = BytesIO(content.encode())
|
|
_file.name = name
|
|
response = client.post(
|
|
reverse('instance:terms_of_use'), data={'file': _file}
|
|
)
|
|
assert response.status_code == expected
|
|
if expected == 302:
|
|
messages = [m.message for m in get_messages(response.wsgi_request)]
|
|
assert len(messages) == 1
|
|
assert "est désormais en ligne." in messages[0]
|