Exploring Unittest, can't figure out why these tests ignore custom clients prepared in setUp() method and use the built-in self.client
(== self.guest_client
). Thus only the last test for anonimous user works properly. The same setUp() method works fine in other test files, as well as url constants.
test file:
User = get_user_model()
NOTE_SLUG = 'note-slug'
HOME_URL = reverse('notes:home')
LOGIN_URL = reverse("users:login")
SIGNUP_URL = reverse('users:signup')
LOGOUT_URL = reverse('users:logout')
NOTES_LIST_URL = reverse('notes:list')
ADD_NOTE_URL = reverse('notes:add')
NOTE_CONFIRM = reverse('notes:success')
NOTE_URL = reverse('notes:detail', args=(NOTE_SLUG,))
NOTE_EDIT_URL = reverse('notes:edit', args=(NOTE_SLUG,))
NOTE_DELETE_URL = reverse('notes:delete', args=(NOTE_SLUG,))
class TestRoutes(TestCase):
@classmethod
def setUpTestData(cls):
cls.url_list = (
HOME_URL,
LOGIN_URL,
SIGNUP_URL,
LOGOUT_URL,
NOTES_LIST_URL,
ADD_NOTE_URL,
NOTE_CONFIRM,
NOTE_URL,
NOTE_EDIT_URL,
NOTE_DELETE_URL
)
cls.author = User.objects.create(username='author')
cls.note = Note.objects.create(
title='Заголовок',
text='Текст заметки',
slug='note-slug',
author=cls.author,
)
def setUp(self):
self.guest_client = Client()
self.reader = User.objects.create(username='reader')
self.authorized_client = Client()
self.authorized_client.force_login(self.reader)
self.author_client = Client()
self.author_client.force_login(self.author)
def test_pages_for_author(self):
for url in self.url_list:
with self.subTest(url=url):
response = self.author_client.get(url)
self.assertEqual(response.status_code, HTTPStatus.OK)
def test_pages_for_auth_reader(self):
for url in self.url_list[0:7]:
with self.subTest(url=url):
response = self.authorized_client.get(url)
self.assertEqual(response.status_code, HTTPStatus.OK)
for url in self.url_list[7:10]:
with self.subTest(url=url):
response = self.authorized_client.get(url)
self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND)
def test_pages_for_anonymous(self):
for url in self.url_list[0:4]:
with self.subTest(url=url):
response = self.guest_client.get(url)
self.assertEqual(response.status_code, HTTPStatus.OK)
for url in self.url_list[4:10]:
with self.subTest(url=url):
redirect_url = f'{LOGIN_URL}?next={url}'
self.assertRedirects(self.guest_client.get(url), redirect_url)