Skip to content

Commit b0879c7

Browse files
committed
Speed up tests ~2x
1 parent 9b91d79 commit b0879c7

18 files changed

+235
-285
lines changed

tests/test_application_views.py

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,10 @@
1414

1515

1616
class BaseTest(TestCase):
17-
def setUp(self):
18-
self.foo_user = UserModel.objects.create_user("foo_user", "test@example.com", "123456")
19-
self.bar_user = UserModel.objects.create_user("bar_user", "dev@example.com", "123456")
20-
21-
def tearDown(self):
22-
self.foo_user.delete()
23-
self.bar_user.delete()
17+
@classmethod
18+
def setUpTestData(cls):
19+
cls.foo_user = UserModel.objects.create_user("foo_user", "test@example.com", "123456")
20+
cls.bar_user = UserModel.objects.create_user("bar_user", "dev@example.com", "123456")
2421

2522

2623
@pytest.mark.usefixtures("oauth2_settings")
@@ -67,29 +64,26 @@ def test_application_registration_user(self):
6764

6865

6966
class TestApplicationViews(BaseTest):
70-
def _create_application(self, name, user):
71-
app = Application.objects.create(
67+
@classmethod
68+
def _create_application(cls, name, user):
69+
return Application.objects.create(
7270
name=name,
7371
redirect_uris="http://example.com",
7472
post_logout_redirect_uris="http://other_example.com",
7573
client_type=Application.CLIENT_CONFIDENTIAL,
7674
authorization_grant_type=Application.GRANT_AUTHORIZATION_CODE,
7775
user=user,
7876
)
79-
return app
80-
81-
def setUp(self):
82-
super().setUp()
83-
self.app_foo_1 = self._create_application("app foo_user 1", self.foo_user)
84-
self.app_foo_2 = self._create_application("app foo_user 2", self.foo_user)
85-
self.app_foo_3 = self._create_application("app foo_user 3", self.foo_user)
8677

87-
self.app_bar_1 = self._create_application("app bar_user 1", self.bar_user)
88-
self.app_bar_2 = self._create_application("app bar_user 2", self.bar_user)
78+
@classmethod
79+
def setUpTestData(cls):
80+
super().setUpTestData()
81+
cls.app_foo_1 = cls._create_application("app foo_user 1", cls.foo_user)
82+
cls.app_foo_2 = cls._create_application("app foo_user 2", cls.foo_user)
83+
cls.app_foo_3 = cls._create_application("app foo_user 3", cls.foo_user)
8984

90-
def tearDown(self):
91-
super().tearDown()
92-
get_application_model().objects.all().delete()
85+
cls.app_bar_1 = cls._create_application("app bar_user 1", cls.bar_user)
86+
cls.app_bar_2 = cls._create_application("app bar_user 2", cls.bar_user)
9387

9488
def test_application_list(self):
9589
self.client.login(username="foo_user", password="123456")
@@ -132,8 +126,8 @@ def test_application_udpate(self):
132126
self.assertRedirects(response, reverse("oauth2_provider:detail", args=(self.app_foo_1.pk,)))
133127

134128
self.app_foo_1.refresh_from_db()
135-
self.assertEquals(self.app_foo_1.client_id, form_data["client_id"])
136-
self.assertEquals(self.app_foo_1.redirect_uris, form_data["redirect_uris"])
137-
self.assertEquals(self.app_foo_1.post_logout_redirect_uris, form_data["post_logout_redirect_uris"])
138-
self.assertEquals(self.app_foo_1.client_type, form_data["client_type"])
139-
self.assertEquals(self.app_foo_1.authorization_grant_type, form_data["authorization_grant_type"])
129+
self.assertEqual(self.app_foo_1.client_id, form_data["client_id"])
130+
self.assertEqual(self.app_foo_1.redirect_uris, form_data["redirect_uris"])
131+
self.assertEqual(self.app_foo_1.post_logout_redirect_uris, form_data["post_logout_redirect_uris"])
132+
self.assertEqual(self.app_foo_1.client_type, form_data["client_type"])
133+
self.assertEqual(self.app_foo_1.authorization_grant_type, form_data["authorization_grant_type"])

tests/test_auth_backends.py

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,20 @@ class BaseTest(TestCase):
2424
Base class for cases in this module
2525
"""
2626

27-
def setUp(self):
28-
self.user = UserModel.objects.create_user("user", "test@example.com", "123456")
29-
self.app = ApplicationModel.objects.create(
27+
factory = RequestFactory()
28+
29+
@classmethod
30+
def setUpTestData(cls):
31+
cls.user = UserModel.objects.create_user("user", "test@example.com", "123456")
32+
cls.app = ApplicationModel.objects.create(
3033
name="app",
3134
client_type=ApplicationModel.CLIENT_CONFIDENTIAL,
3235
authorization_grant_type=ApplicationModel.GRANT_CLIENT_CREDENTIALS,
33-
user=self.user,
36+
user=cls.user,
3437
)
35-
self.token = AccessTokenModel.objects.create(
36-
user=self.user, token="tokstr", application=self.app, expires=now() + timedelta(days=365)
38+
cls.token = AccessTokenModel.objects.create(
39+
user=cls.user, token="tokstr", application=cls.app, expires=now() + timedelta(days=365)
3740
)
38-
self.factory = RequestFactory()
39-
40-
def tearDown(self):
41-
self.user.delete()
42-
self.app.delete()
43-
self.token.delete()
4441

4542

4643
class TestOAuth2Backend(BaseTest):
@@ -103,10 +100,6 @@ def test_get_user(self):
103100
}
104101
)
105102
class TestOAuth2Middleware(BaseTest):
106-
def setUp(self):
107-
super().setUp()
108-
self.anon_user = AnonymousUser()
109-
110103
def dummy_get_response(self, request):
111104
return HttpResponse()
112105

@@ -131,7 +124,7 @@ def test_middleware_user_is_set(self):
131124
request.user = self.user
132125
m(request)
133126
self.assertIs(request.user, self.user)
134-
request.user = self.anon_user
127+
request.user = AnonymousUser()
135128
m(request)
136129
self.assertEqual(request.user.pk, self.user.pk)
137130

@@ -176,10 +169,6 @@ def test_middleware_response_header(self):
176169
}
177170
)
178171
class TestOAuth2ExtraTokenMiddleware(BaseTest):
179-
def setUp(self):
180-
super().setUp()
181-
self.anon_user = AnonymousUser()
182-
183172
def dummy_get_response(self, request):
184173
return HttpResponse()
185174

tests/test_authorization_code.py

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -43,29 +43,27 @@ def get(self, request, *args, **kwargs):
4343

4444
@pytest.mark.usefixtures("oauth2_settings")
4545
class BaseTest(TestCase):
46-
def setUp(self):
47-
self.factory = RequestFactory()
48-
self.test_user = UserModel.objects.create_user("test_user", "test@example.com", "123456")
49-
self.dev_user = UserModel.objects.create_user("dev_user", "dev@example.com", "123456")
46+
factory = RequestFactory()
5047

51-
self.oauth2_settings.ALLOWED_REDIRECT_URI_SCHEMES = ["http", "custom-scheme"]
52-
self.oauth2_settings.PKCE_REQUIRED = False
48+
@classmethod
49+
def setUpTestData(cls):
50+
cls.test_user = UserModel.objects.create_user("test_user", "test@example.com", "123456")
51+
cls.dev_user = UserModel.objects.create_user("dev_user", "dev@example.com", "123456")
5352

54-
self.application = Application.objects.create(
53+
cls.application = Application.objects.create(
5554
name="Test Application",
5655
redirect_uris=(
5756
"http://localhost http://example.com http://example.org custom-scheme://example.com"
5857
),
59-
user=self.dev_user,
58+
user=cls.dev_user,
6059
client_type=Application.CLIENT_CONFIDENTIAL,
6160
authorization_grant_type=Application.GRANT_AUTHORIZATION_CODE,
6261
client_secret=CLEARTEXT_SECRET,
6362
)
6463

65-
def tearDown(self):
66-
self.application.delete()
67-
self.test_user.delete()
68-
self.dev_user.delete()
64+
def setUp(self):
65+
self.oauth2_settings.ALLOWED_REDIRECT_URI_SCHEMES = ["http", "custom-scheme"]
66+
self.oauth2_settings.PKCE_REQUIRED = False
6967

7068

7169
class TestRegressionIssue315(BaseTest):
@@ -1559,10 +1557,11 @@ def test_code_exchange_succeed_when_redirect_uri_match_with_multiple_query_param
15591557

15601558
@pytest.mark.oauth2_settings(presets.OIDC_SETTINGS_RW)
15611559
class TestOIDCAuthorizationCodeTokenView(BaseAuthorizationCodeTokenView):
1562-
def setUp(self):
1563-
super().setUp()
1564-
self.application.algorithm = Application.RS256_ALGORITHM
1565-
self.application.save()
1560+
@classmethod
1561+
def setUpTestData(cls):
1562+
super().setUpTestData()
1563+
cls.application.algorithm = Application.RS256_ALGORITHM
1564+
cls.application.save()
15661565

15671566
def test_id_token_public(self):
15681567
"""
@@ -1636,11 +1635,15 @@ def test_id_token_code_exchange_succeed_when_redirect_uri_match_with_multiple_qu
16361635

16371636
@pytest.mark.oauth2_settings(presets.OIDC_SETTINGS_RW)
16381637
class TestOIDCAuthorizationCodeHSAlgorithm(BaseAuthorizationCodeTokenView):
1638+
@classmethod
1639+
def setUpTestData(cls):
1640+
super().setUpTestData()
1641+
cls.application.algorithm = Application.HS256_ALGORITHM
1642+
cls.application.save()
1643+
16391644
def setUp(self):
16401645
super().setUp()
16411646
self.oauth2_settings.OIDC_RSA_PRIVATE_KEY = None
1642-
self.application.algorithm = Application.HS256_ALGORITHM
1643-
self.application.save()
16441647

16451648
def test_id_token(self):
16461649
"""
@@ -1732,10 +1735,11 @@ def test_resource_access_deny(self):
17321735

17331736
@pytest.mark.oauth2_settings(presets.OIDC_SETTINGS_RW)
17341737
class TestOIDCAuthorizationCodeProtectedResource(BaseTest):
1735-
def setUp(self):
1736-
super().setUp()
1737-
self.application.algorithm = Application.RS256_ALGORITHM
1738-
self.application.save()
1738+
@classmethod
1739+
def setUpTestData(cls):
1740+
super().setUpTestData()
1741+
cls.application.algorithm = Application.RS256_ALGORITHM
1742+
cls.application.save()
17391743

17401744
def test_id_token_resource_access_allowed(self):
17411745
self.client.login(username="test_user", password="123456")

tests/test_client_credential.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,21 @@ def get(self, request, *args, **kwargs):
3535
@pytest.mark.usefixtures("oauth2_settings")
3636
@pytest.mark.oauth2_settings(presets.DEFAULT_SCOPES_RW)
3737
class BaseTest(TestCase):
38-
def setUp(self):
39-
self.factory = RequestFactory()
40-
self.test_user = UserModel.objects.create_user("test_user", "test@example.com", "123456")
41-
self.dev_user = UserModel.objects.create_user("dev_user", "dev@example.com", "123456")
38+
factory = RequestFactory()
4239

43-
self.application = Application.objects.create(
40+
@classmethod
41+
def setUpTestData(cls):
42+
cls.test_user = UserModel.objects.create_user("test_user", "test@example.com", "123456")
43+
cls.dev_user = UserModel.objects.create_user("dev_user", "dev@example.com", "123456")
44+
45+
cls.application = Application.objects.create(
4446
name="test_client_credentials_app",
45-
user=self.dev_user,
47+
user=cls.dev_user,
4648
client_type=Application.CLIENT_PUBLIC,
4749
authorization_grant_type=Application.GRANT_CLIENT_CREDENTIALS,
4850
client_secret=CLEARTEXT_SECRET,
4951
)
5052

51-
def tearDown(self):
52-
self.application.delete()
53-
self.test_user.delete()
54-
self.dev_user.delete()
55-
5653

5754
class TestClientCredential(BaseTest):
5855
def test_client_credential_access_allowed(self):
@@ -98,7 +95,7 @@ def test_client_credential_user_is_none_on_access_token(self):
9895
self.assertIsNone(access_token.user)
9996

10097

101-
class TestView(OAuthLibMixin, View):
98+
class ExampleView(OAuthLibMixin, View):
10299
server_class = BackendApplicationServer
103100
validator_class = OAuth2Validator
104101
oauthlib_backend_class = OAuthLibCore
@@ -132,7 +129,7 @@ def test_extended_request(self):
132129
request = self.request_factory.get("/fake-req", **auth_headers)
133130
request.user = "fake"
134131

135-
test_view = TestView()
132+
test_view = ExampleView()
136133
self.assertIsInstance(test_view.get_server(), BackendApplicationServer)
137134

138135
valid, r = test_view.verify_request(request)
@@ -145,7 +142,7 @@ def test_raises_error_with_invalid_hex_in_query_params(self):
145142
request = self.request_factory.get("/fake-req?auth_token=%%7A")
146143

147144
with pytest.raises(SuspiciousOperation):
148-
TestView().verify_request(request)
145+
ExampleView().verify_request(request)
149146

150147
@patch("oauth2_provider.views.mixins.OAuthLibMixin.get_oauthlib_core")
151148
def test_reraises_value_errors_as_is(self, patched_core):
@@ -154,7 +151,7 @@ def test_reraises_value_errors_as_is(self, patched_core):
154151
request = self.request_factory.get("/fake-req")
155152

156153
with pytest.raises(ValueError):
157-
TestView().verify_request(request)
154+
ExampleView().verify_request(request)
158155

159156

160157
class TestClientResourcePasswordBased(BaseTest):

tests/test_decorators.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,24 @@
1414

1515

1616
class TestProtectedResourceDecorator(TestCase):
17-
@classmethod
18-
def setUpClass(cls):
19-
cls.request_factory = RequestFactory()
20-
super().setUpClass()
17+
request_factory = RequestFactory()
2118

22-
def setUp(self):
23-
self.user = UserModel.objects.create_user("test_user", "test@example.com", "123456")
24-
self.application = Application.objects.create(
19+
@classmethod
20+
def setUpTestData(cls):
21+
cls.user = UserModel.objects.create_user("test_user", "test@example.com", "123456")
22+
cls.application = Application.objects.create(
2523
name="test_client_credentials_app",
26-
user=self.user,
24+
user=cls.user,
2725
client_type=Application.CLIENT_PUBLIC,
2826
authorization_grant_type=Application.GRANT_CLIENT_CREDENTIALS,
2927
)
3028

31-
self.access_token = AccessToken.objects.create(
32-
user=self.user,
29+
cls.access_token = AccessToken.objects.create(
30+
user=cls.user,
3331
scope="read write",
3432
expires=timezone.now() + timedelta(seconds=300),
3533
token="secret-access-token-key",
36-
application=self.application,
34+
application=cls.application,
3735
)
3836

3937
def test_access_denied(self):

tests/test_hybrid.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,30 +48,29 @@ def get(self, request, *args, **kwargs):
4848

4949
@pytest.mark.usefixtures("oauth2_settings")
5050
class BaseTest(TestCase):
51-
def setUp(self):
52-
self.factory = RequestFactory()
53-
self.hy_test_user = UserModel.objects.create_user("hy_test_user", "test_hy@example.com", "123456")
54-
self.hy_dev_user = UserModel.objects.create_user("hy_dev_user", "dev_hy@example.com", "123456")
55-
self.oauth2_settings.PKCE_REQUIRED = False
56-
self.oauth2_settings.ALLOWED_REDIRECT_URI_SCHEMES = ["http", "custom-scheme"]
51+
factory = RequestFactory()
52+
53+
@classmethod
54+
def setUpTestData(cls):
55+
cls.hy_test_user = UserModel.objects.create_user("hy_test_user", "test_hy@example.com", "123456")
56+
cls.hy_dev_user = UserModel.objects.create_user("hy_dev_user", "dev_hy@example.com", "123456")
5757

58-
self.application = Application(
58+
cls.application = Application(
5959
name="Hybrid Test Application",
6060
redirect_uris=(
6161
"http://localhost http://example.com http://example.org custom-scheme://example.com"
6262
),
63-
user=self.hy_dev_user,
63+
user=cls.hy_dev_user,
6464
client_type=Application.CLIENT_CONFIDENTIAL,
6565
authorization_grant_type=Application.GRANT_OPENID_HYBRID,
6666
algorithm=Application.RS256_ALGORITHM,
6767
client_secret=CLEARTEXT_SECRET,
6868
)
69-
self.application.save()
69+
cls.application.save()
7070

71-
def tearDown(self):
72-
self.application.delete()
73-
self.hy_test_user.delete()
74-
self.hy_dev_user.delete()
71+
def setUp(self):
72+
self.oauth2_settings.PKCE_REQUIRED = False
73+
self.oauth2_settings.ALLOWED_REDIRECT_URI_SCHEMES = ["http", "custom-scheme"]
7574

7675

7776
@pytest.mark.oauth2_settings(presets.OIDC_SETTINGS_RW)

0 commit comments

Comments
 (0)