from http import HTTPStatus from django.contrib.auth import get_user_model from django.test import TestCase, Client from django.urls import reverse from notes.models import Note class TestRoutes(TestCase): @classmethod def setUpTestData(cls): cls.test_user1 = get_user_model().objects.create_user( username='testuser1', password='12345' ) cls.test_user2 = get_user_model().objects.create_user( username='testuser2', password='12345' ) cls.note1 = Note.objects.create( title="Test Note 1", text="Test Note Text", author=cls.test_user1 ) cls.note2 = Note.objects.create( title="Test Note 2", text="Test Note Text", author=cls.test_user2 ) cls.url_names_with_slug = [ 'notes:edit', 'notes:detail', 'notes:delete' ] cls.url_names_without_args = [ 'notes:list', 'notes:success', 'notes:add', 'notes:home' ] cls.auth_url_names = [ 'users:login', 'users:logout', 'users:signup' ] def setUp(self): self.client = Client() def test_urls_availability(self): users = [self.test_user1, self.test_user2, None] for user in users: if user is not None: self.client.login(username=user.username, password='12345') else: self.client.logout() for name in self.url_names_with_slug: with self.subTest(user=user, url=name): url = reverse(name, args=[self.note1.slug]) response = self.client.get(url) if user is self.test_user1 or ( user is None and name not in self.url_names_with_slug ): self.assertEqual(response.status_code, HTTPStatus.OK) elif user is self.test_user2: self.assertEqual( response.status_code, HTTPStatus.NOT_FOUND ) else: login_url = reverse('users:login') next_url = url redirect_url = f"{login_url}?next={next_url}" self.assertRedirects(response, redirect_url) for name in self.url_names_without_args: with self.subTest(user=user, url=name): url = reverse(name) response = self.client.get(url) if user is not None or name == 'notes:home': self.assertEqual(response.status_code, HTTPStatus.OK) else: login_url = reverse('users:login') next_url = url redirect_url = f"{login_url}?next={next_url}" self.assertRedirects(response, redirect_url) for name in self.auth_url_names: with self.subTest(user=user, url=name): url = reverse(name) response = self.client.get(url) self.assertEqual(response.status_code, HTTPStatus.OK)