diff --git a/.circleci/config.yml b/.circleci/config.yml index 318f4d2be..6d89e670a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -127,9 +127,18 @@ jobs: - run: command: ./bin/rails tests:migrations:populate_v2 name: Populate database with test data + - run: + command: ./bin/rails db:migrate VERSION=20180514140000 + name: Run migrations up to v2.4.0 + - run: + command: ./bin/rails tests:migrations:populate_v2_4 + name: Populate database with test data - run: command: ./bin/rails db:migrate name: Run all remaining migrations + - run: + command: ./bin/rails tests:migrations:check_database + name: Check migration result test-two-step-migrations: executor: @@ -150,6 +159,14 @@ jobs: - run: command: ./bin/rails tests:migrations:populate_v2 name: Populate database with test data + - run: + command: ./bin/rails db:migrate VERSION=20180514140000 + name: Run pre-deployment migrations up to v2.4.0 + environment: + SKIP_POST_DEPLOYMENT_MIGRATIONS: true + - run: + command: ./bin/rails tests:migrations:populate_v2_4 + name: Populate database with test data - run: command: ./bin/rails db:migrate name: Run all pre-deployment migrations @@ -158,6 +175,9 @@ jobs: - run: command: ./bin/rails db:migrate name: Run all post-deployment remaining migrations + - run: + command: ./bin/rails tests:migrations:check_database + name: Check migration result workflows: version: 2 diff --git a/lib/tasks/tests.rake b/lib/tasks/tests.rake index 0f38b50e3..8082f32fb 100644 --- a/lib/tasks/tests.rake +++ b/lib/tasks/tests.rake @@ -2,6 +2,50 @@ namespace :tests do namespace :migrations do + desc 'Check that database state is consistent with a successful migration from populated data' + task check_database: :environment do + unless Account.find_by(username: 'admin', domain: nil)&.hide_collections? == false + puts 'Unexpected value for Account#hide_collections? for user @admin' + exit(1) + end + + unless Account.find_by(username: 'user', domain: nil)&.hide_collections? == true + puts 'Unexpected value for Account#hide_collections? for user @user' + exit(1) + end + + unless Account.find_by(username: 'evil', domain: 'activitypub.com')&.suspended? + puts 'Unexpected value for Account#suspended? for user @evil@activitypub.com' + exit(1) + end + + unless Status.find(6).account_id == Status.find(7).account_id + puts 'Users @remote@remote.com and @Remote@remote.com not properly merged' + exit(1) + end + + if Account.where(domain: Rails.configuration.x.local_domain).exists? + puts 'Faux remote accounts not properly claned up' + exit(1) + end + + unless AccountConversation.first&.last_status_id == 11 + puts 'AccountConversation records not created as expected' + exit(1) + end + end + + desc 'Populate the database with test data for 2.4.0' + task populate_v2_4: :environment do + ActiveRecord::Base.connection.execute(<<~SQL) + INSERT INTO "settings" + (id, thing_type, thing_id, var, value, created_at, updated_at) + VALUES + (1, 'User', 1, 'hide_network', E'--- false\n', now(), now()), + (2, 'User', 2, 'hide_network', E'--- true\n', now(), now()); + SQL + end + desc 'Populate the database with test data for 2.0.0' task populate_v2: :environment do admin_key = OpenSSL::PKey::RSA.new(2048) @@ -34,7 +78,7 @@ namespace :tests do 'https://remote.com/@remote', 'https://remote.com/salmon/1'), (4, 'Remote', 'remote.com', NULL, #{remote_public_key}, now(), now(), 'https://remote.com/@Remote', 'https://remote.com/salmon/1'), - (5, 'REMOTE', 'Remote.com', NULL, #{remote_public_key2}, now(), now(), + (5, 'REMOTE', 'Remote.com', NULL, #{remote_public_key2}, now() - interval '1 year', now() - interval '1 year', 'https://remote.com/stale/@REMOTE', 'https://remote.com/stale/salmon/1'); INSERT INTO "accounts" @@ -49,6 +93,13 @@ namespace :tests do (7, 'user', #{local_domain}, #{user_private_key}, #{user_public_key}, now(), now()), (8, 'pt_user', NULL, #{user_private_key}, #{user_public_key}, now(), now()); + INSERT INTO "accounts" + (id, username, domain, private_key, public_key, created_at, updated_at, protocol, inbox_url, outbox_url, followers_url, suspended) + VALUES + (9, 'evil', 'activitypub.com', NULL, #{remote_public_key_ap}, now(), now(), + 1, 'https://activitypub.com/users/evil/inbox', 'https://activitypub.com/users/evil/outbox', + 'https://activitypub.com/users/evil/followers', true); + -- users INSERT INTO "users" @@ -62,6 +113,9 @@ namespace :tests do VALUES (3, 7, 'ptuser@localhost', now(), now(), false, 'pt'); + -- conversations + INSERT INTO "conversations" (id, created_at, updated_at) VALUES (1, now(), now()); + -- statuses INSERT INTO "statuses" @@ -97,14 +151,22 @@ namespace :tests do VALUES (9, 1, 2, now(), now()); + INSERT INTO "statuses" + (id, account_id, text, in_reply_to_id, conversation_id, visibility, created_at, updated_at) + VALUES + (10, 2, '@admin hey!', NULL, 1, 3, now(), now()), + (11, 1, '@user hey!', 10, 1, 3, now(), now()); + -- mentions (from previous statuses) INSERT INTO "mentions" - (status_id, account_id, created_at, updated_at) + (id, status_id, account_id, created_at, updated_at) VALUES - (2, 3, now(), now()), - (3, 4, now(), now()), - (4, 5, now(), now()); + (1, 2, 3, now(), now()), + (2, 3, 4, now(), now()), + (3, 4, 5, now(), now()), + (4, 10, 1, now(), now()), + (5, 11, 2, now(), now()); -- stream entries @@ -121,7 +183,6 @@ namespace :tests do (8, 5, 'status', now(), now()), (9, 1, 'status', now(), now()); - -- custom emoji INSERT INTO "custom_emojis" @@ -161,12 +222,12 @@ namespace :tests do -- follows INSERT INTO "follows" - (account_id, target_account_id, created_at, updated_at) + (id, account_id, target_account_id, created_at, updated_at) VALUES - (1, 5, now(), now()), - (6, 2, now(), now()), - (5, 2, now(), now()), - (6, 1, now(), now()); + (1, 1, 5, now(), now()), + (2, 6, 2, now(), now()), + (3, 5, 2, now(), now()), + (4, 6, 1, now(), now()); -- follow requests @@ -175,6 +236,15 @@ namespace :tests do VALUES (2, 5, now(), now()), (5, 1, now(), now()); + + -- notifications + + INSERT INTO "notifications" + (id, from_account_id, account_id, activity_type, activity_id, created_at, updated_at) + VALUES + (1, 6, 2, 'Follow', 2, now(), now()), + (2, 2, 1, 'Mention', 4, now(), now()), + (3, 1, 2, 'Mention', 5, now(), now()); SQL end end