Files
nairobi/spec/system/legislation/draft_versions_spec.rb
Javi Martín 8b13daad95 Add and apply rules for multi-line hashes
For the HashAlignment rule, we're using the default `key` style (keys
are aligned and values aren't) instead of the `table` style (both keys
and values are aligned) because, even if we used both in the
application, we used the `key` style a lot more. Furthermore, the
`table` style looks strange in places where there are both very long and
very short keys and sometimes we weren't even consistent with the
`table` style, aligning some keys without aligning other keys.

Ideally we could align hashes to "either key or table", so developers
can decide whether keeping the symmetry of the code is worth it in a
case-per-case basis, but Rubocop doesn't allow this option.
2023-08-18 14:56:16 +02:00

427 lines
16 KiB
Ruby

require "rails_helper"
describe "Legislation Draft Versions" do
let(:user) { create(:user) }
let(:administrator) do
create(:administrator, user: user)
user
end
context "See draft text page" do
let(:process) { create(:legislation_process) }
let!(:original) do
create(:legislation_draft_version, process: process, title: "Original",
body: "Original version", status: "published")
end
let!(:draft) do
create(:legislation_draft_version, process: process, title: "Draft",
body: "Draft version", status: "draft")
end
before do
create(:legislation_draft_version, process: process, title: "Current",
body: "Current version", status: "published")
end
it "shows the text body for this version" do
visit legislation_process_draft_version_path(process, original)
expect(page).to have_content("Original version")
within("select#draft_version_id") do
expect(page).to have_content("Original")
expect(page).to have_content("Current")
expect(page).not_to have_content("Draft")
end
end
it "shows an unpublished version to admins" do
login_as(administrator)
visit legislation_process_draft_version_path(process, draft)
expect(page).to have_content("Draft version")
within("select#draft_version_id") do
expect(page).to have_content("Original")
expect(page).to have_content("Current")
expect(page).to have_content("Draft *")
end
end
it "switches to another version without js", :no_js do
visit legislation_process_draft_version_path(process, original)
expect(page).to have_content("Original version")
select("Current")
click_button "see"
expect(page).not_to have_content("Original version")
expect(page).to have_content("Current version")
end
it "switches to another version with js" do
visit legislation_process_draft_version_path(process, original)
expect(page).to have_content("Original version")
select("Current")
expect(page).not_to have_content("Original version")
expect(page).to have_content("Current version")
end
scenario "show more info button" do
process.update!(additional_info: "Text for additional info of the process")
visit legislation_process_draft_version_path(process, original)
expect(page).not_to have_content "Text for additional info of the process"
click_button "More information and context"
expect(page).to have_content "Text for additional info of the process"
end
scenario "show help gif" do
visit legislation_process_draft_version_path(process, original)
click_button text: "How can I comment this document?"
expect(page).to have_content "select the text you want to comment and press the button with the pencil"
end
context "for final versions" do
it "does not show the comments panel" do
final_version = create(:legislation_draft_version, process: process, title: "Final version",
body: "Final body", status: "published", final_version: true)
visit legislation_process_draft_version_path(process, final_version)
expect(page).to have_content("Final body")
expect(page).not_to have_content("See all comments")
within(".draft-panels") do
expect(page).not_to have_content("Comments")
end
end
end
end
context "See changes page" do
let(:process) { create(:legislation_process) }
let!(:original) do
create(:legislation_draft_version, process: process, title: "Original", body: "Original version",
changelog: "Changes for first version", status: "published")
end
let!(:draft) do
create(:legislation_draft_version, process: process, title: "Draft", body: "Draft version",
changelog: "Changes for third version", status: "draft")
end
before do
create(:legislation_draft_version, process: process, title: "Current", body: "Current version",
changelog: "Changes for second version", status: "published")
end
it "shows the changes for this version" do
visit legislation_process_draft_version_changes_path(process, original)
expect(page).to have_content("Changes for first version")
within("select#draft_version_id") do
expect(page).to have_content("Original")
expect(page).to have_content("Current")
expect(page).not_to have_content("Draft")
end
end
it "shows an unpublished version to admins" do
login_as(administrator)
visit legislation_process_draft_version_changes_path(process, draft)
expect(page).to have_content("Changes for third version")
within("select#draft_version_id") do
expect(page).to have_content("Original")
expect(page).to have_content("Current")
expect(page).to have_content("Draft *")
end
end
it "switches to another version without js", :no_js do
visit legislation_process_draft_version_changes_path(process, original)
expect(page).to have_content("Changes for first version")
select("Current")
click_button "see"
expect(page).not_to have_content("Changes for first version")
expect(page).to have_content("Changes for second version")
end
it "switches to another version with js" do
visit legislation_process_draft_version_changes_path(process, original)
expect(page).to have_content("Changes for first version")
select("Current")
expect(page).not_to have_content("Changes for first version")
expect(page).to have_content("Changes for second version")
end
end
context "Annotations" do
let(:user) { create(:user) }
let(:draft_version) { create(:legislation_draft_version, :published) }
before { login_as user }
scenario "Visit as anonymous" do
logout
visit legislation_process_draft_version_path(draft_version.process, draft_version)
page.find(:css, ".legislation-annotatable").double_click
page.find(:css, ".annotator-adder button").click
expect(page).not_to have_css("#legislation_annotation_text")
expect(page).to have_content "You must sign in or sign up to leave a comment."
end
scenario "Create" do
visit legislation_process_draft_version_path(draft_version.process, draft_version)
page.find(:css, ".legislation-annotatable").double_click
page.find(:css, ".annotator-adder button").click
page.click_button "Publish Comment"
expect(page).to have_content "Comment can't be blank"
fill_in "legislation_annotation_text", with: "this is my annotation"
page.click_button "Publish Comment"
expect(page).to have_css ".annotator-hl"
first(:css, ".annotator-hl").click
expect(page).to have_content "this is my annotation"
visit legislation_process_draft_version_path(draft_version.process, draft_version)
expect(page).to have_css ".annotator-hl"
first(:css, ".annotator-hl").click
expect(page).to have_content "this is my annotation"
end
scenario "View annotations and comments" do
annotation1 = create(:legislation_annotation, draft_version: draft_version, text: "my annotation",
ranges: [{ "start" => "/p[1]", "startOffset" => 5, "end" => "/p[1]", "endOffset" => 10 }])
create(:legislation_annotation, draft_version: draft_version, text: "my other annotation",
ranges: [{ "start" => "/p[1]", "startOffset" => 12, "end" => "/p[1]", "endOffset" => 19 }])
comment = create(:comment, commentable: annotation1)
visit legislation_process_draft_version_path(draft_version.process, draft_version)
expect(page).to have_css ".annotator-hl"
first(:css, ".annotator-hl").click
expect(page).to have_content "my annotation"
expect(page).to have_content comment.body
all(".annotator-hl")[1].click
expect(page).to have_content "my other annotation"
end
scenario "Publish new comment for an annotation from comments box" do
create(:legislation_annotation, draft_version: draft_version, text: "my annotation",
ranges: [{ "start" => "/p[1]", "startOffset" => 6, "end" => "/p[1]", "endOffset" => 11 }])
visit legislation_process_draft_version_path(draft_version.process, draft_version)
expect(page).to have_css ".annotator-hl"
first(:css, ".annotator-hl").click
expect(page).to have_content "my annotation"
click_link "Publish Comment"
fill_in "comment[body]", with: "My interesting comment"
click_button "Publish comment"
expect(page).to have_content "My interesting comment"
end
scenario "Publish new comment with errors for an existing annotation" do
create(:legislation_annotation, draft_version: draft_version)
visit legislation_process_draft_version_path(draft_version.process, draft_version)
find(:css, ".annotator-hl").double_click
find(:css, ".annotator-adder button").click
click_button "Publish Comment"
expect(page).to have_content "Comment can't be blank"
end
scenario "When page is restored from browser cache do not duplicate annotation handlers" do
Setting["org_name"] = "CONSUL"
create(:legislation_annotation, draft_version: draft_version, text: "my annotation")
visit legislation_process_draft_version_path(draft_version.process, draft_version)
expect(page).to have_css(".annotator-hl", count: 1)
click_link "Help"
expect(page).to have_content "CONSUL is a platform for citizen participation"
go_back
expect(page).to have_content "A collaborative legislation process"
expect(page).to have_css(".annotator-hl", count: 1)
end
scenario "When page is restored from browser cache publish comment button keeps working" do
Setting["org_name"] = "CONSUL"
create(:legislation_annotation, draft_version: draft_version, text: "my annotation")
visit legislation_process_draft_version_path(draft_version.process, draft_version)
find(:css, ".annotator-hl").click
click_link "Help"
expect(page).to have_content "CONSUL is a platform for citizen participation"
go_back
expect(page).to have_content "A collaborative legislation process"
click_link "Publish Comment"
fill_in "comment[body]", with: "My interesting comment"
click_button "Publish comment"
expect(page).to have_content "My interesting comment"
end
end
context "Merged annotations" do
let(:user) { create(:user) }
let(:draft_version) { create(:legislation_draft_version, :published) }
before { login_as user }
scenario "View annotations and comments in an included range" do
create(:legislation_annotation, draft_version: draft_version, text: "my annotation",
ranges: [{ "start" => "/p[1]", "startOffset" => 1, "end" => "/p[1]", "endOffset" => 5 }])
create(:legislation_annotation, draft_version: draft_version, text: "my other annotation",
ranges: [{ "start" => "/p[1]", "startOffset" => 1, "end" => "/p[1]", "endOffset" => 10 }])
visit legislation_process_draft_version_path(draft_version.process, draft_version)
expect(page).to have_css ".annotator-hl"
first(:css, ".annotator-hl").click
within(".comment-box") do
expect(page).to have_content "2 comment"
expect(page).to have_content "my annotation"
expect(page).to have_content "my other annotation"
end
end
end
context "Annotations page" do
let(:draft_version) { create(:legislation_draft_version, :published) }
before do
create(:legislation_annotation, draft_version: draft_version, text: "my annotation", quote: "ipsum",
ranges: [{ "start" => "/p[1]", "startOffset" => 6, "end" => "/p[1]", "endOffset" => 11 }])
create(:legislation_annotation, draft_version: draft_version, text: "my other annotation", quote: "audiam",
ranges: [{ "start" => "/p[3]", "startOffset" => 6, "end" => "/p[3]", "endOffset" => 11 }])
end
scenario "See all annotations for a draft version" do
visit legislation_process_draft_version_annotations_path(draft_version.process, draft_version)
expect(page).to have_content "ipsum"
expect(page).to have_content "audiam"
end
context "switching versions" do
let(:process) { create(:legislation_process) }
let(:original) { create(:legislation_draft_version, :published, process: process, title: "Original") }
let(:current) { create(:legislation_draft_version, :published, process: process, title: "Current") }
before do
create(:legislation_annotation, draft_version: original, quote: "quote for version 1",
ranges: [{ "start" => "/p[1]", "startOffset" => 11, "end" => "/p[1]", "endOffset" => 30 }])
create(:legislation_annotation, draft_version: current, quote: "quote for version 2",
ranges: [{ "start" => "/p[1]", "startOffset" => 11, "end" => "/p[1]", "endOffset" => 30 }])
end
scenario "without js", :no_js do
visit legislation_process_draft_version_annotations_path(process, original)
expect(page).to have_content("quote for version 1")
select("Current")
click_button "see"
expect(page).not_to have_content("quote for version 1")
expect(page).to have_content("quote for version 2")
end
scenario "with js" do
visit legislation_process_draft_version_annotations_path(process, original)
expect(page).to have_content("quote for version 1")
select("Current")
expect(page).not_to have_content("quote for version 1")
expect(page).to have_content("quote for version 2")
end
end
end
context "Annotation comments page" do
let(:draft_version) { create(:legislation_draft_version, :published) }
before do
create(:legislation_annotation, draft_version: draft_version, text: "my annotation", quote: "ipsum",
ranges: [{ "start" => "/p[1]", "startOffset" => 6, "end" => "/p[1]", "endOffset" => 11 }])
end
scenario "See one annotation with replies for a draft version" do
annotation = create(:legislation_annotation, draft_version: draft_version, text: "my other annotation", quote: "audiam",
ranges: [{ "start" => "/p[3]", "startOffset" => 6, "end" => "/p[3]", "endOffset" => 11 }])
visit legislation_process_draft_version_annotation_path(draft_version.process, draft_version, annotation)
expect(page).not_to have_content "ipsum"
expect(page).not_to have_content "my annotation"
expect(page).to have_content "audiam"
expect(page).to have_content "my other annotation"
end
end
context "See table from markdown" do
let(:draft_version) { create(:legislation_draft_version, :published, :with_table) }
let(:path) do
edit_admin_legislation_process_draft_version_path(draft_version.process, draft_version)
end
scenario "See table as a user" do
visit legislation_process_draft_version_path(draft_version.process, draft_version)
expect(page).to have_css("table")
expect(page).to have_content "Roberta"
expect(page).to have_content "25"
end
scenario "See table as an admin" do
login_as(administrator)
visit path
click_link "Launch text editor"
expect(page).to have_css("table")
expect(page).to have_content "Roberta"
expect(page).to have_content "25"
end
end
end