Quoting usability experts Jakob Nielsen and Anna Kaley [1]: > [Opening PDF files in new tabs] is problematic, because it assumes > users will always do the exact same things with certain file formats, > which isn’t always the case. There are many examples of this situation. For example, some people (myself included) configure their browser so it downloads PDF files instead of opening them in the browser. In this situation, a new tab is opened, a blank page is displayed, the file is downloaded, and then either the tab is closed or the blank page needs to be manually closed. The end result is really annoying. Other situations include people who use a mobile phone browser, where navigating through tabs is generally much harder than doing so on a desktop browser. But IMHO the most important point is: every browser already provides a way to open "regular" links in a new tab, so people can choose what to do, but if we decide to open the link in a new tab, we take control away from them, and people who'd like to open the link in the same tab might feel frustrated. In these cases, the links either say "download" or include the word "PDF", so people know in advance that they're going to download/open a PDF file, and so we're giving them information and, by removing the `target` attribute, we're giving them control over their browser so they can choose what's convenient for them. [1] https://www.nngroup.com/articles/new-browser-windows-and-tabs
129 lines
4.0 KiB
Ruby
129 lines
4.0 KiB
Ruby
shared_examples "documentable" do |documentable_factory_name, documentable_path, documentable_path_arguments|
|
|
let(:user) { create(:user) }
|
|
let(:arguments) { {} }
|
|
let(:documentable) { create(documentable_factory_name, author: user) }
|
|
let!(:document) { create(:document, documentable: documentable, user: documentable.author) }
|
|
|
|
before do
|
|
documentable_path_arguments.each do |argument_name, path_to_value|
|
|
arguments.merge!("#{argument_name}": documentable.send(path_to_value))
|
|
end
|
|
end
|
|
|
|
context "Show documents" do
|
|
scenario "Download action should be availabe to anyone and open in the same tab" do
|
|
visit send(documentable_path, arguments)
|
|
|
|
within "#documents" do
|
|
expect(page).to have_link text: document.title
|
|
expect(page).to have_selector "a[rel=nofollow]", text: document.title
|
|
expect(page).not_to have_selector "a[target=_blank]"
|
|
end
|
|
end
|
|
|
|
describe "Destroy action" do
|
|
scenario "Should not be able when no user logged in" do
|
|
visit send(documentable_path, arguments)
|
|
|
|
expect(page).not_to have_link("Delete document")
|
|
end
|
|
|
|
scenario "Should be able when documentable author is logged in" do
|
|
login_as documentable.author
|
|
visit send(documentable_path, arguments)
|
|
|
|
expect(page).to have_link("Delete document")
|
|
end
|
|
|
|
scenario "Administrators cannot destroy documentables they have not authored", :admin do
|
|
visit send(documentable_path, arguments)
|
|
|
|
expect(page).not_to have_link("Delete document")
|
|
end
|
|
|
|
scenario "Users cannot destroy documentables they have not authored" do
|
|
login_as(create(:user))
|
|
visit send(documentable_path, arguments)
|
|
|
|
expect(page).not_to have_link("Delete document")
|
|
end
|
|
end
|
|
|
|
describe "When allow attached documents setting is enabled" do
|
|
before do
|
|
Setting["feature.allow_attached_documents"] = true
|
|
end
|
|
|
|
scenario "Documents list should be available" do
|
|
login_as(user)
|
|
visit send(documentable_path, arguments)
|
|
|
|
expect(page).to have_css("#documents")
|
|
expect(page).to have_content("Documents (1)")
|
|
end
|
|
|
|
scenario "Documents list increase documents number" do
|
|
create(:document, documentable: documentable, user: documentable.author)
|
|
login_as(user)
|
|
visit send(documentable_path, arguments)
|
|
|
|
expect(page).to have_css("#documents")
|
|
expect(page).to have_content("Documents (2)")
|
|
end
|
|
end
|
|
|
|
describe "When allow attached documents setting is disabled" do
|
|
before do
|
|
Setting["feature.allow_attached_documents"] = false
|
|
end
|
|
|
|
scenario "Documents list should not be available" do
|
|
login_as(create(:user))
|
|
visit send(documentable_path, arguments)
|
|
|
|
expect(page).not_to have_css("#documents")
|
|
end
|
|
end
|
|
end
|
|
|
|
context "Destroy" do
|
|
scenario "Should show success notice after successful document upload" do
|
|
login_as documentable.author
|
|
|
|
visit send(documentable_path, arguments)
|
|
|
|
within "#document_#{document.id}" do
|
|
accept_confirm { click_link "Delete document" }
|
|
end
|
|
|
|
expect(page).to have_content "Document was deleted successfully."
|
|
end
|
|
|
|
scenario "Should hide documents tab if there is no documents" do
|
|
login_as documentable.author
|
|
|
|
visit send(documentable_path, arguments)
|
|
|
|
within "#document_#{document.id}" do
|
|
accept_confirm { click_link "Delete document" }
|
|
end
|
|
|
|
expect(page).not_to have_content "Documents (0)"
|
|
end
|
|
|
|
scenario "Should redirect to documentable path after successful deletion" do
|
|
login_as documentable.author
|
|
|
|
visit send(documentable_path, arguments)
|
|
|
|
within "#document_#{document.id}" do
|
|
accept_confirm { click_link "Delete document" }
|
|
end
|
|
|
|
within "##{ActionView::RecordIdentifier.dom_id(documentable)}" do
|
|
expect(page).to have_selector "h1", text: documentable.title
|
|
end
|
|
end
|
|
end
|
|
end
|