test_analytics.py 8.4 KB

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