aa-ledger 1.0.4__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.4.dist-info → aa_ledger-2.0.0.dist-info}/METADATA +5 -6
  2. aa_ledger-2.0.0.dist-info/RECORD +267 -0
  3. ledger/__init__.py +2 -2
  4. ledger/admin.py +23 -18
  5. ledger/api/__init__.py +23 -7
  6. ledger/api/{ledger/admin.py → admin.py} +25 -31
  7. ledger/api/alliance.py +755 -0
  8. ledger/api/character.py +786 -0
  9. ledger/api/corporation.py +1141 -0
  10. ledger/api/{helpers.py → helpers/core.py} +33 -33
  11. ledger/api/helpers/icons.py +372 -0
  12. ledger/api/helpers/planetary_helper.py +354 -0
  13. ledger/api/planetary.py +354 -0
  14. ledger/api/schema.py +240 -15
  15. ledger/app_settings.py +11 -27
  16. ledger/auth_hooks.py +2 -2
  17. ledger/constants.py +50 -177
  18. ledger/decorators.py +2 -46
  19. ledger/forms.py +133 -39
  20. ledger/helpers/billboard.py +194 -144
  21. ledger/helpers/cache.py +105 -0
  22. ledger/helpers/discord.py +2 -4
  23. ledger/helpers/eveonline.py +160 -0
  24. ledger/helpers/ledger_data.py +23 -0
  25. ledger/helpers/ref_type.py +53 -78
  26. ledger/locale/cs_CZ/LC_MESSAGES/django.mo +0 -0
  27. ledger/locale/cs_CZ/LC_MESSAGES/django.po +349 -193
  28. ledger/locale/de/LC_MESSAGES/django.mo +0 -0
  29. ledger/locale/de/LC_MESSAGES/django.po +528 -379
  30. ledger/locale/django.pot +721 -546
  31. ledger/locale/es/LC_MESSAGES/django.mo +0 -0
  32. ledger/locale/es/LC_MESSAGES/django.po +349 -194
  33. ledger/locale/fr_FR/LC_MESSAGES/django.mo +0 -0
  34. ledger/locale/fr_FR/LC_MESSAGES/django.po +349 -193
  35. ledger/locale/it_IT/LC_MESSAGES/django.mo +0 -0
  36. ledger/locale/it_IT/LC_MESSAGES/django.po +349 -193
  37. ledger/locale/ja/LC_MESSAGES/django.mo +0 -0
  38. ledger/locale/ja/LC_MESSAGES/django.po +348 -193
  39. ledger/locale/ko_KR/LC_MESSAGES/django.mo +0 -0
  40. ledger/locale/ko_KR/LC_MESSAGES/django.po +349 -193
  41. ledger/locale/nl_NL/LC_MESSAGES/django.mo +0 -0
  42. ledger/locale/nl_NL/LC_MESSAGES/django.po +349 -193
  43. ledger/locale/pl_PL/LC_MESSAGES/django.mo +0 -0
  44. ledger/locale/pl_PL/LC_MESSAGES/django.po +350 -193
  45. ledger/locale/ru/LC_MESSAGES/django.mo +0 -0
  46. ledger/locale/ru/LC_MESSAGES/django.po +348 -193
  47. ledger/locale/sk/LC_MESSAGES/django.mo +0 -0
  48. ledger/locale/sk/LC_MESSAGES/django.po +348 -193
  49. ledger/locale/uk/LC_MESSAGES/django.mo +0 -0
  50. ledger/locale/uk/LC_MESSAGES/django.po +348 -193
  51. ledger/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  52. ledger/locale/zh_Hans/LC_MESSAGES/django.po +348 -193
  53. ledger/managers/character_audit_manager.py +28 -20
  54. ledger/managers/character_journal_manager.py +185 -357
  55. ledger/managers/character_mining_manager.py +52 -26
  56. ledger/managers/character_planetary_manager.py +178 -136
  57. ledger/managers/corporation_audit_manager.py +36 -27
  58. ledger/managers/corporation_journal_manager.py +92 -56
  59. ledger/managers/general_manager.py +8 -7
  60. ledger/migrations/0018_remove_characterplanet_ledger_char_planet__58a5b6_idx_and_more.py +44 -0
  61. ledger/migrations/0019_rename_characteraudit_characterowner_and_more.py +48 -0
  62. ledger/models/__init__.py +5 -11
  63. ledger/models/characteraudit.py +101 -109
  64. ledger/models/corporationaudit.py +94 -49
  65. ledger/models/general.py +105 -211
  66. ledger/models/helpers/update_manager.py +302 -0
  67. ledger/models/planetary.py +60 -205
  68. ledger/providers.py +101 -0
  69. ledger/static/ledger/css/{ledger.css → aa-ledger.css} +54 -28
  70. ledger/static/ledger/js/aa-ledger.js +124 -0
  71. ledger/static/ledger/js/charts.js +25 -1
  72. ledger/static/ledger/js/view-alliance-ledger.js +383 -0
  73. ledger/static/ledger/js/view-character-ledger.js +388 -0
  74. ledger/static/ledger/js/view-corporation-ledger.js +402 -0
  75. ledger/static/ledger/js/view-planetary.js +492 -0
  76. ledger/static/ledger/libs/amCharts/5.14.4/js/flow.js +2 -0
  77. ledger/static/ledger/libs/amCharts/5.14.4/js/index.js +2 -0
  78. ledger/static/ledger/libs/amCharts/5.14.4/js/percent.js +2 -0
  79. ledger/static/ledger/libs/amCharts/5.14.4/js/themes/Animated.js +2 -0
  80. ledger/static/ledger/libs/amCharts/5.14.4/js/themes/Dark.js +2 -0
  81. ledger/static/ledger/libs/amCharts/5.14.4/js/xy.js +2 -0
  82. ledger/static/ledger/libs/datatables/2.3.5/css/dataTables.bootstrap5.css +610 -0
  83. ledger/static/ledger/libs/datatables/2.3.5/js/dataTables.bootstrap5.js +122 -0
  84. ledger/static/ledger/libs/datatables/2.3.5/js/dataTables.js +14127 -0
  85. ledger/static/ledger/libs/datatables/Extensions/ColumnControl/1.1.1/css/columnControl.bootstrap5.css +516 -0
  86. ledger/static/ledger/libs/datatables/Extensions/ColumnControl/1.1.1/css/columnControl.dataTables.css +529 -0
  87. ledger/static/ledger/libs/datatables/Extensions/ColumnControl/1.1.1/js/columnControl.bootstrap5.js +73 -0
  88. ledger/static/ledger/libs/datatables/Extensions/ColumnControl/1.1.1/js/dataTables.columnControl.js +3090 -0
  89. ledger/static/ledger/libs/datatables/Extensions/FixedHeader/4.0.4/css/fixedHeader.bootstrap5.css +20 -0
  90. ledger/static/ledger/libs/datatables/Extensions/FixedHeader/4.0.4/js/dataTables.fixedHeader.js +1203 -0
  91. ledger/static/ledger/libs/datatables/Extensions/FixedHeader/4.0.4/js/fixedHeader.bootstrap5.js +59 -0
  92. ledger/tasks.py +157 -141
  93. ledger/templates/ledger/base.html +59 -21
  94. ledger/templates/ledger/bundles/aa-ledger-css.html +3 -0
  95. ledger/templates/ledger/bundles/aa-ledger-js.html +3 -0
  96. ledger/templates/ledger/bundles/view-alliance-ledger-js.html +14 -0
  97. ledger/templates/ledger/bundles/view-character-ledger-js.html +15 -0
  98. ledger/templates/ledger/bundles/view-character-planetary-css.html +3 -0
  99. ledger/templates/ledger/bundles/view-character-planetary-js.html +4 -0
  100. ledger/templates/ledger/bundles/view-corporation-ledger-js.html +15 -0
  101. ledger/templates/ledger/partials/modal/confirm.html +0 -1
  102. ledger/templates/ledger/partials/modal/request-accept-delete-alliance.html +38 -0
  103. ledger/templates/ledger/partials/modal/request-accept-delete-character.html +38 -0
  104. ledger/templates/ledger/partials/modal/request-accept-delete-corporation.html +38 -0
  105. ledger/templates/ledger/partials/modal/request-accept-switch-notification.html +38 -0
  106. ledger/templates/ledger/partials/modal/request-view-alliance-details.html +26 -0
  107. ledger/templates/ledger/partials/modal/request-view-character-details.html +26 -0
  108. ledger/templates/ledger/partials/modal/request-view-corporation-details.html +26 -0
  109. ledger/templates/ledger/partials/modal/request-view-extractor.html +32 -0
  110. ledger/templates/ledger/partials/modal/request-view-factory.html +31 -0
  111. ledger/templates/ledger/partials/{menu → navigation}/administration.html +8 -0
  112. ledger/templates/ledger/partials/{menu → navigation}/navigation.html +2 -2
  113. ledger/templates/ledger/partials/{administration → view-alliance-administration}/alliance_corporations.html +3 -3
  114. ledger/templates/ledger/partials/view-alliance-administration/dashboard.html +81 -0
  115. ledger/templates/ledger/partials/view-alliance-ledger/alliance-billboard.html +25 -0
  116. ledger/templates/ledger/partials/view-alliance-ledger/alliance-ledger-details.html +21 -0
  117. ledger/templates/ledger/partials/view-alliance-ledger/alliance-table.html +24 -0
  118. ledger/templates/ledger/partials/view-alliance-ledger/information/daily.html +18 -0
  119. ledger/templates/ledger/partials/view-alliance-ledger/information/hourly.html +18 -0
  120. ledger/templates/ledger/partials/view-alliance-ledger/information/summary.html +19 -0
  121. ledger/templates/ledger/partials/{administration → view-character-administration}/character.html +1 -9
  122. ledger/templates/ledger/partials/{administration → view-character-administration}/dashboard.html +0 -34
  123. ledger/templates/ledger/partials/view-character-ledger/character-billboard.html +25 -0
  124. ledger/templates/ledger/partials/view-character-ledger/character-ledger-details.html +21 -0
  125. ledger/templates/ledger/partials/view-character-ledger/character-table.html +25 -0
  126. ledger/templates/ledger/partials/view-character-ledger/information/daily.html +18 -0
  127. ledger/templates/ledger/partials/view-character-ledger/information/hourly.html +18 -0
  128. ledger/templates/ledger/partials/view-character-ledger/information/summary.html +19 -0
  129. ledger/templates/ledger/partials/view-character-planetary/extractor-table.html +24 -0
  130. ledger/templates/ledger/partials/view-character-planetary/factory-table.html +24 -0
  131. ledger/templates/ledger/partials/view-character-planetary/planetary-table.html +22 -0
  132. ledger/templates/ledger/partials/view-character-planetary/storage-table.html +23 -0
  133. ledger/templates/ledger/partials/{administration → view-corporation-administration}/corporation.html +5 -13
  134. ledger/templates/ledger/partials/{administration → view-corporation-administration}/corporation_characters.html +1 -1
  135. ledger/templates/ledger/partials/view-corporation-administration/dashboard.html +81 -0
  136. ledger/templates/ledger/partials/view-corporation-ledger/corporation-billboard.html +25 -0
  137. ledger/templates/ledger/partials/view-corporation-ledger/corporation-ledger-details.html +21 -0
  138. ledger/templates/ledger/partials/view-corporation-ledger/corporation-table.html +26 -0
  139. ledger/templates/ledger/partials/view-corporation-ledger/information/daily.html +18 -0
  140. ledger/templates/ledger/partials/view-corporation-ledger/information/hourly.html +18 -0
  141. ledger/templates/ledger/partials/view-corporation-ledger/information/summary.html +19 -0
  142. ledger/templates/ledger/view-administration.html +62 -0
  143. ledger/templates/ledger/view-alliance-administration.html +49 -0
  144. ledger/templates/ledger/view-alliance-ledger.html +72 -0
  145. ledger/templates/ledger/view-alliance-overview.html +131 -0
  146. ledger/templates/ledger/view-character-administration.html +42 -0
  147. ledger/templates/ledger/view-character-ledger.html +73 -0
  148. ledger/templates/ledger/view-character-overview.html +135 -0
  149. ledger/templates/ledger/view-character-planetary-overview.html +135 -0
  150. ledger/templates/ledger/view-character-planetary.html +73 -0
  151. ledger/templates/ledger/view-corporation-administration.html +42 -0
  152. ledger/templates/ledger/view-corporation-ledger.html +73 -0
  153. ledger/templates/ledger/view-corporation-overview.html +131 -0
  154. ledger/templatetags/ledger.py +3 -5
  155. ledger/tests/__init__.py +187 -0
  156. ledger/tests/test_admin.py +164 -68
  157. ledger/tests/test_auth_hook.py +31 -13
  158. ledger/tests/test_decarators.py +14 -79
  159. ledger/tests/test_discord_installed.py +0 -1
  160. ledger/tests/test_helpers/test_ledger_data.py +19 -0
  161. ledger/tests/test_managers/test_character_audit_manager.py +111 -69
  162. ledger/tests/test_managers/test_character_journal_manager.py +48 -208
  163. ledger/tests/test_managers/test_character_mining_manager.py +37 -16
  164. ledger/tests/test_managers/test_corporation_division_manager.py +66 -28
  165. ledger/tests/test_managers/test_corporation_journal_manager.py +39 -42
  166. ledger/tests/test_managers/test_general_manager.py +78 -18
  167. ledger/tests/test_managers/test_planetary_manager.py +73 -32
  168. ledger/tests/test_models/test_characteraudit.py +58 -74
  169. ledger/tests/test_models/test_characterminingledger.py +20 -26
  170. ledger/tests/test_models/test_characterwalletjournal.py +10 -33
  171. ledger/tests/test_models/test_corporationaudit.py +41 -35
  172. ledger/tests/test_models/test_corporationwalletjournal.py +35 -32
  173. ledger/tests/test_models/test_general.py +44 -11
  174. ledger/tests/test_models/test_planetary.py +14 -80
  175. ledger/tests/test_templatetags.py +2 -7
  176. ledger/tests/test_views/corporation/test_add_corp.py +16 -35
  177. ledger/tests/test_views/corporation/test_delete_corporation.py +66 -42
  178. ledger/tests/test_views/test_access.py +512 -545
  179. ledger/tests/test_views/test_add_ally.py +57 -46
  180. ledger/tests/test_views/test_add_char.py +21 -33
  181. ledger/tests/test_views/test_delete_character.py +24 -21
  182. ledger/tests/testdata/README_ESI_STUB.md +430 -0
  183. ledger/tests/testdata/esi_stub_openapi.py +511 -0
  184. ledger/tests/testdata/integrations/__init__.py +0 -0
  185. ledger/tests/testdata/{load_eveuniverse.py → integrations/eveuniverse.py} +0 -1
  186. ledger/tests/testdata/integrations/planetary.py +13 -0
  187. ledger/tests/testdata/json/factory.json +281 -0
  188. ledger/tests/testdata/json/inactive.json +281 -0
  189. ledger/tests/testdata/json/pins.json +175 -272
  190. ledger/tests/testdata/json/route.json +95 -528
  191. ledger/tests/testdata/test_esi_stub.py +468 -0
  192. ledger/tests/testdata/utils.py +601 -0
  193. ledger/thirdparty/charlink_hook.py +60 -30
  194. ledger/urls.py +0 -135
  195. ledger/views/alliance/add_ally.py +2 -4
  196. ledger/views/alliance/alliance_ledger.py +64 -147
  197. ledger/views/character/add_char.py +8 -10
  198. ledger/views/character/character_ledger.py +60 -126
  199. ledger/views/character/planetary.py +5 -98
  200. ledger/views/corporation/add_corp.py +10 -12
  201. ledger/views/corporation/corporation_ledger.py +65 -327
  202. ledger/views/index.py +92 -30
  203. aa_ledger-1.0.4.dist-info/RECORD +0 -236
  204. ledger/api/api_helper/planetary_helper.py +0 -107
  205. ledger/api/ledger/__init__.py +0 -7
  206. ledger/api/ledger/planetary.py +0 -231
  207. ledger/helpers/alliance.py +0 -317
  208. ledger/helpers/character.py +0 -251
  209. ledger/helpers/core.py +0 -665
  210. ledger/helpers/corporation.py +0 -427
  211. ledger/helpers/data_exporter.py +0 -452
  212. ledger/static/ledger/js/planetary-confirm.js +0 -66
  213. ledger/static/ledger/js/planetary.js +0 -143
  214. ledger/templates/ledger/admin.html +0 -43
  215. ledger/templates/ledger/allyledger/admin/alliance_administration.html +0 -46
  216. ledger/templates/ledger/allyledger/admin/alliance_overview.html +0 -108
  217. ledger/templates/ledger/allyledger/alliance_ledger.html +0 -86
  218. ledger/templates/ledger/bundles/character-ledger-bundles.html +0 -66
  219. ledger/templates/ledger/bundles/corporation-ledger-bundles.html +0 -75
  220. ledger/templates/ledger/bundles/ledger-bundles.html +0 -23
  221. ledger/templates/ledger/bundles/ledger-css.html +0 -3
  222. ledger/templates/ledger/bundles/planetary-bundles.html +0 -50
  223. ledger/templates/ledger/bundles/table-css.html +0 -3
  224. ledger/templates/ledger/charledger/admin/character_administration.html +0 -39
  225. ledger/templates/ledger/charledger/admin/character_overview.html +0 -106
  226. ledger/templates/ledger/charledger/character_ledger.html +0 -94
  227. ledger/templates/ledger/charledger/planetary/admin/planetary_overview.html +0 -123
  228. ledger/templates/ledger/charledger/planetary/planetary_ledger.html +0 -54
  229. ledger/templates/ledger/corpledger/admin/corporation_administration.html +0 -39
  230. ledger/templates/ledger/corpledger/admin/corporation_overview.html +0 -108
  231. ledger/templates/ledger/corpledger/corporation_ledger.html +0 -129
  232. ledger/templates/ledger/data-export.html +0 -78
  233. ledger/templates/ledger/error.html +0 -31
  234. ledger/templates/ledger/partials/form/error-message.html +0 -1
  235. ledger/templates/ledger/partials/information/daily.html +0 -56
  236. ledger/templates/ledger/partials/information/day.html +0 -48
  237. ledger/templates/ledger/partials/information/error.html +0 -8
  238. ledger/templates/ledger/partials/information/hourly.html +0 -53
  239. ledger/templates/ledger/partials/information/summary.html +0 -88
  240. ledger/templates/ledger/partials/information/view_character_content.html +0 -35
  241. ledger/templates/ledger/partials/modal/switchalarm_confirm.html +0 -39
  242. ledger/templates/ledger/partials/modal/view_extractor.html +0 -48
  243. ledger/templates/ledger/partials/modal/view_factory.html +0 -123
  244. ledger/templates/ledger/partials/table/char-ledger.html +0 -85
  245. ledger/templates/ledger/partials/table/corp-ledger.html +0 -66
  246. ledger/templates/ledger/partials/table/planetary.html +0 -18
  247. ledger/templates/ledger/partials/thirdparty/billboard.html +0 -22
  248. ledger/templates/ledger/partials/view/card.html +0 -160
  249. ledger/templates/ledger/permission.html +0 -2
  250. ledger/tests/test_helpers/test_billboard.py +0 -11
  251. ledger/tests/test_helpers/test_data_exporter.py +0 -207
  252. ledger/tests/test_tasks.py +0 -282
  253. ledger/tests/test_view_helpers/test_core.py +0 -47
  254. ledger/tests/test_views/corporation/test_corporation.py +0 -267
  255. ledger/tests/test_views/test_planetary.py +0 -137
  256. ledger/tests/testdata/esi_stub.py +0 -109
  257. ledger/tests/testdata/esi_stub_migration.py +0 -80
  258. ledger/tests/testdata/generate_characteraudit.py +0 -106
  259. ledger/tests/testdata/generate_corporationaudit.py +0 -74
  260. ledger/tests/testdata/generate_events.py +0 -31
  261. ledger/tests/testdata/generate_miningledger.py +0 -13
  262. ledger/tests/testdata/generate_planets.py +0 -48
  263. ledger/tests/testdata/generate_walletjournal.py +0 -42
  264. ledger/tests/testdata/json/czarno-pins.json +0 -240
  265. ledger/tests/testdata/json/czarno-routes.json +0 -165
  266. ledger/tests/testdata/json/pins2.json +0 -538
  267. {aa_ledger-1.0.4.dist-info → aa_ledger-2.0.0.dist-info}/WHEEL +0 -0
  268. {aa_ledger-1.0.4.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
@@ -1,20 +1,14 @@
1
1
  # Standard Library
2
- from unittest.mock import Mock, patch
2
+ from unittest.mock import patch
3
3
 
4
4
  # Django
5
5
  from django.contrib.admin.sites import AdminSite
6
- from django.contrib.messages.middleware import MessageMiddleware
7
- from django.contrib.sessions.middleware import SessionMiddleware
8
- from django.test import RequestFactory, override_settings
6
+ from django.test import override_settings
9
7
  from django.utils import timezone
10
- from django.utils.safestring import mark_safe
11
8
 
12
9
  # Alliance Auth
13
10
  from allianceauth.eveonline.evelinks import eveimageserver
14
11
 
15
- # Alliance Auth (External Libs)
16
- from app_utils.testing import NoSocketsTestCase
17
-
18
12
  # AA Ledger
19
13
  from ledger.admin import (
20
14
  CharacterAuditAdmin,
@@ -22,18 +16,13 @@ from ledger.admin import (
22
16
  CorporationAuditAdmin,
23
17
  CorporationUpdateStatusAdminInline,
24
18
  )
25
- from ledger.models.characteraudit import CharacterAudit, CharacterUpdateStatus
26
- from ledger.models.corporationaudit import CorporationAudit, CorporationUpdateStatus
27
- from ledger.tests.testdata.generate_characteraudit import (
28
- add_characteraudit_character_to_user,
19
+ from ledger.models.characteraudit import CharacterOwner, CharacterUpdateStatus
20
+ from ledger.models.corporationaudit import CorporationOwner, CorporationUpdateStatus
21
+ from ledger.tests import LedgerTestCase
22
+ from ledger.tests.testdata.utils import (
23
+ add_owner_to_user,
29
24
  create_update_status,
30
25
  )
31
- from ledger.tests.testdata.generate_corporationaudit import (
32
- add_corporationaudit_corporation_to_user,
33
- create_corporation_update_status,
34
- create_user_from_evecharacter,
35
- )
36
- from ledger.tests.testdata.load_allianceauth import load_allianceauth
37
26
 
38
27
  ADMIN_PATH = "ledger.admin"
39
28
 
@@ -43,29 +32,26 @@ class MockRequest:
43
32
 
44
33
 
45
34
  @override_settings(CELERY_ALWAYS_EAGER=True, CELERY_EAGER_PROPAGATES_EXCEPTIONS=True)
46
- class TestCorporationAuditAdmin(NoSocketsTestCase):
35
+ class TestCorporationAuditAdmin(LedgerTestCase):
36
+ """Test Backend AA Administration for Ledger."""
37
+
47
38
  @classmethod
48
39
  def setUpClass(cls) -> None:
49
40
  super().setUpClass()
50
- load_allianceauth()
51
41
 
52
- cls.factory = RequestFactory()
53
42
  cls.site = AdminSite()
54
43
 
55
- cls.user, cls.character_ownership = create_user_from_evecharacter(
56
- 1001,
57
- ["ledger.basic_access"],
58
- )
59
- cls.corporation_audit_admin = CorporationAuditAdmin(CorporationAudit, cls.site)
60
- cls.corporation_audit = add_corporationaudit_corporation_to_user(
44
+ cls.corporation_audit_admin = CorporationAuditAdmin(CorporationOwner, cls.site)
45
+ cls.corporation_audit = add_owner_to_user(
61
46
  cls.user,
62
- cls.character_ownership.character.character_id,
47
+ cls.user_character.character.character_id,
48
+ owner_type="corporation",
63
49
  )
64
- cls.user.is_superuser = True
65
50
 
66
- cls.update_status = create_corporation_update_status(
67
- cls.corporation_audit,
51
+ cls.update_status = create_update_status(
52
+ owner=cls.corporation_audit,
68
53
  section="wallet_journal",
54
+ owner_type="corporation",
69
55
  last_update_at=timezone.now() - timezone.timedelta(minutes=5),
70
56
  last_update_finished_at=timezone.now() - timezone.timedelta(minutes=3),
71
57
  last_run_at=timezone.now() - timezone.timedelta(minutes=4),
@@ -73,42 +59,75 @@ class TestCorporationAuditAdmin(NoSocketsTestCase):
73
59
  )
74
60
 
75
61
  def test_get_queryset(self):
76
- qs = self.corporation_audit_admin.get_queryset(CorporationAudit.objects.all())
62
+ """
63
+ Test get_queryset method.
64
+
65
+ This test ensures that the get_queryset method of the CorporationAuditAdmin
66
+ class returns a valid queryset without errors.
67
+ """
68
+ # Test Action
69
+ qs = self.corporation_audit_admin.get_queryset(CorporationOwner.objects.all())
70
+ # Expected Result
77
71
  self.assertIsNotNone(qs)
78
72
 
79
73
  def test_run_update_duration(self):
74
+ """
75
+ Test run and update duration calculations in inline admin.
76
+
77
+ This test verifies that the duration calculations for run and update times
78
+ in the CorporationUpdateStatusAdminInline class are functioning correctly.
79
+ """
80
+ # Test Data
80
81
  inline = CorporationUpdateStatusAdminInline(CorporationUpdateStatus, self.site)
81
82
 
83
+ # Test Action
82
84
  run_duration = inline._run_duration(self.update_status)
83
85
  update_duration = inline._update_duration(self.update_status).replace(
84
86
  "\xa0", " "
85
87
  )
88
+
89
+ # Expected Results
86
90
  self.assertIn("minute", run_duration)
87
91
  self.assertIn("2 minutes", update_duration)
88
92
  self.assertEqual(inline._calc_duration(None, None), "-")
89
93
 
90
94
  @patch(ADMIN_PATH + ".update_corporation.delay")
91
95
  def test_force_update(self, mock_update_character_delay):
96
+ """
97
+ Test force_update admin action.
98
+
99
+ This test checks that the force_update method in the CorporationAuditAdmin
100
+ class correctly triggers the update_corporation task when invoked.
101
+ """
102
+ # Test Data
92
103
  request = self.factory.get("/")
93
- request.user = self.user
104
+ request.user = self.superuser
94
105
 
95
- # Add session middleware to process the request
96
- middleware = SessionMiddleware(Mock())
97
- middleware.process_request(request)
98
- message_middleware = MessageMiddleware(Mock())
99
- message_middleware.process_request(request)
106
+ self._middleware_process_request(request)
107
+ queryset = CorporationOwner.objects.filter(pk=self.corporation_audit.pk)
100
108
 
101
- queryset = CorporationAudit.objects.filter(pk=self.corporation_audit.pk)
109
+ # Test Action
102
110
  self.corporation_audit_admin.force_update(request, queryset)
111
+
112
+ # Expected Result
103
113
  mock_update_character_delay.assert_called_once()
104
114
 
105
115
  def test_entity_pic(self):
106
- self.client.force_login(self.user)
116
+ """
117
+ Test entity picture display in admin.
118
+
119
+ This test verifies that the _entity_pic method in the CorporationAuditAdmin
120
+ class returns the correct HTML for displaying the corporation's image.
121
+ """
122
+ # Test Data
123
+ self.client.force_login(self.superuser)
107
124
  request = self.factory.get("/")
108
- request.user = self.user
125
+ request.user = self.superuser
126
+
127
+ # Test Action/Expected Result
109
128
  expected_html = '<img src="{}" class="img-circle">'.format(
110
129
  eveimageserver._eve_entity_image_url(
111
- "corporation", self.corporation_audit.corporation.corporation_id, 32
130
+ "corporation", self.corporation_audit.eve_corporation.corporation_id, 32
112
131
  )
113
132
  )
114
133
  self.assertEqual(
@@ -117,9 +136,19 @@ class TestCorporationAuditAdmin(NoSocketsTestCase):
117
136
  )
118
137
 
119
138
  def test_corporation_corporation_id(self):
120
- self.client.force_login(self.user)
139
+ """
140
+ Test corporation ID display in admin.
141
+
142
+ This test checks that the _corporation__corporation_id method in the
143
+ CorporationAuditAdmin class returns the correct corporation ID.
144
+ """
145
+ # Test Data
146
+ self.client.force_login(self.superuser)
147
+
121
148
  request = self.factory.get("/")
122
- request.user = self.user
149
+ request.user = self.superuser
150
+
151
+ # Test Action/Expected Result
123
152
  self.assertEqual(
124
153
  self.corporation_audit_admin._corporation__corporation_id(
125
154
  self.corporation_audit
@@ -128,16 +157,33 @@ class TestCorporationAuditAdmin(NoSocketsTestCase):
128
157
  )
129
158
 
130
159
  def test_has_add_permission(self):
131
- self.client.force_login(self.user)
160
+ """
161
+ Test has_add_permission method.
162
+
163
+ This test ensures that the has_add_permission method of the CorporationAuditAdmin
164
+ class always returns False, preventing addition of new corporation audits
165
+ """
166
+ # Test Data
167
+ self.client.force_login(self.superuser)
132
168
  request = self.factory.get("/")
133
- request.user = self.user
169
+ request.user = self.superuser
170
+
171
+ # Test Action/Expected Result
134
172
  self.assertFalse(self.corporation_audit_admin.has_add_permission(request))
135
173
 
136
174
  def test_has_change_permission(self):
137
- self.client.force_login(self.user)
175
+ """
176
+ Test has_change_permission method.
177
+
178
+ This test ensures that the has_change_permission method of the CorporationAuditAdmin
179
+ class always returns False, preventing changes to existing corporation audits.
180
+ """
181
+ # Test Data
182
+ self.client.force_login(self.superuser)
138
183
  request = self.factory.get("/")
139
- request.user = self.user
140
- request = MockRequest()
184
+ request.user = self.superuser
185
+
186
+ # Test Action/Expected Result
141
187
  self.assertFalse(self.corporation_audit_admin.has_change_permission(request))
142
188
  self.assertFalse(
143
189
  self.corporation_audit_admin.has_change_permission(
@@ -146,24 +192,18 @@ class TestCorporationAuditAdmin(NoSocketsTestCase):
146
192
  )
147
193
 
148
194
 
149
- class TestCharacterAuditAdmin(NoSocketsTestCase):
195
+ class TestCharacterAuditAdmin(LedgerTestCase):
150
196
  @classmethod
151
197
  def setUpClass(cls) -> None:
152
198
  super().setUpClass()
153
- load_allianceauth()
154
- cls.factory = RequestFactory()
155
199
  cls.site = AdminSite()
156
200
 
157
- cls.user, cls.character_ownership = create_user_from_evecharacter(
158
- 1001,
159
- ["ledger.basic_access"],
160
- )
161
- cls.character_audit_admin = CharacterAuditAdmin(CharacterAudit, cls.site)
162
- cls.character_audit = add_characteraudit_character_to_user(
201
+ cls.character_audit_admin = CharacterAuditAdmin(CharacterOwner, cls.site)
202
+ cls.character_audit = add_owner_to_user(
163
203
  cls.user,
164
- cls.character_ownership.character.character_id,
204
+ cls.user_character.character.character_id,
205
+ owner_type="character",
165
206
  )
166
- cls.user.is_superuser = True
167
207
  cls.update_status = create_update_status(
168
208
  cls.character_audit,
169
209
  section="wallet_journal",
@@ -174,36 +214,62 @@ class TestCharacterAuditAdmin(NoSocketsTestCase):
174
214
  )
175
215
 
176
216
  def test_get_queryset(self):
177
- qs = self.character_audit_admin.get_queryset(CharacterAudit.objects.all())
217
+ qs = self.character_audit_admin.get_queryset(CharacterOwner.objects.all())
178
218
  self.assertIsNotNone(qs)
179
219
 
180
220
  @patch(ADMIN_PATH + ".update_character.delay")
181
221
  def test_force_update(self, mock_update_character_delay):
182
- queryset = CharacterAudit.objects.filter(pk=self.character_audit.pk)
222
+ """
223
+ Test force_update admin action.
224
+
225
+ This test checks that the force_update method in the CharacterAuditAdmin
226
+ class correctly triggers the update_character task when invoked.
227
+ """
228
+ # Test Data
229
+ queryset = CharacterOwner.objects.filter(pk=self.character_audit.pk)
183
230
  request = self.factory.get("/")
231
+ request.user = self.superuser
184
232
 
185
- # Add session middleware to process the request
186
- middleware = SessionMiddleware(Mock())
187
- middleware.process_request(request)
188
- message_middleware = MessageMiddleware(Mock())
189
- message_middleware.process_request(request)
233
+ self._middleware_process_request(request)
190
234
 
235
+ # Test Action
191
236
  self.character_audit_admin.force_update(request, queryset)
237
+
238
+ # Expected Result
192
239
  mock_update_character_delay.assert_called_once()
193
240
 
194
241
  def test_run_update_duration(self):
242
+ """
243
+ Test run and update duration calculations in inline admin.
244
+
245
+ This test verifies that the duration calculations for run and update times
246
+ in the CharacterUpdateStatusAdminInline class are functioning correctly.
247
+ """
248
+ # Test Data
195
249
  inline = CharacterUpdateStatusAdminInline(CharacterUpdateStatus, self.site)
196
250
 
251
+ # Test Action
197
252
  run_duration = inline._run_duration(self.update_status)
198
253
  update_duration = inline._update_duration(self.update_status).replace(
199
254
  "\xa0", " "
200
255
  )
256
+
257
+ # Expected Results
201
258
  self.assertIn("minute", run_duration)
202
259
  self.assertIn("2 minutes", update_duration)
203
260
  self.assertEqual(inline._calc_duration(None, None), "-")
204
261
 
205
262
  def test_entity_pic(self):
206
- self.client.force_login(self.user)
263
+ """
264
+ Test entity picture rendering in admin.
265
+
266
+ This test verifies that the _entity_pic method in the CharacterAuditAdmin
267
+ class returns the correct HTML for displaying the character's image.
268
+ """
269
+ # Test Data
270
+ self.client.force_login(self.superuser)
271
+
272
+ # Test Action/Expected Result
207
273
  expected_html = '<img src="{}" class="img-circle">'.format(
208
274
  eveimageserver._eve_entity_image_url(
209
275
  "character", self.character_audit.eve_character.character_id, 32
@@ -214,6 +280,16 @@ class TestCharacterAuditAdmin(NoSocketsTestCase):
214
280
  )
215
281
 
216
282
  def test_character_character_name(self):
283
+ """
284
+ Test character name display in admin.
285
+
286
+ This test checks that the _eve_character__character_name method in the
287
+ CharacterAuditAdmin class returns the correct character name.
288
+ """
289
+ # Test Data
290
+ self.client.force_login(self.superuser)
291
+
292
+ # Test Action/Expected Result
217
293
  self.assertEqual(
218
294
  self.character_audit_admin._eve_character__character_name(
219
295
  self.character_audit
@@ -222,11 +298,31 @@ class TestCharacterAuditAdmin(NoSocketsTestCase):
222
298
  )
223
299
 
224
300
  def test_has_add_permission(self):
301
+ """
302
+ Test has_add_permission method.
303
+
304
+ This test ensures that the has_add_permission method of the CharacterAuditAdmin
305
+ class always returns False, preventing addition of new character audits.
306
+ """
307
+ # Test Data
225
308
  request = self.factory.get("/")
309
+ request.user = self.superuser
310
+
311
+ # Test Action/Expected Result
226
312
  self.assertFalse(self.character_audit_admin.has_add_permission(request))
227
313
 
228
314
  def test_has_change_permission(self):
315
+ """
316
+ Test has_change_permission method.
317
+
318
+ This test ensures that the has_change_permission method of the CharacterAuditAdmin
319
+ class always returns False, preventing changes to existing character audits.
320
+ """
321
+ # Test Data
229
322
  request = self.factory.get("/")
323
+ request.user = self.superuser
324
+
325
+ # Test Action/Expected Result
230
326
  self.assertFalse(self.character_audit_admin.has_change_permission(request))
231
327
  self.assertFalse(
232
328
  self.character_audit_admin.has_change_permission(
@@ -2,22 +2,19 @@
2
2
  from unittest.mock import MagicMock
3
3
 
4
4
  # Django
5
- from django.test import TestCase
6
5
  from django.urls import reverse
7
6
 
8
- # Alliance Auth (External Libs)
9
- from app_utils.testdata_factories import UserMainFactory
10
-
11
7
  # AA Ledger
12
8
  from ledger.auth_hooks import LedgerMenuItem, register_charlink_hook
9
+ from ledger.tests import LedgerTestCase
13
10
 
14
11
 
15
- class TestAuthHooks(TestCase):
12
+ class TestAuthHooks(LedgerTestCase):
13
+ """Test Alliance Auth Menu Hooks for Ledger"""
16
14
 
17
15
  @classmethod
18
16
  def setUpClass(cls) -> None:
19
17
  super().setUpClass()
20
- cls.user = UserMainFactory(permissions=["ledger.basic_access"])
21
18
  cls.html_menu = f"""
22
19
  <li class="d-flex flex-wrap m-2 p-2 pt-0 pb-0 mt-0 mb-0 me-0 pe-0">
23
20
  <i class="nav-link fas fa-book fa-fw fa-fw align-self-center me-3 active"></i>
@@ -28,27 +25,40 @@ class TestAuthHooks(TestCase):
28
25
  """
29
26
 
30
27
  def test_menu_hook(self):
28
+ """
29
+ Test that the menu hook renders correctly for a user with permission.
30
+
31
+ This test logs in a user with the 'ledger.basic_access' permission
32
+ and verifies that the Ledger menu item is present in the rendered HTML.
33
+ """
34
+ # Test Data
31
35
  self.client.force_login(self.user)
32
36
 
37
+ # Test Action
33
38
  response = self.client.get(
34
39
  reverse("ledger:index"), follow=True
35
40
  ) # Follow redirects
36
41
 
37
- # Überprüfen, ob der Benutzer korrekt weitergeleitet wurde
42
+ # Expected Results
38
43
  self.assertEqual(response.status_code, 200)
39
-
40
- # Überprüfen, ob das HTML-Menü enthalten ist
41
44
  self.assertContains(response, self.html_menu, html=True)
42
45
 
43
46
  def test_render_returns_empty_string_for_user_without_permission(self):
44
- # given
47
+ """
48
+ Test that the render method returns an empty string for a user without permission.
49
+
50
+ This test creates a mock request for a user who lacks the 'ledger.basic_access' permission
51
+ and verifies that the render method of LedgerMenuItem returns an empty string.
52
+ """
53
+ # Test Data
45
54
  ledger_menu_item = LedgerMenuItem()
46
55
  mock_request = MagicMock()
47
56
  mock_request.user.has_perm.return_value = False
48
57
 
49
- # when
58
+ # Test Action
50
59
  result = ledger_menu_item.render(mock_request)
51
- # then
60
+
61
+ # Expected Result
52
62
  self.assertEqual(
53
63
  result,
54
64
  "",
@@ -56,6 +66,14 @@ class TestAuthHooks(TestCase):
56
66
  )
57
67
 
58
68
  def test_register_charlink_hook(self):
59
- # Verify that the hook returns the expected value
69
+ """
70
+ Test that the register_charlink_hook function returns the expected value.
71
+
72
+ This test calls the register_charlink_hook function and verifies that it returns
73
+ the correct string indicating the charlink hook location.
74
+ """
75
+ # Test Action
60
76
  result = register_charlink_hook()
77
+
78
+ # Expected Result
61
79
  self.assertEqual(result, "ledger.thirdparty.charlink_hook")
@@ -1,99 +1,34 @@
1
- # Standard Library
2
- from unittest.mock import patch
3
-
4
1
  # Alliance Auth
5
2
  from allianceauth.services.hooks import get_extension_logger
6
3
 
7
- # Alliance Auth (External Libs)
8
- from app_utils.logging import LoggerAddTag
9
- from app_utils.testing import NoSocketsTestCase
10
-
11
4
  # AA Ledger
12
5
  from ledger import __title__
13
6
  from ledger.decorators import (
14
7
  log_timing,
15
- when_esi_is_available,
16
8
  )
9
+ from ledger.providers import AppLogger
10
+ from ledger.tests import LedgerTestCase
17
11
 
18
12
  DECORATOR_PATH = "ledger.decorators."
19
13
 
20
14
 
21
- @patch(DECORATOR_PATH + "ESI_STATUS_ROUTE_RATE_LIMIT", new=1)
22
- class TestDecorators(NoSocketsTestCase):
23
- @patch(DECORATOR_PATH + "fetch_esi_status")
24
- @patch(DECORATOR_PATH + "IS_TESTING", new=True)
25
- def test_when_esi_is_available_is_test(self, mock_fetch_esi_status):
26
- """Test when ESI is available in testing mode."""
27
-
28
- @when_esi_is_available
29
- def trigger_esi_deco():
30
- return "Testing Mode."
31
-
32
- # when
33
- result = trigger_esi_deco()
34
- # then
35
- self.assertEqual(result, "Testing Mode.")
36
-
37
- @patch(DECORATOR_PATH + "fetch_esi_status")
38
- @patch(DECORATOR_PATH + "IS_TESTING", new=False)
39
- def test_when_esi_is_ok(self, mock_fetch_esi_status):
40
- """Test when ESI is available in non-testing mode."""
41
-
42
- # ensure the fetch_esi_status call reports ESI as up
43
- mock_fetch_esi_status.return_value.is_ok = True
44
-
45
- @when_esi_is_available
46
- def trigger_esi_deco():
47
- return "Esi is Available"
48
-
49
- # when
50
- result = trigger_esi_deco()
51
- # then
52
- mock_fetch_esi_status.assert_called_once()
53
- self.assertEqual(result, "Esi is Available")
54
-
55
- @patch(DECORATOR_PATH + "fetch_esi_status")
56
- @patch(DECORATOR_PATH + "IS_TESTING", new=False)
57
- def test_when_esi_is_not_ok(self, mock_fetch_esi_status):
58
- """Test when ESI is not available in non-testing mode."""
59
- # ensure the fetch_esi_status call reports ESI as down
60
- mock_fetch_esi_status.return_value.is_ok = False
61
-
62
- @when_esi_is_available
63
- def trigger_esi_deco():
64
- return None
65
-
66
- # when
67
- result = trigger_esi_deco()
68
- # then
69
- self.assertIsNone(result)
70
-
71
- @patch(DECORATOR_PATH + "fetch_esi_status")
72
- @patch(DECORATOR_PATH + "IS_TESTING", new=False)
73
- def test_when_esi_is_ok_and_cached(self, mock_fetch_esi_status):
74
- """Test when ESI is available in non-testing mode and cached."""
75
- # Make a Exception to ensure fetch_esi_status is not called
76
- mock_fetch_esi_status.side_effect = Exception("Should not be called")
77
-
78
- @when_esi_is_available
79
- def trigger_esi_deco():
80
- return "Esi is Available"
81
-
82
- # when
83
- result = trigger_esi_deco()
84
- # then
85
- mock_fetch_esi_status.assert_not_called()
86
- self.assertEqual(result, "Esi is Available")
87
-
15
+ class TestDecorators(LedgerTestCase):
88
16
  def test_log_timing(self):
89
- # given
90
- logger = LoggerAddTag(get_extension_logger(__name__), __title__)
17
+ """
18
+ Test log_timing decorator functionality.
19
+
20
+ This test defines a simple function decorated with log_timing and
21
+ verifies that it returns the expected result.
22
+ """
23
+ # Test Data
24
+ logger = AppLogger(get_extension_logger(__name__), __title__)
91
25
 
92
26
  @log_timing(logger)
93
27
  def trigger_log_timing():
94
28
  return "Log Timing"
95
29
 
96
- # when
30
+ # Test Action
97
31
  result = trigger_log_timing()
98
- # then
32
+
33
+ # Expected Result
99
34
  self.assertEqual(result, "Log Timing")
@@ -2,7 +2,6 @@
2
2
  from django.test import TestCase, modify_settings
3
3
 
4
4
  # AA Ledger
5
- # AA Skillfarm
6
5
  from ledger.helpers.discord import (
7
6
  allianceauth_discordbot_installed,
8
7
  discordnotify_installed,
@@ -0,0 +1,19 @@
1
+ # AA Ledger
2
+ from ledger.tests import LedgerTestCase
3
+
4
+ MODULE_PATH = "ledger.helpers.ledger_data"
5
+
6
+
7
+ class TestCharacterWalletJournalModel(LedgerTestCase):
8
+ @classmethod
9
+ def setUpClass(cls):
10
+ super().setUpClass()
11
+
12
+ def test_get_footer_text_class(self):
13
+ # AA Ledger
14
+ from ledger.helpers.ledger_data import get_footer_text_class
15
+
16
+ self.assertEqual(get_footer_text_class(10), "text-success")
17
+ self.assertEqual(get_footer_text_class(-10), "text-danger")
18
+ self.assertEqual(get_footer_text_class(0), "")
19
+ self.assertEqual(get_footer_text_class(10, mining=True), "text-info")