Add some unit tests for supervisor management
This commit is contained in:
@@ -1,11 +1,11 @@
|
|||||||
{% extends 'generic/supervisor_base.html' %}
|
{% extends 'generic/supervisor_base.html' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h2>Supervisor: {{object.name}}</h2>
|
<h2>Supervisor: <span id="name">{{object.name}}</span></h2>
|
||||||
{{object.email}}
|
<span id="email">{{object.email}}</span>
|
||||||
|
|
||||||
<br/>User account: {{object.user}}
|
<br/>User account: <span id="user">{{object.user}}</span>
|
||||||
<br/>Site: {{object.site}}
|
<br/>Site: <span id="site">{{object.site}}</span>
|
||||||
<br/>Trainee(s): {% for trainee in object.trainee.all %}
|
<br/>Trainee(s): {% for trainee in object.trainee.all %}
|
||||||
<a href="{% url 'account_profile' trainee.user.username %}">{{trainee.user}}
|
<a href="{% url 'account_profile' trainee.user.username %}">{{trainee.user}}
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
|
|
||||||
<h2>Supervisors</h2>
|
<h2>Supervisors</h2>
|
||||||
|
|
||||||
<ul>
|
<ul id="supervisor-list">
|
||||||
{% for supervisor in object_list %}
|
{% for supervisor in object_list %}
|
||||||
<li><a href="{% url 'generic:supervisor_detail' pk=supervisor.pk %}">{{supervisor.name}}</a>
|
<li class="supervisor"><a href="{% url 'generic:supervisor_detail' pk=supervisor.pk %}">{{supervisor.name}}</a>
|
||||||
<br/>{{supervisor.email}} [{{supervisor.site}}]
|
<br/>{{supervisor.email}} [{{supervisor.site}}]
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ from longs.views import GenericExamViews as LongExamViews
|
|||||||
from physics.views import GenericExamViews as PhysicExamViews
|
from physics.views import GenericExamViews as PhysicExamViews
|
||||||
from anatomy.views import GenericExamViews as AnatomyExamViews
|
from anatomy.views import GenericExamViews as AnatomyExamViews
|
||||||
|
|
||||||
|
from generic.models import Supervisor
|
||||||
|
|
||||||
APP_NAMES = ("rapids", "anatomy", "longs", "physics", "sbas")
|
APP_NAMES = ("rapids", "anatomy", "longs", "physics", "sbas")
|
||||||
|
|
||||||
JSON_APPS = ("rapids", "anatomy", "longs")
|
JSON_APPS = ("rapids", "anatomy", "longs")
|
||||||
@@ -52,6 +54,12 @@ def create_cid_manager(db, django_user_model):
|
|||||||
user.groups.add(g)
|
user.groups.add(g)
|
||||||
return user
|
return user
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def create_basic_user(db, django_user_model):
|
||||||
|
user = django_user_model.objects.create_user(
|
||||||
|
"basicuser", "basic@user.com", "password1234"
|
||||||
|
)
|
||||||
|
return user
|
||||||
|
|
||||||
@pytest.fixture(params=EXAM_VIEWS)
|
@pytest.fixture(params=EXAM_VIEWS)
|
||||||
def set_up_exams(request, django_user_model, create_superuser):
|
def set_up_exams(request, django_user_model, create_superuser):
|
||||||
@@ -227,7 +235,7 @@ def test_index(client, create_superuser, exam_views, django_user_model):
|
|||||||
|
|
||||||
assert len(json_response) == 2
|
assert len(json_response) == 2
|
||||||
|
|
||||||
def test_cid_management(client, create_cid_manager, django_user_model):
|
def test_cid_management(client, create_cid_manager, django_user_model, create_basic_user):
|
||||||
urls = [
|
urls = [
|
||||||
reverse(f"people"),
|
reverse(f"people"),
|
||||||
#reverse(f"generic:update_cid"),
|
#reverse(f"generic:update_cid"),
|
||||||
@@ -237,24 +245,92 @@ def test_cid_management(client, create_cid_manager, django_user_model):
|
|||||||
reverse(f"generic:cid_group_view"),
|
reverse(f"generic:cid_group_view"),
|
||||||
reverse(f"generic:cid_group_view_all"),
|
reverse(f"generic:cid_group_view_all"),
|
||||||
reverse(f"generic:cid_group_create"),
|
reverse(f"generic:cid_group_create"),
|
||||||
|
reverse(f"generic:supervisor"),
|
||||||
]
|
]
|
||||||
|
|
||||||
for url in urls:
|
for url in urls:
|
||||||
response = client.get(url)
|
response = client.get(url)
|
||||||
|
# Some urls will try to redirect to a login page
|
||||||
if response.status_code == 302:
|
if response.status_code == 302:
|
||||||
assert "accounts/login/" in response.url
|
assert "accounts/login/" in response.url
|
||||||
else:
|
else:
|
||||||
|
# Others just forbid
|
||||||
assert response.status_code == 403
|
assert response.status_code == 403
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
basic_user = create_basic_user
|
||||||
|
client.force_login(basic_user)
|
||||||
|
for url in urls:
|
||||||
|
# When logged in there should be no redirection (if access denied)
|
||||||
|
response = client.get(url)
|
||||||
|
|
||||||
|
assert response.status_code == 403
|
||||||
|
|
||||||
cid_manager = create_cid_manager
|
cid_manager = create_cid_manager
|
||||||
|
|
||||||
client.force_login(cid_manager)
|
client.force_login(cid_manager)
|
||||||
|
|
||||||
for url in urls:
|
for url in urls:
|
||||||
print(url)
|
|
||||||
response = client.get(url)
|
response = client.get(url)
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def create_supervisor(db, faker):
|
||||||
|
return Supervisor.objects.create(email=faker.email(), name=faker.name())
|
||||||
|
|
||||||
|
def test_supervisor_management(db, faker, client, create_cid_manager, django_user_model, create_basic_user ):
|
||||||
|
s1 = create_supervisor(db, faker)
|
||||||
|
s2 = create_supervisor(db, faker)
|
||||||
|
print(s1)
|
||||||
|
print(s2)
|
||||||
|
|
||||||
|
|
||||||
|
basic_user = create_basic_user
|
||||||
|
client.force_login(basic_user)
|
||||||
|
|
||||||
|
response = client.get(reverse(f"generic:supervisor_detail", kwargs={"pk": s1.pk}))
|
||||||
|
|
||||||
|
assert response.status_code == 403
|
||||||
|
response = client.get(reverse(f"generic:supervisor"))
|
||||||
|
assert response.status_code == 403
|
||||||
|
|
||||||
|
# Check we can not delete
|
||||||
|
response = client.post(reverse(f"generic:supervisor_delete", kwargs={"pk": s2.pk}))
|
||||||
|
assert response.status_code == 403
|
||||||
|
|
||||||
|
cid_manager = create_cid_manager
|
||||||
|
client.force_login(cid_manager)
|
||||||
|
|
||||||
|
response = client.get(reverse(f"generic:supervisor"))
|
||||||
|
assert response.status_code == 200
|
||||||
|
|
||||||
|
soup = BeautifulSoup(response.content, "html.parser")
|
||||||
|
assert len(soup.find(id="supervisor-list").find_all("li")) == 2
|
||||||
|
|
||||||
|
response = client.get(reverse(f"generic:supervisor_detail", kwargs={"pk": s1.pk}))
|
||||||
|
soup = BeautifulSoup(response.content, "html.parser")
|
||||||
|
assert soup.find(id="name").text == s1.name
|
||||||
|
assert soup.find(id="email").text == s1.email
|
||||||
|
|
||||||
|
new_email = "new@email.com"
|
||||||
|
response = client.post(reverse(f"generic:supervisor_edit", kwargs={"pk": s1.pk}), {"email":new_email, "name": s1.name})
|
||||||
|
|
||||||
|
soup = BeautifulSoup(response.content, "html.parser")
|
||||||
|
assert response.status_code == 302
|
||||||
|
|
||||||
|
response = client.get(reverse(f"generic:supervisor_detail", kwargs={"pk": s1.pk}))
|
||||||
|
soup = BeautifulSoup(response.content, "html.parser")
|
||||||
|
assert soup.find(id="name").text == s1.name
|
||||||
|
assert soup.find(id="email").text == new_email
|
||||||
|
|
||||||
|
# Check we can delete
|
||||||
|
response = client.post(reverse(f"generic:supervisor_delete", kwargs={"pk": s2.pk}))
|
||||||
|
assert response.status_code == 302
|
||||||
|
response = client.get(reverse(f"generic:supervisor"))
|
||||||
|
assert response.status_code == 200
|
||||||
|
|
||||||
|
soup = BeautifulSoup(response.content, "html.parser")
|
||||||
|
assert len(soup.find(id="supervisor-list").find_all("li")) == 1
|
||||||
|
|||||||
+3
-1
@@ -38,4 +38,6 @@ django-ninja
|
|||||||
crispy-bootstrap4
|
crispy-bootstrap4
|
||||||
django-rich
|
django-rich
|
||||||
ipython
|
ipython
|
||||||
django-htmx-autocomplete
|
django-htmx-autocomplete
|
||||||
|
faker
|
||||||
|
pytest-faker
|
||||||
Reference in New Issue
Block a user