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 522ac42..7ca1225 100644 --- a/group/tests.py +++ b/group/tests.py @@ -1,85 +1,201 @@ # coding=utf-8 -from django.test import TestCase +import json from django.core.urlresolvers import reverse from rest_framework.test import APITestCase, APIClient -from account.models import User, SUPER_ADMIN -from group.models import Group +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') - user = User.objects.create(username="test", admin_type=SUPER_ADMIN) - user.set_password("testaa") - user.save() - - def test_invalid_format(self): + 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_success_group(self): - self.client.login(username="test", password="testaa") - data = {"name": "group1", "description": "des1", "join_group_setting": "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): - self.client.login(username="test", password="testaa") 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): - self.client.login(username="test", password="testaa") - group = Group.objects.create(name="group1", description="des1", - join_group_setting="1", visible="True", - admin=User.objects.get(username="test")) - data = {"group_id": group.id + 1, "name": "group0", "description": "des0", + 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_success_edit_group(self): - self.client.login(username="test", password="testaa") - group = Group.objects.create(name="group1", description="des1", - join_group_setting="1", visible="True", - admin=User.objects.get(username="test")) - data = {"group_id": group.id, "name": "group0", "description": "des0", + 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): - self.client.login(username="test", password="testaa") - group = Group.objects.create(name="group1", description="des1", - join_group_setting="1", visible="True", - admin=User.objects.get(username="test")) - data = {"group_id": group.id + 1, "name": "group0", "description": "des0", - "join_group_setting": 2} + 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_success_select_group(self): - self.client.login(username="test", password="testaa") - group = Group.objects.create(name="group1", description="des1", - join_group_setting="1", visible="True", - admin=User.objects.get(username="test")) - data = {"group_id": group.id, "name": "group0", "description": "des0", - "join_group_setting": 2} + 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_data(self): - self.client.login(username="test", password="testaa") + 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/oj/urls.py b/oj/urls.py index 1431dc6..616d245 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"), ]