tests.rake 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. # frozen_string_literal: true
  2. namespace :tests do
  3. namespace :migrations do
  4. desc 'Check that database state is consistent with a successful migration from populated data'
  5. task check_database: :environment do
  6. unless Account.find_by(username: 'admin', domain: nil)&.hide_collections? == false
  7. puts 'Unexpected value for Account#hide_collections? for user @admin'
  8. exit(1)
  9. end
  10. unless Account.find_by(username: 'user', domain: nil)&.hide_collections? == true
  11. puts 'Unexpected value for Account#hide_collections? for user @user'
  12. exit(1)
  13. end
  14. unless Account.find_by(username: 'evil', domain: 'activitypub.com')&.suspended?
  15. puts 'Unexpected value for Account#suspended? for user @evil@activitypub.com'
  16. exit(1)
  17. end
  18. unless Status.find(6).account_id == Status.find(7).account_id
  19. puts 'Users @remote@remote.com and @Remote@remote.com not properly merged'
  20. exit(1)
  21. end
  22. if Account.where(domain: Rails.configuration.x.local_domain).exists?
  23. puts 'Faux remote accounts not properly cleaned up'
  24. exit(1)
  25. end
  26. unless AccountConversation.first&.last_status_id == 11
  27. puts 'AccountConversation records not created as expected'
  28. exit(1)
  29. end
  30. if Account.find(-99).private_key.blank?
  31. puts 'Instance actor does not have a private key'
  32. exit(1)
  33. end
  34. unless Account.find_by(username: 'user', domain: nil).custom_filters.map { |filter| filter.keywords.pluck(:keyword) } == [['test'], ['take']]
  35. puts 'CustomFilterKeyword records not created as expected'
  36. exit(1)
  37. end
  38. unless Admin::ActionLog.find_by(target_type: 'DomainBlock', target_id: 1).human_identifier == 'example.org'
  39. puts 'Admin::ActionLog domain block records not updated as expected'
  40. exit(1)
  41. end
  42. unless Admin::ActionLog.find_by(target_type: 'EmailDomainBlock', target_id: 1).human_identifier == 'example.org'
  43. puts 'Admin::ActionLog email domain block records not updated as expected'
  44. exit(1)
  45. end
  46. unless User.find(1).settings['notification_emails.favourite'] == true && User.find(1).settings['notification_emails.mention'] == false
  47. puts 'User settings not kept as expected'
  48. exit(1)
  49. end
  50. unless Account.find_remote('bob', 'ActivityPub.com').domain == 'activitypub.com'
  51. puts 'Account domains not properly normalized'
  52. exit(1)
  53. end
  54. unless Status.find(12).preview_cards.pluck(:url) == ['https://joinmastodon.org/']
  55. puts 'Preview cards not deduplicated as expected'
  56. exit(1)
  57. end
  58. end
  59. desc 'Populate the database with test data for 2.4.3'
  60. task populate_v2_4_3: :environment do # rubocop:disable Naming/VariableNumber
  61. ActiveRecord::Base.connection.execute(<<~SQL)
  62. INSERT INTO "custom_filters"
  63. (id, account_id, phrase, context, whole_word, irreversible, created_at, updated_at)
  64. VALUES
  65. (1, 2, 'test', '{ "home", "public" }', true, true, now(), now()),
  66. (2, 2, 'take', '{ "home" }', false, false, now(), now());
  67. -- Orphaned admin action logs
  68. INSERT INTO "admin_action_logs"
  69. (account_id, action, target_type, target_id, created_at, updated_at)
  70. VALUES
  71. (1, 'destroy', 'Account', 1312, now(), now()),
  72. (1, 'destroy', 'User', 1312, now(), now()),
  73. (1, 'destroy', 'Report', 1312, now(), now()),
  74. (1, 'destroy', 'DomainBlock', 1312, now(), now()),
  75. (1, 'destroy', 'EmailDomainBlock', 1312, now(), now()),
  76. (1, 'destroy', 'Status', 1312, now(), now()),
  77. (1, 'destroy', 'CustomEmoji', 1312, now(), now());
  78. -- Admin action logs with linked objects
  79. INSERT INTO "domain_blocks"
  80. (id, domain, created_at, updated_at)
  81. VALUES
  82. (1, 'example.org', now(), now());
  83. INSERT INTO "email_domain_blocks"
  84. (id, domain, created_at, updated_at)
  85. VALUES
  86. (1, 'example.org', now(), now());
  87. INSERT INTO "admin_action_logs"
  88. (account_id, action, target_type, target_id, created_at, updated_at)
  89. VALUES
  90. (1, 'destroy', 'Account', 1, now(), now()),
  91. (1, 'destroy', 'User', 1, now(), now()),
  92. (1, 'destroy', 'DomainBlock', 1, now(), now()),
  93. (1, 'destroy', 'EmailDomainBlock', 1, now(), now()),
  94. (1, 'destroy', 'Status', 1, now(), now()),
  95. (1, 'destroy', 'CustomEmoji', 3, now(), now());
  96. INSERT INTO "settings"
  97. (id, thing_type, thing_id, var, value, created_at, updated_at)
  98. VALUES
  99. (3, 'User', 1, 'notification_emails', E'--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess\nfollow: false\nreblog: true\nfavourite: true\nmention: false\nfollow_request: true\ndigest: true\nreport: true\npending_account: false\ntrending_tag: true\nappeal: true\n', now(), now());
  100. SQL
  101. end
  102. desc 'Populate the database with test data for 2.4.0'
  103. task populate_v2_4: :environment do # rubocop:disable Naming/VariableNumber
  104. ActiveRecord::Base.connection.execute(<<~SQL.squish)
  105. INSERT INTO "settings"
  106. (id, thing_type, thing_id, var, value, created_at, updated_at)
  107. VALUES
  108. (1, 'User', 1, 'hide_network', E'--- false\n', now(), now()),
  109. (2, 'User', 2, 'hide_network', E'--- true\n', now(), now());
  110. SQL
  111. end
  112. desc 'Populate the database with test data for 2.0.0'
  113. task populate_v2: :environment do
  114. admin_key = OpenSSL::PKey::RSA.new(2048)
  115. user_key = OpenSSL::PKey::RSA.new(2048)
  116. remote_key = OpenSSL::PKey::RSA.new(2048)
  117. remote_key2 = OpenSSL::PKey::RSA.new(2048)
  118. remote_key3 = OpenSSL::PKey::RSA.new(2048)
  119. admin_private_key = ActiveRecord::Base.connection.quote(admin_key.to_pem)
  120. admin_public_key = ActiveRecord::Base.connection.quote(admin_key.public_key.to_pem)
  121. user_private_key = ActiveRecord::Base.connection.quote(user_key.to_pem)
  122. user_public_key = ActiveRecord::Base.connection.quote(user_key.public_key.to_pem)
  123. remote_public_key = ActiveRecord::Base.connection.quote(remote_key.public_key.to_pem)
  124. remote_public_key2 = ActiveRecord::Base.connection.quote(remote_key2.public_key.to_pem)
  125. remote_public_key_ap = ActiveRecord::Base.connection.quote(remote_key3.public_key.to_pem)
  126. local_domain = ActiveRecord::Base.connection.quote(Rails.configuration.x.local_domain)
  127. ActiveRecord::Base.connection.execute(<<~SQL)
  128. -- accounts
  129. INSERT INTO "accounts"
  130. (id, username, domain, private_key, public_key, created_at, updated_at)
  131. VALUES
  132. (1, 'admin', NULL, #{admin_private_key}, #{admin_public_key}, now(), now()),
  133. (2, 'user', NULL, #{user_private_key}, #{user_public_key}, now(), now());
  134. INSERT INTO "accounts"
  135. (id, username, domain, private_key, public_key, created_at, updated_at, remote_url, salmon_url)
  136. VALUES
  137. (3, 'remote', 'remote.com', NULL, #{remote_public_key}, now(), now(),
  138. 'https://remote.com/@remote', 'https://remote.com/salmon/1'),
  139. (4, 'Remote', 'remote.com', NULL, #{remote_public_key}, now(), now(),
  140. 'https://remote.com/@Remote', 'https://remote.com/salmon/1'),
  141. (5, 'REMOTE', 'Remote.com', NULL, #{remote_public_key2}, now() - interval '1 year', now() - interval '1 year',
  142. 'https://remote.com/stale/@REMOTE', 'https://remote.com/stale/salmon/1');
  143. INSERT INTO "accounts"
  144. (id, username, domain, private_key, public_key, created_at, updated_at, protocol, inbox_url, outbox_url, followers_url)
  145. VALUES
  146. (6, 'bob', 'ActivityPub.com', NULL, #{remote_public_key_ap}, now(), now(),
  147. 1, 'https://activitypub.com/users/bob/inbox', 'https://activitypub.com/users/bob/outbox', 'https://activitypub.com/users/bob/followers');
  148. INSERT INTO "accounts"
  149. (id, username, domain, private_key, public_key, created_at, updated_at)
  150. VALUES
  151. (7, 'user', #{local_domain}, #{user_private_key}, #{user_public_key}, now(), now()),
  152. (8, 'pt_user', NULL, #{user_private_key}, #{user_public_key}, now(), now());
  153. INSERT INTO "accounts"
  154. (id, username, domain, private_key, public_key, created_at, updated_at, protocol, inbox_url, outbox_url, followers_url, suspended)
  155. VALUES
  156. (9, 'evil', 'activitypub.com', NULL, #{remote_public_key_ap}, now(), now(),
  157. 1, 'https://activitypub.com/users/evil/inbox', 'https://activitypub.com/users/evil/outbox',
  158. 'https://activitypub.com/users/evil/followers', true);
  159. -- users
  160. INSERT INTO "users"
  161. (id, account_id, email, created_at, updated_at, admin)
  162. VALUES
  163. (1, 1, 'admin@localhost', now(), now(), true),
  164. (2, 2, 'user@localhost', now(), now(), false);
  165. INSERT INTO "users"
  166. (id, account_id, email, created_at, updated_at, admin, locale)
  167. VALUES
  168. (3, 7, 'ptuser@localhost', now(), now(), false, 'pt');
  169. -- conversations
  170. INSERT INTO "conversations" (id, created_at, updated_at) VALUES (1, now(), now());
  171. -- statuses
  172. INSERT INTO "statuses"
  173. (id, account_id, text, created_at, updated_at)
  174. VALUES
  175. (1, 1, 'test', now(), now()),
  176. (2, 1, '@remote@remote.com hello', now(), now()),
  177. (3, 1, '@Remote@remote.com hello', now(), now()),
  178. (4, 1, '@REMOTE@remote.com hello', now(), now());
  179. INSERT INTO "statuses"
  180. (id, account_id, text, created_at, updated_at, uri, local)
  181. VALUES
  182. (5, 1, 'activitypub status', now(), now(), 'https://localhost/users/admin/statuses/4', true);
  183. INSERT INTO "statuses"
  184. (id, account_id, text, created_at, updated_at)
  185. VALUES
  186. (6, 3, 'test', now(), now());
  187. INSERT INTO "statuses"
  188. (id, account_id, text, created_at, updated_at, in_reply_to_id, in_reply_to_account_id)
  189. VALUES
  190. (7, 4, '@admin hello', now(), now(), 3, 1);
  191. INSERT INTO "statuses"
  192. (id, account_id, text, created_at, updated_at)
  193. VALUES
  194. (8, 5, 'test', now(), now());
  195. INSERT INTO "statuses"
  196. (id, account_id, reblog_of_id, created_at, updated_at)
  197. VALUES
  198. (9, 1, 2, now(), now());
  199. INSERT INTO "statuses"
  200. (id, account_id, text, in_reply_to_id, conversation_id, visibility, created_at, updated_at)
  201. VALUES
  202. (10, 2, '@admin hey!', NULL, 1, 3, now(), now()),
  203. (11, 1, '@user hey!', 10, 1, 3, now(), now());
  204. INSERT INTO "statuses"
  205. (id, account_id, text, created_at, updated_at)
  206. VALUES
  207. (12, 1, 'check out https://joinmastodon.org/', now(), now());
  208. -- mentions (from previous statuses)
  209. INSERT INTO "mentions"
  210. (id, status_id, account_id, created_at, updated_at)
  211. VALUES
  212. (1, 2, 3, now(), now()),
  213. (2, 3, 4, now(), now()),
  214. (3, 4, 5, now(), now()),
  215. (4, 10, 1, now(), now()),
  216. (5, 11, 2, now(), now());
  217. -- stream entries
  218. INSERT INTO "stream_entries"
  219. (activity_id, account_id, activity_type, created_at, updated_at)
  220. VALUES
  221. (1, 1, 'status', now(), now()),
  222. (2, 1, 'status', now(), now()),
  223. (3, 1, 'status', now(), now()),
  224. (4, 1, 'status', now(), now()),
  225. (5, 1, 'status', now(), now()),
  226. (6, 3, 'status', now(), now()),
  227. (7, 4, 'status', now(), now()),
  228. (8, 5, 'status', now(), now()),
  229. (9, 1, 'status', now(), now());
  230. -- custom emoji
  231. INSERT INTO "custom_emojis"
  232. (id, shortcode, created_at, updated_at)
  233. VALUES
  234. (1, 'test', now(), now()),
  235. (2, 'Test', now(), now()),
  236. (3, 'blobcat', now(), now());
  237. INSERT INTO "custom_emojis"
  238. (id, shortcode, domain, uri, created_at, updated_at)
  239. VALUES
  240. (4, 'blobcat', 'remote.org', 'https://remote.org/emoji/blobcat', now(), now()),
  241. (5, 'blobcat', 'Remote.org', 'https://remote.org/emoji/blobcat', now(), now()),
  242. (6, 'Blobcat', 'remote.org', 'https://remote.org/emoji/Blobcat', now(), now());
  243. -- favourites
  244. INSERT INTO "favourites"
  245. (account_id, status_id, created_at, updated_at)
  246. VALUES
  247. (1, 1, now(), now()),
  248. (1, 7, now(), now()),
  249. (4, 1, now(), now()),
  250. (3, 1, now(), now()),
  251. (5, 1, now(), now());
  252. -- pinned statuses
  253. INSERT INTO "status_pins"
  254. (account_id, status_id, created_at, updated_at)
  255. VALUES
  256. (1, 1, now(), now()),
  257. (3, 6, now(), now()),
  258. (4, 7, now(), now());
  259. -- follows
  260. INSERT INTO "follows"
  261. (id, account_id, target_account_id, created_at, updated_at)
  262. VALUES
  263. (1, 1, 5, now(), now()),
  264. (2, 6, 2, now(), now()),
  265. (3, 5, 2, now(), now()),
  266. (4, 6, 1, now(), now());
  267. -- follow requests
  268. INSERT INTO "follow_requests"
  269. (account_id, target_account_id, created_at, updated_at)
  270. VALUES
  271. (2, 5, now(), now()),
  272. (5, 1, now(), now());
  273. -- notifications
  274. INSERT INTO "notifications"
  275. (id, from_account_id, account_id, activity_type, activity_id, created_at, updated_at)
  276. VALUES
  277. (1, 6, 2, 'Follow', 2, now(), now()),
  278. (2, 2, 1, 'Mention', 4, now(), now()),
  279. (3, 1, 2, 'Mention', 5, now(), now());
  280. -- preview cards
  281. INSERT INTO "preview_cards"
  282. (id, url, title, created_at, updated_at)
  283. VALUES
  284. (1, 'https://joinmastodon.org/', 'Mastodon - Decentralized social media', now(), now());
  285. -- many-to-many association between preview cards and statuses
  286. INSERT INTO "preview_cards_statuses"
  287. (status_id, preview_card_id)
  288. VALUES
  289. (12, 1),
  290. (12, 1);
  291. SQL
  292. end
  293. end
  294. end