shared_examples "notifiable in-app" do |factory_name| let(:author) { create(:user, :verified) } let!(:notifiable) { create(factory_name, author: author) } scenario "Notification icon is shown" do create(:notification, notifiable: notifiable, user: author) login_as author visit root_path expect(page).to have_css ".icon-notification" end scenario "A user commented on my notifiable", :js do notification = create(:notification, notifiable: notifiable, user: author) login_as author visit root_path find(".icon-notification").click 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", :js 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", :js 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", :js 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", :js 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 find(".icon-no-notification").click expect(page).to have_css ".notification", count: 0 end end scenario "Author replied to his own comment", :js 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 find(".icon-no-notification").click expect(page).to have_css ".notification", count: 0 end end end