|
1 | 1 | import pytest |
2 | | -from django.contrib.auth import get_user_model |
3 | 2 | from django.test import Client |
4 | 3 | from django.urls import reverse |
5 | | -from task_manager.tasks.models import Task |
| 4 | +from django.contrib.auth import get_user_model |
| 5 | + |
6 | 6 | from task_manager.statuses.models import Status |
| 7 | +from task_manager.tasks.models import Task |
7 | 8 |
|
8 | 9 | User = get_user_model() |
9 | | - |
10 | | - |
11 | | -@pytest.fixture |
12 | | -def status_new(db): |
13 | | - return Status.objects.create(name="новый") |
| 10 | +pytestmark = pytest.mark.django_db |
14 | 11 |
|
15 | 12 |
|
16 | 13 | @pytest.fixture |
17 | 14 | def users(db): |
18 | | - password = "P@ssw0rd12345" |
19 | | - u1 = User.objects.create_user( |
20 | | - username="alice", password=password, first_name="Alice", last_name="A" |
21 | | - ) |
22 | | - u2 = User.objects.create_user( |
23 | | - username="bob", password=password, first_name="Bob", last_name="B" |
24 | | - ) |
25 | | - return {"alice": u1, "bob": u2, "password": password} |
| 15 | + pwd = "p12345678" |
| 16 | + u1 = User.objects.create_user(username="user1", password=pwd) |
| 17 | + u2 = User.objects.create_user(username="user2", password=pwd) |
| 18 | + return {"u1": u1, "u2": u2, "pwd": pwd} |
26 | 19 |
|
27 | 20 |
|
28 | 21 | @pytest.fixture |
29 | 22 | def auth_client(users): |
30 | 23 | c = Client() |
31 | | - c.login(username="alice", password=users["password"]) |
| 24 | + c.login(username="user1", password=users["pwd"]) |
32 | 25 | return c |
33 | 26 |
|
34 | 27 |
|
35 | | -@pytest.mark.django_db |
36 | | -def test_users_list_is_public(client, users): |
37 | | - resp = client.get(reverse("list", current_app="users")) |
38 | | - assert resp.status_code == 200 |
39 | | - html = resp.content.decode() |
40 | | - assert "alice" in html |
41 | | - assert "bob" in html |
42 | | - |
43 | | - |
44 | | -@pytest.mark.django_db |
45 | | -def test_registration_get(client): |
46 | | - r = client.get(reverse("create", current_app="users")) |
47 | | - assert r.status_code == 200 |
48 | | - html = r.content.decode() |
49 | | - assert 'name="username"' in html |
50 | | - assert 'name="password1"' in html |
51 | | - assert 'name="password2"' in html |
52 | | - |
53 | | - |
54 | | -@pytest.mark.django_db |
55 | | -def test_registration_post_creates_user(client): |
56 | | - data = { |
57 | | - "username": "charlie", |
58 | | - "first_name": "Charlie", |
59 | | - "last_name": "C", |
60 | | - "password1": "XyZ12345!xyZ", |
61 | | - "password2": "XyZ12345!xyZ", |
62 | | - } |
63 | | - r = client.post(reverse("create", current_app="users"), data=data) |
64 | | - assert r.status_code in (302, 301) |
65 | | - assert User.objects.filter(username="charlie").exists() |
| 28 | +@pytest.fixture |
| 29 | +def status_new(db): |
| 30 | + return Status.objects.create(name="новый") |
66 | 31 |
|
67 | 32 |
|
68 | | -@pytest.mark.django_db |
69 | | -def test_update_requires_auth_redirects(client, users): |
70 | | - url = reverse("update", args=[users["alice"].pk], current_app="users") |
71 | | - r = client.get(url) |
| 33 | +def test_login_required(client): |
| 34 | + r = client.get(reverse("tasks:index")) |
72 | 35 | assert r.status_code in (302, 301) |
73 | | - assert reverse("login") in r.url |
74 | | - assert f"next={url}" in r.url |
75 | | - |
76 | | - |
77 | | -@pytest.mark.django_db |
78 | | -def test_user_can_update_self(auth_client, users): |
79 | | - url = reverse("update", args=[users["alice"].pk], current_app="users") |
80 | | - r_get = auth_client.get(url) |
81 | | - assert r_get.status_code == 200 |
82 | | - |
83 | | - r_post = auth_client.post( |
84 | | - url, |
85 | | - data={"username": "alice_new", "first_name": "Al", "last_name": "A"}, |
86 | | - ) |
87 | | - assert r_post.status_code in (302, 301) |
88 | | - |
89 | | - users["alice"].refresh_from_db() |
90 | | - assert users["alice"].username == "alice_new" |
91 | | - assert users["alice"].first_name == "Al" |
92 | | - |
93 | 36 |
|
94 | | -@pytest.mark.django_db |
95 | | -def test_user_cannot_update_other(auth_client, users): |
96 | | - url = reverse("update", args=[users["bob"].pk], current_app="users") |
97 | | - r = auth_client.post(url, data={"username": "bob_hacked"}) |
98 | | - assert r.status_code in (302, 403, 404) |
99 | | - users["bob"].refresh_from_db() |
100 | | - assert users["bob"].username == "bob" |
101 | 37 |
|
102 | | - |
103 | | -@pytest.mark.django_db |
104 | | -def test_delete_requires_auth_redirects(client, users): |
105 | | - url = reverse("delete", args=[users["alice"].pk], current_app="users") |
106 | | - r = client.get(url) |
107 | | - assert r.status_code in (302, 301) |
108 | | - assert reverse("login") in r.url |
| 38 | +def test_list(auth_client, users, status_new): |
| 39 | + Task.objects.create(name="Тестовая задача", description="Описание", |
| 40 | + status=status_new, author=users["u1"]) |
| 41 | + Task.objects.create(name="Вторая", description="Ещё одна", |
| 42 | + status=status_new, author=users["u1"]) |
| 43 | + r = auth_client.get(reverse("tasks:index")) |
| 44 | + assert r.status_code == 200 |
| 45 | + html = r.content.decode() |
| 46 | + assert "Тестовая задача" in html |
| 47 | + assert "Вторая" in html |
| 48 | + |
| 49 | + |
| 50 | +def test_create(auth_client, users, status_new): |
| 51 | + resp = auth_client.post(reverse("tasks:create"), data={ |
| 52 | + "name": "Новая задача", |
| 53 | + "description": "Что-то сделать", |
| 54 | + "status": status_new.pk, |
| 55 | + "executor": users["u2"].pk, |
| 56 | + }) |
| 57 | + assert resp.status_code in (302, 301) |
| 58 | + assert Task.objects.filter(name="Новая задача", |
| 59 | + status=status_new, |
| 60 | + author=users["u1"]).exists() |
| 61 | + |
| 62 | + |
| 63 | +def test_update(auth_client, users, status_new): |
| 64 | + t = Task.objects.create(name="Черновик", description="Описание", |
| 65 | + status=status_new, author=users["u1"]) |
| 66 | + resp = auth_client.post(reverse("tasks:update", args=[t.pk]), data={ |
| 67 | + "name": "Изменено", |
| 68 | + "description": "Новое описание", |
| 69 | + "status": status_new.pk, |
| 70 | + "executor": users["u2"].pk, |
| 71 | + }) |
| 72 | + assert resp.status_code in (302, 301) |
| 73 | + t.refresh_from_db() |
| 74 | + assert t.name == "Изменено" |
| 75 | + assert t.description == "Новое описание" |
| 76 | + assert t.executor == users["u2"] |
| 77 | + |
| 78 | + |
| 79 | +def test_view(auth_client, users, status_new): |
| 80 | + t = Task.objects.create(name="Посмотреть", description="Детали", |
| 81 | + status=status_new, author=users["u1"]) |
| 82 | + r = auth_client.get(reverse("tasks:detail", args=[t.pk])) |
| 83 | + assert r.status_code == 200 |
| 84 | + html = r.content.decode() |
| 85 | + assert "Посмотреть" in html |
| 86 | + assert "Детали" in html |
109 | 87 |
|
110 | 88 |
|
111 | | -@pytest.mark.django_db |
112 | | -def test_user_can_delete_self(users): |
113 | | - c = Client() |
114 | | - c.login(username="bob", password=users["password"]) |
115 | | - url = reverse("delete", args=[users["bob"].pk], current_app="users") |
116 | | - r_get = c.get(url) |
| 89 | +def test_delete(auth_client, users, status_new): |
| 90 | + t = Task.objects.create(name="Удалить", description="Ненужная", |
| 91 | + status=status_new, author=users["u1"]) |
| 92 | + r_get = auth_client.get(reverse("tasks:delete", args=[t.pk])) |
117 | 93 | assert r_get.status_code == 200 |
118 | | - r_post = c.post(url) |
| 94 | + r_post = auth_client.post(reverse("tasks:delete", args=[t.pk])) |
119 | 95 | assert r_post.status_code in (302, 301) |
120 | | - assert not User.objects.filter(pk=users["bob"].pk).exists() |
121 | | - |
122 | | - |
123 | | -@pytest.mark.django_db |
124 | | -def test_user_cannot_delete_other(auth_client, users): |
125 | | - url = reverse("delete", args=[users["bob"].pk], current_app="users") |
126 | | - r = auth_client.post(url) |
127 | | - assert r.status_code in (302, 403, 404) |
128 | | - assert User.objects.filter(pk=users["bob"].pk).exists() |
| 96 | + assert not Task.objects.filter(pk=t.pk).exists() |
129 | 97 |
|
130 | 98 |
|
131 | | -@pytest.mark.django_db |
132 | 99 | def test_only_author_can_delete(auth_client, users, status_new): |
133 | 100 | t = Task.objects.create( |
134 | | - name="Чужая задача", |
135 | | - description="...", |
136 | | - status=status_new, |
137 | | - author=users["bob"], |
| 101 | + name="Чужая задача", description="...", |
| 102 | + status=status_new, author=users["u2"] |
138 | 103 | ) |
139 | 104 | r = auth_client.post(reverse("tasks:delete", args=[t.pk])) |
140 | 105 | assert r.status_code in (302, 301) |
141 | 106 | assert Task.objects.filter(pk=t.pk).exists() |
142 | 107 |
|
143 | 108 | c = Client() |
144 | | - c.login(username="bob", password=users["password"]) |
| 109 | + c.login(username="user2", password=users["pwd"]) |
145 | 110 | r2 = c.post(reverse("tasks:delete", args=[t.pk])) |
146 | 111 | assert r2.status_code in (302, 301) |
147 | 112 | assert not Task.objects.filter(pk=t.pk).exists() |
148 | | - |
149 | | - |
150 | | -@pytest.mark.django_db |
151 | | -def test_user_with_tasks_cannot_be_deleted(users, status_new): |
152 | | - Task.objects.create( |
153 | | - name="Тестовая", |
154 | | - description="Проверка", |
155 | | - status=status_new, |
156 | | - author=users["bob"], |
157 | | - ) |
158 | | - |
159 | | - c = Client() |
160 | | - c.login(username="bob", password=users["password"]) |
161 | | - url = reverse("delete", args=[users["bob"].pk], current_app="users") |
162 | | - r = c.post(url) |
163 | | - assert r.status_code in (302, 301) |
164 | | - assert User.objects.filter(pk=users["bob"].pk).exists() |
0 commit comments