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.
143 lines
4.2 KiB
Ruby
143 lines
4.2 KiB
Ruby
shared_examples "notifiable in-app" do |factory_name|
|
|
let(:author) { create(:user, :verified) }
|
|
let!(:notifiable) { create(factory_name, author: author) }
|
|
|
|
before { create(:notification, :read, notifiable: notifiable, user: author) }
|
|
|
|
scenario "Notification message is shown" do
|
|
create(:notification, notifiable: notifiable, user: author)
|
|
|
|
login_as author
|
|
visit root_path
|
|
|
|
expect(page).to have_link "You have a new notification"
|
|
end
|
|
|
|
scenario "A user commented on my notifiable" do
|
|
notification = create(:notification, notifiable: notifiable, user: author)
|
|
|
|
login_as author
|
|
visit root_path
|
|
|
|
click_link "You have a new notification"
|
|
|
|
expect(page).to have_css ".notification", count: 1
|
|
expect(page).to have_content "Someone commented on"
|
|
expect(page).to have_xpath "//a[@href='#{notification_path(notification)}']"
|
|
end
|
|
|
|
scenario "Multiple users commented on my notifiable" do
|
|
3.times do |n|
|
|
login_as(create(:user, :verified))
|
|
|
|
visit path_for(notifiable)
|
|
|
|
fill_in comment_body(notifiable), with: "Number #{n + 1} is the best!"
|
|
click_button submit_comment_text(notifiable)
|
|
within "#comments" do
|
|
expect(page).to have_content "Number #{n + 1} is the best!"
|
|
end
|
|
logout
|
|
end
|
|
|
|
login_as author
|
|
visit notifications_path
|
|
|
|
expect(page).to have_css ".notification", count: 1
|
|
expect(page).to have_content "There are 3 new comments on"
|
|
expect(page).to have_xpath "//a[@href='#{notification_path(Notification.last)}']"
|
|
end
|
|
|
|
scenario "A user replied to my comment" do
|
|
comment = create :comment, commentable: notifiable, user: author
|
|
|
|
login_as(create(:user, :verified))
|
|
visit path_for(notifiable)
|
|
|
|
click_link "Reply"
|
|
within "#js-comment-form-comment_#{comment.id}" do
|
|
fill_in comment_body(notifiable), with: "I replied to your comment"
|
|
click_button "Publish reply"
|
|
end
|
|
|
|
within "#comment_#{comment.id}" do
|
|
expect(page).to have_content "I replied to your comment"
|
|
end
|
|
|
|
logout
|
|
login_as author
|
|
visit notifications_path
|
|
|
|
expect(page).to have_css ".notification", count: 1
|
|
expect(page).to have_content "Someone replied to your comment on"
|
|
expect(page).to have_xpath "//a[@href='#{notification_path(Notification.last)}']"
|
|
end
|
|
|
|
scenario "Multiple replies to my comment" do
|
|
comment = create :comment, commentable: notifiable, user: author
|
|
|
|
3.times do |n|
|
|
login_as(create(:user, :verified))
|
|
visit path_for(notifiable)
|
|
|
|
within("#comment_#{comment.id}_reply") { click_link "Reply" }
|
|
within "#js-comment-form-comment_#{comment.id}" do
|
|
fill_in comment_body(notifiable), with: "Reply number #{n}"
|
|
click_button "Publish reply"
|
|
end
|
|
|
|
within "#comment_#{comment.id}" do
|
|
expect(page).to have_content "Reply number #{n}"
|
|
end
|
|
logout
|
|
end
|
|
|
|
login_as author
|
|
visit notifications_path
|
|
|
|
expect(page).to have_css ".notification", count: 1
|
|
expect(page).to have_content "There are 3 new replies to your comment on"
|
|
expect(page).to have_xpath "//a[@href='#{notification_path(Notification.last)}']"
|
|
end
|
|
|
|
scenario "Author commented on his own notifiable" do
|
|
login_as(author)
|
|
visit path_for(notifiable)
|
|
|
|
fill_in comment_body(notifiable), with: "I commented on my own notifiable"
|
|
click_button submit_comment_text(notifiable)
|
|
within "#comments" do
|
|
expect(page).to have_content "I commented on my own notifiable"
|
|
end
|
|
|
|
within("#notifications") do
|
|
click_link "You don't have new notifications"
|
|
|
|
expect(page).to have_css ".notification", count: 0
|
|
end
|
|
end
|
|
|
|
scenario "Author replied to his own comment" do
|
|
comment = create :comment, commentable: notifiable, user: author
|
|
|
|
login_as author
|
|
visit path_for(notifiable)
|
|
|
|
click_link "Reply"
|
|
within "#js-comment-form-comment_#{comment.id}" do
|
|
fill_in comment_body(notifiable), with: "I replied to my own comment"
|
|
click_button "Publish reply"
|
|
end
|
|
|
|
within "#comment_#{comment.id}" do
|
|
expect(page).to have_content "I replied to my own comment"
|
|
end
|
|
|
|
within("#notifications") do
|
|
click_link "You don't have new notifications"
|
|
|
|
expect(page).to have_css ".notification", count: 0
|
|
end
|
|
end
|
|
end
|