Browse Source

feat: add tests of notification behaviour and routing and refactor

pull/2131/head
natdeanlewissoftwire 2 years ago
parent
commit
efa436ed15
  1. 2
      app/helpers/application_helper.rb
  2. 6
      app/models/notification.rb
  3. 4
      app/views/layouts/application.html.erb
  4. 10
      spec/factories/notification.rb
  5. 132
      spec/features/home_page_spec.rb
  6. 19
      spec/features/start_page_spec.rb
  7. 2
      spec/features/test_spec.rb
  8. 2
      spec/features/user_spec.rb
  9. 32
      spec/views/layouts/application_layout_spec.rb

2
app/helpers/application_helper.rb

@ -12,7 +12,7 @@ module ApplicationHelper
def govuk_header_classes(current_user) def govuk_header_classes(current_user)
if current_user&.support? if current_user&.support?
"app-header app-header--orange" "app-header app-header--orange"
elsif (current_user.blank? || current_user.active_unread_notifications.present?) && !current_page?(notifications_path) elsif ((current_user.blank? && Notification.active_unauthenticated_notifications.present?) || current_user&.active_unread_notifications.present?) && !current_page?(notifications_path)
"app-header app-header__no-border-bottom" "app-header app-header__no-border-bottom"
else else
"app-header" "app-header"

6
app/models/notification.rb

@ -4,7 +4,11 @@ class Notification < ApplicationRecord
scope :active, -> { where("start_date <= ?", Time.zone.now).where("end_date >= ?", Time.zone.now) } scope :active, -> { where("start_date <= ?", Time.zone.now).where("end_date >= ?", Time.zone.now) }
scope :unauthenticated, -> { where(show_on_unauthenticated_pages: true) } scope :unauthenticated, -> { where(show_on_unauthenticated_pages: true) }
def self.active_unauthenticated_notifications
active.unauthenticated
end
def self.newest_active_unauthenticated_notification def self.newest_active_unauthenticated_notification
active.unauthenticated.last active_unauthenticated_notifications.last
end end
end end

4
app/views/layouts/application.html.erb

@ -104,8 +104,8 @@
<% unless current_page?(notifications_path) %> <% unless current_page?(notifications_path) %>
<% if current_user&.active_unread_notifications.present? %> <% if current_user&.active_unread_notifications.present? %>
<%= render "notifications/notification_banner", notification_count: current_user.active_unread_notifications.count, notification: current_user.newest_active_unread_notification %> <%= render "notifications/notification_banner", notification_count: current_user.active_unread_notifications.count, notification: current_user.newest_active_unread_notification %>
<% elsif !current_user.present? && Notification.unauthenticated.present? %> <% elsif current_user.blank? && Notification.active_unauthenticated_notifications.present? %>
<%= render "notifications/notification_banner", notification_count: Notification.unauthenticated.count, notification: Notification.newest_active_unauthenticated_notification %> <%= render "notifications/notification_banner", notification_count: Notification.active_unauthenticated_notifications.count, notification: Notification.newest_active_unauthenticated_notification %>
<% end %> <% end %>
<% end %> <% end %>

10
spec/factories/notification.rb

@ -0,0 +1,10 @@
FactoryBot.define do
factory :notification do
title { "Notification title" }
link_text { "Link text" }
page_content { "Some html content" }
start_date { Time.zone.yesterday }
end_date { Time.zone.tomorrow }
show_on_unauthenticated_pages { false }
end
end

132
spec/features/home_page_spec.rb

@ -4,6 +4,124 @@ require_relative "form/helpers"
RSpec.describe "Home Page Features" do RSpec.describe "Home Page Features" do
include Helpers include Helpers
context "when there are notifications" do
let!(:user) { FactoryBot.create(:user) }
context "when the notifications are currently active" do
before do
create(:notification, title: "Notification title 1")
create(:notification, title: "Notification title 2")
create(:notification, title: "Notification title 3")
sign_in user
visit(root_path)
end
it "shows the latest notification with count and dismiss link" do
expect(page).to have_content("Notification 1 of 3")
expect(page).to have_content("Notification title 3")
expect(page).to have_link("Dismiss")
expect(page).to have_link("Link text")
end
context "when the user clicks a notification link" do
before do
click_link("Link text")
end
it "takes them to the notification details page" do
expect(page).to have_current_path(notifications_path)
expect(page).to have_content("Notification title 3")
expect(page).to have_content("Some html content")
expect(page).to have_link("Back to Home")
end
context "when they return" do
before do
click_link("Back to Home")
end
it "the notification has not been dismissed" do
expect(page).to have_current_path(root_path)
expect(page).to have_content("Notification 1 of 3")
expect(page).to have_content("Notification title 3")
expect(page).to have_link("Dismiss")
expect(page).to have_link("Link text")
end
end
end
context "when the user clicks a dismiss link" do
before do
click_link("Dismiss")
end
it "dismisses the notification and takes them back" do
expect(page).to have_current_path(root_path)
expect(page).to have_content("Notification 1 of 2")
expect(page).to have_content("Notification title 2")
expect(page).to have_link("Dismiss")
expect(page).to have_link("Link text")
end
context "when the user dismisses the penultimate notification" do
before do
click_link("Dismiss")
end
it "no longer displays the count" do
expect(page).to have_current_path(root_path)
expect(page).not_to have_content("Notification 1 of")
expect(page).to have_content("Notification title 1")
end
context "when the user dismisses the final notification" do
before do
click_link("Dismiss")
end
it "no longer displays any notification" do
expect(page).to have_current_path(root_path)
expect(page).not_to have_content("Notification")
expect(page).not_to have_link("Dismiss")
expect(page).not_to have_link("Link_text")
end
end
end
end
context "when another user has dismissed all their notifications" do
before do
other_user = create(:user)
Notification.mark_as_read! :all, for: other_user
visit(root_path)
end
it "the first user can still see the notifications" do
expect(page).to have_content("Notification 1 of 3")
expect(page).to have_content("Notification title 3")
expect(page).to have_link("Dismiss")
expect(page).to have_link("Link text")
end
end
end
context "when the notifications are not currently active" do
before do
create(:notification, end_date: Time.zone.yesterday, title: "Notification title 1")
create(:notification, start_date: Time.zone.tomorrow, title: "Notification title 2")
sign_in user
visit(root_path)
end
it "does not show any notifications" do
expect(page).not_to have_content("Notification title")
expect(page).not_to have_content("Notification 1 of")
expect(page).not_to have_link("Dismiss")
expect(page).not_to have_link("Link text")
end
end
end
context "when the user is a data provider" do context "when the user is a data provider" do
let(:user) { FactoryBot.create(:user, name: "Provider") } let(:user) { FactoryBot.create(:user, name: "Provider") }
@ -13,7 +131,7 @@ RSpec.describe "Home Page Features" do
create_list(:lettings_log, 4, :completed, owning_organisation: user.organisation, created_by: user) create_list(:lettings_log, 4, :completed, owning_organisation: user.organisation, created_by: user)
create_list(:lettings_log, 2, :completed) create_list(:lettings_log, 2, :completed)
sign_in user sign_in user
visit("/") visit(root_path)
end end
it "displays the correct welcome text" do it "displays the correct welcome text" do
@ -26,7 +144,7 @@ RSpec.describe "Home Page Features" do
before do before do
create_list(:sales_log, 5, :in_progress, owning_organisation: user.organisation, created_by: user) create_list(:sales_log, 5, :in_progress, owning_organisation: user.organisation, created_by: user)
create_list(:sales_log, 3, :completed, owning_organisation: user.organisation, created_by: user) create_list(:sales_log, 3, :completed, owning_organisation: user.organisation, created_by: user)
visit("/") visit(root_path)
end end
it "displays correct data boxes, counts and links" do it "displays correct data boxes, counts and links" do
@ -41,7 +159,7 @@ RSpec.describe "Home Page Features" do
context "when their organisation has never submitted sales logs" do context "when their organisation has never submitted sales logs" do
before do before do
visit("/") visit(root_path)
end end
it "displays correct data boxes, counts and links" do it "displays correct data boxes, counts and links" do
@ -63,7 +181,7 @@ RSpec.describe "Home Page Features" do
create_list(:lettings_log, 2, :completed) create_list(:lettings_log, 2, :completed)
create_list(:scheme, 1, :incomplete, owning_organisation: user.organisation) create_list(:scheme, 1, :incomplete, owning_organisation: user.organisation)
sign_in user sign_in user
visit("/") visit(root_path)
end end
let(:user) { FactoryBot.create(:user, :data_coordinator, name: "Coordinator") } let(:user) { FactoryBot.create(:user, :data_coordinator, name: "Coordinator") }
@ -78,7 +196,7 @@ RSpec.describe "Home Page Features" do
before do before do
create_list(:sales_log, 5, :in_progress, owning_organisation: user.organisation) create_list(:sales_log, 5, :in_progress, owning_organisation: user.organisation)
create_list(:sales_log, 3, :completed, owning_organisation: user.organisation) create_list(:sales_log, 3, :completed, owning_organisation: user.organisation)
visit("/") visit(root_path)
end end
it "displays correct data boxes, counts and links" do it "displays correct data boxes, counts and links" do
@ -95,7 +213,7 @@ RSpec.describe "Home Page Features" do
context "when their organisation has never submitted sales logs" do context "when their organisation has never submitted sales logs" do
before do before do
visit("/") visit(root_path)
end end
it "displays correct data boxes, counts and links" do it "displays correct data boxes, counts and links" do
@ -135,7 +253,7 @@ RSpec.describe "Home Page Features" do
click_button("Sign in") click_button("Sign in")
fill_in("code", with: otp) fill_in("code", with: otp)
click_button("Submit") click_button("Submit")
visit("/") visit(root_path)
end end
it "displays the correct welcome text" do it "displays the correct welcome text" do

19
spec/features/start_page_spec.rb

@ -11,7 +11,7 @@ RSpec.describe "Start Page Features" do
end end
it "takes you to the home page" do it "takes you to the home page" do
visit("/") visit(root_path)
expect(page).to have_current_path("/") expect(page).to have_current_path("/")
expect(page).to have_content("Welcome back") expect(page).to have_content("Welcome back")
end end
@ -19,7 +19,7 @@ RSpec.describe "Start Page Features" do
context "when the user is not signed in" do context "when the user is not signed in" do
it "takes you to sign in and then to the home page" do it "takes you to sign in and then to the home page" do
visit("/") visit(root_path)
click_link("Start now") click_link("Start now")
expect(page).to have_current_path("/account/sign-in?start=true") expect(page).to have_current_path("/account/sign-in?start=true")
fill_in("user[email]", with: user.email) fill_in("user[email]", with: user.email)
@ -28,5 +28,20 @@ RSpec.describe "Start Page Features" do
expect(page).to have_current_path("/") expect(page).to have_current_path("/")
expect(page).to have_content("Welcome back") expect(page).to have_content("Welcome back")
end end
context "when the unauthenticated user clicks a notification link" do
before do
create(:notification, show_on_unauthenticated_pages: true)
visit(root_path)
click_link("Link text")
end
it "takes them to the notification details page" do
expect(page).to have_current_path(notifications_path)
expect(page).to have_content("Notification title")
expect(page).to have_content("Some html content")
expect(page).to have_link("Back to Start")
end
end
end end
end end

2
spec/features/test_spec.rb

@ -1,7 +1,7 @@
require "rails_helper" require "rails_helper"
RSpec.describe "Test Features" do RSpec.describe "Test Features" do
it "Displays the name of the app" do it "Displays the name of the app" do
visit("/") visit(root_path)
expect(page).to have_content("Submit social housing lettings and sales data (CORE)") expect(page).to have_content("Submit social housing lettings and sales data (CORE)")
end end

2
spec/features/user_spec.rb

@ -126,7 +126,7 @@ RSpec.describe "User Features" do
end end
it "Can navigate and sign in page with sign in button" do it "Can navigate and sign in page with sign in button" do
visit("/") visit(root_path)
expect(page).to have_link("Sign in") expect(page).to have_link("Sign in")
click_link("Sign in") click_link("Sign in")
fill_in("user[email]", with: user.email) fill_in("user[email]", with: user.email)

32
spec/views/layouts/application_layout_spec.rb

@ -54,4 +54,36 @@ RSpec.describe "layouts/application" do
include_examples "analytics cookie elements", banner: false, scripts: false include_examples "analytics cookie elements", banner: false, scripts: false
end end
context "with a notification present" do
context "when notification is shown on unauthenticated pages" do
before do
create(:notification, title: "Old notification title", show_on_unauthenticated_pages: true)
create(:notification, title: "New notification title", show_on_unauthenticated_pages: true)
render
end
it "shows the most recent notification without dismiss link or count" do
expect(rendered).to have_content("New notification title")
expect(rendered).to have_link("Link text")
expect(rendered).not_to have_link("Dismiss")
expect(rendered).not_to have_content("Notification 1 of")
end
end
context "when notification is not shown on unauthenticated pages" do
before do
create(:notification)
render
end
it "does not show the notification banner" do
expect(rendered).not_to have_content("Notification title")
expect(rendered).not_to have_link("Link text")
expect(rendered).not_to have_link("Dismiss")
expect(rendered).not_to have_content("Notification 1 of")
end
end
end
end end

Loading…
Cancel
Save