discourse/spec/system/table_builder_spec.rb

185 lines
6.5 KiB
Ruby

# frozen_string_literal: true
describe "Table Builder", type: :system do
fab!(:user) { Fabricate(:user, refresh_auto_groups: true) }
let(:composer) { PageObjects::Components::Composer.new }
let(:insert_table_modal) { PageObjects::Modals::InsertTable.new }
fab!(:topic) { Fabricate(:topic, user: user) }
fab!(:topic2) { Fabricate(:topic, user: user) }
fab!(:post1) { create_post(user: user, topic: topic, raw: <<~RAW) }
|Make | Model | Year|
|--- | --- | ---|
|Toyota | Supra | 1998|
|Nissan | Skyline | 1999|
|Honda | S2000 | 2001|
RAW
fab!(:post2) { create_post(user: user, topic: topic2, raw: <<~RAW) }
| | | |
|--- | --- | ---|
|Some | content | here|
|1 | 2 | 3|
RAW
let(:topic_page) { PageObjects::Pages::Topic.new }
before { sign_in(user) }
def normalize_value(content)
content.strip.gsub(/\s+/, " ").gsub(/\r\n/, "\n")
end
context "when creating a new table" do
it "should add table items created in spreadsheet to composer input" do
visit("/latest")
page.find("#create-topic").click
page.find(".toolbar-popup-menu-options").click
page.find(".select-kit-row[data-name='toggle-spreadsheet']").click
insert_table_modal.type_in_cell(0, 0, "Item 1")
insert_table_modal.type_in_cell(0, 1, "Item 2")
insert_table_modal.type_in_cell(0, 2, "Item 3")
insert_table_modal.type_in_cell(0, 3, "Item 4")
insert_table_modal.click_insert_table
created_table = <<~TABLE
|Column 1 | Column 2 | Column 3 | Column 4|
|--- | --- | --- | ---|
|Item 1 | Item 2 | Item 3 | Item 4|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
TABLE
expect(normalize_value(composer.composer_input.value)).to eq(normalize_value(created_table))
end
context "when cancelling table creation" do
it "should close the modal if there are no changes made" do
visit("/latest")
page.find("#create-topic").click
page.find(".toolbar-popup-menu-options").click
page.find(".select-kit-row[data-name='toggle-spreadsheet']").click
insert_table_modal.cancel
expect(page).to have_no_css(".insert-table-modal")
end
it "should show a warning popup if there are unsaved changes" do
visit("/latest")
page.find("#create-topic").click
page.find(".toolbar-popup-menu-options").click
page.find(".select-kit-row[data-name='toggle-spreadsheet']").click
insert_table_modal.type_in_cell(0, 0, "Item 1")
insert_table_modal.cancel
expect(page).to have_css(".dialog-container .dialog-content")
end
end
end
context "when editing a table" do
it "should prefill the spreadsheet with the markdown table items from the post" do
topic_page.visit_topic(topic)
topic_page.find(".btn-edit-table", visible: :all).click
expect(page).to have_selector(".insert-table-modal")
expected_table_content = [
%w[Toyota Supra 1998],
%w[Nissan Skyline 1999],
%w[Honda S2000 2001],
]
expected_table_content.each_with_index do |row, row_index|
row.each_with_index do |content, col_index|
expect(insert_table_modal).to have_content_in_cell(row_index, col_index, content)
end
end
end
it "should update the post with the new table content" do
topic_page.visit_topic(topic)
topic_page.find(".btn-edit-table", visible: :all).click
expect(page).to have_selector(".insert-table-modal")
insert_table_modal.type_in_cell(1, 1, " GTR")
insert_table_modal.click_insert_table
updated_post = <<~RAW
|Make | Model | Year|
|--- | --- | ---|
|Toyota | Supra | 1998|
|Nissan | Skyline GTR | 1999|
|Honda | S2000 | 2001|
RAW
try_until_success do
expect(normalize_value(post1.reload.raw)).to eq(normalize_value(updated_post))
end
end
it "should respect the original empty header" do
topic_page.visit_topic(topic2)
topic_page.find(".btn-edit-table", visible: :all).click
expect(page).to have_selector(".insert-table-modal")
insert_table_modal.type_in_cell(0, 0, " updated")
insert_table_modal.click_insert_table
updated_post = <<~RAW
| | | |
|--- | --- | ---|
|Some updated | content | here|
|1 | 2 | 3|
RAW
try_until_success do
expect(normalize_value(post2.reload.raw)).to eq(normalize_value(updated_post))
end
end
context "when adding an edit reason" do
it "should add the edit reason to the edit history" do
edit_reason = "Updated Nissan model"
topic_page.visit_topic(topic)
topic_page.find(".btn-edit-table", visible: :all).click
expect(page).to have_selector(".insert-table-modal")
insert_table_modal.type_in_cell(1, 1, " GTR")
insert_table_modal.click_edit_reason
insert_table_modal.type_edit_reason(edit_reason)
insert_table_modal.click_insert_table
wait_for { post1.reload.edit_reason == edit_reason }
expect(post1.reload.edit_reason).to eq(edit_reason)
end
end
context "when cancelling table creation" do
it "should close the modal if there are no changes made" do
topic_page.visit_topic(topic)
topic_page.find(".btn-edit-table", visible: :all).click
expect(page).to have_selector(".insert-table-modal")
insert_table_modal.cancel
expect(page).to have_no_css(".insert-table-modal")
end
it "should show a warning popup if there are unsaved changes" do
topic_page.visit_topic(topic)
topic_page.find(".btn-edit-table", visible: :all).click
expect(page).to have_selector(".insert-table-modal")
insert_table_modal.type_in_cell(1, 1, " GTR")
insert_table_modal.cancel
expect(page).to have_css(".dialog-container .dialog-content")
end
end
it "should not accept default Discourse keyboard shortcuts" do
# Some default keyboard shortcuts like Shift + S bring up a modal overriding
# the table builder modal and therefore should not be accepted
topic_page.visit_topic(topic)
topic_page.find(".btn-edit-table", visible: :all).click
insert_table_modal.find_cell(0, 0)
insert_table_modal.send_keys(:shift, "s")
expect(page).to have_css(".insert-table-modal")
expect(page).to have_no_css(".share-topic-modal")
end
end
end