0
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-08-07 13:19:19 +08:00
discourse/spec/system/simplified_category_creation_spec.rb
Martin Brennan d41418ec01
DEV: Remove enable_simplified_category_creation old code (#40108)
Now that enable_simplified_category_creation is permanent, we can remove
all the old code in the false condition of this upcoming change.

Since now admins can also add/remove category types in the General tab,
I am also removing the settings connectors for topic voting + solved
plugins, removing more clutter from the Settings tab:
2026-05-27 10:04:46 +10:00

437 lines
14 KiB
Ruby
Vendored

# frozen_string_literal: true
describe "Simplified Category Creation" do
fab!(:admin)
fab!(:group)
fab!(:category)
let(:category_page) { PageObjects::Pages::Category.new }
let(:form) { PageObjects::Components::FormKit.new(".form-kit") }
let(:category_type_card) { PageObjects::Components::CategoryTypeCard.new }
let(:category_permission_row) { PageObjects::Components::CategoryPermissionRow.new }
let(:toasts) { PageObjects::Components::Toasts.new }
before { sign_in(admin) }
describe "Selecting category type when setting up a new category" do
it "automatically skips category type selection when only one type (discussion) is available" do
category_page.visit_new_category
expect(page).to have_content(I18n.t("js.category.create_with_type", typeName: "discussion"))
expect(page).to have_current_path("/new-category/general")
end
context "when multiple types are available" do
class MockCategoryType < ::Categories::Types::Base
type_id :mock_type
class << self
def category_matches?(category)
true
end
def find_matches
Category.none
end
end
end
before { Categories::TypeRegistry.register(MockCategoryType) }
after { Categories::TypeRegistry.reset! }
it "shows the category type selection cards" do
visit("/new-category/setup")
expect(category_type_card).to have_type_card("mock_type")
expect(category_type_card).to have_type_card("discussion")
category_type_card.find_type_card("discussion").click
expect(page).to have_content(I18n.t("js.category.create_with_type", typeName: "discussion"))
expect(page).to have_current_path("/new-category/general")
end
end
end
describe "General Tab" do
it "creates a basic category with name and color" do
category_page.visit_new_category
form.field("name").fill_in("Test Category")
form.field("color").fill_in("FF5733")
category_page.save_settings
created_category = Category.find_by(name: "Test Category")
expect(created_category).to be_present
expect(created_category.color).to eq("FF5733")
end
it "edits an existing category name" do
category_page.visit_general(category)
form.field("name").fill_in("Updated Name")
category_page.save_settings
expect(category.reload.name).to eq("Updated Name")
end
it "changes category color" do
category_page.visit_general(category)
form.field("color").fill_in("123ABC")
category_page.save_settings
expect(category.reload.color).to eq("123ABC")
end
it "selects a parent category" do
parent_category = Fabricate(:category, name: "Parent")
category_page.visit_general(category)
parent_chooser = PageObjects::Components::SelectKit.new(".category-chooser")
parent_chooser.expand
parent_chooser.select_row_by_value(parent_category.id)
category_page.save_settings
expect(category.reload.parent_category_id).to eq(parent_category.id)
end
it "switches to group restricted visibility" do
category_page.visit_general(category)
form.choose_conditional("group_restricted")
group_chooser = PageObjects::Components::SelectKit.new(".group-chooser")
group_chooser.expand
group_chooser.select_row_by_value(group.id)
group_chooser.collapse
category_page.save_settings
expect(category.reload.category_groups.map(&:group_id)).to include(group.id)
end
it "shows error when color is invalid" do
category_page.visit_general(category)
form.field("color").fill_in("GGGGGG")
category_page.save_settings
expect(form.field("color")).to have_errors(
I18n.t("js.category.color_validations.non_hexdecimal"),
)
end
it "shows advanced tabs when toggled" do
category_page.visit_general(category)
category_page.toggle_advanced_settings
expect(page).to have_css(".edit-category-security")
expect(page).to have_css(".edit-category-settings")
end
it "preserves permission types when adding a new access group on general tab" do
group2 = Fabricate(:group)
category_page.visit_new_category
form.field("name").fill_in("Permission Test")
form.choose_conditional("group_restricted")
group_chooser = PageObjects::Components::SelectKit.new(".group-chooser")
group_chooser.expand
group_chooser.select_row_by_value(group.id)
group_chooser.collapse
category_page.toggle_advanced_settings
find(".edit-category-security a").click
category_permission_row.toggle_group_permission(group.name, "reply")
find(".edit-category-general a").click
group_chooser.expand
group_chooser.select_row_by_value(group2.id)
group_chooser.collapse
find(".edit-category-security a").click
expect(page).to have_no_css(
"#{category_permission_row.group_permission_row_selector(group.name)} .reply-granted",
)
end
it "automatically switches to private when selecting a restricted parent" do
restricted_parent =
Fabricate(:category, name: "Restricted Parent", permissions: { group.name => :full })
category_page.visit_new_category
parent_chooser = PageObjects::Components::SelectKit.new(".category-chooser")
parent_chooser.expand
parent_chooser.select_row_by_value(restricted_parent.id)
expect(page).to have_css(".group-chooser")
end
it "shows inherited groups when selecting a restricted parent" do
restricted_parent =
Fabricate(:category, name: "Restricted Parent", permissions: { group.name => :full })
category_page.visit_new_category
parent_chooser = PageObjects::Components::SelectKit.new(".category-chooser")
parent_chooser.expand
parent_chooser.select_row_by_value(restricted_parent.id)
group_chooser = PageObjects::Components::SelectKit.new(".group-chooser")
expect(group_chooser).to have_selected_name(group.name)
end
it "collapses long descriptions with a show more toggle" do
category_with_definition = Fabricate(:category_with_definition)
long_description = (["This is a long paragraph of text."] * 20).join(" ")
post = category_with_definition.topic.first_post
post.update!(cooked: "<p>#{long_description}</p>")
category_with_definition.update!(description: "<p>#{long_description}</p>")
category_page.visit_general(category_with_definition)
expect(page).to have_css(".description-content.--collapsed.--overflowing")
expect(page).to have_css(".toggle-description")
find(".toggle-description").click
expect(page).to have_no_css(".description-content.--collapsed")
expect(page).to have_css(".description-content.--overflowing")
find(".toggle-description").click
expect(page).to have_css(".description-content.--collapsed.--overflowing")
end
it "does not show expand toggle for short descriptions" do
category_with_definition = Fabricate(:category_with_definition)
category_page.visit_general(category_with_definition)
expect(page).to have_css(".description-content")
expect(page).to have_no_css(".toggle-description")
expect(page).to have_no_css(".description-content.--overflowing")
end
it "opens the composer to edit the category description and updates it after save" do
category_with_definition = Fabricate(:category_with_definition)
category_page.visit_general(category_with_definition)
composer = PageObjects::Components::Composer.new
find(".edit-category-description").click
expect(composer).to be_opened
composer.fill_content("Updated category description")
composer.submit
expect(composer).to be_closed
expect(page).to have_css(".edit-category-description-container .readonly-field")
expect(page).to have_content("Updated category description")
expect(toasts).to have_success(I18n.t("js.category.description_updated"))
end
it "does not allow selecting other category types when creating a new category" do
category_page.visit_new_category
expect(page).to have_content(I18n.t("js.category.create_with_type", typeName: "discussion"))
expect(page).to have_no_css(".category-type-selector")
end
end
describe "Security Tab" do
fab!(:private_category) { Fabricate(:private_category, group:) }
before do
CategoryGroup.create!(
category:,
group: Group.find(Group::AUTO_GROUPS[:everyone]),
permission_type: CategoryGroup.permission_types[:readonly],
)
CategoryGroup.create!(
category:,
group:,
permission_type: CategoryGroup.permission_types[:readonly],
)
end
it "resets security settings when navigating from edit to new category" do
category_page.visit_general(private_category)
expect(page).to have_css(".group-chooser")
category_page.visit_new_category
expect(page).to have_no_css(".group-chooser")
end
it "removes a group permission" do
category_page.visit_security(category)
category_permission_row.remove_group_permission(group.name)
category_page.save_settings
expect(category.reload.category_groups.map(&:group_id)).not_to include(group.id)
end
it "modifies a group permission (toggle reply)" do
category_page.visit_security(category)
category_permission_row.toggle_group_permission(group.name, "reply")
category_page.save_settings
expect(category.reload.category_groups.find_by(group:).permission_type).to eq(
CategoryGroup.permission_types[:create_post],
)
end
end
describe "Moderation Tab" do
it "creates a category with a group-based posting review mode" do
category_page.visit_new_category
form.field("name").fill_in("Review Test")
category_page.toggle_advanced_settings
find(".edit-category-moderation a").click
category_page.topic_posting_review_mode_chooser(simplified: true).expand
category_page.topic_posting_review_mode_chooser(simplified: true).select_row_by_value(
"everyone_except",
)
category_page.save_settings
expect(category_page).to have_posting_review_groups_error
category_page.topic_posting_review_group_chooser(simplified: true).expand
category_page.topic_posting_review_group_chooser(simplified: true).select_row_by_value(
group.id,
)
category_page.save_settings
expect(category_page).to have_no_posting_review_groups_error
created_category = Category.find_by(name: "Review Test")
category_page.visit_moderation(created_category)
expect(category_page).to have_topic_posting_review_mode("everyone_except", simplified: true)
expect(category_page).to have_topic_posting_review_groups(group, simplified: true)
end
it "allows selecting 'everyone' mode" do
category_page.visit_moderation(category)
category_page.topic_posting_review_mode_chooser(simplified: true).expand
category_page.topic_posting_review_mode_chooser(simplified: true).select_row_by_value(
"everyone",
)
category_page.save_settings
category_page.visit_moderation(category)
expect(category_page).to have_topic_posting_review_mode("everyone", simplified: true)
end
it "allows selecting 'everyone_except' mode with groups" do
category_page.visit_moderation(category)
category_page.topic_posting_review_mode_chooser(simplified: true).expand
category_page.topic_posting_review_mode_chooser(simplified: true).select_row_by_value(
"everyone_except",
)
category_page.save_settings
expect(category_page).to have_posting_review_groups_error
category_page.topic_posting_review_group_chooser(simplified: true).expand
category_page.topic_posting_review_group_chooser(simplified: true).select_row_by_value(
group.id,
)
category_page.save_settings
category_page.visit_moderation(category)
expect(category_page).to have_no_posting_review_groups_error
expect(category_page).to have_topic_posting_review_mode("everyone_except", simplified: true)
expect(category_page).to have_topic_posting_review_groups(group, simplified: true)
end
end
describe "Images Tab" do
before do
SiteSetting.authorized_extensions = ""
SiteSetting.authorized_extensions_for_staff = "jpg|jpeg|png"
end
it "sets default view to latest" do
category_page.visit_appearance(category)
form.field("default_view").select("latest")
category_page.save_settings
expect(category.reload.default_view).to eq("latest")
end
it "uploads a category logo" do
category_page.visit_appearance(category)
attach_file(
"category-logo-uploader__input",
Rails.root.join("spec/fixtures/images/logo.png"),
make_visible: true,
)
expect(page).to have_css("#category-logo-uploader.has-image")
category_page.save_settings
expect(category.reload.uploaded_logo).to be_present
end
end
describe "Tags Tab" do
fab!(:tag1) { Fabricate(:tag, name: "tag1") }
fab!(:tag_group) { Fabricate(:tag_group, name: "My Group") }
let(:allowed_tag_groups_chooser) do
PageObjects::Components::SelectKit.new("#category-allowed-tag-groups")
end
before do
SiteSetting.tagging_enabled = true
tag_group.tags = [tag1]
tag_group.save!
end
it "restricts allowed tags" do
category_page.visit_tags(category)
form.field("allowed_tags").select("tag1")
category_page.save_settings
expect(category.reload.tags.map(&:name)).to include("tag1")
category_page.visit_tags(category)
expect(form.field("allowed_tags")).to have_selected_names("tag1")
end
it "sets minimum required tags" do
category_page.visit_tags(category)
form.field("minimum_required_tags").fill_in("2")
category_page.save_settings
expect(category.reload.minimum_required_tags).to eq(2)
end
it "sets required tag groups" do
category_page.visit_tags(category)
allowed_tag_groups_chooser.expand
allowed_tag_groups_chooser.select_row_by_name("My Group")
allowed_tag_groups_chooser.collapse
category_page.save_settings
expect(category.reload.tag_groups.map(&:name)).to include("My Group")
category_page.visit_tags(category)
expect(allowed_tag_groups_chooser).to have_selected_names("My Group")
end
end
end