Force login not working with fixtures (Django TestCase)

I'm populating my test db via a fixture, and everything loads fine. However, I'm unable to get either login or force_login to work. User is also in the fixture.

When I try to test the first view, it redirects to the login page.

class TestUnauthUser(TestCase):

    fixtures = ['project.json']

    @classmethod
    def setUpTestData(cls):
        cls.client = Client()
        # Get User and Login
        cls.unauth_user = User.objects.get(username='unauth_user')
        print(cls.unauth_user.pk)
        #cls.login = cls.client.login(username=cls.unauth_user.username, password=cls.unauth_user.password)
        cls.client.force_login(cls.unauth_user)

        # Get Project
        cls.project = Project.objects.get(slug='test-project')
        cls.slug_dict = {'slug': cls.project.slug}

        # Get Task
        cls.task = Task.objects.get(slug='test-task')

    def test_login(self):
        self.assertTrue(self.unauth_user.login)

    def test_project_view(self):
        # Project Main
        response = self.client.get(reverse('customerportal:project', kwargs=self.slug_dict))
        self.assertEqual(response.status_code, 403)

I'm able to verify that I have the correct user object with: print(cls.unauth_user.pk). So the User exists and is being obtained. But, it's still not logging-in successfully.

I found the problem. force_login() must be run prior to every test. So doing the following solves the issue:

def setUp(self):
    self.client.force_login(self.unauth_user)

However, this seems to run contrary to the purpose of setUpTestData. It was my understanding that anything set under setUpTestData is supposed to last for the duration of the class. So I'm unsure as to why force_login must be run repeatedly even when set from there. If anyone could provide further context that would be highly appreciated.

Back to Top