aa-ledger 1.0.3__py3-none-any.whl → 2.0.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 (280) hide show
  1. {aa_ledger-1.0.3.dist-info → aa_ledger-2.0.0.dist-info}/METADATA +6 -6
  2. aa_ledger-2.0.0.dist-info/RECORD +267 -0
  3. {aa_ledger-1.0.3.dist-info → aa_ledger-2.0.0.dist-info}/WHEEL +1 -1
  4. ledger/__init__.py +2 -2
  5. ledger/admin.py +23 -18
  6. ledger/api/__init__.py +23 -7
  7. ledger/api/{ledger/admin.py → admin.py} +25 -31
  8. ledger/api/alliance.py +755 -0
  9. ledger/api/character.py +786 -0
  10. ledger/api/corporation.py +1141 -0
  11. ledger/api/{helpers.py → helpers/core.py} +33 -33
  12. ledger/api/helpers/icons.py +372 -0
  13. ledger/api/helpers/planetary_helper.py +354 -0
  14. ledger/api/planetary.py +354 -0
  15. ledger/api/schema.py +240 -15
  16. ledger/app_settings.py +18 -26
  17. ledger/auth_hooks.py +2 -2
  18. ledger/constants.py +50 -177
  19. ledger/decorators.py +2 -46
  20. ledger/forms.py +133 -39
  21. ledger/helpers/billboard.py +194 -144
  22. ledger/helpers/cache.py +105 -0
  23. ledger/helpers/discord.py +2 -4
  24. ledger/helpers/eveonline.py +160 -0
  25. ledger/helpers/ledger_data.py +23 -0
  26. ledger/helpers/ref_type.py +53 -78
  27. ledger/locale/cs_CZ/LC_MESSAGES/django.mo +0 -0
  28. ledger/locale/cs_CZ/LC_MESSAGES/django.po +349 -193
  29. ledger/locale/de/LC_MESSAGES/django.mo +0 -0
  30. ledger/locale/de/LC_MESSAGES/django.po +528 -379
  31. ledger/locale/django.pot +717 -553
  32. ledger/locale/es/LC_MESSAGES/django.mo +0 -0
  33. ledger/locale/es/LC_MESSAGES/django.po +349 -194
  34. ledger/locale/fr_FR/LC_MESSAGES/django.mo +0 -0
  35. ledger/locale/fr_FR/LC_MESSAGES/django.po +349 -193
  36. ledger/locale/it_IT/LC_MESSAGES/django.mo +0 -0
  37. ledger/locale/it_IT/LC_MESSAGES/django.po +349 -193
  38. ledger/locale/ja/LC_MESSAGES/django.mo +0 -0
  39. ledger/locale/ja/LC_MESSAGES/django.po +348 -193
  40. ledger/locale/ko_KR/LC_MESSAGES/django.mo +0 -0
  41. ledger/locale/ko_KR/LC_MESSAGES/django.po +349 -193
  42. ledger/locale/nl_NL/LC_MESSAGES/django.mo +0 -0
  43. ledger/locale/nl_NL/LC_MESSAGES/django.po +349 -193
  44. ledger/locale/pl_PL/LC_MESSAGES/django.mo +0 -0
  45. ledger/locale/pl_PL/LC_MESSAGES/django.po +350 -193
  46. ledger/locale/ru/LC_MESSAGES/django.mo +0 -0
  47. ledger/locale/ru/LC_MESSAGES/django.po +348 -193
  48. ledger/locale/sk/LC_MESSAGES/django.mo +0 -0
  49. ledger/locale/sk/LC_MESSAGES/django.po +348 -193
  50. ledger/locale/uk/LC_MESSAGES/django.mo +0 -0
  51. ledger/locale/uk/LC_MESSAGES/django.po +348 -193
  52. ledger/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  53. ledger/locale/zh_Hans/LC_MESSAGES/django.po +348 -193
  54. ledger/managers/character_audit_manager.py +28 -20
  55. ledger/managers/character_journal_manager.py +187 -358
  56. ledger/managers/character_mining_manager.py +64 -30
  57. ledger/managers/character_planetary_manager.py +185 -138
  58. ledger/managers/corporation_audit_manager.py +36 -27
  59. ledger/managers/corporation_journal_manager.py +94 -57
  60. ledger/managers/general_manager.py +12 -8
  61. ledger/migrations/0018_remove_characterplanet_ledger_char_planet__58a5b6_idx_and_more.py +44 -0
  62. ledger/migrations/0019_rename_characteraudit_characterowner_and_more.py +48 -0
  63. ledger/models/__init__.py +5 -11
  64. ledger/models/characteraudit.py +101 -109
  65. ledger/models/corporationaudit.py +94 -49
  66. ledger/models/general.py +105 -211
  67. ledger/models/helpers/update_manager.py +302 -0
  68. ledger/models/planetary.py +60 -205
  69. ledger/providers.py +101 -0
  70. ledger/static/ledger/css/{ledger.css → aa-ledger.css} +54 -28
  71. ledger/static/ledger/js/aa-ledger.js +124 -0
  72. ledger/static/ledger/js/charts.js +25 -1
  73. ledger/static/ledger/js/view-alliance-ledger.js +383 -0
  74. ledger/static/ledger/js/view-character-ledger.js +388 -0
  75. ledger/static/ledger/js/view-corporation-ledger.js +402 -0
  76. ledger/static/ledger/js/view-planetary.js +492 -0
  77. ledger/static/ledger/libs/amCharts/5.14.4/js/flow.js +2 -0
  78. ledger/static/ledger/libs/amCharts/5.14.4/js/index.js +2 -0
  79. ledger/static/ledger/libs/amCharts/5.14.4/js/percent.js +2 -0
  80. ledger/static/ledger/libs/amCharts/5.14.4/js/themes/Animated.js +2 -0
  81. ledger/static/ledger/libs/amCharts/5.14.4/js/themes/Dark.js +2 -0
  82. ledger/static/ledger/libs/amCharts/5.14.4/js/xy.js +2 -0
  83. ledger/static/ledger/libs/datatables/2.3.5/css/dataTables.bootstrap5.css +610 -0
  84. ledger/static/ledger/libs/datatables/2.3.5/js/dataTables.bootstrap5.js +122 -0
  85. ledger/static/ledger/libs/datatables/2.3.5/js/dataTables.js +14127 -0
  86. ledger/static/ledger/libs/datatables/Extensions/ColumnControl/1.1.1/css/columnControl.bootstrap5.css +516 -0
  87. ledger/static/ledger/libs/datatables/Extensions/ColumnControl/1.1.1/css/columnControl.dataTables.css +529 -0
  88. ledger/static/ledger/libs/datatables/Extensions/ColumnControl/1.1.1/js/columnControl.bootstrap5.js +73 -0
  89. ledger/static/ledger/libs/datatables/Extensions/ColumnControl/1.1.1/js/dataTables.columnControl.js +3090 -0
  90. ledger/static/ledger/libs/datatables/Extensions/FixedHeader/4.0.4/css/fixedHeader.bootstrap5.css +20 -0
  91. ledger/static/ledger/libs/datatables/Extensions/FixedHeader/4.0.4/js/dataTables.fixedHeader.js +1203 -0
  92. ledger/static/ledger/libs/datatables/Extensions/FixedHeader/4.0.4/js/fixedHeader.bootstrap5.js +59 -0
  93. ledger/tasks.py +157 -146
  94. ledger/templates/ledger/base.html +59 -21
  95. ledger/templates/ledger/bundles/aa-ledger-css.html +3 -0
  96. ledger/templates/ledger/bundles/aa-ledger-js.html +3 -0
  97. ledger/templates/ledger/bundles/view-alliance-ledger-js.html +14 -0
  98. ledger/templates/ledger/bundles/view-character-ledger-js.html +15 -0
  99. ledger/templates/ledger/bundles/view-character-planetary-css.html +3 -0
  100. ledger/templates/ledger/bundles/view-character-planetary-js.html +4 -0
  101. ledger/templates/ledger/bundles/view-corporation-ledger-js.html +15 -0
  102. ledger/templates/ledger/partials/modal/confirm.html +0 -1
  103. ledger/templates/ledger/partials/modal/request-accept-delete-alliance.html +38 -0
  104. ledger/templates/ledger/partials/modal/request-accept-delete-character.html +38 -0
  105. ledger/templates/ledger/partials/modal/request-accept-delete-corporation.html +38 -0
  106. ledger/templates/ledger/partials/modal/request-accept-switch-notification.html +38 -0
  107. ledger/templates/ledger/partials/modal/request-view-alliance-details.html +26 -0
  108. ledger/templates/ledger/partials/modal/request-view-character-details.html +26 -0
  109. ledger/templates/ledger/partials/modal/request-view-corporation-details.html +26 -0
  110. ledger/templates/ledger/partials/modal/request-view-extractor.html +32 -0
  111. ledger/templates/ledger/partials/modal/request-view-factory.html +31 -0
  112. ledger/templates/ledger/partials/{menu → navigation}/administration.html +8 -0
  113. ledger/templates/ledger/partials/{menu → navigation}/navigation.html +2 -2
  114. ledger/templates/ledger/partials/{administration → view-alliance-administration}/alliance_corporations.html +3 -3
  115. ledger/templates/ledger/partials/view-alliance-administration/dashboard.html +81 -0
  116. ledger/templates/ledger/partials/view-alliance-ledger/alliance-billboard.html +25 -0
  117. ledger/templates/ledger/partials/view-alliance-ledger/alliance-ledger-details.html +21 -0
  118. ledger/templates/ledger/partials/view-alliance-ledger/alliance-table.html +24 -0
  119. ledger/templates/ledger/partials/view-alliance-ledger/information/daily.html +18 -0
  120. ledger/templates/ledger/partials/view-alliance-ledger/information/hourly.html +18 -0
  121. ledger/templates/ledger/partials/view-alliance-ledger/information/summary.html +19 -0
  122. ledger/templates/ledger/partials/{administration → view-character-administration}/character.html +1 -9
  123. ledger/templates/ledger/partials/{administration → view-character-administration}/dashboard.html +0 -34
  124. ledger/templates/ledger/partials/view-character-ledger/character-billboard.html +25 -0
  125. ledger/templates/ledger/partials/view-character-ledger/character-ledger-details.html +21 -0
  126. ledger/templates/ledger/partials/view-character-ledger/character-table.html +25 -0
  127. ledger/templates/ledger/partials/view-character-ledger/information/daily.html +18 -0
  128. ledger/templates/ledger/partials/view-character-ledger/information/hourly.html +18 -0
  129. ledger/templates/ledger/partials/view-character-ledger/information/summary.html +19 -0
  130. ledger/templates/ledger/partials/view-character-planetary/extractor-table.html +24 -0
  131. ledger/templates/ledger/partials/view-character-planetary/factory-table.html +24 -0
  132. ledger/templates/ledger/partials/view-character-planetary/planetary-table.html +22 -0
  133. ledger/templates/ledger/partials/view-character-planetary/storage-table.html +23 -0
  134. ledger/templates/ledger/partials/{administration → view-corporation-administration}/corporation.html +5 -13
  135. ledger/templates/ledger/partials/{administration → view-corporation-administration}/corporation_characters.html +1 -1
  136. ledger/templates/ledger/partials/view-corporation-administration/dashboard.html +81 -0
  137. ledger/templates/ledger/partials/view-corporation-ledger/corporation-billboard.html +25 -0
  138. ledger/templates/ledger/partials/view-corporation-ledger/corporation-ledger-details.html +21 -0
  139. ledger/templates/ledger/partials/view-corporation-ledger/corporation-table.html +26 -0
  140. ledger/templates/ledger/partials/view-corporation-ledger/information/daily.html +18 -0
  141. ledger/templates/ledger/partials/view-corporation-ledger/information/hourly.html +18 -0
  142. ledger/templates/ledger/partials/view-corporation-ledger/information/summary.html +19 -0
  143. ledger/templates/ledger/view-administration.html +62 -0
  144. ledger/templates/ledger/view-alliance-administration.html +49 -0
  145. ledger/templates/ledger/view-alliance-ledger.html +72 -0
  146. ledger/templates/ledger/view-alliance-overview.html +131 -0
  147. ledger/templates/ledger/view-character-administration.html +42 -0
  148. ledger/templates/ledger/view-character-ledger.html +73 -0
  149. ledger/templates/ledger/view-character-overview.html +135 -0
  150. ledger/templates/ledger/view-character-planetary-overview.html +135 -0
  151. ledger/templates/ledger/view-character-planetary.html +73 -0
  152. ledger/templates/ledger/view-corporation-administration.html +42 -0
  153. ledger/templates/ledger/view-corporation-ledger.html +73 -0
  154. ledger/templates/ledger/view-corporation-overview.html +131 -0
  155. ledger/templatetags/ledger.py +3 -5
  156. ledger/tests/__init__.py +187 -0
  157. ledger/tests/test_admin.py +164 -68
  158. ledger/tests/test_auth_hook.py +31 -13
  159. ledger/tests/test_decarators.py +14 -79
  160. ledger/tests/test_discord_installed.py +0 -1
  161. ledger/tests/test_helpers/test_ledger_data.py +19 -0
  162. ledger/tests/test_managers/test_character_audit_manager.py +111 -69
  163. ledger/tests/test_managers/test_character_journal_manager.py +48 -208
  164. ledger/tests/test_managers/test_character_mining_manager.py +37 -16
  165. ledger/tests/test_managers/test_corporation_division_manager.py +66 -28
  166. ledger/tests/test_managers/test_corporation_journal_manager.py +39 -42
  167. ledger/tests/test_managers/test_general_manager.py +78 -18
  168. ledger/tests/test_managers/test_planetary_manager.py +73 -32
  169. ledger/tests/test_models/test_characteraudit.py +58 -74
  170. ledger/tests/test_models/test_characterminingledger.py +20 -26
  171. ledger/tests/test_models/test_characterwalletjournal.py +10 -33
  172. ledger/tests/test_models/test_corporationaudit.py +41 -35
  173. ledger/tests/test_models/test_corporationwalletjournal.py +35 -32
  174. ledger/tests/test_models/test_general.py +44 -11
  175. ledger/tests/test_models/test_planetary.py +14 -80
  176. ledger/tests/test_templatetags.py +2 -7
  177. ledger/tests/test_views/corporation/test_add_corp.py +16 -35
  178. ledger/tests/test_views/corporation/test_delete_corporation.py +66 -42
  179. ledger/tests/test_views/test_access.py +512 -545
  180. ledger/tests/test_views/test_add_ally.py +57 -46
  181. ledger/tests/test_views/test_add_char.py +21 -33
  182. ledger/tests/test_views/test_delete_character.py +24 -21
  183. ledger/tests/testdata/README_ESI_STUB.md +430 -0
  184. ledger/tests/testdata/esi_stub_openapi.py +511 -0
  185. ledger/tests/testdata/integrations/__init__.py +0 -0
  186. ledger/tests/testdata/{load_eveuniverse.py → integrations/eveuniverse.py} +0 -1
  187. ledger/tests/testdata/integrations/planetary.py +13 -0
  188. ledger/tests/testdata/json/factory.json +281 -0
  189. ledger/tests/testdata/json/inactive.json +281 -0
  190. ledger/tests/testdata/json/pins.json +175 -272
  191. ledger/tests/testdata/json/route.json +95 -528
  192. ledger/tests/testdata/test_esi_stub.py +468 -0
  193. ledger/tests/testdata/utils.py +601 -0
  194. ledger/thirdparty/charlink_hook.py +60 -30
  195. ledger/urls.py +0 -135
  196. ledger/views/alliance/add_ally.py +2 -4
  197. ledger/views/alliance/alliance_ledger.py +64 -147
  198. ledger/views/character/add_char.py +8 -10
  199. ledger/views/character/character_ledger.py +60 -126
  200. ledger/views/character/planetary.py +5 -98
  201. ledger/views/corporation/add_corp.py +10 -12
  202. ledger/views/corporation/corporation_ledger.py +65 -327
  203. ledger/views/index.py +92 -30
  204. aa_ledger-1.0.3.dist-info/RECORD +0 -236
  205. ledger/api/api_helper/planetary_helper.py +0 -107
  206. ledger/api/ledger/__init__.py +0 -7
  207. ledger/api/ledger/planetary.py +0 -231
  208. ledger/helpers/alliance.py +0 -317
  209. ledger/helpers/character.py +0 -251
  210. ledger/helpers/core.py +0 -665
  211. ledger/helpers/corporation.py +0 -427
  212. ledger/helpers/data_exporter.py +0 -452
  213. ledger/static/ledger/js/planetary-confirm.js +0 -66
  214. ledger/static/ledger/js/planetary.js +0 -143
  215. ledger/templates/ledger/admin.html +0 -43
  216. ledger/templates/ledger/allyledger/admin/alliance_administration.html +0 -46
  217. ledger/templates/ledger/allyledger/admin/alliance_overview.html +0 -108
  218. ledger/templates/ledger/allyledger/alliance_ledger.html +0 -86
  219. ledger/templates/ledger/bundles/character-ledger-bundles.html +0 -66
  220. ledger/templates/ledger/bundles/corporation-ledger-bundles.html +0 -75
  221. ledger/templates/ledger/bundles/ledger-bundles.html +0 -23
  222. ledger/templates/ledger/bundles/ledger-css.html +0 -3
  223. ledger/templates/ledger/bundles/planetary-bundles.html +0 -50
  224. ledger/templates/ledger/bundles/table-css.html +0 -3
  225. ledger/templates/ledger/charledger/admin/character_administration.html +0 -39
  226. ledger/templates/ledger/charledger/admin/character_overview.html +0 -106
  227. ledger/templates/ledger/charledger/character_ledger.html +0 -94
  228. ledger/templates/ledger/charledger/planetary/admin/planetary_overview.html +0 -123
  229. ledger/templates/ledger/charledger/planetary/planetary_ledger.html +0 -54
  230. ledger/templates/ledger/corpledger/admin/corporation_administration.html +0 -39
  231. ledger/templates/ledger/corpledger/admin/corporation_overview.html +0 -108
  232. ledger/templates/ledger/corpledger/corporation_ledger.html +0 -129
  233. ledger/templates/ledger/data-export.html +0 -78
  234. ledger/templates/ledger/error.html +0 -31
  235. ledger/templates/ledger/partials/form/error-message.html +0 -1
  236. ledger/templates/ledger/partials/information/daily.html +0 -56
  237. ledger/templates/ledger/partials/information/day.html +0 -48
  238. ledger/templates/ledger/partials/information/error.html +0 -8
  239. ledger/templates/ledger/partials/information/hourly.html +0 -53
  240. ledger/templates/ledger/partials/information/summary.html +0 -88
  241. ledger/templates/ledger/partials/information/view_character_content.html +0 -35
  242. ledger/templates/ledger/partials/modal/switchalarm_confirm.html +0 -39
  243. ledger/templates/ledger/partials/modal/view_extractor.html +0 -48
  244. ledger/templates/ledger/partials/modal/view_factory.html +0 -123
  245. ledger/templates/ledger/partials/table/char-ledger.html +0 -85
  246. ledger/templates/ledger/partials/table/corp-ledger.html +0 -66
  247. ledger/templates/ledger/partials/table/planetary.html +0 -18
  248. ledger/templates/ledger/partials/thirdparty/billboard.html +0 -22
  249. ledger/templates/ledger/partials/view/card.html +0 -160
  250. ledger/templates/ledger/permission.html +0 -2
  251. ledger/tests/test_helpers/test_billboard.py +0 -11
  252. ledger/tests/test_helpers/test_data_exporter.py +0 -207
  253. ledger/tests/test_tasks.py +0 -282
  254. ledger/tests/test_view_helpers/test_core.py +0 -47
  255. ledger/tests/test_views/corporation/test_corporation.py +0 -267
  256. ledger/tests/test_views/test_planetary.py +0 -137
  257. ledger/tests/testdata/esi_stub.py +0 -109
  258. ledger/tests/testdata/esi_stub_migration.py +0 -80
  259. ledger/tests/testdata/generate_characteraudit.py +0 -106
  260. ledger/tests/testdata/generate_corporationaudit.py +0 -74
  261. ledger/tests/testdata/generate_events.py +0 -31
  262. ledger/tests/testdata/generate_miningledger.py +0 -13
  263. ledger/tests/testdata/generate_planets.py +0 -48
  264. ledger/tests/testdata/generate_walletjournal.py +0 -42
  265. ledger/tests/testdata/json/czarno-pins.json +0 -240
  266. ledger/tests/testdata/json/czarno-routes.json +0 -165
  267. ledger/tests/testdata/json/pins2.json +0 -538
  268. {aa_ledger-1.0.3.dist-info → aa_ledger-2.0.0.dist-info}/licenses/LICENSE +0 -0
  269. /ledger/{tests/test_view_helpers → api/helpers}/__init__.py +0 -0
  270. /ledger/templates/ledger/bundles/{ally-administration-bundles.html → view-alliance-administration-js.html} +0 -0
  271. /ledger/templates/ledger/bundles/{char-administration-bundles.html → view-character-administration-js.html} +0 -0
  272. /ledger/templates/ledger/bundles/{corp-administration-bundles.html → view-corporation-administration-js.html} +0 -0
  273. /ledger/templates/ledger/partials/{administration → view-alliance-administration}/alliance.html +0 -0
  274. /ledger/tests/testdata/{esi.json → esi_test_data.json} +0 -0
  275. /ledger/tests/testdata/{allianceauth.json → integrations/allianceauth.json} +0 -0
  276. /ledger/tests/testdata/{load_allianceauth.py → integrations/allianceauth.py} +0 -0
  277. /ledger/tests/testdata/{eveentity.json → integrations/eveentity.json} +0 -0
  278. /ledger/tests/testdata/{load_eveentity.py → integrations/eveentity.py} +0 -0
  279. /ledger/tests/testdata/{eveuniverse.json → integrations/eveuniverse.json} +0 -0
  280. /ledger/tests/testdata/{planetary.json → integrations/planetary.json} +0 -0
@@ -2,823 +2,790 @@
2
2
 
3
3
  # Standard Library
4
4
  from http import HTTPStatus
5
- from unittest.mock import Mock, patch
5
+ from unittest.mock import patch
6
6
 
7
7
  # Django
8
- from django.contrib.messages.middleware import MessageMiddleware
9
- from django.contrib.sessions.middleware import SessionMiddleware
10
- from django.test import RequestFactory, TestCase
11
8
  from django.urls import reverse
12
9
 
13
- # Alliance Auth (External Libs)
14
- from app_utils.testing import (
15
- create_user_from_evecharacter,
16
- )
17
-
18
10
  # AA Ledger
19
- from ledger.tests.testdata.generate_characteraudit import (
20
- add_characteraudit_character_to_user,
21
- create_user_from_evecharacter_with_access,
22
- )
23
- from ledger.tests.testdata.generate_corporationaudit import (
24
- add_corporationaudit_corporation_to_user,
11
+ from ledger.tests import LedgerTestCase
12
+ from ledger.tests.testdata.utils import (
13
+ add_new_permission_to_user,
14
+ create_owner_from_user,
25
15
  )
26
- from ledger.tests.testdata.load_allianceauth import load_allianceauth
27
- from ledger.tests.testdata.load_eveuniverse import load_eveuniverse
28
16
  from ledger.views import index
29
17
  from ledger.views.alliance import alliance_ledger
30
18
  from ledger.views.character import character_ledger, planetary
31
19
  from ledger.views.corporation import corporation_ledger
32
20
 
33
21
  INDEX_PATH = "ledger.views.index"
22
+ TASKS_PATH = "ledger.tasks"
34
23
  CHARLEDGER_PATH = "ledger.views.character.character_ledger"
35
24
  CORPLEDGER_PATH = "ledger.views.corporation.corporation_ledger"
36
25
  ALLYLEDGER_PATH = "ledger.views.alliance.alliance_ledger"
37
26
 
38
27
 
39
28
  @patch(INDEX_PATH + ".messages")
40
- class TestViewIndexAccess(TestCase):
29
+ class TestViewIndexAccess(LedgerTestCase):
41
30
  @classmethod
42
31
  def setUpClass(cls):
43
32
  super().setUpClass()
44
- load_allianceauth()
45
- load_eveuniverse()
46
33
 
47
- cls.factory = RequestFactory()
48
- cls.user, cls.character_ownership = create_user_from_evecharacter_with_access(
49
- 1002
50
- )
51
- cls.superuser, cls.character_ownership = (
52
- create_user_from_evecharacter_with_access(1001)
53
- )
34
+ create_owner_from_user(cls.user)
35
+ create_owner_from_user(cls.user, owner_type="corporation")
54
36
 
55
37
  def test_admin(self, mock_messages):
56
- """Test admin access."""
57
- # given
58
- self.superuser.is_superuser = True
59
- self.superuser.save()
38
+ """
39
+ Test admin access.
60
40
 
41
+ This test logs in a superuser and verifies that they can access the admin view.
42
+ """
43
+ # Test Data
61
44
  request = self.factory.get(reverse("ledger:admin"))
62
45
  request.user = self.superuser
63
- # when
46
+
47
+ # Test Action
64
48
  response = index.admin(request)
65
- # then
49
+
50
+ # Expected Result
66
51
  self.assertEqual(response.status_code, HTTPStatus.OK)
67
52
  self.assertContains(response, "Administration")
68
53
 
69
54
  def test_admin_no_access(self, mock_messages):
70
- """Test admin access."""
71
- # given
55
+ """
56
+ Test admin access.
57
+
58
+ This test verifies that a user without admin access is redirected and an error message is shown.
59
+ """
60
+ # Test Data
72
61
  request = self.factory.get(reverse("ledger:admin"))
73
62
  request.user = self.user
74
63
 
75
- middleware = SessionMiddleware(Mock())
76
- middleware.process_request(request)
77
- # when
64
+ self._middleware_process_request(request)
65
+
66
+ # Test Action
78
67
  response = index.admin(request)
79
- # then
68
+
69
+ # Expected Result
80
70
  self.assertEqual(response.status_code, HTTPStatus.FOUND)
81
71
  self.assertTrue(mock_messages.error.called)
82
72
 
83
- def test_admin_clear_all_etags(self, mock_messages):
84
- """Test clear all etags."""
85
- # given
86
- self.superuser.is_superuser = True
87
- self.superuser.save()
73
+ @patch(TASKS_PATH + ".clear_all_cache")
74
+ def test_admin_clear_all_cache(self, mock_clear_cache, mock_messages):
75
+ """
76
+ Test clear all cache.
77
+
78
+ This test posts to the admin view to trigger the clear cache action.
79
+ """
80
+ # Test Data
88
81
  request = self.factory.post(
89
- reverse("ledger:admin"), data={"run_clear_etag": True}
82
+ reverse("ledger:admin"), data={"run_clear_cache": True}
90
83
  )
91
84
  request.user = self.superuser
85
+ self._middleware_process_request(request)
92
86
 
93
- middleware = SessionMiddleware(Mock())
94
- middleware.process_request(request)
95
- # when
87
+ # Test Action
96
88
  response = index.admin(request)
97
- # then
89
+
90
+ # Expected Result
98
91
  self.assertEqual(response.status_code, HTTPStatus.OK)
99
- mock_messages.info.assert_called_once_with(request, "Queued Clear All ETags")
92
+ mock_messages.info.assert_called_once_with(request, "Queued Clear All Cache")
93
+ mock_clear_cache.apply_async.assert_called_once_with(priority=1)
100
94
 
101
95
  def test_force_refresh(self, mock_messages):
102
- """Test force refresh."""
103
- # given
104
- self.superuser.is_superuser = True
105
- self.superuser.save()
96
+ """
97
+ Test force refresh.
98
+
99
+ This test posts to the admin view to trigger the force refresh action.
100
+ """
101
+ # Test Data
106
102
  request = self.factory.post(
107
103
  reverse("ledger:admin"), data={"force_refresh": True}
108
104
  )
109
105
  request.user = self.superuser
106
+ self._middleware_process_request(request)
110
107
 
111
- middleware = SessionMiddleware(Mock())
112
- middleware.process_request(request)
113
- # when
108
+ # Test Action
114
109
  response = index.admin(request)
115
- # then
110
+
111
+ # Expected Result
116
112
  self.assertEqual(response.status_code, HTTPStatus.OK)
117
113
 
118
- def test_run_char_updates(self, mock_messages):
119
- """Test run char updates."""
120
- # given
121
- self.superuser.is_superuser = True
122
- self.superuser.save()
114
+ @patch(TASKS_PATH + ".update_all_characters")
115
+ def test_run_character_updates(self, mock_update_characters, mock_messages):
116
+ """
117
+ Test run character updates.
118
+
119
+ This test posts to the admin view to trigger the run character updates action.
120
+
121
+ # Expected Results
122
+ - Update all characters task is queued
123
+ """
124
+ # Test Data
123
125
  request = self.factory.post(
124
- reverse("ledger:admin"), data={"run_char_updates": True}
126
+ reverse("ledger:admin"), data={"run_character_updates": True}
125
127
  )
126
128
  request.user = self.superuser
129
+ self._middleware_process_request(request)
127
130
 
128
- middleware = SessionMiddleware(Mock())
129
- middleware.process_request(request)
130
- # when
131
+ # Test Action
131
132
  response = index.admin(request)
132
- # then
133
+
134
+ # Expected Result
133
135
  self.assertEqual(response.status_code, HTTPStatus.OK)
134
136
  mock_messages.info.assert_called_once_with(
135
137
  request, "Queued Update All Characters"
136
138
  )
139
+ mock_update_characters.apply_async.assert_called_once()
137
140
 
138
- def test_run_corp_updates(self, mock_messages):
139
- """Test Run corp updates."""
140
- # given
141
- self.superuser.is_superuser = True
142
- self.superuser.save()
141
+ @patch(TASKS_PATH + ".update_character")
142
+ def test_run_character_updates_character_1001(
143
+ self, mock_update_characters, mock_messages
144
+ ):
145
+ """
146
+ Test run character updates.
147
+
148
+ This test posts to the admin view to trigger the run character updates action for character ID 1001.
149
+
150
+ # Expected Results
151
+ - Update task is queued for the specified character
152
+ """
153
+ # Test Data
143
154
  request = self.factory.post(
144
- reverse("ledger:admin"), data={"run_corp_updates": True}
155
+ reverse("ledger:admin"),
156
+ data={"run_character_updates": True, "character_id": 1001},
145
157
  )
146
158
  request.user = self.superuser
159
+ self._middleware_process_request(request)
147
160
 
148
- middleware = SessionMiddleware(Mock())
149
- middleware.process_request(request)
150
- # when
161
+ # Test Action
151
162
  response = index.admin(request)
152
- # then
163
+
164
+ # Expected Result
153
165
  self.assertEqual(response.status_code, HTTPStatus.OK)
154
166
  mock_messages.info.assert_called_once_with(
155
- request, "Queued Update All Corporations"
167
+ request,
168
+ f"Queued Update for Character: {self.user_character.character.character_name}",
156
169
  )
170
+ mock_update_characters.apply_async.assert_called_once()
157
171
 
172
+ @patch(TASKS_PATH + ".update_character")
173
+ def test_run_character_updates_character_not_exist(
174
+ self, mock_update_characters, mock_messages
175
+ ):
176
+ """
177
+ Test run character updates.
158
178
 
159
- class TestViewCharacterLedgerAccess(TestCase):
160
- @classmethod
161
- def setUpClass(cls):
162
- super().setUpClass()
163
- load_allianceauth()
164
- load_eveuniverse()
179
+ This test posts to the admin view to trigger the run character updates action for a non-existent character ID.
165
180
 
166
- cls.factory = RequestFactory()
167
- cls.user, cls.character_ownership = create_user_from_evecharacter_with_access(
168
- 1001
181
+ # Expected Results
182
+ - Error message is shown for the non-existent character
183
+ """
184
+ # Test Data
185
+ request = self.factory.post(
186
+ reverse("ledger:admin"),
187
+ data={"run_character_updates": True, "character_id": 9999},
169
188
  )
170
- cls.user2, cls.character_ownership2 = create_user_from_evecharacter_with_access(
171
- 1002
189
+ request.user = self.superuser
190
+ self._middleware_process_request(request)
191
+
192
+ # Test Action
193
+ response = index.admin(request)
194
+
195
+ # Expected Result
196
+ self.assertEqual(response.status_code, HTTPStatus.OK)
197
+ mock_messages.error.assert_called_with(
198
+ request, "Character with ID 9999 not found"
172
199
  )
173
- cls.audit = add_characteraudit_character_to_user(
174
- cls.user, cls.character_ownership.character.character_id
200
+ mock_update_characters.apply_async.assert_not_called()
201
+
202
+ @patch(TASKS_PATH + ".update_all_corporations")
203
+ def test_run_corporation_updates(self, mock_update_corporations, mock_messages):
204
+ """
205
+ Test run corporation updates.
206
+
207
+ This test posts to the admin view to trigger the run corporation updates action.
208
+
209
+ # Expected Results
210
+ - Update all corporations task is queued
211
+ """
212
+ # Test Data
213
+ request = self.factory.post(
214
+ reverse("ledger:admin"), data={"run_corporation_updates": True}
175
215
  )
216
+ request.user = self.superuser
217
+ self._middleware_process_request(request)
176
218
 
177
- def test_view_character_ledger(self):
178
- """Test view character ledger."""
179
- # given
180
- request = self.factory.get(
181
- reverse(
182
- "ledger:character_ledger",
183
- args=[self.character_ownership.character.character_id],
184
- )
219
+ # Test Action
220
+ response = index.admin(request)
221
+
222
+ # Expected Result
223
+ self.assertEqual(response.status_code, HTTPStatus.OK)
224
+ mock_messages.info.assert_called_once_with(
225
+ request, "Queued Update All Corporations"
185
226
  )
186
- request.user = self.user
187
- # when
188
- response = character_ledger.character_ledger(
189
- request, self.character_ownership.character.character_id
227
+ mock_update_corporations.apply_async.assert_called_once()
228
+
229
+ @patch(TASKS_PATH + ".update_corporation")
230
+ def test_run_corporation_updates_corporation_2001(
231
+ self, mock_update_corporations, mock_messages
232
+ ):
233
+ """
234
+ Test run corporation updates.
235
+
236
+ This test posts to the admin view to trigger the run corporation updates action for corporation ID 2001.
237
+
238
+ # Expected Results
239
+ - Update task is queued for the specified corporation
240
+ """
241
+ # Test Data
242
+ request = self.factory.post(
243
+ reverse("ledger:admin"),
244
+ data={"run_corporation_updates": True, "corporation_id": 2001},
190
245
  )
191
- # then
246
+ request.user = self.superuser
247
+ self._middleware_process_request(request)
248
+
249
+ # Test Action
250
+ response = index.admin(request)
251
+
252
+ # Expected Result
192
253
  self.assertEqual(response.status_code, HTTPStatus.OK)
193
- self.assertContains(response, "Character Ledger")
254
+ mock_messages.info.assert_called_once_with(
255
+ request,
256
+ f"Queued Update for Corporation: {self.user_character.character.corporation.corporation_name}",
257
+ )
258
+ mock_update_corporations.apply_async.assert_called_once()
194
259
 
195
- @patch(CHARLEDGER_PATH + ".messages")
196
- def test_view_character_ledger_without_permission(self, mock_messages):
197
- """Test view character ledger without permission."""
198
- # given
199
- request = self.factory.get(reverse("ledger:character_ledger", args=[1003]))
200
- request.user = self.user
260
+ @patch(TASKS_PATH + ".update_corporation")
261
+ def test_run_corporation_updates_corporation_not_exist(
262
+ self, mock_update_corporations, mock_messages
263
+ ):
264
+ """
265
+ Test run corporation updates.
201
266
 
202
- # Add session middleware to process the request
203
- middleware = SessionMiddleware(Mock())
204
- middleware.process_request(request)
205
- message_middleware = MessageMiddleware(Mock())
206
- message_middleware.process_request(request)
207
- # when
208
- response = character_ledger.character_ledger(request, 1003)
209
- # then
267
+ This test posts to the admin view to trigger the run corporation updates action for a non-existent corporation ID.
268
+
269
+ # Expected Results
270
+ - Error message is shown for the non-existent corporation
271
+ """
272
+ # Test Data
273
+ request = self.factory.post(
274
+ reverse("ledger:admin"),
275
+ data={"run_corporation_updates": True, "corporation_id": 9999},
276
+ )
277
+ request.user = self.superuser
278
+ self._middleware_process_request(request)
279
+
280
+ # Test Action
281
+ response = index.admin(request)
282
+
283
+ # Expected Result
210
284
  self.assertEqual(response.status_code, HTTPStatus.OK)
211
- self.assertContains(response, "Character Ledger")
212
- self.assertTrue(mock_messages.error.called)
285
+ mock_messages.error.assert_called_with(
286
+ request, "Corporation with ID 9999 not found"
287
+ )
288
+ mock_update_corporations.apply_async.assert_not_called()
213
289
 
214
- def test_view_character_details(self):
215
- """Test view character details."""
216
- # given
290
+
291
+ class TestViewCharacterLedgerAccess(LedgerTestCase):
292
+ """Test character ledger access."""
293
+
294
+ @classmethod
295
+ def setUpClass(cls):
296
+ super().setUpClass()
297
+ cls.owner = create_owner_from_user(
298
+ user=cls.user,
299
+ owner_type="character",
300
+ )
301
+
302
+ def test_view_character_ledger(self):
303
+ """
304
+ Test view character ledger.
305
+
306
+ This test verifies that a user with permission can access their character ledger.
307
+ """
308
+ # Test Data
217
309
  request = self.factory.get(
218
310
  reverse(
219
- "ledger:character_details",
220
- args=[self.character_ownership.character.character_id, 2025],
311
+ "ledger:character_ledger",
312
+ kwargs={
313
+ "character_id": self.user_character.character.character_id,
314
+ "year": 2025,
315
+ },
221
316
  )
222
317
  )
223
318
  request.user = self.user
224
- # when
225
- response = character_ledger.character_details(
226
- request, self.character_ownership.character.character_id, year=2025
319
+
320
+ # Test Action
321
+ response = character_ledger.character_ledger(
322
+ request,
323
+ character_id=self.user_character.character.character_id,
324
+ year=2025,
227
325
  )
228
- # then
326
+ # Expected Result
229
327
  self.assertEqual(response.status_code, HTTPStatus.OK)
230
- self.assertContains(
231
- response,
232
- "No ratting data found...",
233
- )
328
+ self.assertContains(response, "Character Ledger")
234
329
 
235
- def test_view_character_details_no_permission(self):
236
- """Test view character details."""
237
- # given
238
- request = self.factory.get(
330
+ @patch(CHARLEDGER_PATH + ".messages")
331
+ def test_view_character_ledger_without_permission(self, mock_messages):
332
+ """
333
+ Test view character ledger without permission.
334
+
335
+ This test verifies that a user without permission is shown an error message when accessing a character ledger.
336
+ """
337
+ # Test Action
338
+ self.client.force_login(self.user)
339
+ response = self.client.get(
239
340
  reverse(
240
- "ledger:character_details",
241
- args=[self.character_ownership.character.character_id, 2025],
242
- )
341
+ "ledger:character_ledger",
342
+ kwargs={"character_id": 1003, "year": 2025},
343
+ ),
344
+ follow=True,
243
345
  )
244
- request.user = self.user2
245
346
 
246
- # when
247
- response = character_ledger.character_details(
248
- request, self.character_ownership.character.character_id, year=2025
249
- )
250
- # then
347
+ # Expected Result
251
348
  self.assertEqual(response.status_code, HTTPStatus.OK)
252
- self.assertContains(response, "Permission Denied")
349
+ self.assertContains(response, "Character Ledger")
350
+ self.assertTrue(mock_messages.error.called)
253
351
 
254
352
  def test_view_character_overview(self):
255
- """Test view character overview."""
256
- # given
353
+ """
354
+ Test view character overview.
355
+
356
+ This test verifies that a user with permission can access the character overview.
357
+ """
358
+ # Test Data
257
359
  request = self.factory.get(reverse("ledger:character_overview"))
258
360
  request.user = self.user
259
- # when
361
+
362
+ # Test Action
260
363
  response = character_ledger.character_overview(request)
261
- # then
364
+
365
+ # Expected Result
262
366
  self.assertEqual(response.status_code, HTTPStatus.OK)
263
367
  self.assertContains(response, "Character Overview")
264
368
 
265
369
  def test_view_character_administration(self):
266
- """Test view character administration."""
267
- # given
370
+ """
371
+ Test view character administration.
372
+
373
+ This test verifies that a user with permission can access their character administration view.
374
+ """
375
+ # Test Data
268
376
  request = self.factory.get(
269
377
  reverse(
270
378
  "ledger:character_administration",
271
- args=[self.character_ownership.character.character_id],
379
+ kwargs={"character_id": self.user_character.character.character_id},
272
380
  )
273
381
  )
274
382
  request.user = self.user
275
- # when
383
+
384
+ # Test Action
276
385
  response = character_ledger.character_administration(
277
- request, self.character_ownership.character.character_id
386
+ request, character_id=self.user_character.character.character_id
278
387
  )
279
- # then
388
+
389
+ # Expected Result
280
390
  self.assertEqual(response.status_code, HTTPStatus.OK)
281
391
  self.assertContains(response, "Administration")
282
392
 
283
393
  def test_view_character_administration_withouth_character_id(self):
284
- """Test view character administration."""
285
- # given
394
+ """
395
+ Test view character administration.
396
+
397
+ This test verifies that a user with permission can access their character administration view without providing a character ID.
398
+ """
399
+ # Test Data
286
400
  request = self.factory.get(
287
401
  reverse(
288
402
  "ledger:character_administration",
289
- args=[self.character_ownership.character.character_id],
403
+ kwargs={"character_id": self.user_character.character.character_id},
290
404
  )
291
405
  )
292
406
  request.user = self.user
293
- # when
407
+
408
+ # Test Action
294
409
  response = character_ledger.character_administration(request)
295
- # then
410
+
411
+ # Expected Result
296
412
  self.assertEqual(response.status_code, HTTPStatus.OK)
297
413
  self.assertContains(response, "Administration")
298
414
 
299
415
  @patch(CHARLEDGER_PATH + ".messages")
300
416
  def test_view_character_administration_no_permission(self, mock_messages):
301
- """Test view character administration."""
302
- # given
417
+ """
418
+ Test view character administration.
419
+
420
+ This test verifies that a user without permission is redirected and shown an error message when accessing character administration.
421
+ """
422
+ # Test Data
303
423
  request = self.factory.get(
304
424
  reverse("ledger:character_administration", args=[1002])
305
425
  )
306
426
  request.user = self.user
307
- middleware = SessionMiddleware(Mock())
308
- middleware.process_request(request)
309
- # when
310
- response = character_ledger.character_administration(request, 1002)
311
- # then
427
+ self._middleware_process_request(request)
428
+
429
+ # Test Action
430
+ response = character_ledger.character_administration(request, character_id=1002)
431
+
432
+ # Expected Result
312
433
  self.assertEqual(response.status_code, HTTPStatus.FOUND)
313
434
  mock_messages.error.assert_called_once_with(request, "Permission Denied")
314
435
 
315
436
 
316
- class TestViewCorporationLedgerAccess(TestCase):
437
+ class TestViewCorporationLedgerAccess(LedgerTestCase):
317
438
  @classmethod
318
439
  def setUpClass(cls):
319
440
  super().setUpClass()
320
- load_allianceauth()
321
- load_eveuniverse()
322
-
323
- cls.factory = RequestFactory()
324
- cls.user, cls.character_ownership = create_user_from_evecharacter(
325
- 1001,
326
- permissions=[
327
- "ledger.basic_access",
328
- "ledger.advanced_access",
329
- "ledger.manage_access",
330
- "ledger.corp_audit_manager",
331
- ],
332
- )
333
- cls.user_no_perm, cls.character_ownership_no_perm = (
334
- create_user_from_evecharacter(
335
- 1002,
336
- permissions=[
337
- "ledger.basic_access",
338
- "ledger.advanced_access",
339
- "ledger.manage_access",
340
- ],
341
- )
441
+ cls.audit = create_owner_from_user(
442
+ user=cls.user,
443
+ owner_type="corporation",
342
444
  )
343
- cls.audit = add_corporationaudit_corporation_to_user(cls.user, 1001)
344
-
345
- def test_view_corporation_ledger_index(self):
346
- """Test view corporation ledger index."""
347
- # given
348
- request = self.factory.get(reverse("ledger:corporation_ledger_index"))
349
- request.user = self.user
350
- # when
351
- response = corporation_ledger.corporation_ledger_index(request)
352
- # then
353
- self.assertEqual(response.status_code, HTTPStatus.FOUND)
445
+ cls.user = add_new_permission_to_user(cls.user, "ledger.advanced_access")
354
446
 
355
447
  def test_view_corporation_ledger(self):
356
- """Test view corporation ledger."""
357
- # given
448
+ """
449
+ Test view corporation ledger.
450
+
451
+ This test verifies that a user with permission can access their corporation ledger.
452
+ """
453
+ # Test Data
358
454
  request = self.factory.get(
359
455
  reverse(
360
456
  "ledger:corporation_ledger",
361
- args=[self.character_ownership.character.corporation_id],
457
+ kwargs={
458
+ "corporation_id": self.user_character.character.corporation_id,
459
+ "year": 2025,
460
+ },
362
461
  )
363
462
  )
364
463
  request.user = self.user
365
- # when
464
+
465
+ # Test Action
366
466
  response = corporation_ledger.corporation_ledger(
367
- request, self.character_ownership.character.corporation_id
467
+ request,
468
+ corporation_id=self.user_character.character.corporation_id,
469
+ year=2025,
368
470
  )
369
- # then
471
+
472
+ # Expected Result
370
473
  self.assertEqual(response.status_code, HTTPStatus.OK)
371
474
  self.assertContains(response, "Corporation Ledger")
372
475
 
373
476
  @patch(CORPLEDGER_PATH + ".messages")
374
477
  def test_view_corporation_ledger_not_found(self, mock_messages):
375
- """Test view corporation ledger not found."""
376
- # given
377
- request = self.factory.get(reverse("ledger:corporation_ledger", args=[9999]))
378
- request.user = self.user
478
+ """
479
+ Test view corporation ledger not found.
480
+
481
+ This test verifies that a user is shown an info message when accessing a non-existent corporation ledger.
482
+ """
483
+ # Test Action
484
+ self.client.force_login(self.user)
485
+ response = self.client.get(
486
+ reverse(
487
+ "ledger:corporation_ledger",
488
+ kwargs={"corporation_id": 9999, "year": 2025},
489
+ ),
490
+ follow=True,
491
+ )
379
492
 
380
- # Add session middleware to process the request
381
- middleware = SessionMiddleware(Mock())
382
- middleware.process_request(request)
383
- message_middleware = MessageMiddleware(Mock())
384
- message_middleware.process_request(request)
385
- # when
386
- response = corporation_ledger.corporation_ledger(request, 9999)
387
- # then
493
+ # Expected Result
388
494
  self.assertEqual(response.status_code, HTTPStatus.OK)
389
495
  self.assertContains(response, "Corporation Ledger")
390
496
  self.assertTrue(mock_messages.info.called)
391
497
 
392
498
  @patch(CORPLEDGER_PATH + ".messages")
393
499
  def test_view_corporation_ledger_without_permission(self, mock_messages):
394
- """Test view corporation ledger without permission."""
395
- # given
396
- request = self.factory.get(reverse("ledger:corporation_ledger", args=[2001]))
397
- request.user = self.user_no_perm
398
-
399
- # Add session middleware to process the request
400
- middleware = SessionMiddleware(Mock())
401
- middleware.process_request(request)
402
- message_middleware = MessageMiddleware(Mock())
403
- message_middleware.process_request(request)
404
- # when
405
- response = corporation_ledger.corporation_ledger(request, 2001)
406
- # then
407
- self.assertEqual(response.status_code, HTTPStatus.OK)
408
- self.assertContains(response, "Corporation Ledger")
409
- self.assertTrue(mock_messages.error.called)
410
-
411
- def test_view_corporation_details(self):
412
- """Test view corporation details."""
413
- # given
414
- request = self.factory.get(
500
+ """
501
+ Test view corporation ledger without permission.
502
+
503
+ This test verifies that a user without permission is shown an error message when accessing a corporation ledger.
504
+ """
505
+ # Test Data
506
+ self.user2 = add_new_permission_to_user(self.user2, "ledger.advanced_access")
507
+ # Test Action
508
+ self.client.force_login(self.user2)
509
+ response = self.client.get(
415
510
  reverse(
416
- "ledger:corporation_details",
417
- args=[self.character_ownership.character.corporation_id, 2025, 1001],
418
- )
419
- )
420
- request.user = self.user
421
- # when
422
- response = corporation_ledger.corporation_details(
423
- request,
424
- self.character_ownership.character.corporation_id,
425
- entity_id=1001,
426
- year=2025,
427
- )
428
- # then
429
- self.assertEqual(response.status_code, HTTPStatus.OK)
430
- self.assertContains(response, "No ratting data found...")
431
-
432
- def test_view_corporation_details_no_permission(self):
433
- """Test view corporation details."""
434
- # given
435
- request = self.factory.get(
436
- reverse(
437
- "ledger:corporation_details",
438
- args=[2001, 2025, 1001],
439
- )
440
- )
441
- request.user = self.user_no_perm
442
-
443
- # when
444
- response = corporation_ledger.corporation_details(
445
- request, 2001, entity_id=1001, year=2025
446
- )
447
- # then
448
- self.assertEqual(response.status_code, HTTPStatus.OK)
449
- self.assertContains(response, "Permission Denied")
450
-
451
- def test_view_corporation_details_not_found(self):
452
- """Test view corporation details."""
453
- # given
454
- request = self.factory.get(
455
- reverse(
456
- "ledger:corporation_details",
457
- args=[9999, 2025, 9999],
458
- )
511
+ "ledger:corporation_ledger",
512
+ kwargs={"corporation_id": 2001, "year": 2025},
513
+ ),
514
+ follow=True,
459
515
  )
460
- request.user = self.user_no_perm
461
516
 
462
- # when
463
- response = corporation_ledger.corporation_details(
464
- request, 9999, entity_id=9999, year=2025
465
- )
466
- # then
517
+ # Expected Result
467
518
  self.assertEqual(response.status_code, HTTPStatus.OK)
468
- self.assertContains(response, "Corporation not found")
519
+ self.assertContains(response, "Corporation Ledger")
520
+ self.assertTrue(mock_messages.error.called)
469
521
 
470
522
  def test_view_corporation_overview(self):
471
- """Test view corporation overview."""
472
- # given
523
+ """
524
+ Test view corporation overview.
525
+
526
+ This test verifies that a user with permission can access the corporation overview.
527
+ """
528
+ # Test Data
473
529
  request = self.factory.get(reverse("ledger:corporation_overview"))
474
530
  request.user = self.user
475
- # when
531
+
532
+ # Test Action
476
533
  response = corporation_ledger.corporation_overview(request)
477
- # then
534
+
535
+ # Expected Result
478
536
  self.assertEqual(response.status_code, HTTPStatus.OK)
479
537
  self.assertContains(response, "Corporation Overview")
480
538
 
481
539
  def test_view_corporation_administration(self):
482
- """Test view corporation administration."""
483
- # given
540
+ """
541
+ Test view corporation administration.
542
+
543
+ This test verifies that a user with permission can access their corporation administration view.
544
+ """
545
+ # Test Data
484
546
  request = self.factory.get(
485
547
  reverse(
486
548
  "ledger:corporation_administration",
487
- args=[self.character_ownership.character.corporation_id],
549
+ kwargs={"corporation_id": self.user_character.character.corporation_id},
488
550
  )
489
551
  )
490
- request.user = self.user
491
- # when
552
+ request.user = self.manage_own_user
553
+
554
+ # Test Action
492
555
  response = corporation_ledger.corporation_administration(
493
- request, self.character_ownership.character.corporation_id
556
+ request, self.user_character.character.corporation_id
494
557
  )
495
- # then
558
+
559
+ # Expected Result
496
560
  self.assertEqual(response.status_code, HTTPStatus.OK)
497
561
  self.assertContains(response, "Administration")
498
562
 
499
563
  @patch(CORPLEDGER_PATH + ".messages")
500
564
  def test_view_corporation_administration_no_permission(self, mock_messages):
501
- """Test view corporation administration."""
502
- # given
565
+ """
566
+ Test view corporation administration.
567
+
568
+ This test verifies that a user without permission is redirected and shown an error message when accessing corporation administration.
569
+ """
570
+ # Test Data
571
+ create_owner_from_user(self.user2, owner_type="corporation")
503
572
  request = self.factory.get(
504
- reverse("ledger:corporation_administration", args=[2001])
573
+ reverse(
574
+ "ledger:corporation_administration", kwargs={"corporation_id": 2002}
575
+ )
505
576
  )
506
- request.user = self.user_no_perm
507
- middleware = SessionMiddleware(Mock())
508
- middleware.process_request(request)
509
- # when
510
- response = corporation_ledger.corporation_administration(request, 2001)
511
- # then
577
+ request.user = self.manage_own_user
578
+ self._middleware_process_request(request)
579
+
580
+ # Test Action
581
+ response = corporation_ledger.corporation_administration(
582
+ request, corporation_id=2002
583
+ )
584
+
585
+ # Expected Result
512
586
  self.assertEqual(response.status_code, HTTPStatus.FOUND)
513
587
  mock_messages.error.assert_called_once_with(request, "Permission Denied")
514
588
 
515
589
  @patch(CORPLEDGER_PATH + ".messages")
516
590
  def test_view_corporation_administration_corporation_not_found(self, mock_messages):
517
- """Test view corporation administration."""
518
- # given
519
- request = self.factory.get(
520
- reverse("ledger:corporation_administration", args=[6666])
521
- )
522
- request.user = self.user
523
- middleware = SessionMiddleware(Mock())
524
- middleware.process_request(request)
525
- # when
526
- response = corporation_ledger.corporation_administration(request, 6666)
527
- # then
528
- self.assertEqual(response.status_code, HTTPStatus.FOUND)
529
- mock_messages.info.assert_called_once_with(request, "Corporation not found")
591
+ """
592
+ Test view corporation administration.
530
593
 
531
- def test_view_corporation_data_exporter(self):
532
- """Test view corporation data exporter."""
533
- # given
594
+ This test verifies that a user is redirected and shown an info message when accessing a non-existent corporation administration.
595
+ """
596
+ # Test Data
534
597
  request = self.factory.get(
535
- reverse("ledger:corporation_data_export", args=[2001])
598
+ reverse(
599
+ "ledger:corporation_administration", kwargs={"corporation_id": 6666}
600
+ )
536
601
  )
537
- request.user = self.user
538
- # when
539
- response = corporation_ledger.corporation_data_export(request, 2001)
540
- # then
541
- self.assertEqual(response.status_code, HTTPStatus.OK)
602
+ request.user = self.manage_own_user
603
+ self._middleware_process_request(request)
542
604
 
543
- @patch(CORPLEDGER_PATH + ".messages")
544
- def test_view_corporation_data_exporter_no_permission(self, mock_messages):
545
- """Test view corporation data exporter with no permission."""
546
- # given
547
- request = self.factory.get(
548
- reverse("ledger:corporation_data_export", args=[2001])
605
+ # Test Action
606
+ response = corporation_ledger.corporation_administration(
607
+ request, corporation_id=6666
549
608
  )
550
- request.user = self.user_no_perm
551
- middleware = SessionMiddleware(Mock())
552
- middleware.process_request(request)
553
- # when
554
- response = corporation_ledger.corporation_data_export(request, 2001)
555
- # then
556
- self.assertEqual(response.status_code, HTTPStatus.OK)
557
- mock_messages.error.assert_called_once_with(request, "Permission Denied")
558
609
 
559
- @patch(CORPLEDGER_PATH + ".messages")
560
- def test_view_corporation_data_exporter_not_found(self, mock_messages):
561
- """Test view corporation data exporter with not found corporation."""
562
- # given
563
- request = self.factory.get(
564
- reverse("ledger:corporation_data_export", args=[9999])
565
- )
566
- request.user = self.user
567
- middleware = SessionMiddleware(Mock())
568
- middleware.process_request(request)
569
- # when
570
- response = corporation_ledger.corporation_data_export(request, 9999)
571
- # then
572
- self.assertEqual(response.status_code, HTTPStatus.OK)
610
+ # Expected Result
611
+ self.assertEqual(response.status_code, HTTPStatus.FOUND)
573
612
  mock_messages.info.assert_called_once_with(request, "Corporation not found")
574
613
 
575
614
 
576
- class TestViewAllianceLedgerAccess(TestCase):
615
+ class TestViewAllianceLedgerAccess(LedgerTestCase):
577
616
  @classmethod
578
617
  def setUpClass(cls):
579
618
  super().setUpClass()
580
- load_allianceauth()
581
- load_eveuniverse()
582
-
583
- cls.factory = RequestFactory()
584
- cls.user, cls.character_ownership = create_user_from_evecharacter(
585
- 1001,
586
- permissions=[
587
- "ledger.basic_access",
588
- "ledger.advanced_access",
589
- ],
590
- )
591
- cls.user_no_perm, cls.character_ownership_no_perm = (
592
- create_user_from_evecharacter(
593
- 1003,
594
- permissions=[
595
- "ledger.basic_access",
596
- "ledger.advanced_access",
597
- ],
598
- )
599
- )
600
- cls.user_admin, cls.character_ownership_admin = create_user_from_evecharacter(
601
- 1002,
602
- permissions=[
603
- "ledger.basic_access",
604
- "ledger.advanced_access",
605
- "ledger.manage_access",
606
- ],
607
- )
608
- cls.audit = add_corporationaudit_corporation_to_user(cls.user, 1001)
609
- cls.audit_admin = add_corporationaudit_corporation_to_user(cls.user_admin, 1002)
610
- cls.user_has_no_alliance, cls.character_ownership_no_alliance = (
611
- create_user_from_evecharacter(
612
- 1000,
613
- permissions=[
614
- "ledger.basic_access",
615
- "ledger.advanced_access",
616
- ],
617
- )
618
- )
619
619
 
620
- def test_view_alliance_ledger_index(self):
621
- """Test view alliance ledger index."""
622
- # given
623
- request = self.factory.get(reverse("ledger:alliance_ledger_index"))
624
- request.user = self.user
625
- # when
626
- response = alliance_ledger.alliance_ledger_index(request)
627
- # then
628
- self.assertEqual(response.status_code, HTTPStatus.FOUND)
620
+ cls.audit = create_owner_from_user(user=cls.user, owner_type="corporation")
621
+ cls.audit_admin = create_owner_from_user(
622
+ user=cls.user2, owner_type="corporation"
623
+ )
624
+ cls.user = add_new_permission_to_user(cls.user, "ledger.advanced_access")
625
+ cls.user2 = add_new_permission_to_user(cls.user2, "ledger.advanced_access")
629
626
 
630
627
  def test_view_alliance_ledger(self):
631
- """Test view alliance ledger."""
632
- # given
628
+ """
629
+ Test view alliance ledger.
630
+
631
+ This test verifies that a user with permission can access their alliance ledger.
632
+ """
633
+ # Test Data
633
634
  request = self.factory.get(
634
635
  reverse(
635
636
  "ledger:alliance_ledger",
636
- args=[self.character_ownership.character.alliance_id],
637
+ kwargs={
638
+ "alliance_id": self.user_character.character.alliance_id,
639
+ "year": 2025,
640
+ },
637
641
  )
638
642
  )
639
643
  request.user = self.user
640
- # when
644
+
645
+ # Test Action
641
646
  response = alliance_ledger.alliance_ledger(
642
- request, self.character_ownership.character.alliance_id
647
+ request, alliance_id=self.user_character.character.alliance_id, year=2025
643
648
  )
644
- # then
649
+
650
+ # Expected Result
645
651
  self.assertEqual(response.status_code, HTTPStatus.OK)
646
652
  self.assertContains(response, "Alliance Ledger")
647
653
 
648
654
  @patch(ALLYLEDGER_PATH + ".messages")
649
655
  def test_view_alliance_ledger_not_found(self, mock_messages):
650
- """Test view alliance ledger not found."""
651
- # given
652
- request = self.factory.get(reverse("ledger:alliance_ledger", args=[9999]))
653
- request.user = self.user
656
+ """
657
+ Test view alliance ledger not found.
658
+
659
+ This test verifies that a user is shown an info message when accessing a non-existent alliance ledger.
660
+ """
661
+ # Test Action
662
+ self.client.force_login(self.user)
663
+ response = self.client.get(
664
+ reverse(
665
+ "ledger:alliance_ledger", kwargs={"alliance_id": 9999, "year": 2025}
666
+ ),
667
+ follow=True,
668
+ )
654
669
 
655
- # Add session middleware to process the request
656
- middleware = SessionMiddleware(Mock())
657
- middleware.process_request(request)
658
- message_middleware = MessageMiddleware(Mock())
659
- message_middleware.process_request(request)
660
- # when
661
- response = alliance_ledger.alliance_ledger(request, 9999)
662
- # then
670
+ # Expected Result: final page after redirect is OK and contains the overview
663
671
  self.assertEqual(response.status_code, HTTPStatus.OK)
664
- self.assertContains(response, "Alliance Ledger")
672
+ self.assertContains(response, "Alliance Overview")
665
673
  self.assertTrue(mock_messages.info.called)
666
674
 
667
675
  @patch(ALLYLEDGER_PATH + ".messages")
668
676
  def test_view_alliance_ledger_without_permission(self, mock_messages):
669
- """Test view alliance ledger without permission."""
670
- # given
671
- request = self.factory.get(reverse("ledger:alliance_ledger", args=[3001]))
672
- request.user = self.user_no_perm
673
-
674
- # Add session middleware to process the request
675
- middleware = SessionMiddleware(Mock())
676
- middleware.process_request(request)
677
- message_middleware = MessageMiddleware(Mock())
678
- message_middleware.process_request(request)
679
- # when
680
- response = alliance_ledger.alliance_ledger(request, 3001)
681
- # then
682
- self.assertEqual(response.status_code, HTTPStatus.OK)
683
- self.assertContains(response, "Alliance Ledger")
684
- self.assertTrue(mock_messages.error.called)
685
-
686
- def test_view_alliance_details(self):
687
- """Test view alliance details."""
688
- # given
689
- request = self.factory.get(
677
+ """
678
+ Test view alliance ledger without permission.
679
+
680
+ This test verifies that a user without permission is shown an error message when accessing an alliance ledger.
681
+ """
682
+ # Test Action
683
+ self.client.force_login(self.user2)
684
+ response = self.client.get(
690
685
  reverse(
691
- "ledger:alliance_details",
692
- args=[self.character_ownership.character.alliance_id, 2025, 1001],
693
- )
686
+ "ledger:alliance_ledger", kwargs={"alliance_id": 3001, "year": 2025}
687
+ ),
688
+ follow=True,
694
689
  )
695
- request.user = self.user
696
- # when
697
- response = alliance_ledger.alliance_details(
698
- request,
699
- self.character_ownership.character.alliance_id,
700
- entity_id=1001,
701
- year=2025,
702
- )
703
- # then
704
- self.assertEqual(response.status_code, HTTPStatus.OK)
705
- self.assertContains(response, "No ratting data found...")
706
690
 
707
- def test_view_alliance_details_no_permission(self):
708
- """Test view alliance details without permission."""
709
- # given
710
- request = self.factory.get(
711
- reverse(
712
- "ledger:alliance_details",
713
- args=[3001, 2025, 2001],
714
- )
715
- )
716
- request.user = self.user_no_perm
717
-
718
- # when
719
- response = alliance_ledger.alliance_details(
720
- request, 3001, entity_id=2001, year=2025
721
- )
722
- # then
723
- self.assertEqual(response.status_code, HTTPStatus.OK)
724
- self.assertContains(response, "Permission Denied")
725
-
726
- def test_view_alliance_details_not_found(self):
727
- """Test view alliance details not found."""
728
- # given
729
- request = self.factory.get(
730
- reverse(
731
- "ledger:alliance_details",
732
- args=[9999, 2025, 9999],
733
- )
734
- )
735
- request.user = self.user_no_perm
736
-
737
- # when
738
- response = alliance_ledger.alliance_details(
739
- request, 9999, entity_id=9999, year=2025
740
- )
741
- # then
691
+ # Expected Result: final page after redirect is OK and shows overview, and an error message was created
742
692
  self.assertEqual(response.status_code, HTTPStatus.OK)
743
- self.assertContains(response, "Alliance not found.")
693
+ self.assertContains(response, "Alliance Overview")
694
+ self.assertTrue(mock_messages.error.called)
744
695
 
745
696
  def test_view_alliance_overview(self):
746
- """Test view alliance overview."""
747
- # given
697
+ """
698
+ Test view alliance overview.
699
+
700
+ This test verifies that a user with permission can access the alliance overview.
701
+ """
702
+ # Test Data
748
703
  request = self.factory.get(reverse("ledger:alliance_overview"))
749
704
  request.user = self.user
750
- # when
705
+
706
+ # Test Action
751
707
  response = alliance_ledger.alliance_overview(request)
752
- # then
708
+
709
+ # Expected Result
753
710
  self.assertEqual(response.status_code, HTTPStatus.OK)
754
711
  self.assertContains(response, "Alliance Overview")
755
712
 
756
713
  def test_view_alliance_administration(self):
757
- """Test view alliance administration."""
758
- # given
714
+ """
715
+ Test view alliance administration.
716
+
717
+ This test verifies that a user with permission can access their alliance administration view.
718
+ """
719
+ # Test Data
759
720
  request = self.factory.get(
760
721
  reverse(
761
722
  "ledger:alliance_administration",
762
- args=[self.character_ownership_admin.character.alliance_id],
723
+ kwargs={"alliance_id": self.user_character.character.alliance_id},
763
724
  )
764
725
  )
765
- request.user = self.user_admin
766
- # when
726
+ request.user = self.manage_user
727
+
728
+ # Test Action
767
729
  response = alliance_ledger.alliance_administration(
768
- request, self.character_ownership_admin.character.alliance_id
730
+ request, alliance_id=self.user_character.character.alliance_id
769
731
  )
770
- # then
732
+
733
+ # Expected Result
771
734
  self.assertEqual(response.status_code, HTTPStatus.OK)
772
735
  self.assertContains(response, "Administration")
773
736
 
774
737
  @patch(ALLYLEDGER_PATH + ".messages")
775
738
  def test_view_alliance_administration_no_permission(self, mock_messages):
776
- """Test view alliance administration."""
777
- # given
739
+ """
740
+ Test view alliance administration without permission.
741
+
742
+ This test verifies that a user without permission is redirected and shown an error message when accessing alliance administration.
743
+ """
744
+ # Test Data
778
745
  request = self.factory.get(
779
- reverse("ledger:alliance_administration", args=[3001])
746
+ reverse("ledger:alliance_administration", kwargs={"alliance_id": 3002})
780
747
  )
781
- request.user = self.user_admin
782
- middleware = SessionMiddleware(Mock())
783
- middleware.process_request(request)
784
- # when
785
- response = alliance_ledger.alliance_administration(request, 3001)
786
- # then
748
+ request.user = self.manage_own_user
749
+ self._middleware_process_request(request)
750
+
751
+ # Test Action
752
+ response = alliance_ledger.alliance_administration(request, alliance_id=3002)
753
+
754
+ # Expected Result
787
755
  self.assertEqual(response.status_code, HTTPStatus.FOUND)
788
756
  mock_messages.error.assert_called_once_with(request, "Permission Denied")
789
757
 
790
758
  @patch(ALLYLEDGER_PATH + ".messages")
791
759
  def test_view_alliance_administration_alliance_not_found(self, mock_messages):
792
- """Test view alliance administration."""
793
- # given
760
+ """
761
+ Test view alliance administration when the alliance is not found.
762
+
763
+ This test verifies that a user is redirected and shown an info message when accessing a non-existent alliance administration.
764
+ """
765
+ # Test Data
794
766
  request = self.factory.get(
795
- reverse("ledger:alliance_administration", args=[6666])
767
+ reverse("ledger:alliance_administration", kwargs={"alliance_id": 6666})
796
768
  )
797
- request.user = self.user_admin
798
- middleware = SessionMiddleware(Mock())
799
- middleware.process_request(request)
800
- # when
801
- response = alliance_ledger.alliance_administration(request, 6666)
802
- # then
769
+ request.user = self.manage_user
770
+ self._middleware_process_request(request)
771
+
772
+ # Test Action
773
+ response = alliance_ledger.alliance_administration(request, alliance_id=6666)
774
+
775
+ # Expected Result
803
776
  self.assertEqual(response.status_code, HTTPStatus.FOUND)
804
777
  mock_messages.info.assert_called_once_with(request, "Alliance not found.")
805
778
 
806
779
 
807
- class TestViewPlanetaryLedgerAccess(TestCase):
780
+ class TestViewPlanetaryLedgerAccess(LedgerTestCase):
808
781
  @classmethod
809
782
  def setUpClass(cls):
810
783
  super().setUpClass()
811
- load_allianceauth()
812
- load_eveuniverse()
813
784
 
814
- cls.factory = RequestFactory()
815
- cls.user, cls.character_ownership = create_user_from_evecharacter(
816
- 1001,
817
- permissions=[
818
- "ledger.basic_access",
819
- "ledger.advanced_access",
820
- ],
785
+ cls.audit = create_owner_from_user(
786
+ user=cls.user,
821
787
  )
788
+ cls.user = add_new_permission_to_user(cls.user, "ledger.advanced_access")
822
789
 
823
790
  def test_view_planetary_ledger_index(self):
824
791
  """Test view planetary ledger index."""
@@ -836,13 +803,13 @@ class TestViewPlanetaryLedgerAccess(TestCase):
836
803
  request = self.factory.get(
837
804
  reverse(
838
805
  "ledger:planetary_ledger",
839
- args=[self.character_ownership.character.character_id],
806
+ args=[self.user_character.character.character_id],
840
807
  )
841
808
  )
842
809
  request.user = self.user
843
810
  # when
844
811
  response = planetary.planetary_ledger(
845
- request, self.character_ownership.character.character_id
812
+ request, self.user_character.character.character_id
846
813
  )
847
814
  # then
848
815
  self.assertEqual(response.status_code, HTTPStatus.OK)
@@ -854,7 +821,7 @@ class TestViewPlanetaryLedgerAccess(TestCase):
854
821
  request = self.factory.get(
855
822
  reverse(
856
823
  "ledger:planetary_ledger",
857
- args=[self.character_ownership.character.character_id],
824
+ args=[self.user_character.character.character_id],
858
825
  )
859
826
  )
860
827
  request.user = self.user