diff --git a/umap/templates/auth/group_form.html b/umap/templates/auth/group_form.html
index 3709a8c8..6a6261c0 100644
--- a/umap/templates/auth/group_form.html
+++ b/umap/templates/auth/group_form.html
@@ -21,7 +21,7 @@
{% if group.user_set.count == 1 %}
- {% trans "Delete this group" %}
+ {% trans "Delete this team" %}
{% endif %}
diff --git a/umap/tests/test_group_views.py b/umap/tests/test_group_views.py
new file mode 100644
index 00000000..0138e38a
--- /dev/null
+++ b/umap/tests/test_group_views.py
@@ -0,0 +1,98 @@
+import pytest
+from django.urls import reverse
+from django.contrib.auth.models import Group
+
+pytestmark = pytest.mark.django_db
+
+
+def test_can_see_group_maps(client, map, group):
+ map.group = group
+ map.save()
+ url = reverse("group_maps", args=(group.pk,))
+ response = client.get(url)
+ assert response.status_code == 200
+ assert map.name in response.content.decode()
+
+
+def test_user_can_see_their_groups(client, group, user):
+ user.groups.add(group)
+ user.save()
+ url = reverse("user_groups")
+ client.login(username=user.username, password="123123")
+ response = client.get(url)
+ assert response.status_code == 200
+ assert group.name in response.content.decode()
+
+
+def test_can_create_a_group(client, user):
+ assert not Group.objects.count()
+ url = reverse("group_new")
+ client.login(username=user.username, password="123123")
+ response = client.post(url, {"name": "my new group", "members": [user.pk]})
+ assert response.status_code == 302
+ assert response["Location"] == "/en/me/groups"
+ assert Group.objects.count() == 1
+ group = Group.objects.first()
+ assert group.name == "my new group"
+ assert group in user.groups.all()
+
+
+def test_can_edit_a_group(client, user, group):
+ user.groups.add(group)
+ user.save()
+ assert Group.objects.count() == 1
+ url = reverse("group_update", args=(group.pk,))
+ client.login(username=user.username, password="123123")
+ response = client.post(url, {"name": "my new group", "members": [user.pk]})
+ assert response.status_code == 302
+ assert response["Location"] == "/en/me/groups"
+ assert Group.objects.count() == 1
+ modified = Group.objects.first()
+ assert modified.name == "my new group"
+ assert modified in user.groups.all()
+
+
+def test_cannot_edit_a_group_if_not_member(client, user, user2, group):
+ user.groups.add(group)
+ user.save()
+ assert Group.objects.count() == 1
+ url = reverse("group_update", args=(group.pk,))
+ client.login(username=user2.username, password="123123")
+ response = client.post(url, {"name": "my new group", "members": [user.pk]})
+ assert response.status_code == 403
+
+
+def test_can_delete_a_group(client, user, group):
+ user.groups.add(group)
+ user.save()
+ assert Group.objects.count() == 1
+ url = reverse("group_delete", args=(group.pk,))
+ client.login(username=user.username, password="123123")
+ response = client.post(url)
+ assert response.status_code == 302
+ assert response["Location"] == "/en/me/groups"
+ assert Group.objects.count() == 0
+
+
+def test_cannot_delete_a_group_if_not_member(client, user, user2, group):
+ user.groups.add(group)
+ user.save()
+ assert Group.objects.count() == 1
+ url = reverse("group_delete", args=(group.pk,))
+ client.login(username=user2.username, password="123123")
+ response = client.post(url)
+ assert response.status_code == 403
+ assert Group.objects.count() == 1
+
+
+def test_cannot_delete_a_group_if_more_than_one_member(client, user, user2, group):
+ user.groups.add(group)
+ user.save()
+ user2.groups.add(group)
+ user2.save()
+ assert Group.objects.count() == 1
+ url = reverse("group_delete", args=(group.pk,))
+ client.login(username=user.username, password="123123")
+ response = client.post(url)
+ assert response.status_code == 400
+ assert Group.objects.count() == 1
diff --git a/umap/urls.py b/umap/urls.py
index 02accb2d..0f466ae4 100644
--- a/umap/urls.py
+++ b/umap/urls.py
@@ -102,7 +102,7 @@ i18n_urls += decorated_patterns(
)
i18n_urls += decorated_patterns(
[login_required_if_not_anonymous_allowed, never_cache],
- re_path(r"^map/create/$", views.MapCreate.as_view(), name="map_create"),
+ path("map/create/", views.MapCreate.as_view(), name="map_create"),
)
i18n_urls += decorated_patterns(
[login_required],
@@ -187,12 +187,10 @@ datalayer_urls = [
i18n_urls += decorated_patterns([can_edit_map, never_cache], *map_urls)
i18n_urls += decorated_patterns([never_cache], *datalayer_urls)
urlpatterns += i18n_patterns(
- re_path(r"^$", views.home, name="home"),
- re_path(
- r"^showcase/$", cache_page(24 * 60 * 60)(views.showcase), name="maps_showcase"
- ),
- re_path(r"^search/$", views.search, name="search"),
- re_path(r"^about/$", views.about, name="about"),
+ path("", views.home, name="home"),
+ path("showcase/", cache_page(24 * 60 * 60)(views.showcase), name="maps_showcase"),
+ path("search/", views.search, name="search"),
+ path("about/", views.about, name="about"),
re_path(r"^user/(?P.+)/stars/$", views.user_stars, name="user_stars"),
re_path(r"^user/(?P.+)/$", views.user_maps, name="user_maps"),
path("group//", views.group_maps, name="group_maps"),