discourse/spec/lib/discourse_ip_info_spec.rb
Alan Guo Xiang Tan 3193afe7ca
FIX: Rescue and warn when error is encountered in DiscourseIpInfo.mmdb_download (#28134)
Since switching to Maxmind permalinks to download the databases in
7079698cdf, we have received multiple
reports about rebuilds failing as `maxminddb:refresh` runs during
the rebuilds and failing to download the databases cases the rebuilds to
fail.

Downloading Maxmind databases should not sit in the critical rebuild
path but since we are close to the Discourse 3.3 release, we have opted
to just rescue all errors encountered when downloading the databases.

In the near future after the Discourse 3.3 release, we will be looking
at moving the downloading of maxmind databases out of the rebuild path.
2024-07-30 11:33:20 +08:00

88 lines
3.3 KiB
Ruby

# frozen_string_literal: true
RSpec.describe DiscourseIpInfo do
describe ".mmdb_download" do
before { Discourse::Utils.stubs(:execute_command) }
it "should download the MaxMind databases from MaxMind's download permalinks when `maxmind_license_key` and `maxmind_account_id` global setting has been set" do
global_setting :maxmind_license_key, "license_key"
global_setting :maxmind_account_id, "account_id"
stub_request(
:get,
"https://download.maxmind.com/geoip/databases/GeoLite2-City/download?suffix=tar.gz",
).with(basic_auth: %w[account_id license_key]).to_return(
status: 302,
body: "",
headers: {
location:
"https://mm-prod-geoip-databases.a2649acb697e2c09b632799562c076f2.r2.cloudflarestorage.com/some-path",
},
)
stub_request(
:get,
"https://mm-prod-geoip-databases.a2649acb697e2c09b632799562c076f2.r2.cloudflarestorage.com/some-path",
).with { |req| expect(req.headers.key?("Authorization")).to eq(false) }.to_return(status: 200)
described_class.mmdb_download("GeoLite2-City")
end
it "should download the MaxMind databases from MaxMind's undocumented download URL when `maxmind_license_key` global setting has been set but not `maxmind_account_id` for backwards compatibility reasons" do
global_setting :maxmind_license_key, "license_key"
stub_request(
:get,
"https://download.maxmind.com/app/geoip_download?license_key=license_key&edition_id=GeoLite2-City&suffix=tar.gz",
).to_return(status: 200, body: "", headers: {})
described_class.mmdb_download("GeoLite2-City")
end
it "should download the MaxMind databases from the right URL when `maxmind_mirror_url` global setting has been configured" do
global_setting :maxmind_mirror_url, "https://b.www.example.com/mirror"
stub_request(:get, "https://b.www.example.com/mirror/GeoLite2-City.tar.gz").to_return(
status: 200,
body: "",
)
described_class.mmdb_download("GeoLite2-City")
end
it "should download the MaxMind databases from the right URL when `maxmind_mirror_url` global setting has been configured and has a trailing slash" do
global_setting :maxmind_mirror_url, "https://b.www.example.com/mirror/"
stub_request(:get, "https://b.www.example.com/mirror/GeoLite2-City.tar.gz").to_return(
status: 200,
body: "",
)
described_class.mmdb_download("GeoLite2-City")
end
it "should not throw an error and instead log the exception when database file fails to download" do
original_logger = Rails.logger
Rails.logger = fake_logger = FakeLogger.new
global_setting :maxmind_license_key, "license_key"
global_setting :maxmind_account_id, "account_id"
stub_request(
:get,
"https://download.maxmind.com/geoip/databases/GeoLite2-City/download?suffix=tar.gz",
).with(basic_auth: %w[account_id license_key]).to_return(status: 500, body: nil, headers: {})
expect do described_class.mmdb_download("GeoLite2-City") end.not_to raise_error
expect(fake_logger.warnings.length).to eq(1)
expect(fake_logger.warnings.first).to include(
"MaxMind database GeoLite2-City download failed. 500 Error",
)
ensure
Rails.logger = original_logger
end
end
end