Итак, я сделал это маленькое приложение, где у пользователей есть страница учетной записи, где они могут видеть и обновлять свои собственные данные.
Сейчас я пишу несколько тестов для DetailView и UpdateView. Я хотел бы убедиться, что зарегистрированный пользователь действительно является владельцем данных пользователя.
Я создал базу тестов с разными пользователями и добавил три теста.
- Проверьте, вошел ли пользователь в систему
- Когда пользователь входит в систему, получает ли он правильный шаблон
- Когда пользователь вошел в систему, он видит только свои собственные данные
Проблема в последнем тесте, я попытался получить зарегистрированного пользователя и сравнить его с текущими данными пользователя, но это не работает. Есть идеи?
Редактировать: теперь тест проходит успешно, поэтому пользовательские данные принадлежат зарегистрированному пользователю.
Однако это не похоже на действительный метод тестирования. Несмотря на то, что пользователь соответствует владельцу сведений, я ищу способ проверить, сможет ли пользователь получить доступ к данным другого лица.
Раньше я использовал идентификатор пользователя в URL-адресе;
urls.py
path('account/<int:pk>/', views.AccountDetailView.as_view(), name='account_detail'),
Таким образом, кто-то сможет редактировать urlpath и получить доступ к другим данным, если он не был добавлен в LoginRequiredMixin.
Используя get_object (self) :, это больше невозможно, каков наилучший способ проверить эту возможность?
views.py
class AccountDetailView(LoginRequiredMixin, DetailView):
model = User
template_name = 'account.html'
'''
Retrieve user id from "self.request.user" instead of retrieving the user_id
from the URL. This way we can eliminate the user id in the URL.
'''
def get_object(self):
return self.request.user
test_views.py
class LoggedInTestCase(TestCase):
'''
Setup LoginInTestCase
'''
def setUp(self):
guest = User.objects.create_user(username='john.doe', email='john@doe.com', password='1234')
guest_other = User.objects.create_user(username='david.doe', email='david@doe.com', password='5678')
class AccountDetailViewTests(LoggedInTestCase):
'''
Test the UserDetailView which shows the user details
'''
def test_login_required_redirection(self):
'''
Test if only logged in users can view the user detail page
'''
self.url = reverse('account_detail')
login_url = reverse('account_login')
response = self.client.get(self.url)
self.assertRedirects(response, '{login_url}?next={url}'.format(login_url=login_url, url=self.url))
def test_logged_in_uses_correct_template(self):
'''
Test if logged in user gets to see the correct template
'''
login = self.client.login(username='john.doe', password='1234')
response = self.client.get(reverse('account_detail'))
# Check if our guest is logged in
self.assertEqual(str(response.context['user']), 'john.doe')
# Check for response "succes"
self.assertEqual(response.status_code, 200)
# Check if we get the correct template
self.assertTemplateUsed(response, 'account.html')
def test_accountdetails_belong_to_logged_in_user(self):
'''
Test if logged in user can only see the details that belong to him
'''
login = self.client.login(username='john.doe', password='1234')
response = self.client.get(reverse('account_detail'))
# Check if our guest is logged in matches the
user = User.objects.get(username='john.doe') #edited
self.assertEqual(response.context['user'], user)
# Check for response "success"
self.assertEqual(response.status_code, 200)