diff --git a/spec/components/s3_inventory_multisite_spec.rb b/spec/components/s3_inventory_multisite_spec.rb new file mode 100644 index 00000000000..ef702015b79 --- /dev/null +++ b/spec/components/s3_inventory_multisite_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require "rails_helper" +require "s3_helper" +require "s3_inventory" +require "file_store/s3_store" + +describe "S3Inventory", type: :multisite do + let(:client) { Aws::S3::Client.new(stub_responses: true) } + let(:helper) { S3Helper.new(SiteSetting.Upload.s3_upload_bucket.downcase, "", client: client) } + let(:inventory) { S3Inventory.new(helper, :upload) } + let(:csv_filename) { "#{Rails.root}/spec/fixtures/csv/s3_inventory.csv" } + + it "can create per-site files" do + freeze_time + setup_s3 + SiteSetting.enable_s3_inventory = true + inventory.stubs(:files).returns([{ key: "Key", filename: "#{csv_filename}.gz" }]) + inventory.stubs(:cleanup!) + + files = inventory.prepare_for_all_sites + db1 = files["default"].read + db2 = files["second"].read + + expect(db1.lines.count).to eq(3) + expect(db2.lines.count).to eq(1) + files.values.each { |f| f.close; f.unlink } + end +end diff --git a/spec/components/s3_inventory_spec.rb b/spec/components/s3_inventory_spec.rb index a31efcdfccd..9b79a9b816d 100644 --- a/spec/components/s3_inventory_spec.rb +++ b/spec/components/s3_inventory_spec.rb @@ -175,19 +175,6 @@ describe "S3Inventory" do expect(Discourse.stats.get("missing_s3_uploads")).to eq(2) end - it "can create per-site files", type: :multisite do - freeze_time - - inventory.stubs(:files).returns([{ key: "Key", filename: "#{csv_filename}.gz" }]) - - files = inventory.prepare_for_all_sites - db1 = files["default"].read - db2 = files["second"].read - expect(db1.lines.count).to eq(3) - expect(db2.lines.count).to eq(1) - files.values.each { |f| f.close; f.unlink } - end - context "s3 inventory configuration" do let(:bucket_name) { "s3-upload-bucket" } let(:subfolder_path) { "subfolder" } diff --git a/spec/components/site_setting_extension_multisite_spec.rb b/spec/components/site_setting_extension_multisite_spec.rb new file mode 100644 index 00000000000..e59fe581708 --- /dev/null +++ b/spec/components/site_setting_extension_multisite_spec.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe SiteSettingExtension, type: :multisite do + before do + MessageBus.off + end + + after do + MessageBus.on + end + + let(:provider_local) do + SiteSettings::LocalProcessProvider.new + end + + let(:settings) do + new_settings(provider_local) + end + + it "has no db cross talk" do + settings.setting(:hello, 1) + settings.hello = 100 + + test_multisite_connection("second") do + expect(settings.hello).to eq(1) + end + end +end diff --git a/spec/components/site_setting_extension_spec.rb b/spec/components/site_setting_extension_spec.rb index ba85686135a..c34588725f1 100644 --- a/spec/components/site_setting_extension_spec.rb +++ b/spec/components/site_setting_extension_spec.rb @@ -162,17 +162,6 @@ describe SiteSettingExtension do end end - describe "multisite" do - it "has no db cross talk", type: :multisite do - settings.setting(:hello, 1) - settings.hello = 100 - - test_multisite_connection("second") do - expect(settings.hello).to eq(1) - end - end - end - describe "DiscourseEvent" do before do settings.setting(:test_setting, 1) diff --git a/spec/components/site_settings/local_process_provider_multisite_spec.rb b/spec/components/site_settings/local_process_provider_multisite_spec.rb new file mode 100644 index 00000000000..04d25fbf957 --- /dev/null +++ b/spec/components/site_settings/local_process_provider_multisite_spec.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe SiteSettings::LocalProcessProvider, type: :multisite do + def expect_same_setting(actual, expected) + expect(actual.name).to eq(expected.name) + expect(actual.value).to eq(expected.value) + expect(actual.data_type).to eq(expected.data_type) + end + + let(:provider) { described_class.new } + + def setting(name, value, data_type) + described_class::Setting.new(name, data_type).tap { |s| s.value = value } + end + + it "loads the correct settings" do + test_multisite_connection("default") { provider.save("test", "bla-default", 2) } + test_multisite_connection("second") { provider.save("test", "bla-second", 2) } + + test_multisite_connection("default") do + expect_same_setting(provider.find("test"), setting("test", "bla-default", 2)) + end + + test_multisite_connection("second") do + expect_same_setting(provider.find("test"), setting("test", "bla-second", 2)) + end + end + + it "returns the correct site name" do + test_multisite_connection("second") do + expect(provider.current_site).to eq("second") + end + end +end diff --git a/spec/components/site_settings/local_process_provider_spec.rb b/spec/components/site_settings/local_process_provider_spec.rb index 99345027d76..9a86c35b545 100644 --- a/spec/components/site_settings/local_process_provider_spec.rb +++ b/spec/components/site_settings/local_process_provider_spec.rb @@ -61,25 +61,4 @@ describe SiteSettings::LocalProcessProvider do it "returns the correct site name" do expect(provider.current_site).to eq("default") end - - describe "multisite", type: :multisite do - it "loads the correct settings" do - test_multisite_connection("default") { provider.save("test", "bla-default", 2) } - test_multisite_connection("second") { provider.save("test", "bla-second", 2) } - - test_multisite_connection("default") do - expect_same_setting(provider.find("test"), setting("test", "bla-default", 2)) - end - - test_multisite_connection("second") do - expect_same_setting(provider.find("test"), setting("test", "bla-second", 2)) - end - end - - it "returns the correct site name" do - test_multisite_connection("second") do - expect(provider.current_site).to eq("second") - end - end - end end diff --git a/spec/integration/multisite_spec.rb b/spec/integration/multisite_spec.rb index 4aa8af580e7..d369617850b 100644 --- a/spec/integration/multisite_spec.rb +++ b/spec/integration/multisite_spec.rb @@ -49,7 +49,6 @@ describe 'multisite', type: :multisite do end it "should hit correct site elsewise" do - headers = { "HTTP_HOST" => "test2.localhost", "REQUEST_METHOD" => "GET", @@ -61,5 +60,4 @@ describe 'multisite', type: :multisite do expect(code).to eq(200) expect(body.join).to eq("test2.localhost") end - end diff --git a/spec/lib/backup_restore/backup_file_handler_multisite_spec.rb b/spec/lib/backup_restore/backup_file_handler_multisite_spec.rb new file mode 100644 index 00000000000..6111be6870e --- /dev/null +++ b/spec/lib/backup_restore/backup_file_handler_multisite_spec.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require "rails_helper" +require_relative "shared_context_for_backup_restore" + +describe BackupRestore::BackupFileHandler, type: :multisite do + include_context "shared stuff" + + it "works with old backup file format" do + test_multisite_connection("second") do + expect_decompress_and_clean_up_to_work( + backup_filename: "backup_till_v1.5.tar.gz", + require_metadata_file: true, + require_uploads: true + ) + end + end +end diff --git a/spec/lib/backup_restore/backup_file_handler_spec.rb b/spec/lib/backup_restore/backup_file_handler_spec.rb index 80a0e62b805..3acec9fe605 100644 --- a/spec/lib/backup_restore/backup_file_handler_spec.rb +++ b/spec/lib/backup_restore/backup_file_handler_spec.rb @@ -6,68 +6,6 @@ require_relative 'shared_context_for_backup_restore' describe BackupRestore::BackupFileHandler do include_context "shared stuff" - def expect_decompress_and_clean_up_to_work(backup_filename:, expected_dump_filename: "dump.sql", - require_metadata_file:, require_uploads:, expected_upload_paths: nil, - location: nil) - - freeze_time(DateTime.parse('2019-12-24 14:31:48')) - - source_file = File.join(Rails.root, "spec/fixtures/backups", backup_filename) - target_directory = BackupRestore::LocalBackupStore.base_directory - target_file = File.join(target_directory, backup_filename) - FileUtils.copy_file(source_file, target_file) - - Dir.mktmpdir do |root_directory| - current_db = RailsMultisite::ConnectionManagement.current_db - file_handler = BackupRestore::BackupFileHandler.new( - logger, backup_filename, current_db, - root_tmp_directory: root_directory, - location: location - ) - tmp_directory, db_dump_path = file_handler.decompress - - expected_tmp_path = File.join(root_directory, "tmp/restores", current_db, "2019-12-24-143148") - expect(tmp_directory).to eq(expected_tmp_path) - expect(db_dump_path).to eq(File.join(expected_tmp_path, expected_dump_filename)) - - expect(Dir.exist?(tmp_directory)).to eq(true) - expect(File.exist?(db_dump_path)).to eq(true) - - expect(File.exist?(File.join(tmp_directory, "meta.json"))).to eq(require_metadata_file) - - if require_uploads - expected_upload_paths ||= ["uploads/default/original/3X/b/d/bd269860bb508aebcb6f08fe7289d5f117830383.png"] - - expected_upload_paths.each do |upload_path| - absolute_upload_path = File.join(tmp_directory, upload_path) - expect(File.exist?(absolute_upload_path)).to eq(true), "expected file #{upload_path} does not exist" - yield(absolute_upload_path) if block_given? - end - else - expect(Dir.exist?(File.join(tmp_directory, "uploads"))).to eq(false) - end - - file_handler.clean_up - expect(Dir.exist?(tmp_directory)).to eq(false) - end - ensure - FileUtils.rm(target_file) - - # We don't want to delete the directory unless it is empty, otherwise this could be annoying - # when tests run for the "default" database in a development environment. - FileUtils.rmdir(target_directory) rescue nil - end - - it "works with old backup file format", type: :multisite do - test_multisite_connection("second") do - expect_decompress_and_clean_up_to_work( - backup_filename: "backup_till_v1.5.tar.gz", - require_metadata_file: true, - require_uploads: true - ) - end - end - it "works with current backup file format" do expect_decompress_and_clean_up_to_work( backup_filename: "backup_since_v1.6.tar.gz", diff --git a/spec/lib/backup_restore/database_restorer_multisite_spec.rb b/spec/lib/backup_restore/database_restorer_multisite_spec.rb new file mode 100644 index 00000000000..5deeb594e88 --- /dev/null +++ b/spec/lib/backup_restore/database_restorer_multisite_spec.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require "rails_helper" +require_relative "shared_context_for_backup_restore" + +describe BackupRestore::DatabaseRestorer, type: :multisite do + include_context "shared stuff" + + let(:current_db) { RailsMultisite::ConnectionManagement.current_db } + + subject { BackupRestore::DatabaseRestorer.new(logger, current_db) } + + describe "#restore" do + context "database connection" do + it "reconnects to the correct database" do + RailsMultisite::ConnectionManagement.establish_connection(db: "second") + execute_stubbed_restore + expect(RailsMultisite::ConnectionManagement.current_db).to eq("second") + end + end + end +end diff --git a/spec/lib/backup_restore/database_restorer_spec.rb b/spec/lib/backup_restore/database_restorer_spec.rb index fbe6204609a..e1b4c8726ff 100644 --- a/spec/lib/backup_restore/database_restorer_spec.rb +++ b/spec/lib/backup_restore/database_restorer_spec.rb @@ -7,56 +7,9 @@ describe BackupRestore::DatabaseRestorer do include_context "shared stuff" let(:current_db) { RailsMultisite::ConnectionManagement.current_db } + subject { BackupRestore::DatabaseRestorer.new(logger, current_db) } - def expect_create_readonly_functions - Migration::BaseDropper.expects(:create_readonly_function).at_least_once - end - - def expect_table_move - BackupRestore.expects(:move_tables_between_schemas).with("public", "backup").once - end - - def expect_psql(output_lines: ["output from psql"], exit_status: 0, stub_thread: false) - status = mock("psql status") - status.expects(:exitstatus).returns(exit_status).once - Process.expects(:last_status).returns(status).once - - if stub_thread - thread = mock("thread") - thread.stubs(:join) - Thread.stubs(:new).returns(thread) - end - - output_lines << nil - psql_io = mock("psql") - psql_io.expects(:readline).returns(*output_lines).times(output_lines.size) - IO.expects(:popen).yields(psql_io).once - end - - def expect_db_migrate - Discourse::Utils.expects(:execute_command).with do |env, *command, **options| - env["SKIP_POST_DEPLOYMENT_MIGRATIONS"] == "0" && - env["SKIP_OPTIMIZE_ICONS"] == "1" && - env["DISABLE_TRANSLATION_OVERRIDES"] == "1" && - command == ["rake", "db:migrate"] && - options[:chdir] == Rails.root - end.once - end - - def expect_db_reconnect - RailsMultisite::ConnectionManagement.expects(:establish_connection).once - end - - def execute_stubbed_restore(stub_readonly_functions: true, stub_psql: true, stub_migrate: true, - dump_file_path: "foo.sql") - expect_table_move - expect_create_readonly_functions if stub_readonly_functions - expect_psql if stub_psql - expect_db_migrate if stub_migrate - subject.restore(dump_file_path) - end - describe "#restore" do it "executes everything in the correct order" do restore = sequence("restore") @@ -173,12 +126,6 @@ describe BackupRestore::DatabaseRestorer do end context "database connection" do - it 'reconnects to the correct database', type: :multisite do - RailsMultisite::ConnectionManagement.establish_connection(db: 'second') - execute_stubbed_restore - expect(RailsMultisite::ConnectionManagement.current_db).to eq('second') - end - it 'it is not erroring for non-multisite' do expect { execute_stubbed_restore }.not_to raise_error end diff --git a/spec/lib/backup_restore/shared_context_for_backup_restore.rb b/spec/lib/backup_restore/shared_context_for_backup_restore.rb index bc9990469fa..2ff78176ea4 100644 --- a/spec/lib/backup_restore/shared_context_for_backup_restore.rb +++ b/spec/lib/backup_restore/shared_context_for_backup_restore.rb @@ -1,9 +1,117 @@ # frozen_string_literal: true -# + shared_context "shared stuff" do let!(:logger) do Class.new do def log(message, ex = nil); end end.new end + + def expect_create_readonly_functions + Migration::BaseDropper.expects(:create_readonly_function).at_least_once + end + + def expect_table_move + BackupRestore.expects(:move_tables_between_schemas).with("public", "backup").once + end + + def expect_psql(output_lines: ["output from psql"], exit_status: 0, stub_thread: false) + status = mock("psql status") + status.expects(:exitstatus).returns(exit_status).once + Process.expects(:last_status).returns(status).once + + if stub_thread + thread = mock("thread") + thread.stubs(:join) + Thread.stubs(:new).returns(thread) + end + + output_lines << nil + psql_io = mock("psql") + psql_io.expects(:readline).returns(*output_lines).times(output_lines.size) + IO.expects(:popen).yields(psql_io).once + end + + def expect_db_migrate + Discourse::Utils.expects(:execute_command).with do |env, *command, **options| + env["SKIP_POST_DEPLOYMENT_MIGRATIONS"] == "0" && + env["SKIP_OPTIMIZE_ICONS"] == "1" && + env["DISABLE_TRANSLATION_OVERRIDES"] == "1" && + command == ["rake", "db:migrate"] && + options[:chdir] == Rails.root + end.once + end + + def expect_db_reconnect + RailsMultisite::ConnectionManagement.expects(:establish_connection).once + end + + def execute_stubbed_restore( + stub_readonly_functions: true, + stub_psql: true, + stub_migrate: true, + dump_file_path: "foo.sql" + ) + expect_table_move + expect_create_readonly_functions if stub_readonly_functions + expect_psql if stub_psql + expect_db_migrate if stub_migrate + subject.restore(dump_file_path) + end + + def expect_decompress_and_clean_up_to_work( + backup_filename:, + expected_dump_filename: "dump.sql", + require_metadata_file:, + require_uploads:, + expected_upload_paths: nil, + location: nil + ) + freeze_time(DateTime.parse("2019-12-24 14:31:48")) + + source_file = File.join(Rails.root, "spec/fixtures/backups", backup_filename) + target_directory = BackupRestore::LocalBackupStore.base_directory + target_file = File.join(target_directory, backup_filename) + FileUtils.copy_file(source_file, target_file) + + Dir.mktmpdir do |root_directory| + current_db = RailsMultisite::ConnectionManagement.current_db + file_handler = BackupRestore::BackupFileHandler.new( + logger, backup_filename, current_db, + root_tmp_directory: root_directory, + location: location + ) + tmp_directory, db_dump_path = file_handler.decompress + + expected_tmp_path = File.join(root_directory, "tmp/restores", current_db, "2019-12-24-143148") + expect(tmp_directory).to eq(expected_tmp_path) + expect(db_dump_path).to eq(File.join(expected_tmp_path, expected_dump_filename)) + + expect(Dir.exist?(tmp_directory)).to eq(true) + expect(File.exist?(db_dump_path)).to eq(true) + + expect(File.exist?(File.join(tmp_directory, "meta.json"))).to eq(require_metadata_file) + + if require_uploads + expected_upload_paths ||= ["uploads/default/original/3X/b/d/bd269860bb508aebcb6f08fe7289d5f117830383.png"] + + expected_upload_paths.each do |upload_path| + absolute_upload_path = File.join(tmp_directory, upload_path) + expect(File.exist?(absolute_upload_path)).to eq(true), "expected file #{upload_path} does not exist" + yield(absolute_upload_path) if block_given? + end + else + expect(Dir.exist?(File.join(tmp_directory, "uploads"))).to eq(false) + end + + file_handler.clean_up + expect(Dir.exist?(tmp_directory)).to eq(false) + end + ensure + FileUtils.rm(target_file) + + # We don't want to delete the directory unless it is empty, otherwise this could be annoying + # when tests run for the "default" database in a development environment. + FileUtils.rmdir(target_directory) rescue nil + end end diff --git a/spec/lib/backup_restore/shared_examples_for_backup_store.rb b/spec/lib/backup_restore/shared_examples_for_backup_store.rb index 679fd637f3f..726fd511411 100644 --- a/spec/lib/backup_restore/shared_examples_for_backup_store.rb +++ b/spec/lib/backup_restore/shared_examples_for_backup_store.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true +# rubocop:disable Discourse/OnlyTopLevelMultisiteSpecs shared_context "backups" do before { create_backups } diff --git a/spec/lib/backup_restore/system_interface_multisite_spec.rb b/spec/lib/backup_restore/system_interface_multisite_spec.rb new file mode 100644 index 00000000000..93d1c7dc3bb --- /dev/null +++ b/spec/lib/backup_restore/system_interface_multisite_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require "rails_helper" +require_relative "shared_context_for_backup_restore" + +describe BackupRestore::SystemInterface, type: :multisite do + include_context "shared stuff" + + subject { BackupRestore::SystemInterface.new(logger) } + + describe "#flush_redis" do + it "removes only keys from the current site in a multisite" do + test_multisite_connection("default") do + Discourse.redis.set("foo", "default-foo") + Discourse.redis.set("bar", "default-bar") + + expect(Discourse.redis.get("foo")).to eq("default-foo") + expect(Discourse.redis.get("bar")).to eq("default-bar") + end + + test_multisite_connection("second") do + Discourse.redis.set("foo", "second-foo") + Discourse.redis.set("bar", "second-bar") + + expect(Discourse.redis.get("foo")).to eq("second-foo") + expect(Discourse.redis.get("bar")).to eq("second-bar") + + subject.flush_redis + + expect(Discourse.redis.get("foo")).to be_nil + expect(Discourse.redis.get("bar")).to be_nil + end + + test_multisite_connection("default") do + expect(Discourse.redis.get("foo")).to eq("default-foo") + expect(Discourse.redis.get("bar")).to eq("default-bar") + end + end + end +end diff --git a/spec/lib/backup_restore/system_interface_spec.rb b/spec/lib/backup_restore/system_interface_spec.rb index 27d77598e2d..8ebfd4cabb8 100644 --- a/spec/lib/backup_restore/system_interface_spec.rb +++ b/spec/lib/backup_restore/system_interface_spec.rb @@ -168,45 +168,17 @@ describe BackupRestore::SystemInterface do subject.wait_for_sidekiq end end + end - describe "flush_redis" do - context "Sidekiq" do - after { Sidekiq.unpause! } + describe "#flush_redis" do + context "Sidekiq" do + after { Sidekiq.unpause! } - it "doesn't unpause Sidekiq" do - Sidekiq.pause! - subject.flush_redis + it "doesn't unpause Sidekiq" do + Sidekiq.pause! + subject.flush_redis - expect(Sidekiq.paused?).to eq(true) - end - end - - it "removes only keys from the current site in a multisite", type: :multisite do - test_multisite_connection("default") do - Discourse.redis.set("foo", "default-foo") - Discourse.redis.set("bar", "default-bar") - - expect(Discourse.redis.get("foo")).to eq("default-foo") - expect(Discourse.redis.get("bar")).to eq("default-bar") - end - - test_multisite_connection("second") do - Discourse.redis.set("foo", "second-foo") - Discourse.redis.set("bar", "second-bar") - - expect(Discourse.redis.get("foo")).to eq("second-foo") - expect(Discourse.redis.get("bar")).to eq("second-bar") - - subject.flush_redis - - expect(Discourse.redis.get("foo")).to be_nil - expect(Discourse.redis.get("bar")).to be_nil - end - - test_multisite_connection("default") do - expect(Discourse.redis.get("foo")).to eq("default-foo") - expect(Discourse.redis.get("bar")).to eq("default-bar") - end + expect(Sidekiq.paused?).to eq(true) end end end diff --git a/spec/lib/backup_restore/uploads_restorer_spec.rb b/spec/lib/backup_restore/uploads_restorer_spec.rb index f4fb16ec48a..2963e381e08 100644 --- a/spec/lib/backup_restore/uploads_restorer_spec.rb +++ b/spec/lib/backup_restore/uploads_restorer_spec.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true +# rubocop:disable Discourse/OnlyTopLevelMultisiteSpecs require 'rails_helper' require_relative 'shared_context_for_backup_restore' diff --git a/spec/multisite/pausable_multisite_spec.rb b/spec/multisite/pausable_multisite_spec.rb new file mode 100644 index 00000000000..ccab0832fbb --- /dev/null +++ b/spec/multisite/pausable_multisite_spec.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +require "rails_helper" + +RSpec.describe "Pausing/Unpausing Sidekiq", type: :multisite do + describe "#pause!, #unpause! and #paused?" do + it "can pause and unpause" do + Sidekiq.pause! + expect(Sidekiq.paused?).to eq(true) + + test_multisite_connection("second") do + expect(Sidekiq.paused?).to eq(false) + end + + Sidekiq.unpause! + + expect(Sidekiq.paused?).to eq(false) + + test_multisite_connection("second") do + Sidekiq.pause!("test") + expect(Sidekiq.paused?).to eq(true) + end + + expect(Sidekiq.paused_dbs).to eq(["second"]) + + Sidekiq.unpause_all! + + RailsMultisite::ConnectionManagement.each_connection do + expect(Sidekiq.paused?).to eq(false) + end + end + end +end + +RSpec.describe Sidekiq::Pausable, type: :multisite do + after do + Sidekiq.unpause_all! + end + + describe "when sidekiq is paused" do + let(:middleware) { Sidekiq::Pausable.new } + + def call_middleware(db = RailsMultisite::ConnectionManagement::DEFAULT) + middleware.call(Jobs::PostAlert.new, { + "args" => [{ "current_site_id" => db }] + }, "critical") do + yield + end + end + + it "should delay the job" do + Sidekiq.pause! + + called = false + called2 = false + call_middleware { called = true } + + expect(called).to eq(false) + + test_multisite_connection("second") do + call_middleware("second") { called2 = true } + expect(called2).to eq(true) + end + + Sidekiq.unpause! + call_middleware { called = true } + + expect(called).to eq(true) + + test_multisite_connection("second") do + Sidekiq.pause! + call_middleware("second") { called2 = false } + expect(called2).to eq(true) + end + end + end +end diff --git a/spec/multisite/pausable_spec.rb b/spec/multisite/pausable_spec.rb index fe764faabbe..cc19785cbd9 100644 --- a/spec/multisite/pausable_spec.rb +++ b/spec/multisite/pausable_spec.rb @@ -1,37 +1,6 @@ # frozen_string_literal: true -require 'rails_helper' - -RSpec.describe "Pausing/Unpausing Sidekiq", type: :multisite do - - describe '#pause!, #unpause! and #paused?' do - it "can pause and unpause" do - Sidekiq.pause! - expect(Sidekiq.paused?).to eq(true) - - test_multisite_connection('second') do - expect(Sidekiq.paused?).to eq(false) - end - - Sidekiq.unpause! - - expect(Sidekiq.paused?).to eq(false) - - test_multisite_connection('second') do - Sidekiq.pause!("test") - expect(Sidekiq.paused?).to eq(true) - end - - expect(Sidekiq.paused_dbs).to eq(["second"]) - - Sidekiq.unpause_all! - - RailsMultisite::ConnectionManagement.each_connection do - expect(Sidekiq.paused?).to eq(false) - end - end - end -end +require "rails_helper" RSpec.describe Sidekiq::Pausable do after do @@ -54,42 +23,4 @@ RSpec.describe Sidekiq::Pausable do jobs = Sidekiq::ScheduledSet.new expect(jobs.size).to eq(0) end - - describe 'when sidekiq is paused', type: :multisite do - let(:middleware) { Sidekiq::Pausable.new } - - def call_middleware(db = RailsMultisite::ConnectionManagement::DEFAULT) - middleware.call(Jobs::PostAlert.new, { - "args" => [{ "current_site_id" => db }] - }, "critical") do - yield - end - end - - it 'should delay the job' do - Sidekiq.pause! - - called = false - called2 = false - call_middleware { called = true } - - expect(called).to eq(false) - - test_multisite_connection('second') do - call_middleware('second') { called2 = true } - expect(called2).to eq(true) - end - - Sidekiq.unpause! - call_middleware { called = true } - - expect(called).to eq(true) - - test_multisite_connection('second') do - Sidekiq.pause! - call_middleware('second') { called2 = false } - expect(called2).to eq(true) - end - end - end end diff --git a/spec/requests/uploads_controller_multisite_spec.rb b/spec/requests/uploads_controller_multisite_spec.rb index 8c073b09a37..937de3c2af4 100644 --- a/spec/requests/uploads_controller_multisite_spec.rb +++ b/spec/requests/uploads_controller_multisite_spec.rb @@ -1,33 +1,22 @@ # frozen_string_literal: true -require 'rails_helper' +require "rails_helper" -describe UploadsController do +describe UploadsController, type: [:multisite, :request] do let!(:user) { Fabricate(:user) } + let(:upload) { Fabricate(:upload_s3) } - describe "#show_short" do - describe "s3 store" do - let(:upload) { Fabricate(:upload_s3) } + before do + setup_s3 + SiteSetting.secure_media = true + upload.update(secure: true) + end - before do - setup_s3 - end + it "redirects to the signed_url_for_path with the multisite DB name in the url" do + sign_in(user) + freeze_time + get upload.short_path - context "when upload is secure and secure media enabled" do - before do - SiteSetting.secure_media = true - upload.update(secure: true) - end - - context "when running on a multisite connection", type: :multisite do - it "redirects to the signed_url_for_path with the multisite DB name in the url" do - sign_in(user) - freeze_time - get upload.short_path - expect(response.body).to include(RailsMultisite::ConnectionManagement.current_db) - end - end - end - end + expect(response.body).to include(RailsMultisite::ConnectionManagement.current_db) end end diff --git a/spec/services/inline_uploads_multisite_spec.rb b/spec/services/inline_uploads_multisite_spec.rb new file mode 100644 index 00000000000..1ca0eab1b31 --- /dev/null +++ b/spec/services/inline_uploads_multisite_spec.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require "rails_helper" + +RSpec.describe InlineUploads, type: :multisite do + before do + set_cdn_url "https://awesome.com" + end + + describe ".process" do + describe "s3 uploads" do + let(:upload) { Fabricate(:upload_s3) } + let(:upload2) { Fabricate(:upload_s3) } + let(:upload3) { Fabricate(:upload) } + + before do + upload3 + setup_s3 + SiteSetting.s3_cdn_url = "https://s3.cdn.com" + end + + it "should correct image URLs in multisite" do + md = <<~MD + https:#{upload2.url} https:#{upload2.url} + #{URI.join(SiteSetting.s3_cdn_url, URI.parse(upload2.url).path).to_s} + + some image + some image + + MD + + expect(InlineUploads.process(md)).to eq(<<~MD) + #{Discourse.base_url}#{upload2.short_path} #{Discourse.base_url}#{upload2.short_path} + #{Discourse.base_url}#{upload2.short_path} + + ![some image](#{upload.short_url}) + ![some image](#{upload2.short_url}) + ![](#{upload3.short_url}) + MD + end + end + end +end diff --git a/spec/services/inline_uploads_spec.rb b/spec/services/inline_uploads_spec.rb index 03c4fc56801..52875e081db 100644 --- a/spec/services/inline_uploads_spec.rb +++ b/spec/services/inline_uploads_spec.rb @@ -692,26 +692,6 @@ RSpec.describe InlineUploads do [some reference]: #{Discourse.base_url}#{upload.short_path} MD end - - it "should correct image URLs in multisite", type: :multisite do - md = <<~MD - https:#{upload2.url} https:#{upload2.url} - #{URI.join(SiteSetting.s3_cdn_url, URI.parse(upload2.url).path).to_s} - - some image - some image - - MD - - expect(InlineUploads.process(md)).to eq(<<~MD) - #{Discourse.base_url}#{upload2.short_path} #{Discourse.base_url}#{upload2.short_path} - #{Discourse.base_url}#{upload2.short_path} - - ![some image](#{upload.short_url}) - ![some image](#{upload2.short_url}) - ![](#{upload3.short_url}) - MD - end end end