From 82da537a50436d51431d3dea5a8b860182253005 Mon Sep 17 00:00:00 2001 From: hohoTT <609029365@qq.com> Date: Mon, 10 Aug 2015 18:04:35 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=A2=9E=E6=B7=BBannouncementPage=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=9A=84=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- announcement/tests.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) 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") From 402c7ee87fcb97c25f14355b91fedf8e3ca138e3 Mon Sep 17 00:00:00 2001 From: hohoTT <609029365@qq.com> Date: Mon, 10 Aug 2015 18:07:08 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E3=80=81=E4=BF=AE=E6=94=B9=E5=B0=8F=E7=BB=84=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=B0=8F=E7=BB=84=E5=88=97=E8=A1=A8=E6=88=96?= =?UTF-8?q?=E8=80=85=E6=98=AF=E5=8D=95=E4=B8=AA=E5=B0=8F=E7=BB=84=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group/tests.py | 84 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/group/tests.py b/group/tests.py index 7ce503c..522ac42 100644 --- a/group/tests.py +++ b/group/tests.py @@ -1,3 +1,85 @@ +# coding=utf-8 from django.test import TestCase -# Create your tests here. +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 + + +class GroupAdminAPITest(APITestCase): + # 以下是创建小组的测试 + 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.client.login(username="test", password="testaa") + 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"} + response = self.client.post(self.url, data=data) + self.assertEqual(response.data["code"], 0) + + # 以下是修改小组的测试 + 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", + "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", + "join_group_setting": 2} + response = self.client.put(self.url, data=data) + self.assertEqual(response.data["code"], 0) + + # 以下是查询小组列表或者是单个小组时的测试 + 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} + 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} + 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") + self.assertEqual(self.client.get(self.url).data["code"], 0) + + From c8388c8a8fecebc8c4050ca03aff4b2ef8699e9e Mon Sep 17 00:00:00 2001 From: hohoTT <609029365@qq.com> Date: Tue, 11 Aug 2015 14:47:19 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0group/views=E4=B8=AD?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=92=8C=E4=BF=AE=E6=94=B9=E5=B0=8F=E7=BB=84?= =?UTF-8?q?=E6=97=B6=E5=B0=8F=E7=BB=84=E5=90=8D=E5=AD=98=E5=9C=A8=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E5=88=A4=E6=96=AD=EF=BC=8C=E4=BB=A5=E5=8F=8A=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E5=B0=8F=E7=BB=84=E6=97=B6=E9=87=8D=E5=A4=8D=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E5=92=8C=E8=AF=B7=E6=B1=82=E5=8A=A0=E5=85=A5=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group/views.py | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) 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"该小组不允许任何人加入") From 5063d1c7a2e583dfa2587a7e56ded853f4f0a23a Mon Sep 17 00:00:00 2001 From: hohoTT <609029365@qq.com> Date: Tue, 11 Aug 2015 14:50:33 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B9=8B=E5=89=8D?= =?UTF-8?q?=E7=9A=84=E6=B5=8B=E8=AF=95=EF=BC=8C=E4=BB=A5=E5=8F=8A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=9F=A5=E8=AF=A2=E3=80=81=E5=88=A0=E9=99=A4=E5=B0=8F?= =?UTF-8?q?=E7=BB=84=E6=88=90=E5=91=98=E3=80=81=E7=94=A8=E6=88=B7=E8=A6=81?= =?UTF-8?q?=E5=8A=A0=E5=85=A5=E6=9F=90=E4=B8=AA=E5=B0=8F=E7=BB=84=E5=92=8C?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E5=B0=8F=E7=BB=84=E6=97=B6=E7=9A=84=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group/models.py | 5 +- group/tests.py | 194 ++++++++++++++++++++++++++++++++++++++---------- oj/urls.py | 4 +- 3 files changed, 161 insertions(+), 42 deletions(-) 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"), ]