test_analytics.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. from datetime import timedelta
  2. import pytest
  3. from ariadne import gql
  4. from django.utils import timezone
  5. from ....threads.models import Attachment, AttachmentType
  6. from ....threads.test import post_thread
  7. from ....users.datadownloads import request_user_data_download
  8. from ....users.test import create_test_user
  9. test_query = gql(
  10. """
  11. query getAnalytics($span: Int!) {
  12. analytics(span: $span) {
  13. users {
  14. current
  15. previous
  16. }
  17. threads {
  18. current
  19. previous
  20. }
  21. posts {
  22. current
  23. previous
  24. }
  25. attachments {
  26. current
  27. previous
  28. }
  29. dataDownloads {
  30. current
  31. previous
  32. }
  33. }
  34. }
  35. """
  36. )
  37. previous_datetime = timezone.now() - timedelta(days=30)
  38. excluded_datetime = timezone.now() - timedelta(days=60)
  39. def test_query_without_data_executes_without_errors(admin_graphql_client):
  40. result = admin_graphql_client.query(test_query, {"span": 30})
  41. assert result["analytics"]
  42. def test_all_analytics_are_limited_to_requested_span(admin_graphql_client):
  43. result = admin_graphql_client.query(test_query, {"span": 30})
  44. for model_analytics in result["analytics"].values():
  45. assert len(model_analytics["current"]) == 30
  46. assert len(model_analytics["previous"]) == 30
  47. def test_large_analytics_span_is_reduced_to_360(admin_graphql_client):
  48. result = admin_graphql_client.query(test_query, {"span": 3000})
  49. for model_analytics in result["analytics"].values():
  50. assert len(model_analytics["current"]) == 360
  51. assert len(model_analytics["previous"]) == 360
  52. def test_short_analytics_span_is_extended_to_30(admin_graphql_client):
  53. result = admin_graphql_client.query(test_query, {"span": 0})
  54. for model_analytics in result["analytics"].values():
  55. assert len(model_analytics["current"]) == 30
  56. assert len(model_analytics["previous"]) == 30
  57. def test_recent_user_registration_appears_in_current_analytics(admin_graphql_client):
  58. create_test_user("User", "user@example.com")
  59. result = admin_graphql_client.query(test_query, {"span": 30})
  60. analytics = result["analytics"]["users"]
  61. assert sum(analytics["current"]) == 2 # includes admin
  62. assert sum(analytics["previous"]) == 0
  63. def test_older_user_registration_appears_in_previous_analytics(admin_graphql_client):
  64. create_test_user("User", "user@example.com", joined_on=previous_datetime)
  65. result = admin_graphql_client.query(test_query, {"span": 30})
  66. analytics = result["analytics"]["users"]
  67. assert sum(analytics["current"]) == 1 # includes admin
  68. assert sum(analytics["previous"]) == 1
  69. def test_old_user_registration_is_excluded_from_analytics(admin_graphql_client):
  70. create_test_user("User", "user@example.com", joined_on=excluded_datetime)
  71. result = admin_graphql_client.query(test_query, {"span": 30})
  72. analytics = result["analytics"]["users"]
  73. assert sum(analytics["current"]) == 1 # includes admin
  74. assert sum(analytics["previous"]) == 0
  75. def test_recent_thread_appears_in_current_analytics(
  76. admin_graphql_client, default_category
  77. ):
  78. post_thread(default_category)
  79. result = admin_graphql_client.query(test_query, {"span": 30})
  80. analytics = result["analytics"]["threads"]
  81. assert sum(analytics["current"]) == 1
  82. assert sum(analytics["previous"]) == 0
  83. def test_older_thread_appears_in_previous_analytics(
  84. admin_graphql_client, default_category
  85. ):
  86. post_thread(default_category, started_on=previous_datetime)
  87. result = admin_graphql_client.query(test_query, {"span": 30})
  88. analytics = result["analytics"]["threads"]
  89. assert sum(analytics["current"]) == 0
  90. assert sum(analytics["previous"]) == 1
  91. def test_old_thread_is_excluded_from_analytics(admin_graphql_client, default_category):
  92. post_thread(default_category, started_on=excluded_datetime)
  93. result = admin_graphql_client.query(test_query, {"span": 30})
  94. analytics = result["analytics"]["threads"]
  95. assert sum(analytics["current"]) == 0
  96. assert sum(analytics["previous"]) == 0
  97. def test_recent_post_appears_in_current_analytics(
  98. admin_graphql_client, default_category
  99. ):
  100. post_thread(default_category)
  101. result = admin_graphql_client.query(test_query, {"span": 30})
  102. analytics = result["analytics"]["posts"]
  103. assert sum(analytics["current"]) == 1
  104. assert sum(analytics["previous"]) == 0
  105. def test_older_post_appears_in_previous_analytics(
  106. admin_graphql_client, default_category
  107. ):
  108. post_thread(default_category, started_on=previous_datetime)
  109. result = admin_graphql_client.query(test_query, {"span": 30})
  110. analytics = result["analytics"]["posts"]
  111. assert sum(analytics["current"]) == 0
  112. assert sum(analytics["previous"]) == 1
  113. def test_old_post_is_excluded_from_analytics(admin_graphql_client, default_category):
  114. post_thread(default_category, started_on=excluded_datetime)
  115. result = admin_graphql_client.query(test_query, {"span": 30})
  116. analytics = result["analytics"]["posts"]
  117. assert sum(analytics["current"]) == 0
  118. assert sum(analytics["previous"]) == 0
  119. @pytest.fixture
  120. def attachment_type(db):
  121. return AttachmentType.objects.create(name="test", extensions="test")
  122. def test_recent_attachment_appears_in_current_analytics(
  123. admin_graphql_client, attachment_type
  124. ):
  125. Attachment.objects.create(
  126. filetype=attachment_type,
  127. uploader_name="test",
  128. uploader_slug="test",
  129. filename="test",
  130. )
  131. result = admin_graphql_client.query(test_query, {"span": 30})
  132. analytics = result["analytics"]["attachments"]
  133. assert sum(analytics["current"]) == 1
  134. assert sum(analytics["previous"]) == 0
  135. def test_older_attachment_appears_in_previous_analytics(
  136. admin_graphql_client, attachment_type
  137. ):
  138. Attachment.objects.create(
  139. filetype=attachment_type,
  140. uploader_name="test",
  141. uploader_slug="test",
  142. filename="test",
  143. uploaded_on=previous_datetime,
  144. )
  145. result = admin_graphql_client.query(test_query, {"span": 30})
  146. analytics = result["analytics"]["attachments"]
  147. assert sum(analytics["current"]) == 0
  148. assert sum(analytics["previous"]) == 1
  149. def test_old_attachment_is_excluded_from_analytics(
  150. admin_graphql_client, attachment_type
  151. ):
  152. Attachment.objects.create(
  153. filetype=attachment_type,
  154. uploader_name="test",
  155. uploader_slug="test",
  156. filename="test",
  157. uploaded_on=excluded_datetime,
  158. )
  159. result = admin_graphql_client.query(test_query, {"span": 30})
  160. analytics = result["analytics"]["attachments"]
  161. assert sum(analytics["current"]) == 0
  162. assert sum(analytics["previous"]) == 0
  163. def test_recent_data_download_appears_in_current_analytics(
  164. admin_graphql_client, superuser
  165. ):
  166. request_user_data_download(superuser)
  167. result = admin_graphql_client.query(test_query, {"span": 30})
  168. analytics = result["analytics"]["dataDownloads"]
  169. assert sum(analytics["current"]) == 1
  170. assert sum(analytics["previous"]) == 0
  171. def test_older_data_download_appears_in_previous_analytics(
  172. admin_graphql_client, superuser
  173. ):
  174. download = request_user_data_download(superuser)
  175. download.requested_on = previous_datetime
  176. download.save()
  177. result = admin_graphql_client.query(test_query, {"span": 30})
  178. analytics = result["analytics"]["dataDownloads"]
  179. assert sum(analytics["current"]) == 0
  180. assert sum(analytics["previous"]) == 1
  181. def test_old_data_download_is_excluded_from_analytics(admin_graphql_client, superuser):
  182. download = request_user_data_download(superuser)
  183. download.requested_on = excluded_datetime
  184. download.save()
  185. result = admin_graphql_client.query(test_query, {"span": 30})
  186. analytics = result["analytics"]["dataDownloads"]
  187. assert sum(analytics["current"]) == 0
  188. assert sum(analytics["previous"]) == 0