JavaScript is used by about 98% of web users, so by testing without it enabled, we're only testing that the application works for a very reduced number of users. We proceeded this way in the past because CONSUL started using Rails 4.2 and truncating the database between JavaScript tests with database cleaner, which made these tests terribly slow. When we upgraded to Rails 5.1 and introduced system tests, we started using database transactions in JavaScript tests, making these tests much faster. So now we can use JavaScript tests everywhere without critically slowing down our test suite.
146 lines
4.4 KiB
Ruby
146 lines
4.4 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 able to anyone" do
|
|
visit send(documentable_path, arguments)
|
|
|
|
expect(page).to have_link("Download file")
|
|
end
|
|
|
|
scenario "Download file link should have blank target attribute" do
|
|
visit send(documentable_path, arguments)
|
|
|
|
expect(page).to have_selector("a[target=_blank]", text: "Download file")
|
|
end
|
|
|
|
scenario "Download file links should have rel attribute setted to no follow" do
|
|
visit send(documentable_path, arguments)
|
|
|
|
expect(page).to have_selector("a[rel=nofollow]", text: "Download file")
|
|
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
|
|
|
|
def attach_document(path, success = true)
|
|
attach_file :document_attachment, path, make_visible: true
|
|
if success
|
|
expect(page).to have_css ".loading-bar.complete"
|
|
else
|
|
expect(page).to have_css ".loading-bar.errors"
|
|
end
|
|
end
|