From 61bb90540ee5fe7ceaa0897a4fd457b97766e392 Mon Sep 17 00:00:00 2001 From: Derinhelm Date: Sun, 18 Apr 2021 20:46:32 +0300 Subject: [PATCH 01/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - backend/tests/__init__.py | 0 backend/tests/test_1.py | 27 +++++++++++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 backend/tests/__init__.py create mode 100644 backend/tests/test_1.py diff --git a/.gitignore b/.gitignore index 247236f..27cc7f2 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,5 @@ target/ *.jsl *.db tmp* -test_* .env* venv* diff --git a/backend/tests/__init__.py b/backend/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/tests/test_1.py b/backend/tests/test_1.py new file mode 100644 index 0000000..0da58e0 --- /dev/null +++ b/backend/tests/test_1.py @@ -0,0 +1,27 @@ +import os + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "backend.settings") + +from django.core.wsgi import get_wsgi_application +application = get_wsgi_application() + +from django.urls import reverse +from rest_framework import status +from rest_framework.test import APITestCase +from rest_framework.test import APIClient +from django.contrib.auth.models import User +from backend.api import router + +class EasyTest(APITestCase): + def test_list(self): + """ + The first test. + """ + user = User.objects.create_user('test_user', 'test@test.com', 'test_password') + + url = reverse('ToDoLists-list')#reverse('ToDoLists-list') + data = {} + self.client.force_authenticate(user=user) + response = self.client.get(url, data, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, []) \ No newline at end of file From 7e02dff18434603868a4b9099040ee327e9fa4c2 Mon Sep 17 00:00:00 2001 From: Derinhelm Date: Fri, 23 Apr 2021 02:01:32 +0300 Subject: [PATCH 02/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20=D0=BD=D0=B0=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D1=82=D0=B5=D0=B9=D1=88=D0=B5=D0=B5=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20ToDoList?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Для запуска docker-compose exec web python manage.py test --- backend/tests/test_1.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/backend/tests/test_1.py b/backend/tests/test_1.py index 0da58e0..bb529dd 100644 --- a/backend/tests/test_1.py +++ b/backend/tests/test_1.py @@ -11,17 +11,28 @@ from rest_framework.test import APITestCase from rest_framework.test import APIClient from django.contrib.auth.models import User from backend.api import router +from collections import OrderedDict class EasyTest(APITestCase): + def test_list(self): """ The first test. """ user = User.objects.create_user('test_user', 'test@test.com', 'test_password') - - url = reverse('ToDoLists-list')#reverse('ToDoLists-list') - data = {} + url = reverse('ToDoLists-list') self.client.force_authenticate(user=user) - response = self.client.get(url, data, format='json') + + response = self.client.get(url, {}, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, []) \ No newline at end of file + self.assertEqual(response.data, OrderedDict([('count', 0), ('next', None), ('previous', None), ('results', [])])) + + response = self.client.post(url, {"title": "ToDoList1"}, format='json') + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(response.data['title'], "ToDoList1") + + response = self.client.get(url, {}, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + self.assertEqual((response.data['count'], response.data['next'], response.data['previous'], \ + response.data['results'][0]['title']), (1, None, None, "ToDoList1")) \ No newline at end of file From 889acf6c4598bd7dff2966fbde45f38788c7f095 Mon Sep 17 00:00:00 2001 From: Derinhelm Date: Mon, 26 Apr 2021 11:46:01 +0300 Subject: [PATCH 03/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20ToDoList?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/tests/test_1.py | 79 +++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 18 deletions(-) diff --git a/backend/tests/test_1.py b/backend/tests/test_1.py index bb529dd..a5ba38e 100644 --- a/backend/tests/test_1.py +++ b/backend/tests/test_1.py @@ -13,26 +13,69 @@ from django.contrib.auth.models import User from backend.api import router from collections import OrderedDict -class EasyTest(APITestCase): - - def test_list(self): - """ - The first test. - """ - user = User.objects.create_user('test_user', 'test@test.com', 'test_password') - url = reverse('ToDoLists-list') - self.client.force_authenticate(user=user) - - response = self.client.get(url, {}, format='json') +class EasyTest1(APITestCase): + def get_todo(self, expected_titles): + response = self.client.get(self.url, {}, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, OrderedDict([('count', 0), ('next', None), ('previous', None), ('results', [])])) - - response = self.client.post(url, {"title": "ToDoList1"}, format='json') + real_titles = [data['title'] for data in response.data['results']] + self.assertEqual((response.data['count'], real_titles), \ + (len(expected_titles), expected_titles)) + + def post_todo(self, to_do_title): + response = self.client.post(self.url, {"title": to_do_title}, format='json') self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(response.data['title'], "ToDoList1") + self.assertEqual(response.data['title'], to_do_title) + return response.data['id'] - response = self.client.get(url, {}, format='json') + def get_todo_by_id(self, id, expected_title): + url_with_id = reverse('ToDoLists-detail', args=(id,)) + response = self.client.get(url_with_id, {id: id}, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['title'], expected_title) - self.assertEqual((response.data['count'], response.data['next'], response.data['previous'], \ - response.data['results'][0]['title']), (1, None, None, "ToDoList1")) \ No newline at end of file + def put_todo(self, id, new_title): + url_with_id = reverse('ToDoLists-detail', args=(id,)) + response = self.client.put(url_with_id, {"title": new_title}, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['title'], new_title) + + def patch_todo(self, id, new_title): + url_with_id = reverse('ToDoLists-detail', args=(id,)) + response = self.client.patch(url_with_id, {"title": new_title}, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['title'], new_title) + + def delete_todo(self, id): + url_with_id = reverse('ToDoLists-detail', args=(id,)) + response = self.client.delete(url_with_id, {}, format='json') + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + + def test_todo(self): + """ + Tests API for todo. + + lists/: get, post + lists/{id}/: get, put (update), patch (partial_update), delete + """ + + user = User.objects.create_user('test_user', 'test@test.com', 'test_password') + self.client.force_authenticate(user=user) + self.url = reverse('ToDoLists-list') + + self.get_todo([]) + to_do_title_1, to_do_title_2 = "ToDoList1", "ToDoList2" + to_do_id1 = self.post_todo(to_do_title_1) + self.get_todo([to_do_title_1]) + to_do_id2 = self.post_todo(to_do_title_2) + self.get_todo([to_do_title_1, to_do_title_2]) + + self.get_todo_by_id(to_do_id1, to_do_title_1) + self.get_todo_by_id(to_do_id2, to_do_title_2) + + self.delete_todo(to_do_id2) + self.get_todo([to_do_title_1]) + + self.put_todo(to_do_id1, "ToDoList11") + + self.patch_todo(to_do_id1, "ToDoList12") + \ No newline at end of file From a6a31c8c1010265e0d0868f51cfa06eebe89aaea Mon Sep 17 00:00:00 2001 From: Derinhelm Date: Mon, 26 Apr 2021 12:48:51 +0300 Subject: [PATCH 04/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BF=D1=80=D0=BE=D1=81=D1=82=D0=B5=D0=B9?= =?UTF-8?q?=D1=88=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20Ite?= =?UTF-8?q?m?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/tests/test_1.py | 111 +++++++++++++++++++++++++++++++--------- 1 file changed, 87 insertions(+), 24 deletions(-) diff --git a/backend/tests/test_1.py b/backend/tests/test_1.py index a5ba38e..7d18f6e 100644 --- a/backend/tests/test_1.py +++ b/backend/tests/test_1.py @@ -13,69 +13,132 @@ from django.contrib.auth.models import User from backend.api import router from collections import OrderedDict -class EasyTest1(APITestCase): - def get_todo(self, expected_titles): - response = self.client.get(self.url, {}, format='json') +def create_todo(client, title): + url = reverse('ToDoLists-list') + response = client.post(url, {"title": title}, format='json') + return response + +class ToDoTest(APITestCase): + '''Tests API for todo.''' + def get(self, expected_titles): + url = reverse('ToDoLists-list') + response = self.client.get(url, {}, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) real_titles = [data['title'] for data in response.data['results']] self.assertEqual((response.data['count'], real_titles), \ (len(expected_titles), expected_titles)) - def post_todo(self, to_do_title): - response = self.client.post(self.url, {"title": to_do_title}, format='json') + def post(self, to_do_title): + response = create_todo(self.client, to_do_title) self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(response.data['title'], to_do_title) return response.data['id'] - def get_todo_by_id(self, id, expected_title): + def get_by_id(self, id, expected_title): url_with_id = reverse('ToDoLists-detail', args=(id,)) response = self.client.get(url_with_id, {id: id}, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data['title'], expected_title) - def put_todo(self, id, new_title): + def put(self, id, new_title): url_with_id = reverse('ToDoLists-detail', args=(id,)) response = self.client.put(url_with_id, {"title": new_title}, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data['title'], new_title) - def patch_todo(self, id, new_title): + def patch(self, id, new_title): url_with_id = reverse('ToDoLists-detail', args=(id,)) response = self.client.patch(url_with_id, {"title": new_title}, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data['title'], new_title) - def delete_todo(self, id): + def delete(self, id): url_with_id = reverse('ToDoLists-detail', args=(id,)) response = self.client.delete(url_with_id, {}, format='json') self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) def test_todo(self): """ - Tests API for todo. - lists/: get, post lists/{id}/: get, put (update), patch (partial_update), delete """ user = User.objects.create_user('test_user', 'test@test.com', 'test_password') self.client.force_authenticate(user=user) - self.url = reverse('ToDoLists-list') - self.get_todo([]) + self.get([]) to_do_title_1, to_do_title_2 = "ToDoList1", "ToDoList2" - to_do_id1 = self.post_todo(to_do_title_1) - self.get_todo([to_do_title_1]) - to_do_id2 = self.post_todo(to_do_title_2) - self.get_todo([to_do_title_1, to_do_title_2]) + to_do_id1 = self.post(to_do_title_1) + self.get([to_do_title_1]) + to_do_id2 = self.post(to_do_title_2) + self.get([to_do_title_1, to_do_title_2]) - self.get_todo_by_id(to_do_id1, to_do_title_1) - self.get_todo_by_id(to_do_id2, to_do_title_2) + self.get_by_id(to_do_id1, to_do_title_1) + self.get_by_id(to_do_id2, to_do_title_2) - self.delete_todo(to_do_id2) - self.get_todo([to_do_title_1]) + self.delete(to_do_id2) + self.get([to_do_title_1]) + + self.put(to_do_id1, "ToDoList11") + + self.patch(to_do_id1, "ToDoList12") + +class ItemTest(APITestCase): + '''Tests API for items.''' + def get(self, todo_id, finished, expected_titles): + url = reverse('ToDoItems-list') + if finished is not None: + data = {"parent": todo_id, "finished": finished} + else: + data = {"parent": todo_id} + response = self.client.get(url, data, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + real_titles = [d['text'] for d in response.data['results']] + self.assertEqual((response.data['count'], real_titles), \ + (len(expected_titles), expected_titles)) + + if finished is not None: + item_status = [data['finished'] for data in response.data['results']] + self.assertEqual(finished, all(item_status)) + + def post(self, item_text, todo_id, finished): + url = reverse('ToDoItems-list') + if finished is not None: + data = {"text": item_text, "parent": todo_id, "finished": finished} + else: + data = {"text": item_text, "parent": todo_id} + response = self.client.post(url, data, format='json') + + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + check_finished = False if (finished is None) else finished + self.assertEqual((response.data['text'], response.data['parent'], response.data['finished']), \ + (item_text, todo_id, check_finished)) + return response.data['id'] + + def delete(self, id): + url_with_id = reverse('ToDoItems-detail', args=(id,)) + response = self.client.delete(url_with_id, {}, format='json') + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + + def test_items(self): + """ + /todo_items/: get+, post+ (create) + /todo_items/{id}/: get (read), put (update), patch (partial_update), delete+ + """ + user = User.objects.create_user('test_user', 'test@test.com', 'test_password') + self.client.force_authenticate(user=user) + to_do_id = create_todo(self.client, "ToDoList").data['id'] + self.get(to_do_id, None, []) + item_id_1 = self.post("Item1", to_do_id, None) + self.get(to_do_id, None, ["Item1"]) + item_id_2 = self.post("Item2", to_do_id, False) + self.get(to_do_id, None, ["Item1", "Item2"]) + item_id_3 = self.post("Item3", to_do_id, True) + self.get(to_do_id, None, ["Item1", "Item2", "Item3"]) + self.get(to_do_id, False, ["Item1", "Item2"]) + self.get(to_do_id, True, ["Item3"]) + + self.delete(item_id_3) + self.get(to_do_id, None, ["Item1", "Item2"]) - self.put_todo(to_do_id1, "ToDoList11") - self.patch_todo(to_do_id1, "ToDoList12") - \ No newline at end of file From e3b93f3524f8bc844c18a8f6d1866914824b40ad Mon Sep 17 00:00:00 2001 From: Derinhelm Date: Mon, 26 Apr 2021 23:35:45 +0300 Subject: [PATCH 05/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20Item?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/tests/test_1.py | 102 ++++++++++++++++++++++++++++++++-------- 1 file changed, 82 insertions(+), 20 deletions(-) diff --git a/backend/tests/test_1.py b/backend/tests/test_1.py index 7d18f6e..702a533 100644 --- a/backend/tests/test_1.py +++ b/backend/tests/test_1.py @@ -82,20 +82,22 @@ class ToDoTest(APITestCase): self.put(to_do_id1, "ToDoList11") self.patch(to_do_id1, "ToDoList12") - + + class ItemTest(APITestCase): '''Tests API for items.''' def get(self, todo_id, finished, expected_titles): url = reverse('ToDoItems-list') + data = {} if finished is not None: - data = {"parent": todo_id, "finished": finished} - else: - data = {"parent": todo_id} + data["finished"] = finished + if todo_id is not None: + data["parent"] = todo_id + response = self.client.get(url, data, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) - real_titles = [d['text'] for d in response.data['results']] - self.assertEqual((response.data['count'], real_titles), \ - (len(expected_titles), expected_titles)) + real_titles = [(d['text'], d['parent']) for d in response.data['results']] + self.assertEqual(real_titles, expected_titles) if finished is not None: item_status = [data['finished'] for data in response.data['results']] @@ -113,8 +115,45 @@ class ItemTest(APITestCase): check_finished = False if (finished is None) else finished self.assertEqual((response.data['text'], response.data['parent'], response.data['finished']), \ (item_text, todo_id, check_finished)) - return response.data['id'] + return response.data['id'], response.data['finished'] + def get_by_id(self, id, text, finished, parent): + url_with_id = reverse('ToDoItems-detail', args=(id,)) + response = self.client.get(url_with_id, {id: id}, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual((response.data['text'], response.data['finished'], response.data['parent']), \ + (text, finished, parent)) + + def put(self, id, text, finished, parent): + url_with_id = reverse('ToDoItems-detail', args=(id,)) + data = {"text": text, "parent": parent} + if finished is not None: + data["finished"] = finished + response = self.client.put(url_with_id, data, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual((response.data['text'], response.data['parent']), \ + (text, parent)) + if finished is not None: + self.assertEqual(response.data['finished'], finished) + + def patch(self, id, text, finished, parent): + url_with_id = reverse('ToDoItems-detail', args=(id,)) + data = {} + if text is not None: + data["text"] = text + if finished is not None: + data["finished"] = finished + if parent is not None: + data["parent"] = parent + response = self.client.patch(url_with_id, data, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + if text is not None: + self.assertEqual(response.data['text'], text) + if finished is not None: + self.assertEqual(response.data['finished'], finished) + if parent is not None: + self.assertEqual(response.data['parent'], parent) + def delete(self, id): url_with_id = reverse('ToDoItems-detail', args=(id,)) response = self.client.delete(url_with_id, {}, format='json') @@ -123,22 +162,45 @@ class ItemTest(APITestCase): def test_items(self): """ /todo_items/: get+, post+ (create) - /todo_items/{id}/: get (read), put (update), patch (partial_update), delete+ + /todo_items/{id}/: get+ (read), put (update), patch (partial_update), delete+ """ user = User.objects.create_user('test_user', 'test@test.com', 'test_password') self.client.force_authenticate(user=user) - to_do_id = create_todo(self.client, "ToDoList").data['id'] - self.get(to_do_id, None, []) - item_id_1 = self.post("Item1", to_do_id, None) - self.get(to_do_id, None, ["Item1"]) - item_id_2 = self.post("Item2", to_do_id, False) - self.get(to_do_id, None, ["Item1", "Item2"]) - item_id_3 = self.post("Item3", to_do_id, True) - self.get(to_do_id, None, ["Item1", "Item2", "Item3"]) - self.get(to_do_id, False, ["Item1", "Item2"]) - self.get(to_do_id, True, ["Item3"]) + to_do_id_1 = create_todo(self.client, "ToDoList1").data['id'] + to_do_id_2 = create_todo(self.client, "ToDoList2").data['id'] + + self.get(to_do_id_1, None, []) + item_text_1, item_text_2, item_text_3, item_text_4 = "Item1", "Item2", "Item3", "Item4" + item_id_1, item_finished_1 = self.post(item_text_1, to_do_id_1, None) + self.get(to_do_id_1, None, [(item_text_1, to_do_id_1)]) + item_id_2, item_finished_2 = self.post(item_text_2, to_do_id_1, False) + self.get(to_do_id_1, None, [(item_text_1, to_do_id_1), (item_text_2, to_do_id_1)]) + item_id_3, item_finished_3 = self.post(item_text_3, to_do_id_1, True) + self.get(to_do_id_1, None, [(item_text_1, to_do_id_1), (item_text_2, to_do_id_1), \ + (item_text_3, to_do_id_1)]) + item_id_4, item_finished_4 = self.post(item_text_4, to_do_id_2, True) + self.get(None, None, [(item_text_1, to_do_id_1), (item_text_2, to_do_id_1), \ + (item_text_3, to_do_id_1), (item_text_4, to_do_id_2)]) + + + self.get(to_do_id_1, None, [(item_text_1, to_do_id_1), (item_text_2, to_do_id_1), (item_text_3, to_do_id_1)]) + self.get(to_do_id_1, False, [(item_text_1, to_do_id_1), (item_text_2, to_do_id_1)]) + self.get(to_do_id_1, True, [(item_text_3, to_do_id_1)]) + + self.get_by_id(item_id_1, item_text_1, item_finished_1, to_do_id_1) + self.get_by_id(item_id_2, item_text_2, item_finished_2, to_do_id_1) + self.get_by_id(item_id_3, item_text_3, item_finished_3, to_do_id_1) self.delete(item_id_3) - self.get(to_do_id, None, ["Item1", "Item2"]) + self.get(to_do_id_1, None, [(item_text_1, to_do_id_1), (item_text_2, to_do_id_1)]) + item_text_1_2 = "Item5" + self.put(item_id_1, item_text_1_2, None, to_do_id_2) + self.put(item_id_1, item_text_1_2, False, to_do_id_2) + self.put(item_id_1, item_text_1_2, True, to_do_id_2) + + item_text_1_2 = "Item6" + self.patch(item_id_1, None, None, to_do_id_1) + self.patch(item_id_1, None, True, None) + self.patch(item_id_1, item_text_1_2, None, None) From 4ab5f11dd2b4402b7104bbd7fb51d31daca8a662 Mon Sep 17 00:00:00 2001 From: Derinhelm Date: Tue, 27 Apr 2021 17:52:16 +0300 Subject: [PATCH 06/10] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B3=D1=80?= =?UTF-8?q?=D1=83=D0=BF=D0=BF=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/tests/test_1.py | 206 ------------------------------------- backend/tests/test_item.py | 157 ++++++++++++++++++++++++++++ backend/tests/test_todo.py | 95 +++++++++++++++++ 3 files changed, 252 insertions(+), 206 deletions(-) delete mode 100644 backend/tests/test_1.py create mode 100644 backend/tests/test_item.py create mode 100644 backend/tests/test_todo.py diff --git a/backend/tests/test_1.py b/backend/tests/test_1.py deleted file mode 100644 index 702a533..0000000 --- a/backend/tests/test_1.py +++ /dev/null @@ -1,206 +0,0 @@ -import os - -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "backend.settings") - -from django.core.wsgi import get_wsgi_application -application = get_wsgi_application() - -from django.urls import reverse -from rest_framework import status -from rest_framework.test import APITestCase -from rest_framework.test import APIClient -from django.contrib.auth.models import User -from backend.api import router -from collections import OrderedDict - -def create_todo(client, title): - url = reverse('ToDoLists-list') - response = client.post(url, {"title": title}, format='json') - return response - -class ToDoTest(APITestCase): - '''Tests API for todo.''' - def get(self, expected_titles): - url = reverse('ToDoLists-list') - response = self.client.get(url, {}, format='json') - self.assertEqual(response.status_code, status.HTTP_200_OK) - real_titles = [data['title'] for data in response.data['results']] - self.assertEqual((response.data['count'], real_titles), \ - (len(expected_titles), expected_titles)) - - def post(self, to_do_title): - response = create_todo(self.client, to_do_title) - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(response.data['title'], to_do_title) - return response.data['id'] - - def get_by_id(self, id, expected_title): - url_with_id = reverse('ToDoLists-detail', args=(id,)) - response = self.client.get(url_with_id, {id: id}, format='json') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['title'], expected_title) - - def put(self, id, new_title): - url_with_id = reverse('ToDoLists-detail', args=(id,)) - response = self.client.put(url_with_id, {"title": new_title}, format='json') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['title'], new_title) - - def patch(self, id, new_title): - url_with_id = reverse('ToDoLists-detail', args=(id,)) - response = self.client.patch(url_with_id, {"title": new_title}, format='json') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['title'], new_title) - - def delete(self, id): - url_with_id = reverse('ToDoLists-detail', args=(id,)) - response = self.client.delete(url_with_id, {}, format='json') - self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - - def test_todo(self): - """ - lists/: get, post - lists/{id}/: get, put (update), patch (partial_update), delete - """ - - user = User.objects.create_user('test_user', 'test@test.com', 'test_password') - self.client.force_authenticate(user=user) - - self.get([]) - to_do_title_1, to_do_title_2 = "ToDoList1", "ToDoList2" - to_do_id1 = self.post(to_do_title_1) - self.get([to_do_title_1]) - to_do_id2 = self.post(to_do_title_2) - self.get([to_do_title_1, to_do_title_2]) - - self.get_by_id(to_do_id1, to_do_title_1) - self.get_by_id(to_do_id2, to_do_title_2) - - self.delete(to_do_id2) - self.get([to_do_title_1]) - - self.put(to_do_id1, "ToDoList11") - - self.patch(to_do_id1, "ToDoList12") - - -class ItemTest(APITestCase): - '''Tests API for items.''' - def get(self, todo_id, finished, expected_titles): - url = reverse('ToDoItems-list') - data = {} - if finished is not None: - data["finished"] = finished - if todo_id is not None: - data["parent"] = todo_id - - response = self.client.get(url, data, format='json') - self.assertEqual(response.status_code, status.HTTP_200_OK) - real_titles = [(d['text'], d['parent']) for d in response.data['results']] - self.assertEqual(real_titles, expected_titles) - - if finished is not None: - item_status = [data['finished'] for data in response.data['results']] - self.assertEqual(finished, all(item_status)) - - def post(self, item_text, todo_id, finished): - url = reverse('ToDoItems-list') - if finished is not None: - data = {"text": item_text, "parent": todo_id, "finished": finished} - else: - data = {"text": item_text, "parent": todo_id} - response = self.client.post(url, data, format='json') - - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - check_finished = False if (finished is None) else finished - self.assertEqual((response.data['text'], response.data['parent'], response.data['finished']), \ - (item_text, todo_id, check_finished)) - return response.data['id'], response.data['finished'] - - def get_by_id(self, id, text, finished, parent): - url_with_id = reverse('ToDoItems-detail', args=(id,)) - response = self.client.get(url_with_id, {id: id}, format='json') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual((response.data['text'], response.data['finished'], response.data['parent']), \ - (text, finished, parent)) - - def put(self, id, text, finished, parent): - url_with_id = reverse('ToDoItems-detail', args=(id,)) - data = {"text": text, "parent": parent} - if finished is not None: - data["finished"] = finished - response = self.client.put(url_with_id, data, format='json') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual((response.data['text'], response.data['parent']), \ - (text, parent)) - if finished is not None: - self.assertEqual(response.data['finished'], finished) - - def patch(self, id, text, finished, parent): - url_with_id = reverse('ToDoItems-detail', args=(id,)) - data = {} - if text is not None: - data["text"] = text - if finished is not None: - data["finished"] = finished - if parent is not None: - data["parent"] = parent - response = self.client.patch(url_with_id, data, format='json') - self.assertEqual(response.status_code, status.HTTP_200_OK) - if text is not None: - self.assertEqual(response.data['text'], text) - if finished is not None: - self.assertEqual(response.data['finished'], finished) - if parent is not None: - self.assertEqual(response.data['parent'], parent) - - def delete(self, id): - url_with_id = reverse('ToDoItems-detail', args=(id,)) - response = self.client.delete(url_with_id, {}, format='json') - self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - - def test_items(self): - """ - /todo_items/: get+, post+ (create) - /todo_items/{id}/: get+ (read), put (update), patch (partial_update), delete+ - """ - user = User.objects.create_user('test_user', 'test@test.com', 'test_password') - self.client.force_authenticate(user=user) - to_do_id_1 = create_todo(self.client, "ToDoList1").data['id'] - to_do_id_2 = create_todo(self.client, "ToDoList2").data['id'] - - self.get(to_do_id_1, None, []) - item_text_1, item_text_2, item_text_3, item_text_4 = "Item1", "Item2", "Item3", "Item4" - item_id_1, item_finished_1 = self.post(item_text_1, to_do_id_1, None) - self.get(to_do_id_1, None, [(item_text_1, to_do_id_1)]) - item_id_2, item_finished_2 = self.post(item_text_2, to_do_id_1, False) - self.get(to_do_id_1, None, [(item_text_1, to_do_id_1), (item_text_2, to_do_id_1)]) - item_id_3, item_finished_3 = self.post(item_text_3, to_do_id_1, True) - self.get(to_do_id_1, None, [(item_text_1, to_do_id_1), (item_text_2, to_do_id_1), \ - (item_text_3, to_do_id_1)]) - item_id_4, item_finished_4 = self.post(item_text_4, to_do_id_2, True) - self.get(None, None, [(item_text_1, to_do_id_1), (item_text_2, to_do_id_1), \ - (item_text_3, to_do_id_1), (item_text_4, to_do_id_2)]) - - - self.get(to_do_id_1, None, [(item_text_1, to_do_id_1), (item_text_2, to_do_id_1), (item_text_3, to_do_id_1)]) - self.get(to_do_id_1, False, [(item_text_1, to_do_id_1), (item_text_2, to_do_id_1)]) - self.get(to_do_id_1, True, [(item_text_3, to_do_id_1)]) - - self.get_by_id(item_id_1, item_text_1, item_finished_1, to_do_id_1) - self.get_by_id(item_id_2, item_text_2, item_finished_2, to_do_id_1) - self.get_by_id(item_id_3, item_text_3, item_finished_3, to_do_id_1) - - self.delete(item_id_3) - self.get(to_do_id_1, None, [(item_text_1, to_do_id_1), (item_text_2, to_do_id_1)]) - - item_text_1_2 = "Item5" - self.put(item_id_1, item_text_1_2, None, to_do_id_2) - self.put(item_id_1, item_text_1_2, False, to_do_id_2) - self.put(item_id_1, item_text_1_2, True, to_do_id_2) - - item_text_1_2 = "Item6" - self.patch(item_id_1, None, None, to_do_id_1) - self.patch(item_id_1, None, True, None) - self.patch(item_id_1, item_text_1_2, None, None) - diff --git a/backend/tests/test_item.py b/backend/tests/test_item.py new file mode 100644 index 0000000..114c83b --- /dev/null +++ b/backend/tests/test_item.py @@ -0,0 +1,157 @@ +import os + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "backend.settings") + +from django.core.wsgi import get_wsgi_application +application = get_wsgi_application() + +from django.urls import reverse +from rest_framework import status +from rest_framework.test import APITestCase +from rest_framework.test import APIClient +from django.contrib.auth.models import User +from backend.api import router +from .test_todo import create_todo + +class ItemTest(APITestCase): + '''Tests API for items.''' + + def prepare(self): + user = User.objects.create_user('test_user4', 'test@test.com', 'test_password') + self.client.force_authenticate(user=user) + to_do_id_1 = create_todo(self.client, "ToDoList1").data['id'] + to_do_id_2 = create_todo(self.client, "ToDoList2").data['id'] + return to_do_id_1, to_do_id_2 + + def get(self, expected_titles, todo_id=None, finished=None): + url = reverse('ToDoItems-list') + data = {} + if finished is not None: + data["finished"] = finished + if todo_id is not None: + data["parent"] = todo_id + + response = self.client.get(url, data, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + real_titles = [(d['text'], d['parent']) for d in response.data['results']] + self.assertEqual(real_titles, expected_titles) + + if finished is not None: + item_status = [data['finished'] for data in response.data['results']] + self.assertEqual(finished, all(item_status)) + + def post(self, item_text, todo_id, finished=None): + url = reverse('ToDoItems-list') + if finished is not None: + data = {"text": item_text, "parent": todo_id, "finished": finished} + else: + data = {"text": item_text, "parent": todo_id} + response = self.client.post(url, data, format='json') + + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + check_finished = False if (finished is None) else finished + self.assertEqual(response.data['text'], item_text) + self.assertEqual(response.data['parent'], todo_id) + self.assertEqual(response.data['finished'], check_finished) + + return response.data['id'], response.data['finished'] + + def get_by_id(self, id, text, finished, parent): + url_with_id = reverse('ToDoItems-detail', args=(id,)) + response = self.client.get(url_with_id, {id: id}, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['text'], text) + self.assertEqual(response.data['finished'], finished) + self.assertEqual(response.data['parent'], parent) + + def put(self, id, text, parent, finished=None): + url_with_id = reverse('ToDoItems-detail', args=(id,)) + data = {"text": text, "parent": parent} + if finished is not None: + data["finished"] = finished + response = self.client.put(url_with_id, data, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['text'], text) + self.assertEqual(response.data['parent'], parent) + if finished is not None: + self.assertEqual(response.data['finished'], finished) + + def patch(self, id, text=None, finished=None, parent=None): + url_with_id = reverse('ToDoItems-detail', args=(id,)) + data = {} + if text is not None: + data["text"] = text + if finished is not None: + data["finished"] = finished + if parent is not None: + data["parent"] = parent + response = self.client.patch(url_with_id, data, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + if text is not None: + self.assertEqual(response.data['text'], text) + if finished is not None: + self.assertEqual(response.data['finished'], finished) + if parent is not None: + self.assertEqual(response.data['parent'], parent) + + def delete(self, id, title, finished, to_do_id): + self.get_by_id(id, title, finished, to_do_id) + url_with_id = reverse('ToDoItems-detail', args=(id,)) + response = self.client.delete(url_with_id, {}, format='json') + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + + def test_create_delete(self): + """ + /todo_items/: get, post (create) + /todo_items/{id}/: get (read), delete + """ + to_do_id_1, to_do_id_2 = self.prepare() + self.get([], to_do_id_1) + item_text_1, item_text_2, item_text_3, item_text_4 = "Item1", "Item2", "Item3", "Item4" + item_id_1, item_finished_1 = self.post(item_text_1, to_do_id_1) + self.get([(item_text_1, to_do_id_1)], to_do_id_1) + item_id_2, item_finished_2 = self.post(item_text_2, to_do_id_1, finished=False) + self.get([(item_text_1, to_do_id_1), (item_text_2, to_do_id_1)], to_do_id_1) + item_id_3, item_finished_3 = self.post(item_text_3, to_do_id_1, finished=True) + self.get([(item_text_1, to_do_id_1), (item_text_2, to_do_id_1), \ + (item_text_3, to_do_id_1)], to_do_id_1) + item_id_4, item_finished_4 = self.post(item_text_4, to_do_id_2, finished=False) + self.get([(item_text_1, to_do_id_1), (item_text_2, to_do_id_1), \ + (item_text_3, to_do_id_1), (item_text_4, to_do_id_2)]) + + self.get([(item_text_1, to_do_id_1), (item_text_2, to_do_id_1), (item_text_3, to_do_id_1)], to_do_id_1) + self.get([(item_text_1, to_do_id_1), (item_text_2, to_do_id_1)], to_do_id_1, finished=False) + self.get([(item_text_3, to_do_id_1)], to_do_id_1, finished=True) + + self.get_by_id(item_id_1, item_text_1, item_finished_1, to_do_id_1) + self.get_by_id(item_id_2, item_text_2, item_finished_2, to_do_id_1) + self.get_by_id(item_id_3, item_text_3, item_finished_3, to_do_id_1) + + self.delete(item_id_3, item_text_3, item_finished_3, to_do_id_1) + self.get([(item_text_1, to_do_id_1), (item_text_2, to_do_id_1)], to_do_id_1) + + def test_update(self): + """ + /todo_items/{id}/: put (update), patch (partial_update) + """ + + to_do_id_1, to_do_id_2 = self.prepare() + + item_text_1 = "Item1" + item_id_1, item_finished_1 = self.post(item_text_1, to_do_id_1) + + item_text_1_2 = "Item5" + self.put(item_id_1, item_text_1_2, to_do_id_2) + self.put(item_id_1, item_text_1_2, to_do_id_2, finished=False) + self.put(item_id_1, item_text_1_2, to_do_id_2, finished=True) + + item_text_1_3 = "Item6" + self.patch(item_id_1, parent=to_do_id_1) + self.patch(item_id_1, finished=True) + self.patch(item_id_1, text=item_text_1_3) + + + + + + diff --git a/backend/tests/test_todo.py b/backend/tests/test_todo.py new file mode 100644 index 0000000..f39a652 --- /dev/null +++ b/backend/tests/test_todo.py @@ -0,0 +1,95 @@ +import os + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "backend.settings") + +from django.core.wsgi import get_wsgi_application +application = get_wsgi_application() + +from django.urls import reverse +from rest_framework import status +from rest_framework.test import APITestCase +from rest_framework.test import APIClient +from django.contrib.auth.models import User +from backend.api import router +from collections import OrderedDict + +def create_todo(client, title): + url = reverse('ToDoLists-list') + response = client.post(url, {"title": title}, format='json') + return response + +class ToDoTest(APITestCase): + '''Tests API for todo.''' + def get(self, expected_titles): + url = reverse('ToDoLists-list') + response = self.client.get(url, {}, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + real_titles = [data['title'] for data in response.data['results']] + self.assertEqual((response.data['count'], real_titles), \ + (len(expected_titles), expected_titles)) + + def post(self, to_do_title): + response = create_todo(self.client, to_do_title) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(response.data['title'], to_do_title) + return response.data['id'] + + def get_by_id(self, id, expected_title): + url_with_id = reverse('ToDoLists-detail', args=(id,)) + response = self.client.get(url_with_id, {id: id}, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['title'], expected_title) + + def put(self, id, new_title): + url_with_id = reverse('ToDoLists-detail', args=(id,)) + response = self.client.put(url_with_id, {"title": new_title}, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['title'], new_title) + + def patch(self, id, new_title): + url_with_id = reverse('ToDoLists-detail', args=(id,)) + response = self.client.patch(url_with_id, {"title": new_title}, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['title'], new_title) + + def delete(self, id, title): + self.get_by_id(id, title) + url_with_id = reverse('ToDoLists-detail', args=(id,)) + response = self.client.delete(url_with_id, {}, format='json') + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + + def prepare(self): + user = User.objects.create_user('test_user', 'test@test.com', 'test_password') + self.client.force_authenticate(user=user) + + def test_create_delete(self): + """ + lists/{id}/: put (update), patch (partial_update) + """ + self.prepare() + to_do_title_1 = "ToDoList1" + to_do_id1 = self.post(to_do_title_1) + self.put(to_do_id1, "ToDoList11") + self.patch(to_do_id1, "ToDoList12") + + + def test_todo(self): + """ + lists/: get, post + lists/{id}/: get, delete + """ + + self.prepare() + self.get([]) + to_do_title_1, to_do_title_2 = "ToDoList1", "ToDoList2" + to_do_id1 = self.post(to_do_title_1) + self.get([to_do_title_1]) + to_do_id2 = self.post(to_do_title_2) + self.get([to_do_title_1, to_do_title_2]) + + self.get_by_id(to_do_id1, to_do_title_1) + self.get_by_id(to_do_id2, to_do_title_2) + + self.delete(to_do_id2, to_do_title_2) + self.get([to_do_title_1]) + From bba4be6b274069a5b676fdc3e3da38fd459039db Mon Sep 17 00:00:00 2001 From: Derinhelm Date: Tue, 27 Apr 2021 20:38:49 +0300 Subject: [PATCH 07/10] =?UTF-8?q?=D0=92=20README=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D0=BD=D0=B4=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=B0=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index ec2c1c7..60dde79 100644 --- a/README.md +++ b/README.md @@ -53,3 +53,8 @@ docker-compose up ```bash docker-compose exec web python manage.py makemigrations backend ``` + +Для запуска тестов использовать +```bash +docker-compose exec web python manage.py test +``` From 0ee81d4b421046ee36f14092834cd6255d64e474 Mon Sep 17 00:00:00 2001 From: Aleksey Lobanov Date: Tue, 27 Apr 2021 23:12:51 +0300 Subject: [PATCH 08/10] =?UTF-8?q?feat:=20=D0=98=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D1=83=D0=B5=D0=BC=20pytest=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=B1=D0=B5=D0=BA=D0=B5=D0=BD=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/backend/settings.py | 2 +- backend/requirements.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/backend/settings.py b/backend/backend/settings.py index 32b39d6..e00523f 100644 --- a/backend/backend/settings.py +++ b/backend/backend/settings.py @@ -28,7 +28,7 @@ DEBUG = True ALLOWED_HOSTS = [] if DEBUG: - ALLOWED_HOSTS = ["0.0.0.0", "localhost", "127.0.0.1"] + ALLOWED_HOSTS = ["0.0.0.0", "localhost", "127.0.0.1", "ALLOWED_HOSTS", "testserver"] # Application definition diff --git a/backend/requirements.txt b/backend/requirements.txt index 2c9488b..fe00bac 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,3 +1,4 @@ +pytest==6.2.3 djangorestframework==3.12.4 django-filter==2.4.0 markdown==3.3.4 From fdd40d459258bd1e1097752da10f8b83590a4b30 Mon Sep 17 00:00:00 2001 From: Aleksey Lobanov Date: Tue, 27 Apr 2021 23:13:16 +0300 Subject: [PATCH 09/10] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=B2=D1=8B=D1=87=D0=B8=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=BA=D1=80=D1=8B=D1=82?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B1=D0=B5=D0=BA=D0=B5=D0=BD=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- backend/.coveragerc | 3 +++ backend/requirements.txt | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 backend/.coveragerc diff --git a/README.md b/README.md index 60dde79..2b1f96a 100644 --- a/README.md +++ b/README.md @@ -56,5 +56,5 @@ docker-compose exec web python manage.py makemigrations backend Для запуска тестов использовать ```bash -docker-compose exec web python manage.py test +docker-compose run web pytest --cov=backend ``` diff --git a/backend/.coveragerc b/backend/.coveragerc new file mode 100644 index 0000000..455c6de --- /dev/null +++ b/backend/.coveragerc @@ -0,0 +1,3 @@ +[run] +omit = + backend/migrations/* diff --git a/backend/requirements.txt b/backend/requirements.txt index fe00bac..7385760 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,4 +1,5 @@ pytest==6.2.3 +pytest-cov==2.11.1 djangorestframework==3.12.4 django-filter==2.4.0 markdown==3.3.4 From 9152cc9772dc8839aa89fc5a3119a8c15dd9f43a Mon Sep 17 00:00:00 2001 From: Derinhelm Date: Wed, 28 Apr 2021 00:47:56 +0300 Subject: [PATCH 10/10] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B5=D0=B4=D0=BE=D1=87=D0=B5?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B2=20=D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- backend/backend/urls.py | 16 +++--- backend/tests/__init__.py | 3 ++ backend/tests/test_item.py | 107 ++++++++++++++++++------------------- backend/tests/test_todo.py | 58 +++++++++----------- 5 files changed, 88 insertions(+), 98 deletions(-) diff --git a/README.md b/README.md index 2b1f96a..e886902 100644 --- a/README.md +++ b/README.md @@ -56,5 +56,5 @@ docker-compose exec web python manage.py makemigrations backend Для запуска тестов использовать ```bash -docker-compose run web pytest --cov=backend +docker-compose run -e DJANGO_SETTINGS_MODULE=backend.settings web pytest --cov=backend ``` diff --git a/backend/backend/urls.py b/backend/backend/urls.py index d123db5..cdcbc7f 100644 --- a/backend/backend/urls.py +++ b/backend/backend/urls.py @@ -13,13 +13,13 @@ from drf_yasg import openapi from .api import router schema_view = get_schema_view( - openapi.Info( - title="ToDo List", - default_version='v1', - description="Swagger Interface for ToDo List", - ), - public=True, - permission_classes=(permissions.AllowAny,), + openapi.Info( + title="ToDo List", + default_version="v1", + description="Swagger Interface for ToDo List", + ), + public=True, + permission_classes=(permissions.AllowAny,), ) urlpatterns = [ @@ -28,5 +28,5 @@ urlpatterns = [ path("api/token/refresh/", TokenRefreshView.as_view(), name="token_refresh"), path("api/", include(router.urls)), path("api-auth/", include("rest_framework.urls", namespace="rest_framework")), - path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'), + path("swagger/", schema_view.with_ui("swagger", cache_timeout=0), name="schema-swagger-ui"), ] diff --git a/backend/tests/__init__.py b/backend/tests/__init__.py index e69de29..8435af2 100644 --- a/backend/tests/__init__.py +++ b/backend/tests/__init__.py @@ -0,0 +1,3 @@ +from django.core.wsgi import get_wsgi_application + +application = get_wsgi_application() diff --git a/backend/tests/test_item.py b/backend/tests/test_item.py index 114c83b..783dcff 100644 --- a/backend/tests/test_item.py +++ b/backend/tests/test_item.py @@ -1,83 +1,75 @@ -import os - -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "backend.settings") - -from django.core.wsgi import get_wsgi_application -application = get_wsgi_application() - from django.urls import reverse from rest_framework import status from rest_framework.test import APITestCase -from rest_framework.test import APIClient from django.contrib.auth.models import User -from backend.api import router from .test_todo import create_todo + class ItemTest(APITestCase): - '''Tests API for items.''' + """Tests API for items.""" def prepare(self): - user = User.objects.create_user('test_user4', 'test@test.com', 'test_password') + user = User.objects.create_user("test_user4", "test@test.com", "test_password") self.client.force_authenticate(user=user) - to_do_id_1 = create_todo(self.client, "ToDoList1").data['id'] - to_do_id_2 = create_todo(self.client, "ToDoList2").data['id'] + to_do_id_1 = create_todo(self.client, "ToDoList1").data["id"] + to_do_id_2 = create_todo(self.client, "ToDoList2").data["id"] return to_do_id_1, to_do_id_2 def get(self, expected_titles, todo_id=None, finished=None): - url = reverse('ToDoItems-list') + url = reverse("ToDoItems-list") data = {} if finished is not None: data["finished"] = finished if todo_id is not None: data["parent"] = todo_id - response = self.client.get(url, data, format='json') + response = self.client.get(url, data, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) - real_titles = [(d['text'], d['parent']) for d in response.data['results']] + real_titles = [(d["text"], d["parent"]) for d in response.data["results"]] self.assertEqual(real_titles, expected_titles) if finished is not None: - item_status = [data['finished'] for data in response.data['results']] + item_status = [data["finished"] for data in response.data["results"]] self.assertEqual(finished, all(item_status)) def post(self, item_text, todo_id, finished=None): - url = reverse('ToDoItems-list') + url = reverse("ToDoItems-list") if finished is not None: data = {"text": item_text, "parent": todo_id, "finished": finished} else: data = {"text": item_text, "parent": todo_id} - response = self.client.post(url, data, format='json') + response = self.client.post(url, data, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) check_finished = False if (finished is None) else finished - self.assertEqual(response.data['text'], item_text) - self.assertEqual(response.data['parent'], todo_id) - self.assertEqual(response.data['finished'], check_finished) + self.assertEqual(response.data["text"], item_text) + self.assertEqual(response.data["parent"], todo_id) + self.assertEqual(response.data["finished"], check_finished) - return response.data['id'], response.data['finished'] + return response.data["id"], response.data["finished"] def get_by_id(self, id, text, finished, parent): - url_with_id = reverse('ToDoItems-detail', args=(id,)) - response = self.client.get(url_with_id, {id: id}, format='json') + url_with_id = reverse("ToDoItems-detail", args=(id,)) + response = self.client.get(url_with_id, {id: id}, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['text'], text) - self.assertEqual(response.data['finished'], finished) - self.assertEqual(response.data['parent'], parent) - + self.assertEqual(response.data["text"], text) + self.assertEqual(response.data["finished"], finished) + self.assertEqual(response.data["parent"], parent) + def put(self, id, text, parent, finished=None): - url_with_id = reverse('ToDoItems-detail', args=(id,)) + url_with_id = reverse("ToDoItems-detail", args=(id,)) data = {"text": text, "parent": parent} if finished is not None: data["finished"] = finished - response = self.client.put(url_with_id, data, format='json') + response = self.client.put(url_with_id, data, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['text'], text) - self.assertEqual(response.data['parent'], parent) + self.assertEqual(response.data["text"], text) + self.assertEqual(response.data["parent"], parent) if finished is not None: - self.assertEqual(response.data['finished'], finished) + self.assertEqual(response.data["finished"], finished) def patch(self, id, text=None, finished=None, parent=None): - url_with_id = reverse('ToDoItems-detail', args=(id,)) + url_with_id = reverse("ToDoItems-detail", args=(id,)) data = {} if text is not None: data["text"] = text @@ -85,21 +77,21 @@ class ItemTest(APITestCase): data["finished"] = finished if parent is not None: data["parent"] = parent - response = self.client.patch(url_with_id, data, format='json') + response = self.client.patch(url_with_id, data, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) if text is not None: - self.assertEqual(response.data['text'], text) + self.assertEqual(response.data["text"], text) if finished is not None: - self.assertEqual(response.data['finished'], finished) + self.assertEqual(response.data["finished"], finished) if parent is not None: - self.assertEqual(response.data['parent'], parent) - + self.assertEqual(response.data["parent"], parent) + def delete(self, id, title, finished, to_do_id): self.get_by_id(id, title, finished, to_do_id) - url_with_id = reverse('ToDoItems-detail', args=(id,)) - response = self.client.delete(url_with_id, {}, format='json') + url_with_id = reverse("ToDoItems-detail", args=(id,)) + response = self.client.delete(url_with_id, {}, format="json") self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - + def test_create_delete(self): """ /todo_items/: get, post (create) @@ -113,13 +105,24 @@ class ItemTest(APITestCase): item_id_2, item_finished_2 = self.post(item_text_2, to_do_id_1, finished=False) self.get([(item_text_1, to_do_id_1), (item_text_2, to_do_id_1)], to_do_id_1) item_id_3, item_finished_3 = self.post(item_text_3, to_do_id_1, finished=True) - self.get([(item_text_1, to_do_id_1), (item_text_2, to_do_id_1), \ - (item_text_3, to_do_id_1)], to_do_id_1) - item_id_4, item_finished_4 = self.post(item_text_4, to_do_id_2, finished=False) - self.get([(item_text_1, to_do_id_1), (item_text_2, to_do_id_1), \ - (item_text_3, to_do_id_1), (item_text_4, to_do_id_2)]) + self.get( + [(item_text_1, to_do_id_1), (item_text_2, to_do_id_1), (item_text_3, to_do_id_1)], + to_do_id_1, + ) + item_id_4, item_finished_4 = self.post(item_text_4, to_do_id_2, finished=False) + self.get( + [ + (item_text_1, to_do_id_1), + (item_text_2, to_do_id_1), + (item_text_3, to_do_id_1), + (item_text_4, to_do_id_2), + ] + ) - self.get([(item_text_1, to_do_id_1), (item_text_2, to_do_id_1), (item_text_3, to_do_id_1)], to_do_id_1) + self.get( + [(item_text_1, to_do_id_1), (item_text_2, to_do_id_1), (item_text_3, to_do_id_1)], + to_do_id_1, + ) self.get([(item_text_1, to_do_id_1), (item_text_2, to_do_id_1)], to_do_id_1, finished=False) self.get([(item_text_3, to_do_id_1)], to_do_id_1, finished=True) @@ -149,9 +152,3 @@ class ItemTest(APITestCase): self.patch(item_id_1, parent=to_do_id_1) self.patch(item_id_1, finished=True) self.patch(item_id_1, text=item_text_1_3) - - - - - - diff --git a/backend/tests/test_todo.py b/backend/tests/test_todo.py index f39a652..a8b260f 100644 --- a/backend/tests/test_todo.py +++ b/backend/tests/test_todo.py @@ -1,65 +1,57 @@ -import os - -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "backend.settings") - -from django.core.wsgi import get_wsgi_application -application = get_wsgi_application() - from django.urls import reverse from rest_framework import status from rest_framework.test import APITestCase -from rest_framework.test import APIClient from django.contrib.auth.models import User -from backend.api import router -from collections import OrderedDict + def create_todo(client, title): - url = reverse('ToDoLists-list') - response = client.post(url, {"title": title}, format='json') + url = reverse("ToDoLists-list") + response = client.post(url, {"title": title}, format="json") return response + class ToDoTest(APITestCase): - '''Tests API for todo.''' + """Tests API for todo.""" + def get(self, expected_titles): - url = reverse('ToDoLists-list') - response = self.client.get(url, {}, format='json') + url = reverse("ToDoLists-list") + response = self.client.get(url, {}, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) - real_titles = [data['title'] for data in response.data['results']] - self.assertEqual((response.data['count'], real_titles), \ - (len(expected_titles), expected_titles)) + real_titles = [data["title"] for data in response.data["results"]] + self.assertEqual(real_titles, expected_titles) def post(self, to_do_title): response = create_todo(self.client, to_do_title) self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(response.data['title'], to_do_title) - return response.data['id'] + self.assertEqual(response.data["title"], to_do_title) + return response.data["id"] def get_by_id(self, id, expected_title): - url_with_id = reverse('ToDoLists-detail', args=(id,)) - response = self.client.get(url_with_id, {id: id}, format='json') + url_with_id = reverse("ToDoLists-detail", args=(id,)) + response = self.client.get(url_with_id, {id: id}, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['title'], expected_title) + self.assertEqual(response.data["title"], expected_title) def put(self, id, new_title): - url_with_id = reverse('ToDoLists-detail', args=(id,)) - response = self.client.put(url_with_id, {"title": new_title}, format='json') + url_with_id = reverse("ToDoLists-detail", args=(id,)) + response = self.client.put(url_with_id, {"title": new_title}, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['title'], new_title) + self.assertEqual(response.data["title"], new_title) def patch(self, id, new_title): - url_with_id = reverse('ToDoLists-detail', args=(id,)) - response = self.client.patch(url_with_id, {"title": new_title}, format='json') + url_with_id = reverse("ToDoLists-detail", args=(id,)) + response = self.client.patch(url_with_id, {"title": new_title}, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['title'], new_title) + self.assertEqual(response.data["title"], new_title) def delete(self, id, title): self.get_by_id(id, title) - url_with_id = reverse('ToDoLists-detail', args=(id,)) - response = self.client.delete(url_with_id, {}, format='json') + url_with_id = reverse("ToDoLists-detail", args=(id,)) + response = self.client.delete(url_with_id, {}, format="json") self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) def prepare(self): - user = User.objects.create_user('test_user', 'test@test.com', 'test_password') + user = User.objects.create_user("test_user", "test@test.com", "test_password") self.client.force_authenticate(user=user) def test_create_delete(self): @@ -72,7 +64,6 @@ class ToDoTest(APITestCase): self.put(to_do_id1, "ToDoList11") self.patch(to_do_id1, "ToDoList12") - def test_todo(self): """ lists/: get, post @@ -92,4 +83,3 @@ class ToDoTest(APITestCase): self.delete(to_do_id2, to_do_title_2) self.get([to_do_title_1]) -