# frozen_string_literal: true
RSpec.describe BootstrapController do
let(:theme) { Fabricate(:theme, enabled: true) }
before do
DiscoursePluginRegistry.register_html_builder('server:before-head-close') { 'wat' }
theme.set_field(target: :desktop, name: :header, value: '
custom header
').save
SiteSetting.default_theme_id = theme.id
end
after do
DiscoursePluginRegistry.reset!
ExtraLocalesController.clear_cache!
end
it "returns data as anonymous" do
get "/bootstrap.json"
expect(response.status).to eq(200)
json = response.parsed_body
expect(json).to be_present
bootstrap = json['bootstrap']
expect(bootstrap).to be_present
expect(bootstrap['title']).to be_present
expect(bootstrap['theme_id']).to eq(theme.id)
expect(bootstrap['setup_data']['base_url']).to eq(Discourse.base_url)
expect(bootstrap['stylesheets']).to be_present
expect(bootstrap['html']).to be_present
expect(bootstrap['html']['before_head_close']).to eq('wat')
expect(bootstrap['theme_html']).to be_present
expect(bootstrap['theme_html']['header']).to eq('custom header
')
preloaded = bootstrap['preloaded']
expect(preloaded['site']).to be_present
expect(preloaded['siteSettings']).to be_present
expect(preloaded['currentUser']).to be_blank
expect(preloaded['topicTrackingStates']).to be_blank
expect(bootstrap['html_classes']).to eq("desktop-view not-mobile-device text-size-normal anon")
expect(bootstrap['html_lang']).to eq('en')
end
it "returns user data when authenticated" do
user = Fabricate(:user)
sign_in(user)
get "/bootstrap.json"
expect(response.status).to eq(200)
json = response.parsed_body
expect(json).to be_present
bootstrap = json['bootstrap']
preloaded = bootstrap['preloaded']
expect(preloaded['currentUser']).to be_present
expect(preloaded['topicTrackingStates']).to be_present
end
it "returns extra locales (admin) when staff" do
user = Fabricate(:admin)
sign_in(user)
get "/bootstrap.json"
expect(response.status).to eq(200)
json = response.parsed_body
expect(json).to be_present
bootstrap = json['bootstrap']
expect(bootstrap['extra_locales']).to be_present
end
it "returns data when login_required is enabled" do
SiteSetting.login_required = true
get "/bootstrap.json"
expect(response.status).to eq(200)
expect(response.parsed_body).to be_present
end
context "when authentication data is present" do
it "returns authentication data" do
cookie_data = 'someauthenticationdata'
cookies['authentication_data'] = cookie_data
get "/bootstrap.json"
bootstrap = response.parsed_body['bootstrap']
expect(bootstrap['authentication_data']).to eq(cookie_data)
end
end
context 'with a plugin asset filter' do
let :plugin do
plugin = Plugin::Instance.new
plugin.path = "#{Rails.root}/spec/fixtures/plugins/my_plugin/plugin.rb"
plugin.register_asset_filter do |type, request|
next true if request.path == "/mypluginroute"
false
end
plugin
end
before do
Discourse.plugins << plugin
plugin.activate!
end
after do
Discourse.plugins.delete plugin
end
it "filters assets using the given path" do
get "/bootstrap.json"
expect(response.status).to eq(200)
plugin_assets = response.parsed_body.dig("bootstrap", "plugin_js")
expect(plugin_assets).not_to include(a_string_matching "my_plugin")
get "/bootstrap.json?for_url=/mypluginroute"
expect(response.status).to eq(200)
plugin_assets = response.parsed_body.dig("bootstrap", "plugin_js")
expect(plugin_assets).to include(a_string_matching "my_plugin")
end
end
end