django-esi 8.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. django_esi-8.1.0.dist-info/METADATA +93 -0
  2. django_esi-8.1.0.dist-info/RECORD +100 -0
  3. django_esi-8.1.0.dist-info/WHEEL +4 -0
  4. django_esi-8.1.0.dist-info/licenses/LICENSE +674 -0
  5. esi/__init__.py +7 -0
  6. esi/admin.py +42 -0
  7. esi/aiopenapi3/client.py +79 -0
  8. esi/aiopenapi3/plugins.py +224 -0
  9. esi/app_settings.py +112 -0
  10. esi/apps.py +11 -0
  11. esi/checks.py +56 -0
  12. esi/clients.py +657 -0
  13. esi/decorators.py +271 -0
  14. esi/errors.py +22 -0
  15. esi/exceptions.py +51 -0
  16. esi/helpers.py +63 -0
  17. esi/locale/cs_CZ/LC_MESSAGES/django.mo +0 -0
  18. esi/locale/cs_CZ/LC_MESSAGES/django.po +53 -0
  19. esi/locale/de/LC_MESSAGES/django.mo +0 -0
  20. esi/locale/de/LC_MESSAGES/django.po +58 -0
  21. esi/locale/en/LC_MESSAGES/django.mo +0 -0
  22. esi/locale/en/LC_MESSAGES/django.po +54 -0
  23. esi/locale/es/LC_MESSAGES/django.mo +0 -0
  24. esi/locale/es/LC_MESSAGES/django.po +59 -0
  25. esi/locale/fr_FR/LC_MESSAGES/django.mo +0 -0
  26. esi/locale/fr_FR/LC_MESSAGES/django.po +59 -0
  27. esi/locale/it_IT/LC_MESSAGES/django.mo +0 -0
  28. esi/locale/it_IT/LC_MESSAGES/django.po +59 -0
  29. esi/locale/ja/LC_MESSAGES/django.mo +0 -0
  30. esi/locale/ja/LC_MESSAGES/django.po +58 -0
  31. esi/locale/ko_KR/LC_MESSAGES/django.mo +0 -0
  32. esi/locale/ko_KR/LC_MESSAGES/django.po +58 -0
  33. esi/locale/nl_NL/LC_MESSAGES/django.mo +0 -0
  34. esi/locale/nl_NL/LC_MESSAGES/django.po +53 -0
  35. esi/locale/pl_PL/LC_MESSAGES/django.mo +0 -0
  36. esi/locale/pl_PL/LC_MESSAGES/django.po +53 -0
  37. esi/locale/ru/LC_MESSAGES/django.mo +0 -0
  38. esi/locale/ru/LC_MESSAGES/django.po +61 -0
  39. esi/locale/sk/LC_MESSAGES/django.mo +0 -0
  40. esi/locale/sk/LC_MESSAGES/django.po +55 -0
  41. esi/locale/uk/LC_MESSAGES/django.mo +0 -0
  42. esi/locale/uk/LC_MESSAGES/django.po +57 -0
  43. esi/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  44. esi/locale/zh_Hans/LC_MESSAGES/django.po +58 -0
  45. esi/management/commands/__init__.py +0 -0
  46. esi/management/commands/esi_clear_spec_cache.py +21 -0
  47. esi/management/commands/generate_esi_stubs.py +661 -0
  48. esi/management/commands/migrate_to_ssov2.py +188 -0
  49. esi/managers.py +303 -0
  50. esi/managers.pyi +85 -0
  51. esi/migrations/0001_initial.py +55 -0
  52. esi/migrations/0002_scopes_20161208.py +56 -0
  53. esi/migrations/0003_hide_tokens_from_admin_site.py +23 -0
  54. esi/migrations/0004_remove_unique_access_token.py +18 -0
  55. esi/migrations/0005_remove_token_length_limit.py +23 -0
  56. esi/migrations/0006_remove_url_length_limit.py +18 -0
  57. esi/migrations/0007_fix_mysql_8_migration.py +18 -0
  58. esi/migrations/0008_nullable_refresh_token.py +18 -0
  59. esi/migrations/0009_set_old_tokens_to_sso_v1.py +18 -0
  60. esi/migrations/0010_set_new_tokens_to_sso_v2.py +18 -0
  61. esi/migrations/0011_add_token_indices.py +28 -0
  62. esi/migrations/0012_fix_token_type_choices.py +18 -0
  63. esi/migrations/0013_squashed_0012_fix_token_type_choices.py +57 -0
  64. esi/migrations/__init__.py +0 -0
  65. esi/models.py +349 -0
  66. esi/openapi_clients.py +1225 -0
  67. esi/rate_limiting.py +107 -0
  68. esi/signals.py +21 -0
  69. esi/static/esi/img/EVE_SSO_Login_Buttons_Large_Black.png +0 -0
  70. esi/static/esi/img/EVE_SSO_Login_Buttons_Large_White.png +0 -0
  71. esi/static/esi/img/EVE_SSO_Login_Buttons_Small_Black.png +0 -0
  72. esi/static/esi/img/EVE_SSO_Login_Buttons_Small_White.png +0 -0
  73. esi/stubs.py +2 -0
  74. esi/stubs.pyi +6807 -0
  75. esi/tasks.py +78 -0
  76. esi/templates/esi/select_token.html +116 -0
  77. esi/templatetags/__init__.py +0 -0
  78. esi/templatetags/scope_tags.py +8 -0
  79. esi/tests/__init__.py +134 -0
  80. esi/tests/client_authed_pilot.py +63 -0
  81. esi/tests/client_public_pilot.py +53 -0
  82. esi/tests/factories.py +47 -0
  83. esi/tests/factories_2.py +60 -0
  84. esi/tests/jwt_factory.py +135 -0
  85. esi/tests/test_checks.py +48 -0
  86. esi/tests/test_clients.py +1019 -0
  87. esi/tests/test_decorators.py +578 -0
  88. esi/tests/test_management_command.py +307 -0
  89. esi/tests/test_managers.py +673 -0
  90. esi/tests/test_models.py +403 -0
  91. esi/tests/test_openapi.json +854 -0
  92. esi/tests/test_openapi.py +1017 -0
  93. esi/tests/test_swagger.json +489 -0
  94. esi/tests/test_swagger_full.json +51112 -0
  95. esi/tests/test_tasks.py +116 -0
  96. esi/tests/test_templatetags.py +22 -0
  97. esi/tests/test_views.py +331 -0
  98. esi/tests/threading_pilot.py +69 -0
  99. esi/urls.py +9 -0
  100. esi/views.py +129 -0
@@ -0,0 +1,307 @@
1
+ from unittest.mock import patch
2
+ from io import StringIO
3
+
4
+ from django.contrib.auth.models import User
5
+ from django.test import TestCase
6
+ from django.core.management import call_command as base_call_command
7
+
8
+ from . import _generate_token, _store_as_Token
9
+
10
+ from esi.errors import (
11
+ TokenInvalidError,
12
+ NotRefreshableTokenError
13
+ )
14
+
15
+ from oauthlib.oauth2.rfc6749.errors import InvalidGrantError, \
16
+ InvalidTokenError, \
17
+ InvalidClientIdError
18
+
19
+
20
+ @patch('esi.models.Token.delete')
21
+ @patch('requests_oauthlib.OAuth2Session.refresh_token')
22
+ @patch('esi.models.Token.refresh')
23
+ class TestSSOMigrations(TestCase):
24
+ """tests for SSOv1 to SSOv2 Migration command"""
25
+
26
+ def setUp(self):
27
+
28
+ character_id = 1001
29
+ character_name = 'Batman'
30
+
31
+ self.user = User.objects.create_user(
32
+ character_name,
33
+ 'abc@example.com',
34
+ 'password'
35
+ )
36
+ self.token_v1 = _store_as_Token(
37
+ _generate_token(
38
+ character_id=character_id,
39
+ character_name=character_name,
40
+ scopes=['esi-universe.read_structures.v1'],
41
+ sso_version=1
42
+ ),
43
+ self.user
44
+ )
45
+ self.token_v3 = _store_as_Token(
46
+ _generate_token(
47
+ character_id=character_id,
48
+ character_name=character_name,
49
+ scopes=['esi-universe.read_structures.v1'],
50
+ sso_version=1
51
+ ),
52
+ self.user
53
+ )
54
+ self.token_v4 = _store_as_Token(
55
+ _generate_token(
56
+ character_id=character_id,
57
+ character_name=character_name,
58
+ scopes=['esi-universe.read_structures.v1'],
59
+ sso_version=1
60
+ ),
61
+ self.user
62
+ )
63
+ self.token_v5 = _store_as_Token(
64
+ _generate_token(
65
+ character_id=character_id,
66
+ character_name=character_name,
67
+ scopes=['esi-universe.read_structures.v1'],
68
+ sso_version=1
69
+ ),
70
+ self.user
71
+ )
72
+ self.token_v2 = _store_as_Token(
73
+ _generate_token(
74
+ character_id=character_id,
75
+ character_name=character_name,
76
+ scopes=['publicdata']
77
+
78
+ ),
79
+ self.user
80
+ )
81
+
82
+ def call_command(self, *args, **kwargs):
83
+ std_out = StringIO()
84
+ std_err = StringIO()
85
+ base_call_command(
86
+ "migrate_to_ssov2",
87
+ *args,
88
+ stdout=std_out,
89
+ stderr=std_err,
90
+ **kwargs,
91
+ )
92
+ return (std_out.getvalue(), std_err.getvalue())
93
+
94
+ def test_ignore_sso_v1(
95
+ self, mock_v2_refresh, mock_v1_refresh, mock_delete
96
+ ):
97
+ mock_v1_refresh.return_value = {
98
+ 'access_token': 'access_token_2',
99
+ 'refresh_token': 'refresh_token_2'
100
+ }
101
+
102
+ self.call_command("--skip-v1-checks", "-n 1")
103
+
104
+ self.assertEqual(mock_v2_refresh.call_count, 1)
105
+ self.assertEqual(mock_v1_refresh.call_count, 0)
106
+ self.assertEqual(mock_delete.call_count, 0)
107
+
108
+ def test_normal_refresh(
109
+ self, mock_v2_refresh, mock_v1_refresh, mock_delete
110
+ ):
111
+
112
+ mock_v1_refresh.return_value = {
113
+ 'access_token': 'access_token_2',
114
+ 'refresh_token': 'refresh_token_2'
115
+ }
116
+ self.call_command("-n 1")
117
+
118
+ self.assertEqual(mock_v2_refresh.call_count, 1)
119
+ self.assertEqual(mock_v1_refresh.call_count, 1)
120
+ self.assertEqual(mock_delete.call_count, 0)
121
+
122
+ def test_normal_refresh_all(
123
+ self, mock_v2_refresh, mock_v1_refresh, mock_delete
124
+ ):
125
+
126
+ mock_v1_refresh.return_value = {
127
+ 'access_token': 'access_token_2',
128
+ 'refresh_token': 'refresh_token_2'
129
+ }
130
+ self.call_command()
131
+
132
+ self.assertEqual(mock_v2_refresh.call_count, 4)
133
+ self.assertEqual(mock_v1_refresh.call_count, 4)
134
+ self.assertEqual(mock_delete.call_count, 0)
135
+
136
+ def test_fail_v1_pre_refresh_ignore(
137
+ self, mock_v2_refresh, mock_v1_refresh, mock_delete
138
+ ):
139
+
140
+ mock_v1_refresh.side_effect = InvalidGrantError
141
+ self.call_command("-n 1")
142
+
143
+ self.assertEqual(mock_v2_refresh.call_count, 0)
144
+ self.assertEqual(mock_v1_refresh.call_count, 1)
145
+ self.assertEqual(mock_delete.call_count, 0)
146
+
147
+ def test_fail_v1_pre_refresh_delete_InvalidGrantError(
148
+ self, mock_v2_refresh, mock_v1_refresh, mock_delete
149
+ ):
150
+
151
+ mock_v1_refresh.side_effect = InvalidGrantError
152
+ self.call_command("--purge", "-n 1")
153
+
154
+ self.assertEqual(mock_v2_refresh.call_count, 0)
155
+ self.assertEqual(mock_v1_refresh.call_count, 1)
156
+ self.assertEqual(mock_delete.call_count, 1)
157
+
158
+ def test_fail_v1_pre_refresh_delete_InvalidTokenError(
159
+ self, mock_v2_refresh, mock_v1_refresh, mock_delete
160
+ ):
161
+
162
+ mock_v1_refresh.side_effect = InvalidTokenError
163
+ self.call_command("--purge", "-n 1")
164
+
165
+ self.assertEqual(mock_v2_refresh.call_count, 0)
166
+ self.assertEqual(mock_v1_refresh.call_count, 1)
167
+ self.assertEqual(mock_delete.call_count, 1)
168
+
169
+ def test_fail_v1_pre_refresh_delete_InvalidClientIdError(
170
+ self, mock_v2_refresh, mock_v1_refresh, mock_delete
171
+ ):
172
+
173
+ mock_v1_refresh.side_effect = InvalidClientIdError
174
+ self.call_command("--purge", "-n 1")
175
+
176
+ self.assertEqual(mock_v2_refresh.call_count, 0)
177
+ self.assertEqual(mock_v1_refresh.call_count, 1)
178
+ self.assertEqual(mock_delete.call_count, 1)
179
+
180
+ def test_fail_v1_pre_refresh_delete_Exception(
181
+ self, mock_v2_refresh, mock_v1_refresh, mock_delete
182
+ ):
183
+
184
+ mock_v1_refresh.side_effect = Exception
185
+ self.call_command("--purge", "-n 1")
186
+
187
+ self.assertEqual(mock_v2_refresh.call_count, 0)
188
+ self.assertEqual(mock_v1_refresh.call_count, 1)
189
+ self.assertEqual(mock_delete.call_count, 1)
190
+
191
+ def test_fail_v2_refresh_ignore(
192
+ self, mock_v2_refresh, mock_v1_refresh, mock_delete
193
+ ):
194
+
195
+ mock_v2_refresh.side_effect = TokenInvalidError
196
+ self.call_command("--purge", "--skip-v1-checks", "-n 1")
197
+
198
+ self.assertEqual(mock_v2_refresh.call_count, 1)
199
+ self.assertEqual(mock_v1_refresh.call_count, 0)
200
+ self.assertEqual(mock_delete.call_count, 1)
201
+
202
+ def test_fail_v2_refresh_delete(
203
+ self, mock_v2_refresh, mock_v1_refresh, mock_delete
204
+ ):
205
+
206
+ mock_v2_refresh.side_effect = TokenInvalidError
207
+ self.call_command("--purge", "--skip-v1-checks", "-n 1")
208
+
209
+ self.assertEqual(mock_v2_refresh.call_count, 1)
210
+ self.assertEqual(mock_v1_refresh.call_count, 0)
211
+ self.assertEqual(mock_delete.call_count, 1)
212
+
213
+ def test_v1_pass_v2_fail_v1_pass(
214
+ self, mock_v2_refresh, mock_v1_refresh, mock_delete
215
+ ):
216
+
217
+ mock_v1_refresh.return_value = {
218
+ 'access_token': 'access_token_2',
219
+ 'refresh_token': 'refresh_token_2'
220
+ }
221
+ mock_v2_refresh.side_effect = TokenInvalidError
222
+
223
+ self.call_command("--purge", "-n 1")
224
+
225
+ self.assertEqual(mock_v2_refresh.call_count, 1)
226
+ self.assertEqual(mock_v1_refresh.call_count, 2)
227
+ self.assertEqual(mock_delete.call_count, 0)
228
+
229
+ def test_v1_pass_v2_fail_v1_fail_ignore(
230
+ self, mock_v2_refresh, mock_v1_refresh, mock_delete
231
+ ):
232
+
233
+ mock_v1_refresh.side_effect = [{
234
+ 'access_token': 'access_token_2',
235
+ 'refresh_token': 'refresh_token_2'
236
+ }, InvalidGrantError]
237
+ mock_v2_refresh.side_effect = TokenInvalidError
238
+
239
+ self.call_command("-n 1")
240
+
241
+ self.assertEqual(mock_v2_refresh.call_count, 1)
242
+ self.assertEqual(mock_v1_refresh.call_count, 2)
243
+ self.assertEqual(mock_delete.call_count, 0)
244
+
245
+ def test_v1_pass_v2_fail_v1_fail_delete(
246
+ self, mock_v2_refresh, mock_v1_refresh, mock_delete
247
+ ):
248
+
249
+ mock_v1_refresh.side_effect = [{
250
+ 'access_token': 'access_token_2',
251
+ 'refresh_token': 'refresh_token_2'
252
+ }, InvalidGrantError]
253
+ mock_v2_refresh.side_effect = TokenInvalidError
254
+
255
+ self.call_command("--purge", "-n 1")
256
+
257
+ self.assertEqual(mock_v2_refresh.call_count, 1)
258
+ self.assertEqual(mock_v1_refresh.call_count, 2)
259
+ self.assertEqual(mock_delete.call_count, 1)
260
+
261
+ def test_v2_fail_non_refresh_delete(
262
+ self, mock_v2_refresh, mock_v1_refresh, mock_delete
263
+ ):
264
+
265
+ mock_v1_refresh.side_effect = [{
266
+ 'access_token': 'access_token_2',
267
+ 'refresh_token': 'refresh_token_2'
268
+ }]
269
+ mock_v2_refresh.side_effect = NotRefreshableTokenError
270
+
271
+ self.call_command("--purge", "-n 1")
272
+
273
+ self.assertEqual(mock_v2_refresh.call_count, 1)
274
+ self.assertEqual(mock_v1_refresh.call_count, 1)
275
+ self.assertEqual(mock_delete.call_count, 1)
276
+
277
+ def test_v2_fail_ignore(
278
+ self, mock_v2_refresh, mock_v1_refresh, mock_delete
279
+ ):
280
+
281
+ mock_v1_refresh.side_effect = [{
282
+ 'access_token': 'access_token_2',
283
+ 'refresh_token': 'refresh_token_2'
284
+ }]
285
+ mock_v2_refresh.side_effect = TokenInvalidError
286
+
287
+ self.call_command("--skip-v1-checks", "-n 1")
288
+
289
+ self.assertEqual(mock_v2_refresh.call_count, 1)
290
+ self.assertEqual(mock_v1_refresh.call_count, 0)
291
+ self.assertEqual(mock_delete.call_count, 0)
292
+
293
+ def test_v2_fail_non_refresh_ignore(
294
+ self, mock_v2_refresh, mock_v1_refresh, mock_delete
295
+ ):
296
+
297
+ mock_v1_refresh.side_effect = [{
298
+ 'access_token': 'access_token_2',
299
+ 'refresh_token': 'refresh_token_2'
300
+ }]
301
+ mock_v2_refresh.side_effect = NotRefreshableTokenError
302
+
303
+ self.call_command("-n 1")
304
+
305
+ self.assertEqual(mock_v2_refresh.call_count, 1)
306
+ self.assertEqual(mock_v1_refresh.call_count, 1)
307
+ self.assertEqual(mock_delete.call_count, 0)