Skip to content

Commit d465b1f

Browse files
committed
tests migrated to apps folders
1 parent 5d05231 commit d465b1f

File tree

10 files changed

+434
-497
lines changed

10 files changed

+434
-497
lines changed

task_manager/labels/tests.py

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,73 @@
1+
import pytest
2+
from django.urls import reverse
13

2-
# Create your tests here.
4+
from task_manager.labels.models import Label
5+
from task_manager.tasks.models import Task, Status
6+
pytestmark = pytest.mark.django_db
7+
8+
9+
@pytest.mark.django_db
10+
def test_labels_list_requires_login(client):
11+
url = reverse("labels:index")
12+
resp = client.get(url)
13+
assert resp.status_code == 302
14+
assert reverse("login") in resp["Location"]
15+
16+
17+
@pytest.mark.django_db
18+
def test_label_create_requires_login(client):
19+
url = reverse("labels:create")
20+
resp = client.post(url, {"name": "bug"})
21+
assert resp.status_code == 302
22+
assert reverse("login") in resp["Location"]
23+
assert not Label.objects.filter(name="bug").exists()
24+
25+
26+
@pytest.mark.django_db
27+
def test_label_create_ok(client, django_user_model):
28+
django_user_model.objects.create_user(username="u", password="p")
29+
assert client.login(username="u", password="p")
30+
url = reverse("labels:create")
31+
resp = client.post(url, {"name": "bug"})
32+
assert resp.status_code == 302
33+
obj = Label.objects.get(name="bug")
34+
assert obj.name == "bug"
35+
36+
37+
@pytest.mark.django_db
38+
def test_label_update_ok(client, django_user_model):
39+
django_user_model.objects.create_user(username="u", password="p")
40+
assert client.login(username="u", password="p")
41+
label = Label.objects.create(name="old")
42+
url = reverse("labels:update", args=[label.pk])
43+
resp = client.post(url, {"name": "new"})
44+
assert resp.status_code == 302
45+
label.refresh_from_db()
46+
assert label.name == "new"
47+
48+
49+
@pytest.mark.django_db
50+
def test_label_delete_blocked_when_in_use(client, django_user_model):
51+
user = django_user_model.objects.create_user(username="u", password="p")
52+
assert client.login(username="u", password="p")
53+
label = Label.objects.create(name="bug")
54+
status = Status.objects.create(name="open")
55+
task = Task.objects.create(name="t1", author=user, status=status)
56+
task.labels.add(label)
57+
url = reverse("labels:delete", args=[label.pk])
58+
resp_get = client.get(url)
59+
assert resp_get.status_code in (200, 302)
60+
resp_post = client.post(url)
61+
assert resp_post.status_code == 302
62+
assert Label.objects.filter(pk=label.pk).exists()
63+
64+
65+
@pytest.mark.django_db
66+
def test_label_delete_when_unused_ok(client, django_user_model):
67+
django_user_model.objects.create_user(username="u", password="p")
68+
assert client.login(username="u", password="p")
69+
label = Label.objects.create(name="orphan")
70+
url = reverse("labels:delete", args=[label.pk])
71+
resp = client.post(url)
72+
assert resp.status_code == 302
73+
assert not Label.objects.filter(pk=label.pk).exists()

task_manager/statuses/tests.py

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,88 @@
1+
from django.db.models import ProtectedError
2+
from django.test import Client
13

2-
# Create your tests here.
4+
from task_manager.statuses.models import Status
5+
from task_manager.tasks.models import Task
6+
import pytest
7+
from django.contrib.auth import get_user_model
8+
from django.urls import reverse
9+
pytestmark = pytest.mark.django_db
10+
11+
User = get_user_model()
12+
13+
14+
@pytest.fixture
15+
def user(db):
16+
return User.objects.create_user(username="u", password="p12345678")
17+
18+
19+
@pytest.fixture
20+
def auth_client(user):
21+
c = Client()
22+
c.login(username="u", password="p12345678")
23+
return c
24+
25+
26+
@pytest.mark.django_db
27+
def test_login_required(client):
28+
r1 = client.get(reverse("statuses:index"))
29+
r2 = client.get(reverse("statuses:create"))
30+
assert r1.status_code in (302, 301)
31+
assert r2.status_code in (302, 301)
32+
assert "login" in r1.url
33+
assert "login" in r2.url
34+
35+
36+
@pytest.mark.django_db
37+
def test_list(auth_client):
38+
Status.objects.create(name="новый")
39+
Status.objects.create(name="в работе")
40+
resp = auth_client.get(reverse("statuses:index"))
41+
assert resp.status_code == 200
42+
html = resp.content.decode()
43+
assert "новый" in html
44+
assert "в работе" in html
45+
46+
47+
@pytest.mark.django_db
48+
def test_create(auth_client):
49+
resp = auth_client.post(reverse("statuses:create"),
50+
data={"name": "на тестировании"})
51+
assert resp.status_code in (302, 301)
52+
assert Status.objects.filter(name="на тестировании").exists()
53+
54+
55+
@pytest.mark.django_db
56+
def test_update(auth_client):
57+
st = Status.objects.create(name="черновик")
58+
resp = auth_client.post(reverse("statuses:update", args=[st.pk]),
59+
data={"name": "завершён"})
60+
assert resp.status_code in (302, 301)
61+
st.refresh_from_db()
62+
assert st.name == "завершён"
63+
64+
65+
@pytest.mark.django_db
66+
def test_delete(auth_client):
67+
st = Status.objects.create(name="временный")
68+
get_resp = auth_client.get(reverse("statuses:delete", args=[st.pk]))
69+
assert get_resp.status_code == 200
70+
post_resp = auth_client.post(reverse("statuses:delete", args=[st.pk]))
71+
assert post_resp.status_code in (302, 301)
72+
assert not Status.objects.filter(pk=st.pk).exists()
73+
74+
75+
@pytest.mark.django_db
76+
def test_cannot_delete_status_in_use(django_user_model):
77+
user = (django_user_model.objects.
78+
create_user(username="alice", password="p123"))
79+
status = Status.objects.create(name="новый")
80+
Task.objects.create(
81+
name="Тестовая задача",
82+
description="Проверка связи",
83+
status=status,
84+
author=user,
85+
)
86+
87+
with pytest.raises(ProtectedError):
88+
status.delete()

task_manager/tasks/tests.py

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import pytest
2+
from django.test import Client
3+
from django.urls import reverse
4+
from django.contrib.auth import get_user_model
5+
6+
from task_manager.statuses.models import Status
7+
from task_manager.tasks.models import Task
8+
9+
User = get_user_model()
10+
pytestmark = pytest.mark.django_db
11+
12+
13+
@pytest.fixture
14+
def users(db):
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}
19+
20+
21+
@pytest.fixture
22+
def auth_client(users):
23+
c = Client()
24+
c.login(username="user1", password=users["pwd"])
25+
return c
26+
27+
28+
@pytest.fixture
29+
def status_new(db):
30+
return Status.objects.create(name="новый")
31+
32+
33+
def test_login_required(client):
34+
r = client.get(reverse("tasks:index"))
35+
assert r.status_code in (302, 301)
36+
37+
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
87+
88+
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]))
93+
assert r_get.status_code == 200
94+
r_post = auth_client.post(reverse("tasks:delete", args=[t.pk]))
95+
assert r_post.status_code in (302, 301)
96+
assert not Task.objects.filter(pk=t.pk).exists()
97+
98+
99+
def test_only_author_can_delete(auth_client, users, status_new):
100+
t = Task.objects.create(
101+
name="Чужая задача", description="...",
102+
status=status_new, author=users["u2"]
103+
)
104+
r = auth_client.post(reverse("tasks:delete", args=[t.pk]))
105+
assert r.status_code in (302, 301)
106+
assert Task.objects.filter(pk=t.pk).exists()
107+
108+
c = Client()
109+
c.login(username="user2", password=users["pwd"])
110+
r2 = c.post(reverse("tasks:delete", args=[t.pk]))
111+
assert r2.status_code in (302, 301)
112+
assert not Task.objects.filter(pk=t.pk).exists()

0 commit comments

Comments
 (0)