2019-04-30 08:27:42 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2022-07-28 10:27:38 +08:00
|
|
|
RSpec.describe SiteSerializer do
|
2019-03-16 19:48:57 +08:00
|
|
|
let(:guardian) { Guardian.new }
|
2020-08-20 03:05:04 +08:00
|
|
|
let(:category) { Fabricate(:category) }
|
2019-03-16 19:48:57 +08:00
|
|
|
|
2021-06-23 15:21:11 +08:00
|
|
|
after do
|
|
|
|
Site.clear_cache
|
|
|
|
end
|
|
|
|
|
2022-11-10 02:20:34 +08:00
|
|
|
describe '#user_tips' do
|
|
|
|
it 'is included if enable_user_tips' do
|
|
|
|
SiteSetting.enable_user_tips = true
|
2022-10-12 23:38:45 +08:00
|
|
|
|
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
2022-11-10 02:20:34 +08:00
|
|
|
expect(serialized[:user_tips]).to eq(User.user_tips)
|
2022-10-12 23:38:45 +08:00
|
|
|
end
|
|
|
|
|
2022-11-10 02:20:34 +08:00
|
|
|
it 'is not included if enable_user_tips is disabled' do
|
2022-10-12 23:38:45 +08:00
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
2022-11-10 02:20:34 +08:00
|
|
|
expect(serialized[:user_tips]).to eq(nil)
|
2022-10-12 23:38:45 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-03-16 19:48:57 +08:00
|
|
|
it "includes category custom fields only if its preloaded" do
|
|
|
|
category.custom_fields["enable_marketplace"] = true
|
|
|
|
category.save_custom_fields
|
|
|
|
|
2021-06-23 15:21:11 +08:00
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
|
|
|
c1 = serialized[:categories].find { |c| c[:id] == category.id }
|
|
|
|
|
|
|
|
expect(c1[:custom_fields]).to eq(nil)
|
2019-03-16 19:48:57 +08:00
|
|
|
|
|
|
|
Site.preloaded_category_custom_fields << "enable_marketplace"
|
2021-06-23 15:21:11 +08:00
|
|
|
Site.clear_cache
|
|
|
|
|
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
|
|
|
c1 = serialized[:categories].find { |c| c[:id] == category.id }
|
|
|
|
|
|
|
|
expect(c1[:custom_fields]["enable_marketplace"]).to eq("t")
|
2021-06-25 09:15:17 +08:00
|
|
|
ensure
|
2022-07-14 08:54:31 +08:00
|
|
|
Site.reset_preloaded_category_custom_fields
|
2021-06-23 15:21:11 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
it "includes category tags" do
|
|
|
|
tag = Fabricate(:tag)
|
|
|
|
tag_group = Fabricate(:tag_group)
|
|
|
|
tag_group_2 = Fabricate(:tag_group)
|
|
|
|
|
|
|
|
category.tags << tag
|
|
|
|
category.tag_groups << tag_group
|
2022-04-06 21:08:06 +08:00
|
|
|
category.update!(category_required_tag_groups: [CategoryRequiredTagGroup.new(tag_group: tag_group_2, min_count: 1)])
|
2021-06-23 15:21:11 +08:00
|
|
|
|
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
|
|
|
c1 = serialized[:categories].find { |c| c[:id] == category.id }
|
2019-03-16 19:48:57 +08:00
|
|
|
|
2021-06-23 15:21:11 +08:00
|
|
|
expect(c1[:allowed_tags]).to contain_exactly(tag.name)
|
|
|
|
expect(c1[:allowed_tag_groups]).to contain_exactly(tag_group.name)
|
2022-04-06 21:08:06 +08:00
|
|
|
expect(c1[:required_tag_groups]).to eq([{ name: tag_group_2.name, min_count: 1 }])
|
2019-03-16 19:48:57 +08:00
|
|
|
end
|
2020-08-20 03:05:04 +08:00
|
|
|
|
2022-04-22 01:18:35 +08:00
|
|
|
it "doesn't explode when category_required_tag_group is missing" do
|
|
|
|
tag = Fabricate(:tag)
|
|
|
|
tag_group = Fabricate(:tag_group)
|
|
|
|
crtg = CategoryRequiredTagGroup.new(tag_group: tag_group, min_count: 1)
|
|
|
|
category.update!(category_required_tag_groups: [ crtg ])
|
|
|
|
|
|
|
|
tag_group.delete # Bypassing hooks like this should never happen in the app
|
|
|
|
|
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
|
|
|
c1 = serialized[:categories].find { |c| c[:id] == category.id }
|
|
|
|
|
|
|
|
expect(c1[:required_tag_groups]).to eq([{ name: nil, min_count: 1 }])
|
|
|
|
end
|
|
|
|
|
2020-08-20 03:05:04 +08:00
|
|
|
it "returns correct notification level for categories" do
|
|
|
|
SiteSetting.mute_all_categories_by_default = true
|
2022-06-20 11:49:33 +08:00
|
|
|
SiteSetting.default_categories_normal = category.id.to_s
|
2020-08-20 03:05:04 +08:00
|
|
|
|
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
|
|
|
categories = serialized[:categories]
|
|
|
|
expect(categories[0][:notification_level]).to eq(0)
|
|
|
|
expect(categories[-1][:notification_level]).to eq(1)
|
|
|
|
end
|
2020-08-28 22:36:52 +08:00
|
|
|
|
|
|
|
it "includes user-selectable color schemes" do
|
2020-10-14 22:18:02 +08:00
|
|
|
# it includes seeded color schemes
|
2020-08-28 22:36:52 +08:00
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
2022-07-09 05:46:32 +08:00
|
|
|
expect(serialized[:user_color_schemes].count).to eq(6)
|
2020-08-28 22:36:52 +08:00
|
|
|
|
2020-10-16 02:05:48 +08:00
|
|
|
scheme_names = serialized[:user_color_schemes].map { |x| x[:name] }
|
|
|
|
expect(scheme_names).to include(I18n.t("color_schemes.dark"))
|
|
|
|
expect(scheme_names).to include(I18n.t("color_schemes.wcag"))
|
|
|
|
expect(scheme_names).to include(I18n.t("color_schemes.wcag_dark"))
|
2022-07-09 05:46:32 +08:00
|
|
|
expect(scheme_names).to include(I18n.t("color_schemes.solarized_light"))
|
|
|
|
expect(scheme_names).to include(I18n.t("color_schemes.solarized_dark"))
|
|
|
|
expect(scheme_names).to include(I18n.t("color_schemes.dracula"))
|
2020-10-16 02:05:48 +08:00
|
|
|
|
|
|
|
dark_scheme = ColorScheme.create_from_base(name: "AnotherDarkScheme", base_scheme_id: "Dark")
|
2020-08-28 22:36:52 +08:00
|
|
|
dark_scheme.user_selectable = true
|
|
|
|
dark_scheme.save!
|
|
|
|
|
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
2022-07-09 05:46:32 +08:00
|
|
|
expect(serialized[:user_color_schemes].count).to eq(7)
|
2020-08-28 22:36:52 +08:00
|
|
|
expect(serialized[:user_color_schemes][0][:is_dark]).to eq(true)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "includes default dark mode scheme" do
|
|
|
|
scheme = ColorScheme.last
|
|
|
|
SiteSetting.default_dark_mode_color_scheme_id = scheme.id
|
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
|
|
|
default_dark_scheme =
|
|
|
|
expect(serialized[:default_dark_color_scheme]["name"]).to eq(scheme.name)
|
|
|
|
|
|
|
|
SiteSetting.default_dark_mode_color_scheme_id = -1
|
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
|
|
|
expect(serialized[:default_dark_color_scheme]).to eq(nil)
|
|
|
|
end
|
2021-05-07 03:09:31 +08:00
|
|
|
|
|
|
|
it 'does not include shared_drafts_category_id if the category is Uncategorized' do
|
|
|
|
admin = Fabricate(:admin)
|
|
|
|
admin_guardian = Guardian.new(admin)
|
|
|
|
|
|
|
|
SiteSetting.shared_drafts_category = SiteSetting.uncategorized_category_id
|
|
|
|
|
|
|
|
serialized = described_class.new(Site.new(admin_guardian), scope: admin_guardian, root: false).as_json
|
|
|
|
expect(serialized[:shared_drafts_category_id]).to eq(nil)
|
|
|
|
end
|
2022-08-10 00:22:39 +08:00
|
|
|
|
|
|
|
it 'includes show_welcome_topic_banner' do
|
|
|
|
admin = Fabricate(:admin)
|
|
|
|
admin_guardian = Guardian.new(admin)
|
|
|
|
UserAuthToken.generate!(user_id: admin.id)
|
|
|
|
|
|
|
|
first_post = Fabricate(:post, created_at: 25.days.ago)
|
|
|
|
SiteSetting.welcome_topic_id = first_post.topic.id
|
|
|
|
|
|
|
|
serialized = described_class.new(Site.new(admin_guardian), scope: admin_guardian, root: false).as_json
|
|
|
|
expect(serialized[:show_welcome_topic_banner]).to eq(true)
|
|
|
|
end
|
2022-08-23 16:20:46 +08:00
|
|
|
|
2022-10-11 08:45:22 +08:00
|
|
|
describe '#anonymous_default_sidebar_tags' do
|
|
|
|
fab!(:user) { Fabricate(:user) }
|
2022-10-27 06:38:50 +08:00
|
|
|
fab!(:tag) { Fabricate(:tag, name: 'dev') }
|
|
|
|
fab!(:tag2) { Fabricate(:tag, name: 'random') }
|
|
|
|
fab!(:hidden_tag) { Fabricate(:tag, name: "secret") }
|
|
|
|
fab!(:staff_tag_group) { Fabricate(:tag_group, permissions: { "staff" => 1 }, tag_names: [hidden_tag.name]) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
SiteSetting.enable_experimental_sidebar_hamburger = true
|
|
|
|
SiteSetting.tagging_enabled = true
|
|
|
|
SiteSetting.default_sidebar_tags = "#{tag.name}|#{tag2.name}|#{hidden_tag.name}"
|
|
|
|
end
|
2022-08-23 16:20:46 +08:00
|
|
|
|
2022-10-11 08:45:22 +08:00
|
|
|
it 'is not included in the serialised object when tagging is not enabled' do
|
|
|
|
SiteSetting.tagging_enabled = false
|
|
|
|
guardian = Guardian.new(user)
|
|
|
|
|
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
|
|
|
expect(serialized[:anonymous_default_sidebar_tags]).to eq(nil)
|
|
|
|
end
|
|
|
|
|
2022-10-27 06:38:50 +08:00
|
|
|
it 'is not included in the serialised object when experimental sidebar has not been enabled' do
|
|
|
|
SiteSetting.enable_experimental_sidebar_hamburger = false
|
2022-10-11 08:45:22 +08:00
|
|
|
|
2022-10-27 06:38:50 +08:00
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
|
|
|
expect(serialized[:anonymous_default_sidebar_tags]).to eq(nil)
|
|
|
|
end
|
2022-10-11 08:45:22 +08:00
|
|
|
|
2022-10-27 06:38:50 +08:00
|
|
|
it 'is not included in the serialised object when user is not anonymous' do
|
|
|
|
guardian = Guardian.new(user)
|
2022-10-11 08:45:22 +08:00
|
|
|
|
2022-10-27 06:38:50 +08:00
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
|
|
|
expect(serialized[:anonymous_default_sidebar_tags]).to eq(nil)
|
|
|
|
end
|
2022-10-11 08:45:22 +08:00
|
|
|
|
2022-10-27 06:38:50 +08:00
|
|
|
it 'is not included in the serialisd object when default sidebar tags have not been configured' do
|
|
|
|
SiteSetting.default_sidebar_tags = ""
|
2022-10-11 08:45:22 +08:00
|
|
|
|
2022-10-27 06:38:50 +08:00
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
|
|
|
expect(serialized[:anonymous_default_sidebar_tags]).to eq(nil)
|
|
|
|
end
|
2022-10-11 08:45:22 +08:00
|
|
|
|
2022-10-27 06:38:50 +08:00
|
|
|
it 'includes only tags user can see in the serialised object when user is anonymous' do
|
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
|
|
|
expect(serialized[:anonymous_default_sidebar_tags]).to eq(["dev", "random"])
|
2022-10-11 08:45:22 +08:00
|
|
|
end
|
2022-08-23 16:20:46 +08:00
|
|
|
end
|
2022-10-06 15:58:55 +08:00
|
|
|
|
|
|
|
describe '#top_tags' do
|
|
|
|
fab!(:tag) { Fabricate(:tag) }
|
|
|
|
|
|
|
|
describe 'when tagging is not enabled' do
|
|
|
|
before do
|
|
|
|
SiteSetting.tagging_enabled = false
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'is not included in the serialised object' do
|
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
|
|
|
|
|
|
|
expect(serialized[:top_tags]).to eq(nil)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'when tagging is enabled' do
|
|
|
|
fab!(:tag2) { Fabricate(:tag) }
|
|
|
|
fab!(:tag3) { Fabricate(:tag) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
SiteSetting.tagging_enabled = true
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'is not included in the serialised object when there are no tags' do
|
|
|
|
tag.destroy!
|
|
|
|
|
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
|
|
|
|
|
|
|
expect(serialized[:top_tags]).to eq([])
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'is included in the serialised object containing the top tags' do
|
|
|
|
tag2 = Fabricate(:tag)
|
|
|
|
tag2 = Fabricate(:tag)
|
|
|
|
|
|
|
|
SiteSetting.max_tags_in_filter_list = 1
|
|
|
|
|
|
|
|
CategoryTagStat.create!(category_id: SiteSetting.uncategorized_category_id, tag_id: tag2.id, topic_count: 2)
|
|
|
|
CategoryTagStat.create!(category_id: SiteSetting.uncategorized_category_id, tag_id: tag.id, topic_count: 1)
|
|
|
|
CategoryTagStat.create!(category_id: SiteSetting.uncategorized_category_id, tag_id: tag3.id, topic_count: 5)
|
|
|
|
|
|
|
|
serialized = described_class.new(Site.new(guardian), scope: guardian, root: false).as_json
|
|
|
|
|
|
|
|
expect(serialized[:top_tags]).to eq([tag3.name, tag2.name])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2019-03-16 19:48:57 +08:00
|
|
|
end
|