diff --git a/app/models/pool_version.rb b/app/models/pool_version.rb index 598c03108..1bf6f3cb6 100644 --- a/app/models/pool_version.rb +++ b/app/models/pool_version.rb @@ -3,10 +3,14 @@ class PoolVersion < ApplicationRecord belongs_to :pool def self.enabled? - Danbooru.config.aws_sqs_archives_url.present? + Rails.env.test? || Danbooru.config.aws_sqs_archives_url.present? end - establish_connection (ENV["ARCHIVE_DATABASE_URL"] || "archive_#{Rails.env}".to_sym) if enabled? + def self.database_url + ENV["ARCHIVE_DATABASE_URL"] || "archive_#{Rails.env}".to_sym + end + + establish_connection database_url if enabled? module SearchMethods def default_order diff --git a/app/models/post_version.rb b/app/models/post_version.rb index ee7abb495..d45ea0e64 100644 --- a/app/models/post_version.rb +++ b/app/models/post_version.rb @@ -9,7 +9,11 @@ class PostVersion < ApplicationRecord Rails.env.test? || Danbooru.config.aws_sqs_archives_url.present? end - establish_connection (ENV["ARCHIVE_DATABASE_URL"] || "archive_#{Rails.env}".to_sym) if enabled? + def self.database_url + ENV["ARCHIVE_DATABASE_URL"] || "archive_#{Rails.env}".to_sym + end + + establish_connection database_url if enabled? def self.check_for_retry(msg) if msg =~ /can't get socket descriptor/ && msg =~ /post_versions/ diff --git a/test/functional/pool_elements_controller_test.rb b/test/functional/pool_elements_controller_test.rb index bde89265f..937e457ab 100644 --- a/test/functional/pool_elements_controller_test.rb +++ b/test/functional/pool_elements_controller_test.rb @@ -3,8 +3,6 @@ require 'test_helper' class PoolElementsControllerTest < ActionDispatch::IntegrationTest context "The pools posts controller" do setup do - mock_pool_archive_service! - start_pool_archive_transaction @user = travel_to(1.month.ago) {create(:user)} @mod = create(:moderator_user) as_user do @@ -13,10 +11,6 @@ class PoolElementsControllerTest < ActionDispatch::IntegrationTest end end - teardown do - rollback_pool_archive_transaction - end - context "create action" do should "add a post to a pool" do post_auth pool_element_path, @user, params: {:pool_id => @pool.id, :post_id => @post.id, :format => "json"} diff --git a/test/functional/pool_versions_controller_test.rb b/test/functional/pool_versions_controller_test.rb index 703f4e43d..a04c0a043 100644 --- a/test/functional/pool_versions_controller_test.rb +++ b/test/functional/pool_versions_controller_test.rb @@ -3,30 +3,17 @@ require 'test_helper' class PoolVersionsControllerTest < ActionDispatch::IntegrationTest context "The pool versions controller" do setup do - mock_pool_archive_service! - start_pool_archive_transaction @user = create(:user) end - teardown do - rollback_pool_archive_transaction - end - context "index action" do setup do - as_user do - @pool = create(:pool) - end + @pool = as(@user) { create(:pool) } @user_2 = create(:user) @user_3 = create(:user) - CurrentUser.scoped(@user_2, "1.2.3.4") do - @pool.update(:post_ids => "1 2") - end - - CurrentUser.scoped(@user_3, "5.6.7.8") do - @pool.update(:post_ids => "1 2 3 4") - end + as(@user_2) { @pool.update(post_ids: "1 2") } + as(@user_3) { @pool.update(post_ids: "1 2 3 4") } @versions = @pool.versions end diff --git a/test/functional/pools_controller_test.rb b/test/functional/pools_controller_test.rb index 7fcc2a441..9f3eb7fc0 100644 --- a/test/functional/pools_controller_test.rb +++ b/test/functional/pools_controller_test.rb @@ -3,10 +3,6 @@ require 'test_helper' class PoolsControllerTest < ActionDispatch::IntegrationTest context "The pools controller" do setup do - mock_pool_archive_service! - PoolVersion.sqs_service.stubs(:merge?).returns(false) - start_pool_archive_transaction - travel_to(1.month.ago) do @user = create(:user) @mod = create(:moderator_user) @@ -17,10 +13,6 @@ class PoolsControllerTest < ActionDispatch::IntegrationTest end end - teardown do - rollback_pool_archive_transaction - end - context "index action" do should "list all pools" do get pools_path diff --git a/test/test_helper.rb b/test/test_helper.rb index f4f6fe0d8..6b974bc9d 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -57,14 +57,17 @@ end class ActiveSupport::TestCase include ActiveJob::TestHelper include FactoryBot::Syntax::Methods - include PostArchiveTestHelper - include PoolArchiveTestHelper + extend PostArchiveTestHelper + extend PoolArchiveTestHelper include ReportbooruHelper include DownloadTestHelper include IqdbTestHelper include UploadTestHelper include TestHelpers + mock_post_version_service! + mock_pool_version_service! + setup do Socket.stubs(:gethostname).returns("www.example.com") mock_popular_search_service! @@ -84,9 +87,12 @@ class ActiveSupport::TestCase end class ActionDispatch::IntegrationTest - include PostArchiveTestHelper - include PoolArchiveTestHelper include TestHelpers + extend PostArchiveTestHelper + extend PoolArchiveTestHelper + + mock_post_version_service! + mock_pool_version_service! def method_authenticated(method_name, url, user, options) post session_path, params: { name: user.name, password: user.password } diff --git a/test/test_helpers/pool_archive_test_helper.rb b/test/test_helpers/pool_archive_test_helper.rb index f98990ab4..acf77d0dd 100644 --- a/test/test_helpers/pool_archive_test_helper.rb +++ b/test/test_helpers/pool_archive_test_helper.rb @@ -1,30 +1,30 @@ module PoolArchiveTestHelper - def mock_pool_archive_service! - mock_sqs_service = Class.new do - def send_message(msg, *options) - _, json = msg.split(/\n/) - json = JSON.parse(json) - prev = PoolVersion.where(pool_id: json["pool_id"]).order("id desc").first - if merge?(prev, json) - prev.update_columns(json) - else - PoolVersion.create(json) - end - end + def mock_pool_version_service! + setup do + PoolVersion.stubs(:sqs_service).returns(MockPoolSqsService.new) + PoolVersion.establish_connection(PoolVersion.database_url) + PoolVersion.connection.begin_transaction joinable: false + end - def merge?(prev, json) - prev && (prev.updater_id == json["updater_id"]) && (prev.updated_at >= 1.hour.ago) + teardown do + PoolVersion.connection.rollback_transaction + end + end + + class MockPoolSqsService + def send_message(msg, *options) + _, json = msg.split(/\n/) + json = JSON.parse(json) + prev = PoolVersion.where(pool_id: json["pool_id"]).order("id desc").first + if merge?(prev, json) + prev.update_columns(json) + else + PoolVersion.create!(json) end end - PoolVersion.stubs(:sqs_service).returns(mock_sqs_service.new) - end - - def start_pool_archive_transaction - PoolVersion.connection.begin_transaction joinable: false - end - - def rollback_pool_archive_transaction - PoolVersion.connection.rollback_transaction + def merge?(prev, json) + prev && (prev.updater_id == json["updater_id"]) && (prev.updated_at >= 1.hour.ago) + end end end diff --git a/test/test_helpers/post_archive_test_helper.rb b/test/test_helpers/post_archive_test_helper.rb index 1990711e7..6ff113bd5 100644 --- a/test/test_helpers/post_archive_test_helper.rb +++ b/test/test_helpers/post_archive_test_helper.rb @@ -1,54 +1,42 @@ module PostArchiveTestHelper - def setup - super + def mock_post_version_service! + setup do + PostVersion.stubs(:sqs_service).returns(MockPostSqsService.new) + PostVersion.establish_connection(PostVersion.database_url) + PostVersion.connection.begin_transaction joinable: false + end - mock_post_archive_service! - start_post_archive_transaction + teardown do + PostVersion.connection.rollback_transaction + end end - def teardown - super - - rollback_post_archive_transaction - end - - def mock_post_archive_service! - mock_sqs_service = Class.new do - def send_message(msg, *options) - _, json = msg.split(/\n/) - json = JSON.parse(json) - json.delete("created_at") - json["version"] = 1 + PostVersion.where(post_id: json["post_id"]).count - prev = PostVersion.where(post_id: json["post_id"]).order("id desc").first - if prev - json["added_tags"] = json["tags"].scan(/\S+/) - prev.tags.scan(/\S+/) - json["removed_tags"] = prev.tags.scan(/\S+/) - json["tags"].scan(/\S+/) - else - json["added_tags"] = json["tags"].scan(/\S+/) - end - json["parent_changed"] = (prev.nil? || json.key?("parent_id") && prev.parent_id != json["parent_id"]) - json["source_changed"] = (prev.nil? || json.key?("source") && prev.source != json["source"]) - json["rating_changed"] = (prev.nil? || json.key?("rating") && prev.rating != json["rating"]) - if merge?(prev, json) - prev.update_columns(json) - else - PostVersion.create(json) - end + class MockPostSqsService + def send_message(msg, *options) + _, json = msg.split(/\n/) + json = JSON.parse(json) + json.delete("created_at") + json["version"] = 1 + PostVersion.where(post_id: json["post_id"]).count + prev = PostVersion.where(post_id: json["post_id"]).order("id desc").first + if prev + json["added_tags"] = json["tags"].scan(/\S+/) - prev.tags.scan(/\S+/) + json["removed_tags"] = prev.tags.scan(/\S+/) - json["tags"].scan(/\S+/) + else + json["added_tags"] = json["tags"].scan(/\S+/) end - - def merge?(prev, json) - prev && (prev.updater_id == json["updater_id"]) && (prev.updated_at >= 1.hour.ago) + json["parent_changed"] = (prev.nil? || json.key?("parent_id") && prev.parent_id != json["parent_id"]) + json["source_changed"] = (prev.nil? || json.key?("source") && prev.source != json["source"]) + json["rating_changed"] = (prev.nil? || json.key?("rating") && prev.rating != json["rating"]) + if merge?(prev, json) + prev.update_columns(json) + else + # XXX change this to `create!` and fix tests that don't set current user. + PostVersion.create(json) end end - PostVersion.stubs(:sqs_service).returns(mock_sqs_service.new) - end - - def start_post_archive_transaction - PostVersion.connection.begin_transaction joinable: false - end - - def rollback_post_archive_transaction - PostVersion.connection.rollback_transaction + def merge?(prev, json) + prev && (prev.updater_id == json["updater_id"]) && (prev.updated_at >= 1.hour.ago) + end end end diff --git a/test/unit/pool_test.rb b/test/unit/pool_test.rb index 466b093e4..d2c7a31d3 100644 --- a/test/unit/pool_test.rb +++ b/test/unit/pool_test.rb @@ -8,14 +8,9 @@ class PoolTest < ActiveSupport::TestCase end CurrentUser.ip_addr = "127.0.0.1" - - mock_pool_archive_service! - PoolVersion.sqs_service.stubs(:merge?).returns(false) - start_pool_archive_transaction end teardown do - rollback_pool_archive_transaction CurrentUser.user = nil CurrentUser.ip_addr = nil end diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb index 5fceed12e..6392e591b 100644 --- a/test/unit/post_test.rb +++ b/test/unit/post_test.rb @@ -23,7 +23,6 @@ class PostTest < ActiveSupport::TestCase end CurrentUser.user = @user CurrentUser.ip_addr = "127.0.0.1" - mock_pool_archive_service! end def teardown @@ -838,15 +837,6 @@ class PostTest < ActiveSupport::TestCase end context "for a pool" do - setup do - mock_pool_archive_service! - start_pool_archive_transaction - end - - teardown do - rollback_pool_archive_transaction - end - context "on creation" do setup do @pool = FactoryBot.create(:pool) @@ -1863,10 +1853,6 @@ class PostTest < ActiveSupport::TestCase end context "Searching:" do - setup do - mock_pool_archive_service! - end - should "return posts for the age:<1minute tag" do post = FactoryBot.create(:post) assert_tag_match([post], "age:<1minute")