0
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-08-06 13:08:40 +08:00
discourse/spec/system/composer_spec.rb
Bannon Tanner 0bf651e358
FIX: Create tags in composer creates instead of fallback to ID (#41847)
There's a small bug with creating tags inside of the composer and
choosing "Create: '20'" or some numeric name for the tagname. If there
is already a tag with that ID, it will use the existing tag instead of
creating the new one.

This changes to ensure that when the "Create" option is selected, it
does not populate the ID and will instead create the tag with name "20".
2026-07-21 09:40:20 -05:00

180 lines
5.6 KiB
Ruby
Vendored

# frozen_string_literal: true
describe "Composer" do
fab!(:user) { Fabricate(:user, refresh_auto_groups: true) }
let(:composer) { PageObjects::Components::Composer.new }
before { sign_in(user) }
it "displays user cards in preview" do
page.visit "/new-topic"
expect(composer).to be_opened
composer.fill_content("@#{user.username}")
composer.preview.find("a.mention").click
page.has_css?("#user-card")
end
context "in a topic, the autocomplete prioritizes" do
fab!(:topic_user, :user)
fab!(:second_reply_user, :user)
fab!(:topic) { Fabricate(:topic, user: topic_user) }
fab!(:op) { Fabricate(:post, topic: topic, user: topic_user) }
let!(:op_post) { PageObjects::Components::Post.new(op.post_number) }
fab!(:second_reply) { Fabricate(:post, topic: topic, user: second_reply_user) }
let!(:second_reply_post) { PageObjects::Components::Post.new(second_reply.post_number) }
before { SiteSetting.enable_names = false }
it "the topic owner if replying to topic" do
page.visit "/t/#{topic.id}"
op_post.reply
expect(composer).to be_opened
composer.type_content("@")
expect(composer.mention_menu_autocomplete_username_list).to eq(
[op.username, second_reply_user.username], # must be first the topic owner
)
end
it "the recipient of the reply when replying" do
page.visit "/t/#{topic.id}"
second_reply_post.reply
expect(composer).to be_opened
composer.type_content("@")
expect(composer.mention_menu_autocomplete_username_list).to eq(
[second_reply_user.username, topic_user.username], # must be first the reply user
)
end
it "the recipient of the reply when editing a reply" do
admin = Fabricate(:admin, refresh_auto_groups: true)
reply_to_second_post =
Fabricate(:post, topic: topic, user: user, reply_to_post_number: second_reply.post_number)
reply_post = PageObjects::Components::Post.new(reply_to_second_post.post_number)
sign_in(admin)
page.visit "/t/#{topic.id}"
reply_post.edit
expect(composer).to be_opened
composer.type_content(" @")
expect(composer.mention_menu_autocomplete_username_list).to eq(
[second_reply_user.username, user.username, topic_user.username],
)
end
end
it "focuses the reply button when tabbing out of both editor modes" do
page.visit "/new-topic"
expect(composer).to be_opened
composer.focus
page.send_keys(:tab)
expect(composer.reply_button_focused?).to eq(true)
composer.toggle_rich_editor
composer.focus
page.send_keys(:tab)
expect(composer.reply_button_focused?).to eq(true)
end
context "with tagging enabled" do
fab!(:tag) { Fabricate(:tag, name: "test-tag") }
fab!(:category)
let(:mini_tag_chooser) { PageObjects::Components::SelectKit.new(".mini-tag-chooser") }
let(:topic_page) { PageObjects::Pages::Topic.new }
before do
SiteSetting.tagging_enabled = true
category.set_permissions(everyone: :full)
category.save!
end
it "creates a topic with tags" do
page.visit "/new-topic"
expect(composer).to be_opened
composer.fill_title("Test topic with tags")
composer.fill_content("This is a test topic with tags")
composer.switch_category(category.name)
mini_tag_chooser.expand
mini_tag_chooser.search(tag.name)
mini_tag_chooser.select_row_by_name(tag.name)
mini_tag_chooser.collapse
composer.create
expect(topic_page).to have_topic_title("Test topic with tags")
expect(topic_page.topic_tags).to include(tag.name)
end
it "creates a new numeric-name tag rather than reusing an existing tag with that id" do
SiteSetting.create_tag_allowed_groups = Group::AUTO_GROUPS[:trust_level_0]
# A pre-existing tag whose id (as a string) will collide with what the
# user types. If serialization ever treats the typed name as an id, the
# backend would attach this tag instead of creating a new one.
existing_tag = Fabricate(:tag, name: "existing-tag-name")
numeric_name = existing_tag.id.to_s
page.visit "/new-topic"
expect(composer).to be_opened
composer.fill_title("Test topic with numeric-name tag")
composer.fill_content("This is a test topic with a numeric-name tag")
composer.switch_category(category.name)
mini_tag_chooser.expand
mini_tag_chooser.search(numeric_name)
mini_tag_chooser.select_row_by_name(numeric_name)
mini_tag_chooser.collapse
composer.create
expect(topic_page).to have_topic_title("Test topic with numeric-name tag")
expect(topic_page.topic_tags).to eq([numeric_name])
expect(topic_page.topic_tags).not_to include(existing_tag.name)
expect(Tag.exists?(name: numeric_name)).to eq(true)
end
end
context "with fixed category positions" do
fab!(:parent_category) { Fabricate(:category, name: "Software", position: 102) }
fab!(:subcategory) do
Fabricate(:category, name: "Email", parent_category: parent_category, position: 25)
end
before do
SiteSetting.fixed_category_positions = true
SiteSetting.fixed_category_positions_on_create = true
end
it "groups subcategories immediately after their parent in the category chooser" do
visit "/new-topic"
expect(composer).to be_opened
category_chooser = composer.category_chooser
category_chooser.expand
option_names = category_chooser.option_names
parent_index = option_names.index("Software")
child_index = option_names.index("Email")
expect(child_index).to eq(parent_index + 1)
end
end
end