Files
nairobi/spec/components/admin/action_component_spec.rb
Javi Martín ea913f9332 Use Capybara methods to find/click/check links
We applied the Capybara/SpecificMatcher in commit f52a86b46.  However,
this rule doesn't convert methods finding <a> tags to methods finding
links because <a> tags only count as links when they've got the `href`
attribute. For instance, in the `xss_spec.rb` file we check what happens
when clicking on an anchor tag because we're testing that the `href`
attribute has been removed and so we can't use `click_link`.

So, basically, we can't enable a rule to automatically detect when we're
using `have_css` instead of `have_link`, but we should still do it
because `have_link` adds an extra check which affects accessibility
since it makes sure the tag has the `href` attribute and so it's
recognizable as a link by screen readers.
2023-09-11 14:10:41 +02:00

182 lines
6.2 KiB
Ruby

require "rails_helper"
describe Admin::ActionComponent do
describe "HTML class" do
it "includes an HTML class for the action by default" do
render_inline Admin::ActionComponent.new(:edit, double, path: "/")
expect(page).to have_link class: %w[edit-link admin-action]
end
it "keeps the admin-action class when the class is overwritten" do
render_inline Admin::ActionComponent.new(:edit, double, path: "/", class: "modify-link")
expect(page).to have_link class: %w[modify-link admin-action]
expect(page).not_to have_css ".edit-link"
end
end
describe "HTML id" do
it "is not rendered for non-ActiveModel records" do
render_inline Admin::ActionComponent.new(:edit, double, path: "/")
expect(page).not_to have_css "[id]"
end
it "includes an id based on the model and the action by default" do
record = double(model_name: double(param_key: "computer"), to_key: [1])
render_inline Admin::ActionComponent.new(:edit, record, path: "/")
expect(page).to have_link class: "edit-link", id: "edit_computer_1"
end
it "can be overwritten" do
record = double(model_name: double(param_key: "computer"), to_key: [1])
render_inline Admin::ActionComponent.new(:edit, record, path: "/", id: "my_id")
expect(page).to have_link class: "edit-link", id: "my_id"
expect(page).not_to have_css "#edit_computer_1"
end
end
describe "aria-describedby attribute" do
it "is not rendered by default" do
render_inline Admin::ActionComponent.new(:edit, double, path: "/")
expect(page).to have_link count: 1
expect(page).not_to have_css "[aria-describedby]"
end
it "renders with the given value" do
render_inline Admin::ActionComponent.new(:edit, double, path: "/", "aria-describedby": "my_descriptor")
expect(page).to have_link count: 1
expect(page).to have_css "[aria-describedby='my_descriptor']"
end
it "renders a default value when aria-describedby is true" do
record = double(model_name: double(param_key: "book"), to_key: [23])
render_inline Admin::ActionComponent.new(:edit, record, path: "/", "aria-describedby": true)
expect(page).to have_link count: 1
expect(page).to have_css "[aria-describedby='edit_book_23_descriptor']"
end
end
describe "aria-label attribute" do
it "is not rendered by default" do
record = double(human_name: "Stay home")
render_inline Admin::ActionComponent.new(:edit, record, path: "/")
expect(page).to have_link count: 1
expect(page).not_to have_css "[aria-label]"
end
it "is not rendered when aria-label is nil" do
render_inline Admin::ActionComponent.new(:edit, double, path: "/", "aria-label": nil)
expect(page).to have_link count: 1
expect(page).not_to have_css "[aria-label]"
end
it "renders with the given value" do
render_inline Admin::ActionComponent.new(:edit, double, path: "/", "aria-label": "Modify")
expect(page).to have_link count: 1
expect(page).to have_css "[aria-label='Modify']"
end
context "when aria-label is true" do
it "includes the action and the human_name of the record" do
record = double(human_name: "Stay home")
render_inline Admin::ActionComponent.new(:edit, record, path: "/", "aria-label": true)
expect(page).to have_link count: 1
expect(page).to have_css "a[aria-label='Edit Stay home']", exact_text: "Edit"
end
it "uses the to_s method when there's no human_name" do
record = double(to_s: "do_not_go_out")
render_inline Admin::ActionComponent.new(:edit, record, path: "/", "aria-label": true)
expect(page).to have_link count: 1
expect(page).to have_css "a[aria-label='Edit Do not go out']", exact_text: "Edit"
end
it "uses the human_name when there are both human_name and to_s" do
record = double(human_name: "Stay home", to_s: "do_not_go_out")
render_inline Admin::ActionComponent.new(:edit, record, path: "/", "aria-label": true)
expect(page).to have_link count: 1
expect(page).to have_css "a[aria-label='Edit Stay home']", exact_text: "Edit"
end
end
end
describe "data-confirm attribute" do
it "is not rendered by default" do
render_inline Admin::ActionComponent.new(:edit, double, path: "/")
expect(page).to have_link count: 1
expect(page).not_to have_css "[data-confirm]"
end
it "is not rendered when confirm is nil" do
render_inline Admin::ActionComponent.new(:edit, double, path: "/", confirm: nil)
expect(page).to have_link count: 1
expect(page).not_to have_css "[data-confirm]"
end
it "renders with the given value" do
render_inline Admin::ActionComponent.new(:edit, double, path: "/", confirm: "Really?")
expect(page).to have_link count: 1
expect(page).to have_css "[data-confirm='Really?']"
end
context "when confirm is true" do
it "uses the human name as default" do
record = double(human_name: "Everywhere and nowhere")
text = 'Are you sure? Edit "Everywhere and nowhere"'
render_inline Admin::ActionComponent.new(:edit, record, path: "/", confirm: true)
expect(page).to have_link count: 1
expect(page).to have_css "[data-confirm='#{text}']"
end
it "includes a more detailed message for the destroy action" do
record = double(human_name: "Participatory Budget 2015")
text = 'Are you sure? This action will delete "Participatory Budget 2015" and can\\\'t be undone.'
render_inline Admin::ActionComponent.new(:destroy, record, path: "/", confirm: true)
expect(page).to have_link count: 1
expect(page).to have_css "[data-confirm='#{text}']"
end
end
end
describe "data-disable-with attribute" do
it "is not rendered for links" do
render_inline Admin::ActionComponent.new(:edit, double, path: "/")
expect(page).not_to have_css "[data-disable-with]"
end
it "is rendered for buttons" do
render_inline Admin::ActionComponent.new(:hide, double, path: "/", method: :delete)
expect(page).to have_css "button[data-disable-with='Hide']"
end
end
end