diff --git a/spec/features/admin/admin_notifications_spec.rb b/spec/features/admin/admin_notifications_spec.rb new file mode 100644 index 000000000..b994cf9f6 --- /dev/null +++ b/spec/features/admin/admin_notifications_spec.rb @@ -0,0 +1,238 @@ +require 'rails_helper' + +feature "Admin Notifications" do + + background do + admin = create(:administrator) + login_as(admin.user) + create(:budget) + end + + context "Show" do + scenario "Valid Admin Notification" do + notification = create(:admin_notification, title: 'Notification title', + body: 'Notification body', + link: 'https://www.decide.madrid.es/vota', + segment_recipient: :all_users) + + visit admin_admin_notification_path(notification) + + expect(page).to have_content('Notification title') + expect(page).to have_content('Notification body') + expect(page).to have_content('https://www.decide.madrid.es/vota') + expect(page).to have_content('All users') + end + + scenario "Notification with invalid segment recipient" do + invalid_notification = create(:admin_notification) + invalid_notification.update_attribute(:segment_recipient, 'invalid_segment') + + visit admin_admin_notification_path(invalid_notification) + + expect(page).to have_content("Recipients user segment is invalid") + end + end + + context "Index" do + scenario "Valid Admin Notifications" do + draft = create(:admin_notification, segment_recipient: :all_users, title: 'Not yet sent') + sent = create(:admin_notification, :sent, segment_recipient: :administrators, + title: 'Sent one') + + visit admin_admin_notifications_path + + expect(page).to have_css(".admin_notification", count: 2) + + within("#admin_notification_#{draft.id}") do + expect(page).to have_content('Not yet sent') + expect(page).to have_content('All users') + expect(page).to have_content('Draft') + end + + within("#admin_notification_#{sent.id}") do + expect(page).to have_content('Sent one') + expect(page).to have_content('Administrators') + expect(page).to have_content(I18n.l(Date.current)) + end + end + + scenario "Notifications with invalid segment recipient" do + invalid_notification = create(:admin_notification) + invalid_notification.update_attribute(:segment_recipient, 'invalid_segment') + + visit admin_admin_notifications_path + + expect(page).to have_content("Recipients user segment is invalid") + end + end + + scenario "Create" do + visit admin_admin_notifications_path + click_link "New notification" + + fill_in_admin_notification_form(segment_recipient: 'Proposal authors', + title: 'This is a title', + body: 'This is a body', + link: 'http://www.dummylink.dev') + + click_button "Create Admin notification" + + expect(page).to have_content "Notification created successfully" + expect(page).to have_content "Proposal authors" + expect(page).to have_content "This is a title" + expect(page).to have_content "This is a body" + expect(page).to have_content "http://www.dummylink.dev" + end + + context "Update" do + scenario "A draft notification can be updated" do + notification = create(:admin_notification) + + visit admin_admin_notifications_path + within("#admin_notification_#{notification.id}") do + click_link "Edit" + end + + + fill_in_admin_notification_form(segment_recipient: 'All users', + title: 'Other title', + body: 'Other body', + link: '') + + click_button "Update Admin notification" + + expect(page).to have_content "Notification updated successfully" + expect(page).to have_content "All users" + expect(page).to have_content "Other title" + expect(page).to have_content "Other body" + expect(page).not_to have_content "http://www.dummylink.dev" + end + + scenario "Sent notification can not be updated" do + notification = create(:admin_notification, :sent) + + visit admin_admin_notifications_path + within("#admin_notification_#{notification.id}") do + expect(page).not_to have_link("Edit") + end + end + end + + context "Destroy" do + scenario "A draft notification can be destroyed" do + notification = create(:admin_notification) + + visit admin_admin_notifications_path + within("#admin_notification_#{notification.id}") do + click_link "Delete" + end + + expect(page).to have_content "Notification deleted successfully" + expect(page).to have_css(".notification", count: 0) + end + + scenario "Sent notification can not be destroyed" do + notification = create(:admin_notification, :sent) + + visit admin_admin_notifications_path + within("#admin_notification_#{notification.id}") do + expect(page).not_to have_link("Delete") + end + end + end + + context "Visualize" do + scenario "A draft notification can be previewed" do + notification = create(:admin_notification, segment_recipient: :administrators) + + visit admin_admin_notifications_path + within("#admin_notification_#{notification.id}") do + click_link "Preview" + end + + expect(page).to have_content "This is how the users will see the notification:" + expect(page).to have_content "Administrators (1 users will be notified)" + end + + scenario "A sent notification can be viewed" do + notification = create(:admin_notification, :sent, recipients_count: 7, + segment_recipient: :administrators) + + visit admin_admin_notifications_path + within("#admin_notification_#{notification.id}") do + click_link "View" + end + + expect(page).to have_content "This is how the users see the notification:" + expect(page).to have_content "Administrators (7 users got notified)" + end + end + + scenario 'Errors on create' do + visit new_admin_admin_notification_path + + click_button "Create Admin notification" + + expect(page).to have_content error_message + end + + scenario "Errors on update" do + notification = create(:admin_notification) + visit edit_admin_admin_notification_path(notification) + + fill_in :admin_notification_title, with: '' + click_button "Update Admin notification" + + expect(page).to have_content error_message + end + + context "Send notification", :js do + scenario "A draft Admin notification can be sent", :js do + 2.times { create(:user) } + notification = create(:admin_notification, segment_recipient: :all_users) + total_users = notification.list_of_recipients.count + confirm_message = "Are you sure you want to send this notification to #{total_users} users?" + + visit admin_admin_notification_path(notification) + + click_link "Send" + + page.accept_confirm(confirm_message) + + expect(page).to have_content "Notification sent successfully" + + User.all.each do |user| + expect(user.notifications.count).to eq(1) + end + end + + scenario "A sent Admin notification can not be sent", :js do + notification = create(:admin_notification, :sent) + + visit admin_admin_notification_path(notification) + + expect(page).not_to have_link("Send") + end + + scenario "Admin notification with invalid segment recipient cannot be sent", :js do + invalid_notification = create(:admin_notification) + invalid_notification.update_attribute(:segment_recipient, 'invalid_segment') + visit admin_admin_notification_path(invalid_notification) + + expect(page).not_to have_link("Send") + end + end + + scenario "Select list of users to send notification" do + UserSegments::SEGMENTS.each do |user_segment| + segment_recipient = I18n.t("admin.segment_recipient.#{user_segment}") + + visit new_admin_admin_notification_path + + fill_in_admin_notification_form(segment_recipient: segment_recipient) + click_button "Create Admin notification" + + expect(page).to have_content(I18n.t("admin.segment_recipient.#{user_segment}")) + end + end +end