discourse/spec/components/discourse_spec.rb

158 lines
4.3 KiB
Ruby

require 'spec_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
Discourse.current_hostname.should == '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
Discourse.base_url.should == "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
Discourse.base_url.should == "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
Discourse.base_url.should == "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)
Discourse.site_contact_user.should == 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)
Discourse.site_contact_user.should == another_admin
end
it 'returns the first admin user otherwise' do
SiteSetting.stubs(:site_contact_username).returns(nil)
Discourse.site_contact_user.should == admin
end
end
context "#store" do
it "returns LocalStore by default" do
Discourse.store.should 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")
Discourse.store.should 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 "returns true when the key is present in redis" do
$redis.expects(:get).with(Discourse.readonly_mode_key).returns("1")
Discourse.readonly_mode?.should == true
end
it "returns false when the key is not present in redis" do
$redis.expects(:get).with(Discourse.readonly_mode_key).returns(nil)
Discourse.readonly_mode?.should == false
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_exception(exception, nil, nil)
logger.exception.should == exception
logger.context.keys.should == [:current_db, :current_hostname]
end
it "correctly passes extra context" do
exception = StandardError.new
Discourse.handle_exception(exception, {message: "Doing a test", post_id: 31}, nil)
logger.exception.should == exception
logger.context.keys.sort.should == [:current_db, :current_hostname, :message, :post_id].sort
end
end
end