diff --git a/announcement/tests.py b/announcement/tests.py index 435da34..708f3c6 100644 --- a/announcement/tests.py +++ b/announcement/tests.py @@ -1,5 +1,6 @@ # coding=utf-8 from django.core.urlresolvers import reverse +from django.test import TestCase from rest_framework.test import APITestCase, APIClient @@ -87,3 +88,27 @@ class AnnouncementAPITest(APITestCase): self.assertEqual(response.data["code"], 0) for item in response.data["data"]: self.assertEqual(item["visible"], True) + + +class AnnouncementPageTest(TestCase): + def setUp(self): + user = User.objects.create(username="test") + user.set_password("testaa") + user.save() + Announcement.objects.create(title="aa", + content="AA", + created_by=User.objects.get(username="test"), + visible=True) + + Announcement.objects.create(title="bb", + content="BB", + created_by=User.objects.get(username="test"), + visible=False) + + def test_success_announcement(self): + response = self.client.get('/announcement/1/') + self.assertEqual(response.status_code, 200) + + def test_announcement_does_not_exist(self): + response = self.client.get('/announcement/3/') + self.assertTemplateUsed(response, "utils/error.html") diff --git a/group/models.py b/group/models.py index 0508dc0..8b15644 100644 --- a/group/models.py +++ b/group/models.py @@ -5,7 +5,7 @@ from account.models import User class Group(models.Model): - name = models.CharField(max_length=30) + name = models.CharField(max_length=30, unique=True) description = models.TextField() create_time = models.DateTimeField(auto_now_add=True) admin = models.ForeignKey(User, related_name="my_groups") @@ -26,10 +26,11 @@ class UserGroupRelation(models.Model): class Meta: db_table = "user_group_relation" + unique_together = ("group", "user") class JoinGroupRequest(models.Model): - group = models.ForeignKey(User) + group = models.ForeignKey(Group) user = models.ForeignKey(User, related_name="my_join_group_requests") message = models.TextField() create_time = models.DateTimeField(auto_now_add=True) diff --git a/group/tests.py b/group/tests.py index 7ce503c..7ca1225 100644 --- a/group/tests.py +++ b/group/tests.py @@ -1,3 +1,201 @@ -from django.test import TestCase +# coding=utf-8 +import json -# Create your tests here. +from django.core.urlresolvers import reverse + +from rest_framework.test import APITestCase, APIClient + +from account.models import User, REGULAR_USER, ADMIN, SUPER_ADMIN +from group.models import Group, UserGroupRelation, JoinGroupRequest + + +class GroupAPITest(APITestCase): + pass + + +class GroupAdminAPITest(APITestCase): + def _create_group(self, name, join_group_setting): + group = Group.objects.create(name=name, description="des0", + join_group_setting=join_group_setting, visible=True, + admin=self.user) + return group + + def setUp(self): + self.client = APIClient() + self.url = reverse('group_admin_api') + self.user = User.objects.create(username="test", admin_type=SUPER_ADMIN) + self.user.set_password("testaa") + self.user.save() + self.group = self._create_group("group1", 0) + self.client.login(username="test", password="testaa") + + # 以下是创建小组的测试 + def test_invalid_format(self): + data = {"name": "group1"} + response = self.client.post(self.url, data=data) + self.assertEqual(response.data["code"], 1) + + def test_create_group_successfully(self): + data = {"name": "group0", "description": "des0", "join_group_setting": "1"} + response = self.client.post(self.url, data=data) + self.assertEqual(response.data["code"], 0) + + def test_group_already_exists(self): + data = {"name": "group1", "description": "des0", "join_group_setting": "1"} + response = self.client.post(self.url, data=data) + self.assertEqual(response.data, {"code": 1, "data": u"小组名已经存在"}) + + # 以下是修改小组的测试 + def test_put_invalid_data(self): + data = {"name": "group1"} + response = self.client.put(self.url, data=data) + self.assertEqual(response.data["code"], 1) + + def test_edit_group_does_not_exist(self): + data = {"group_id": self.group.id + 1, "name": "group0", "description": "des0", + "join_group_setting": 2} + response = self.client.put(self.url, data=data) + self.assertEqual(response.data, {"code": 1, "data": u"小组不存在"}) + + def test_edit_group_successfully(self): + data = {"group_id": self.group.id, "name": "group0", "description": "des0", + "join_group_setting": 2} + response = self.client.put(self.url, data=data) + self.assertEqual(response.data["code"], 0) + self.assertEqual(response.data["data"]["name"], "group0") + self.assertEqual(response.data["data"]["join_group_setting"], 2) + + def test_edit_group_exists(self): + group = self._create_group("group2", 1) + data = {"group_id": group.id, "name": "group1", "description": "des0", + "join_group_setting": 0} + response = self.client.put(self.url, data=data) + self.assertEqual(response.data, {"code": 1, "data": u"小组名已经存在"}) + + # 以下是查询小组列表或者是单个小组时的测试 + def test_select_group_does_not_exist(self): + data = {"group_id": self.group.id + 1} + response = self.client.get(self.url, data=data) + self.assertEqual(response.data, {"code": 1, "data": u"小组不存在"}) + + def test_select_group_successfully(self): + data = {"group_id": self.group.id} + response = self.client.get(self.url, data=data) + self.assertEqual(response.data["code"], 0) + + def test_success_get_all_groups(self): + self.assertEqual(self.client.get(self.url).data["code"], 0) + + +class GroupMemberAdminAPITest(APITestCase): + def setUp(self): + self.client = APIClient() + self.url = reverse('group_member_admin_api') + self.user = User.objects.create(username="test", admin_type=SUPER_ADMIN) + self.user.set_password("testaa") + self.user.save() + self.user1 = User.objects.create(username="member1", admin_type=REGULAR_USER) + self.user1.set_password("testxx") + self.user1.save() + self.client.login(username="test", password="testaa") + self.group = Group.objects.create(name="group1", description="des1", + join_group_setting="1", visible="True", + admin=self.user) + UserGroupRelation.objects.create(group=self.group, user=self.user1) + + # 以下是查询小组成员的测试 + def test_missing_parameter(self): + self.assertEqual(self.client.get(self.url).data, {"code": 1, "data": u"参数错误"}) + + def test_group_does_not_exist(self): + data = {"group_id": self.group.id + 1} + response = self.client.get(self.url, data=data) + self.assertEqual(response.data, {"code": 1, "data": u"小组不存在"}) + + def test_get_member_list_successfully(self): + data = {"group_id": self.group.id} + response = self.client.get(self.url, data=data) + self.assertEqual(response.data["code"], 0) + + # 以下是删除小组成员的测试 + def test_invalid_format(self): + data = {"members": [self.user1.id]} + response = self.client.put(self.url, data=json.dumps(data), content_type="application/json") + self.assertEqual(response.data["code"], 1) + + def test_del_group_does_not_exist(self): + data = {"group_id": self.group.id + 1, "members": [self.user1.id]} + response = self.client.put(self.url, data=json.dumps(data), content_type="application/json") + self.assertEqual(response.data, {"code": 1, "data": u"小组不存在"}) + + def test_success_del_members(self): + data = {"group_id": self.group.id, "members": [self.user1.id]} + response = self.client.put(self.url, data=json.dumps(data), content_type="application/json") + self.assertEqual(response.data, {"code": 0, "data": u"删除成功"}) + try: + UserGroupRelation.objects.get(group=self.group, user=self.user1) + raise AssertionError() + except UserGroupRelation.DoesNotExist: + pass + + +class JoinGroupAPITest(APITestCase): + def _create_group(self, name, join_group_setting): + group = Group.objects.create(name=name, description="des0", + join_group_setting=join_group_setting, visible="True", + admin=self.user) + return group + + def setUp(self): + self.client = APIClient() + self.url = reverse('group_join_admin_api') + self.user = User.objects.create(username="test", admin_type=SUPER_ADMIN) + self.user.set_password("testaa") + self.user.save() + self.client.login(username="test", password="testaa") + self.group = self._create_group("group0", 0) + + # 以下是用户要加入某个小组的测试 + def test_invalid_format(self): + data = {"message": "message1"} + response = self.client.post(self.url, data=data) + self.assertEqual(response.data["code"], 1) + + def test_group_does_not_exist(self): + data = {"group_id": self.group.id + 1, "message": "message1"} + response = self.client.post(self.url, data=data) + self.assertEqual(response.data, {"code": 1, "data": u"小组不存在"}) + + def test_join0(self): + data = {"group_id": self.group.id, "message": "message0"} + response = self.client.post(self.url, data=data) + self.assertEqual(response.data, {"code": 0, "data": u"你已经成功的加入该小组"}) + + # 再加入一遍 已经是小组成员了 + data = {"group_id": self.group.id, "message": "message0"} + response = self.client.post(self.url, data=data) + self.assertEqual(response.data, {"code": 1, "data": u"你已经是小组成员了"}) + + def test_success_join1(self): + group = self._create_group("group1", 1) + data = {"group_id": group.id, "message": "message1"} + response = self.client.post(self.url, data=data) + self.assertEqual(response.data, {"code": 0, "data": u"申请提交成功,请等待审核"}) + try: + JoinGroupRequest.objects.get(user=self.user, group=group, status=False) + except JoinGroupRequest.DoesNotExist: + raise AssertionError() + + def test_success_join2(self): + group = self._create_group("group2", 2) + data = {"group_id": group.id, "message": "message2"} + response = self.client.post(self.url, data=data) + self.assertEqual(response.data, {"code": 1, "data": u"该小组不允许任何人加入"}) + + # 以下是搜索小组的测试 + def test_error_get_data(self): + self.assertEqual(self.client.get(self.url).data["code"], 1) + + def test_query_by_keyword(self): + response = self.client.get(self.url + "?keyword=group0") + self.assertEqual(response.data["code"], 0) diff --git a/group/views.py b/group/views.py index cd8ac54..54c1ec2 100644 --- a/group/views.py +++ b/group/views.py @@ -1,5 +1,6 @@ # coding=utf-8 from django.shortcuts import render +from django.db import IntegrityError from rest_framework.views import APIView @@ -48,10 +49,13 @@ class GroupAdminAPIView(APIView, GroupAPIViewBase): serializer = CreateGroupSerializer(data=request.data) if serializer.is_valid(): data = serializer.data - group = Group.objects.create(name=data["name"], - description=data["description"], - join_group_setting=data["join_group_setting"], - admin=request.user) + try: + group = Group.objects.create(name=data["name"], + description=data["description"], + join_group_setting=data["join_group_setting"], + admin=request.user) + except IntegrityError: + return error_response(u"小组名已经存在") return success_response(GroupSerializer(group).data) else: return serializer_invalid_response(serializer) @@ -70,10 +74,14 @@ class GroupAdminAPIView(APIView, GroupAPIViewBase): group = self.get_group(request, data["group_id"]) except Group.DoesNotExist: return error_response(u"小组不存在") - group.name = data["name"] - group.description = data["description"] - group.join_group_setting = data["join_group_setting"] - group.save() + try: + group.name = data["name"] + group.description = data["description"] + group.join_group_setting = data["join_group_setting"] + group.save() + except IntegrityError: + return error_response(u"小组名已经存在") + return success_response(GroupSerializer(group).data) else: return serializer_invalid_response(serializer) @@ -133,8 +141,12 @@ class GroupMemberAdminAPIView(APIView, GroupAPIViewBase): def join_group(user, group): - return UserGroupRelation.objects.create(user=user, group=group) - + try: + UserGroupRelation.objects.create(user=user, group=group) + return True + except IntegrityError: + return False + class JoinGroupAPIView(APIView): @login_required @@ -149,12 +161,15 @@ class JoinGroupAPIView(APIView): data = serializer.data try: group = Group.objects.get(id=data["group_id"]) - except Group.DesoNotExist: + except Group.DoesNotExist: return error_response(u"小组不存在") if group.join_group_setting == 0: - join_group(request.user, group) - return success_response(u"你已经成功的加入该小组") + if join_group(request.user, group): + return success_response(u"你已经成功的加入该小组") + else: + return error_response(u"你已经是小组成员了") elif group.join_group_setting == 1: + JoinGroupRequest.objects.create(user=request.user, group=group, message=data["message"]) return success_response(u"申请提交成功,请等待审核") elif group.join_group_setting == 2: return error_response(u"该小组不允许任何人加入") diff --git a/oj/urls.py b/oj/urls.py index 27635c7..4bee4a1 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -7,7 +7,7 @@ from account.views import (UserLoginAPIView, UsernameCheckAPIView, UserRegisterA UserChangePasswordAPIView, EmailCheckAPIView, UserAPIView, UserAdminAPIView) from announcement.views import AnnouncementAPIView, AnnouncementAdminAPIView -from group.views import GroupAdminAPIView +from group.views import GroupAdminAPIView, GroupMemberAdminAPIView, JoinGroupAPIView from admin.views import AdminTemplateView from problem.views import ProblemAdminAPIView @@ -39,6 +39,8 @@ urlpatterns = [ url(r'^problems/$', TemplateView.as_view(template_name="oj/problem/problem_list.html"), name="problem_list_page"), url(r'^admin/template/(?P\w+)/(?P\w+).html', AdminTemplateView.as_view(), name="admin_template"), url(r'^api/admin/group/$', GroupAdminAPIView.as_view(), name="group_admin_api"), + url(r'^api/admin/group_member/$', GroupMemberAdminAPIView.as_view(), name="group_member_admin_api"), + url(r'^api/admin/group_join/$', JoinGroupAPIView.as_view(), name="group_join_admin_api"), url(r'^api/admin/problem/$', ProblemAdminAPIView.as_view(), name="problem_admin_api"), url(r'^api/admin/test_case_upload/$', TestCaseUploadAPIView.as_view(), name="test_case_upload_api"), url(r'^api/admin/tag/$', ProblemTagAdminAPIView.as_view(), name="problem_tag_admin_api"),