171 lines
4.7 KiB
Ruby
171 lines
4.7 KiB
Ruby
require 'rails_helper'
|
|
require 'discourse'
|
|
|
|
describe Discourse do
|
|
|
|
before do
|
|
RailsMultisite::ConnectionManagement.stubs(:current_hostname).returns('foo.com')
|
|
end
|
|
|
|
context 'current_hostname' do
|
|
|
|
it 'returns the hostname from the current db connection' do
|
|
expect(Discourse.current_hostname).to eq('foo.com')
|
|
end
|
|
|
|
end
|
|
|
|
context 'base_url' do
|
|
context 'when https is off' do
|
|
before do
|
|
SiteSetting.expects(:use_https?).returns(false)
|
|
end
|
|
|
|
it 'has a non https base url' do
|
|
expect(Discourse.base_url).to eq("http://foo.com")
|
|
end
|
|
end
|
|
|
|
context 'when https is on' do
|
|
before do
|
|
SiteSetting.expects(:use_https?).returns(true)
|
|
end
|
|
|
|
it 'has a non-ssl base url' do
|
|
expect(Discourse.base_url).to eq("https://foo.com")
|
|
end
|
|
end
|
|
|
|
context 'with a non standard port specified' do
|
|
before do
|
|
SiteSetting.stubs(:port).returns(3000)
|
|
end
|
|
|
|
it "returns the non standart port in the base url" do
|
|
expect(Discourse.base_url).to eq("http://foo.com:3000")
|
|
end
|
|
end
|
|
end
|
|
|
|
context '#site_contact_user' do
|
|
|
|
let!(:admin) { Fabricate(:admin) }
|
|
let!(:another_admin) { Fabricate(:admin) }
|
|
|
|
it 'returns the user specified by the site setting site_contact_username' do
|
|
SiteSetting.stubs(:site_contact_username).returns(another_admin.username)
|
|
expect(Discourse.site_contact_user).to eq(another_admin)
|
|
end
|
|
|
|
it 'returns the user specified by the site setting site_contact_username regardless of its case' do
|
|
SiteSetting.stubs(:site_contact_username).returns(another_admin.username.upcase)
|
|
expect(Discourse.site_contact_user).to eq(another_admin)
|
|
end
|
|
|
|
it 'returns the system user otherwise' do
|
|
SiteSetting.stubs(:site_contact_username).returns(nil)
|
|
expect(Discourse.site_contact_user.username).to eq("system")
|
|
end
|
|
|
|
end
|
|
|
|
context "#store" do
|
|
|
|
it "returns LocalStore by default" do
|
|
expect(Discourse.store).to be_a(FileStore::LocalStore)
|
|
end
|
|
|
|
it "returns S3Store when S3 is enabled" do
|
|
SiteSetting.stubs(:enable_s3_uploads?).returns(true)
|
|
SiteSetting.stubs(:s3_upload_bucket).returns("s3_bucket")
|
|
SiteSetting.stubs(:s3_access_key_id).returns("s3_access_key_id")
|
|
SiteSetting.stubs(:s3_secret_access_key).returns("s3_secret_access_key")
|
|
expect(Discourse.store).to be_a(FileStore::S3Store)
|
|
end
|
|
|
|
end
|
|
|
|
context "#enable_readonly_mode" do
|
|
|
|
it "adds a key in redis and publish a message through the message bus" do
|
|
$redis.expects(:set).with(Discourse.readonly_mode_key, 1)
|
|
MessageBus.expects(:publish).with(Discourse.readonly_channel, true)
|
|
Discourse.enable_readonly_mode
|
|
end
|
|
|
|
end
|
|
|
|
context "#disable_readonly_mode" do
|
|
|
|
it "removes a key from redis and publish a message through the message bus" do
|
|
$redis.expects(:del).with(Discourse.readonly_mode_key)
|
|
MessageBus.expects(:publish).with(Discourse.readonly_channel, false)
|
|
Discourse.disable_readonly_mode
|
|
end
|
|
|
|
end
|
|
|
|
context "#readonly_mode?" do
|
|
it "is false by default" do
|
|
expect(Discourse.readonly_mode?).to eq(false)
|
|
end
|
|
|
|
it "returns true when the key is present in redis" do
|
|
begin
|
|
$redis.set(Discourse.readonly_mode_key, 1)
|
|
expect(Discourse.readonly_mode?).to eq(true)
|
|
ensure
|
|
$redis.del(Discourse.readonly_mode_key)
|
|
end
|
|
end
|
|
|
|
it "returns true when Discourse is recently read only" do
|
|
Discourse.received_readonly!
|
|
expect(Discourse.readonly_mode?).to eq(true)
|
|
end
|
|
end
|
|
|
|
context ".received_readonly!" do
|
|
it "sets the right time" do
|
|
time = Discourse.received_readonly!
|
|
expect(Discourse.last_read_only['default']).to eq(time)
|
|
end
|
|
end
|
|
|
|
context "#handle_exception" do
|
|
|
|
class TempSidekiqLogger < Sidekiq::ExceptionHandler::Logger
|
|
attr_accessor :exception, :context
|
|
def call(ex, ctx)
|
|
self.exception = ex
|
|
self.context = ctx
|
|
end
|
|
end
|
|
|
|
let!(:logger) { TempSidekiqLogger.new }
|
|
|
|
before do
|
|
Sidekiq.error_handlers.clear
|
|
Sidekiq.error_handlers << logger
|
|
end
|
|
|
|
it "should not fail when called" do
|
|
exception = StandardError.new
|
|
|
|
Discourse.handle_job_exception(exception, nil, nil)
|
|
expect(logger.exception).to eq(exception)
|
|
expect(logger.context.keys).to eq([:current_db, :current_hostname])
|
|
end
|
|
|
|
it "correctly passes extra context" do
|
|
exception = StandardError.new
|
|
|
|
Discourse.handle_job_exception(exception, {message: "Doing a test", post_id: 31}, nil)
|
|
expect(logger.exception).to eq(exception)
|
|
expect(logger.context.keys.sort).to eq([:current_db, :current_hostname, :message, :post_id].sort)
|
|
end
|
|
end
|
|
|
|
end
|
|
|