Django testing - тестирование, если вошедший в систему пользователь является владельцем userdetails - PullRequest
0 голосов
/ 27 мая 2019

Итак, я сделал это маленькое приложение, где у пользователей есть страница учетной записи, где они могут видеть и обновлять свои собственные данные.

Сейчас я пишу несколько тестов для 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)

1 Ответ

1 голос
/ 27 мая 2019

Метод client.login возвращает True, если вход выполнен успешно, пользователь не возвращается.

Вы можете выбрать пользователя из базы данных.

user = User.objects.get(username='john.doe')
self.assertEqual(response.context['user'], user)

Или сравните строку, как в другом тесте.

self.assertEqual(str(response.context['user']), 'john.doe')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...