diff --git a/spec/system/placements/schools/partner_providers/add_a_partner_provider_spec.rb b/spec/system/placements/schools/partner_providers/add_a_partner_provider_spec.rb deleted file mode 100644 index 4cff269f4a..0000000000 --- a/spec/system/placements/schools/partner_providers/add_a_partner_provider_spec.rb +++ /dev/null @@ -1,258 +0,0 @@ -require "rails_helper" - -RSpec.describe "Placements / Schools / Partner providers / Add a partner provider", - service: :placements, type: :system do - include ActiveJob::TestHelper - - around do |example| - perform_enqueued_jobs { example.run } - end - - let!(:school) { create(:school, :placements) } - let!(:provider) { create(:placements_provider, name: "Provider 1") } - let!(:provider_user) { create(:placements_user, providers: [provider]) } - - before do - given_i_am_signed_in_as_a_placements_user(organisations: [school]) - end - - scenario "User adds a partner provider", :js do - when_i_view_the_partner_providers_page - and_i_click_on("Add provider") - and_i_enter_a_provider_named("Provider 1") - then_i_see_a_dropdown_item_for("Provider 1") - when_i_click_the_dropdown_item_for("Provider 1") - and_i_click_on("Continue") - then_i_see_the_check_details_page_for_provider("Provider 1") - when_i_click_on("Confirm and add provider") - then_i_return_to_partner_provider_index - and_a_provider_is_listed(provider_name: "Provider 1") - and_i_see_success_message - and_a_notification_email_is_sent_to(provider_user) - end - - scenario "User adds a partner provider which already exists", :js do - given_a_partnership_exists_between(school, provider) - when_i_view_the_partner_providers_page - and_i_click_on("Add provider") - and_i_enter_a_provider_named("Provider 1") - then_i_see_a_dropdown_item_for("Provider 1") - when_i_click_the_dropdown_item_for("Provider 1") - and_i_click_on("Continue") - then_i_see_an_error("Provider 1 has already been added. Try another provider") - end - - scenario "User submits the search form without selecting a provider", :js do - when_i_visit_the_add_partner_provider_page - and_i_click_on("Continue") - then_i_see_an_error("Enter a provider name, United Kingdom provider number (UKPRN), unique reference number (URN) or postcode") - end - - scenario "User reconsiders selecting a provider using back link", :js do - when_i_view_the_partner_providers_page - and_i_click_on("Add provider") - and_i_enter_a_provider_named("Provider 1") - then_i_see_a_dropdown_item_for("Provider 1") - when_i_click_the_dropdown_item_for("Provider 1") - and_i_click_on("Continue") - then_i_see_the_check_details_page_for_provider("Provider 1") - when_i_click_on("Back") - then_i_see_the_search_input_pre_filled_with("Provider 1") - and_i_click_on("Continue") - then_i_see_the_check_details_page_for_provider("Provider 1") - end - - scenario "User reconsiders selecting a provider using change link", :js do - when_i_view_the_partner_providers_page - and_i_click_on("Add provider") - and_i_enter_a_provider_named("Provider 1") - then_i_see_a_dropdown_item_for("Provider 1") - when_i_click_the_dropdown_item_for("Provider 1") - and_i_click_on("Continue") - then_i_see_the_check_details_page_for_provider("Provider 1") - when_i_click_on("Change") - then_i_see_the_search_input_pre_filled_with("Provider 1") - and_i_click_on("Continue") - then_i_see_the_check_details_page_for_provider("Provider 1") - end - - scenario "User adds a partner provider, which is not onboarded on the placements service", :js do - given_the_provider_is_not_onboarded_on_placements_service(provider) - when_i_view_the_partner_providers_page - and_i_click_on("Add provider") - and_i_enter_a_provider_named("Provider 1") - then_i_see_a_dropdown_item_for("Provider 1") - when_i_click_the_dropdown_item_for("Provider 1") - and_i_click_on("Continue") - then_i_see_the_check_details_page_for_provider("Provider 1") - when_i_click_on("Confirm and add provider") - then_i_return_to_partner_provider_index - and_a_provider_is_listed(provider_name: "Provider 1") - and_i_see_success_message - and_a_notification_email_is_not_sent_to(provider_user) - end - - describe "when I use multiple tabs to add partner providers", :js do - let(:provider_2) { create(:placements_provider, name: "Provider 2") } - let(:windows) do - { - open_new_window => { provider: }, - open_new_window => { provider: provider_2 }, - } - end - - it "persists the partner provider details for each tab upon refresh" do - windows.each do |window, details| - within_window window do - when_i_view_the_partner_providers_page - and_i_click_on("Add provider") - and_i_enter_a_provider_named(details[:provider].name) - then_i_see_a_dropdown_item_for(details[:provider].name) - when_i_click_the_dropdown_item_for(details[:provider].name) - and_i_click_on("Continue") - then_i_see_the_check_details_page_for_provider(details[:provider].name) - end - end - - # We need this test to be A -> B -> A -> B, so we can't combine the loops. - # rubocop:disable Style/CombinableLoops - windows.each do |window, details| - within_window window do - when_i_refresh_the_page - then_the_provider_details_have_not_changed(details[:provider].name) - when_i_click_on("Confirm and add provider") - then_i_return_to_partner_provider_index - and_a_provider_is_listed(provider_name: details[:provider].name) - and_i_see_success_message - end - end - # rubocop:enable Style/CombinableLoops - - when_i_view_the_partner_providers_page - then_i_see_my_providers(windows.values) - end - end - - private - - def when_i_view_the_partner_providers_page - visit placements_school_partner_providers_path(school) - - expect_partner_providers_to_be_selected_in_primary_navigation - end - - def when_i_click_on(text) - click_on text - end - alias_method :and_i_click_on, :when_i_click_on - - def and_i_enter_a_provider_named(provider_name) - fill_in "Add a provider", with: provider_name - end - - def then_i_see_a_dropdown_item_for(provider_name) - expect(page).to have_css(".autocomplete__option", text: provider_name, wait: 10) - end - - def when_i_click_the_dropdown_item_for(provider_name) - page.find(".autocomplete__option", text: provider_name).click - end - - def then_i_see_the_check_details_page_for_provider(provider_name) - expect(page).to have_content("Confirm provider details") - org_name_row = page.all(".govuk-summary-list__row")[0] - expect(org_name_row).to have_content(provider_name) - end - - def then_i_return_to_partner_provider_index - expect(page.find(".govuk-heading-l")).to have_content("Providers you work with") - end - - def and_a_provider_is_listed(provider_name:) - expect(page).to have_content(provider_name) - end - - def and_i_see_success_message - expect(page).to have_content "Provider added" - end - - def given_a_partnership_exists_between(school, provider) - create(:placements_partnership, school:, provider:) - end - alias_method :and_a_partnership_exists_between, :given_a_partnership_exists_between - - def then_i_see_an_error(error_message) - # Error summary - expect(page.find(".govuk-error-summary")).to have_content( - "There is a problem", - ) - expect(page.find(".govuk-error-summary")).to have_content(error_message) - # Error above input - expect(page.find(".govuk-error-message")).to have_content(error_message) - end - - def when_i_visit_the_add_partner_provider_page - visit new_add_partner_provider_placements_school_partner_providers_path(school) - end - - def given_i_have_completed_the_form_to_select(provider:) - params = { - "partnership" => { provider_id: provider.id, provider_name: provider.name }, - school_id: school.id, - } - visit check_placements_school_partner_providers_path(params) - end - - def partner_provider_notification(user) - ActionMailer::Base.deliveries.find do |delivery| - delivery.to.include?(user.email) && - delivery.subject == "A school has added you" - end - end - - def and_a_notification_email_is_sent_to(user) - email = partner_provider_notification(user) - - expect(email).not_to be_nil - end - - def and_a_notification_email_is_not_sent_to(user) - email = partner_provider_notification(user) - - expect(email).to be_nil - end - - def then_i_see_the_search_input_pre_filled_with(provider_name) - within(".autocomplete__wrapper") do - find_field "Add a provider", with: provider_name - end - end - - def expect_partner_providers_to_be_selected_in_primary_navigation - nav = page.find(".app-primary-navigation__nav") - - within(nav) do - expect(page).to have_link "Placements", current: "false" - expect(page).to have_link "Mentors", current: "false" - expect(page).to have_link "Users", current: "false" - expect(page).to have_link "Organisation details", current: "false" - expect(page).to have_link "Providers", current: "page" - end - end - - def given_the_provider_is_not_onboarded_on_placements_service(provider) - provider.update!(placements_service: false) - end - - def when_i_refresh_the_page - visit current_path - end - - def then_i_see_my_providers(providers) - providers.each do |provider| - expect(page).to have_content(provider[:provider].name) - end - end - - alias_method :then_the_provider_details_have_not_changed, :then_i_see_the_check_details_page_for_provider -end diff --git a/spec/system/placements/schools/partner_providers/add_a_partner_provider_without_javascript_spec.rb b/spec/system/placements/schools/partner_providers/add_a_partner_provider_without_javascript_spec.rb deleted file mode 100644 index 07912228da..0000000000 --- a/spec/system/placements/schools/partner_providers/add_a_partner_provider_without_javascript_spec.rb +++ /dev/null @@ -1,210 +0,0 @@ -require "rails_helper" - -RSpec.describe "Placements / Schools / Partner providers / Add a partner provider without JavaScript", - service: :placements, type: :system do - include ActiveJob::TestHelper - - around do |example| - perform_enqueued_jobs { example.run } - end - - let!(:school) { create(:placements_school) } - let!(:provider) { create(:provider, :placements, name: "Manchester 1") } - let!(:provider_user) { create(:placements_user, providers: [provider]) } - - before do - create(:provider, name: "Manchester 2") - create(:provider, :placements, name: "London") - create(:claims_provider, name: "Claims") - - given_i_am_signed_in_as_a_placements_user(organisations: [school]) - end - - scenario "User adds a partner provider" do - when_i_visit_the_add_partner_provider_page - and_i_enter_a_provider_named("Manch") - and_i_click_on("Continue") - then_i_see_list_of_placements_providers - when_i_choose("Manchester 1") - and_i_click_on("Continue") - then_i_see_the_check_details_page_for_provider("Manchester 1") - and_i_click_on("Confirm and add provider") - then_i_return_to_partner_provider_index - and_a_provider_is_listed(provider_name: "Manchester 1") - and_i_see_success_message - and_a_notification_email_is_sent_to(provider_user) - end - - scenario "User adds a partner provider which already exists" do - given_a_partnership_exists_between(school, provider) - when_i_visit_the_add_partner_provider_page - and_i_enter_a_provider_named("Manch") - and_i_click_on("Continue") - then_i_see_list_of_placements_providers - when_i_choose("Manchester 1") - and_i_click_on("Continue") - then_i_see_an_error("Manchester 1 has already been added. Try another provider") - end - - scenario "User submits the search form without selecting a provider" do - when_i_visit_the_add_partner_provider_page - and_i_click_on("Continue") - then_i_see_an_error("Enter a provider name, United Kingdom provider number (UKPRN), unique reference number (URN) or postcode") - end - - scenario "User submits the options form without selecting a provider" do - when_i_visit_the_add_partner_provider_page - and_i_enter_a_provider_named("Manch") - and_i_click_on("Continue") - then_i_see_list_of_placements_providers - and_i_click_on("Continue") - then_i_see_an_error("Select a provider") - end - - scenario "User reconsiders selecting a provider" do - when_i_visit_the_add_partner_provider_page - and_i_enter_a_provider_named("Manch") - and_i_click_on("Continue") - then_i_see_list_of_placements_providers - when_i_choose("Manchester 1") - and_i_click_on("Continue") - then_i_see_the_check_details_page_for_provider("Manchester 1") - when_i_click_on("Back") - then_i_see_list_of_placements_providers - and_the_option_for_provider_has_been_pre_selected("Manchester 1") - and_i_click_on("Back") - then_i_see_the_search_input_pre_filled_with("Manch") - and_i_click_on("Continue") - then_i_see_list_of_placements_providers - when_i_choose("Manchester 1") - and_i_click_on("Continue") - then_i_see_the_check_details_page_for_provider("Manchester 1") - end - - scenario "User adds a partner provider, which is not onboarded on the placements service" do - given_the_provider_is_not_onboarded_on_placements_service(provider) - when_i_visit_the_add_partner_provider_page - and_i_enter_a_provider_named("Manch") - and_i_click_on("Continue") - then_i_see_list_of_placements_providers - when_i_choose("Manchester 1") - and_i_click_on("Continue") - then_i_see_the_check_details_page_for_provider("Manchester 1") - and_i_click_on("Confirm and add provider") - then_i_return_to_partner_provider_index - and_a_provider_is_listed(provider_name: "Manchester 1") - and_i_see_success_message - and_a_notification_email_is_not_sent_to(provider_user) - end - - private - - def when_i_visit_the_add_partner_provider_page - visit new_add_partner_provider_placements_school_partner_providers_path(school) - end - - def when_i_click_on(text) - click_on text - end - alias_method :and_i_click_on, :when_i_click_on - - def and_i_enter_a_provider_named(provider_name) - fill_in "Add a provider", with: provider_name - end - - def then_i_see_list_of_placements_providers - expect(page).to have_content("Manchester 1") - expect(page).to have_content("Manchester 2") - expect(page).not_to have_content("London") - expect(page).not_to have_content("Claims") - end - - def then_i_choose(selection_name) - choose selection_name - end - alias_method :when_i_choose, :then_i_choose - - def then_i_see_the_check_details_page_for_provider(provider_name) - expect(page).to have_content("Confirm provider details") - org_name_row = page.all(".govuk-summary-list__row")[0] - expect(org_name_row).to have_content(provider_name) - end - - def then_i_return_to_partner_provider_index - expect(page.find(".govuk-heading-l")).to have_content("Providers you work with") - end - - def and_a_provider_is_listed(provider_name:) - expect(page).to have_content(provider_name) - end - - def and_i_see_success_message - expect(page).to have_content "Provider added" - end - - def given_a_partnership_exists_between(school, provider) - create(:placements_partnership, school:, provider:) - end - alias_method :and_a_partnership_exists_between, :given_a_partnership_exists_between - - def then_i_see_an_error(error_message) - # Error summary - expect(page.find(".govuk-error-summary")).to have_content( - "There is a problem", - ) - expect(page.find(".govuk-error-summary")).to have_content(error_message) - # Error above input - expect(page.find(".govuk-error-message")).to have_content(error_message) - end - - def given_i_have_completed_the_form_to_select(provider:) - params = { - "partnership" => { provider_id: provider.id, provider_name: provider.name }, - school_id: school.id, - } - visit check_placements_school_partner_providers_path(params) - end - - def then_i_see_the_search_input_pre_filled_with(provider_name) - find_field "Add a provider", with: provider_name - end - - def partner_provider_notification(user) - ActionMailer::Base.deliveries.find do |delivery| - delivery.to.include?(user.email) && - delivery.subject == "A school has added you" - end - end - - def and_a_notification_email_is_sent_to(user) - email = partner_provider_notification(user) - - expect(email).not_to be_nil - end - - def and_a_notification_email_is_not_sent_to(user) - email = partner_provider_notification(user) - - expect(email).to be_nil - end - - def expect_partner_providers_to_be_selected_in_primary_navigation - nav = page.find(".app-primary-navigation__nav") - - within(nav) do - expect(page).to have_link "Placements", current: "false" - expect(page).to have_link "Mentors", current: "false" - expect(page).to have_link "Users", current: "false" - expect(page).to have_link "Organisation details", current: "false" - expect(page).to have_link "Partner providers", current: "page" - end - end - - def given_the_provider_is_not_onboarded_on_placements_service(provider) - provider.update!(placements_service: false) - end - - def and_the_option_for_provider_has_been_pre_selected(provider_name) - expect(page).to have_checked_field(provider_name) - end -end diff --git a/spec/system/placements/schools/partner_providers/add_a_provider_spec.rb b/spec/system/placements/schools/partner_providers/add_a_provider_spec.rb new file mode 100644 index 0000000000..8e769a9ebb --- /dev/null +++ b/spec/system/placements/schools/partner_providers/add_a_provider_spec.rb @@ -0,0 +1,272 @@ +require "rails_helper" + +RSpec.describe "School user adds a provider to their list of providers", + service: :placements, type: :system do + include ActiveJob::TestHelper + + around do |example| + perform_enqueued_jobs { example.run } + end + + scenario "User adds a provider", :js do + given_provider_exists + and_i_am_signed_in + + when_i_am_on_the_providers_index_page + and_i_click_on_add_provider + and_i_click_on_continue + then_i_see_a_validation_error_for_entering_a_provider_search_term + + given_shelbyville_university_is_already_in_my_list_of_providers + when_i_enter_shelbyville_university + then_i_see_a_dropdown_item_for_shelbyville_university + + when_i_click_on_the_shelbyville_university_dropdown_item + and_i_click_on_continue + then_i_see_a_validation_error_for_shelbyville_university_is_already_in_my_list_of_providers + + given_ogdenville_university_has_not_been_onboarded_to_the_placements_service + when_i_enter_ogdenville_university + then_i_see_a_dropdown_item_for_ogdenville_university + + when_i_click_on_the_ogdenville_university_dropdown_item + and_i_click_on_continue + then_i_see_confirm_provider_details_page_for_ogdenville_university + + when_i_click_on_confirm_and_add_provider + then_i_see_success_message_for_ogdenville_university + and_i_see_the_providers_index_page + and_i_see_ogdenville_university_listed + and_a_notification_email_is_not_sent_to_ogdenville_university + + when_i_click_on_add_provider + and_i_enter_springfield_university + then_i_see_a_dropdown_item_for_springfield_university + + when_i_click_on_the_springfield_university_dropdown_item + and_i_click_on_continue + then_i_see_confirm_provider_details_page_for_springfield_university + + # User reconsiders selecting a provider using back link + when_i_click_on_back + then_i_see_the_search_input_prefilled_with_springfield_university + + when_i_click_on_continue + then_i_see_confirm_provider_details_page_for_springfield_university + + # User reconsiders selecting a provider using change link + when_i_click_on_change + then_i_see_the_search_input_prefilled_with_springfield_university + + when_i_click_on_continue + then_i_see_confirm_provider_details_page_for_springfield_university + + when_i_click_on_confirm_and_add_provider + then_i_see_success_message_for_springfield_university + + when_i_am_on_the_providers_index_page + then_i_see_springfield_university_listed + and_a_notification_email_is_sent_to_springfield_university + end + + private + + def given_provider_exists + @springfield_university = create(:placements_provider, + name: "Springfield University", + ukprn: "10101010", + urn: "101010", + email_address: "reception@springfield.ac.uk", + telephone: "0101 010 0101", + website: "http://www.springfield.ac.uk", + address1: "Undisclosed") + @springfield_university_user = create(:placements_user, providers: [@springfield_university]) + + @ogdenville_university = create(:placements_provider, + name: "Ogdenville University", + ukprn: "00100010", + urn: "000010", + email_address: "reception@ogdenville.ac.uk", + telephone: "0000 000 1111", + website: "http://www.ogdenville.ac.uk", + address1: "1 Main Street") + @ogdenville_university_user = create(:placements_user, providers: [@ogdenville_university]) + + @shelbyville_university = create(:placements_provider, name: "Shelbyville University") + end + + def and_i_am_signed_in + @school = create(:school, :placements) + given_i_am_signed_in_as_a_placements_user(organisations: [@school]) + end + + def when_i_am_on_the_providers_index_page + page.find(".app-primary-navigation__nav").click_on("Providers") + + expect(page).to have_current_path(placements_school_partner_providers_path(@school)) + expect(page).to have_title("Providers you work with - Manage school placements - GOV.UK") + expect(primary_navigation).to have_current_item("Providers") + expect(page).to have_h1("Providers you work with") + end + alias_method :and_i_see_the_providers_index_page, :when_i_am_on_the_providers_index_page + + def and_i_click_on_add_provider + click_on "Add provider" + end + alias_method :when_i_click_on_add_provider, :and_i_click_on_add_provider + + def and_i_enter_springfield_university + fill_in "Add a provider", with: "Springfield University" + end + + def then_i_see_a_dropdown_item_for_springfield_university + expect(page).to have_css(".autocomplete__option", text: "Springfield University", wait: 10) + end + + def when_i_click_on_the_springfield_university_dropdown_item + page.find(".autocomplete__option", text: "Springfield University").click + end + + def and_i_click_on_continue + click_on "Continue" + end + alias_method :when_i_click_on_continue, :and_i_click_on_continue + + def then_i_see_confirm_provider_details_page_for_springfield_university + expect(page).to have_title("Confirm provider details - Provider details - Manage school placements - GOV.UK") + expect(primary_navigation).to have_current_item("Providers") + expect(page).to have_h1("Confirm provider details") + expect(page).to have_element(:p, text: "Adding them means you will be able to assign them to your placements. We will send them an email to let them know you have added them.", class: "govuk-body") + expect(page).to have_h2("Provider") + expect(page).to have_summary_list_row("Name", "Springfield University") + expect(page).to have_summary_list_row("UK provider reference number (UKPRN)", "10101010") + expect(page).to have_summary_list_row("Unique reference number (URN)", "101010") + expect(page).to have_summary_list_row("Email address", "reception@springfield.ac.uk") + expect(page).to have_summary_list_row("Telephone number", "0101 010 0101") + expect(page).to have_summary_list_row("Address", "Undisclosed") + expect(page).to have_button("Confirm and add provider") + expect(page).to have_link("Cancel", href: "/schools/#{@school.id}/partner_providers") + end + + def when_i_click_on_confirm_and_add_provider + click_on "Confirm and add provider" + end + + def then_i_see_springfield_university_listed + expect(page).to have_table_row({ + "Name" => "Springfield University", + "UK provider reference number (UKPRN)" => "10101010", + }) + end + + def then_i_see_success_message_for_springfield_university + expect(page).to have_success_banner("Provider added", "You can now add Springfield University to your placements.") + end + + def springfield_university_notification + ActionMailer::Base.deliveries.find do |delivery| + delivery.to.include?(@springfield_university_user.email) && + delivery.subject == "A school has added you" + end + end + + def and_a_notification_email_is_sent_to_springfield_university + email = springfield_university_notification + + expect(email).not_to be_nil + end + + def then_i_see_a_validation_error_for_entering_a_provider_search_term + expect(page).to have_validation_error("Enter a provider name, United Kingdom provider number (UKPRN), unique reference number (URN) or postcode") + end + + def given_shelbyville_university_is_already_in_my_list_of_providers + create(:placements_partnership, school: @school, provider: @shelbyville_university) + end + + def when_i_enter_shelbyville_university + fill_in "Add a provider", with: "Shelbyville University" + end + + def then_i_see_a_dropdown_item_for_shelbyville_university + expect(page).to have_css(".autocomplete__option", text: "Shelbyville University", wait: 10) + end + + def when_i_click_on_the_shelbyville_university_dropdown_item + page.find(".autocomplete__option", text: "Shelbyville University").click + end + + def then_i_see_a_validation_error_for_shelbyville_university_is_already_in_my_list_of_providers + expect(page).to have_validation_error("Shelbyville University has already been added. Try another provider") + end + + def given_ogdenville_university_has_not_been_onboarded_to_the_placements_service + @ogdenville_university.update!(placements_service: false) + end + + def when_i_enter_ogdenville_university + fill_in "Add a provider", with: "Ogdenville University" + end + + def then_i_see_a_dropdown_item_for_ogdenville_university + expect(page).to have_css(".autocomplete__option", text: "Ogdenville University", wait: 10) + end + + def when_i_click_on_the_ogdenville_university_dropdown_item + page.find(".autocomplete__option", text: "Ogdenville University").click + end + + def then_i_see_confirm_provider_details_page_for_ogdenville_university + expect(page).to have_title("Confirm provider details - Provider details - Manage school placements - GOV.UK") + expect(primary_navigation).to have_current_item("Providers") + expect(page).to have_h1("Confirm provider details") + expect(page).to have_element(:p, text: "Adding them means you will be able to assign them to your placements. We will send them an email to let them know you have added them.", class: "govuk-body") + expect(page).to have_h2("Provider") + expect(page).to have_summary_list_row("Name", "Ogdenville University") + expect(page).to have_summary_list_row("UK provider reference number (UKPRN)", "00100010") + expect(page).to have_summary_list_row("Unique reference number (URN)", "000010") + expect(page).to have_summary_list_row("Email address", "reception@ogdenville.ac.uk") + expect(page).to have_summary_list_row("Telephone number", "0000 000 1111") + expect(page).to have_summary_list_row("Address", "1 Main Street") + expect(page).to have_button("Confirm and add provider") + expect(page).to have_link("Cancel", href: "/schools/#{@school.id}/partner_providers") + end + + def and_i_see_ogdenville_university_listed + expect(page).to have_table_row({ + "Name" => "Ogdenville University", + "UK provider reference number (UKPRN)" => "00100010", + }) + end + + def then_i_see_success_message_for_ogdenville_university + expect(page).to have_success_banner("Provider added", "You can now add Ogdenville University to your placements.") + end + + def ogdenville_university_notification + ActionMailer::Base.deliveries.find do |delivery| + delivery.to.include?(@ogdenville_university_user.email) && + delivery.subject == "A school has added you" + end + end + + def and_a_notification_email_is_not_sent_to_ogdenville_university + email = ogdenville_university_notification + + expect(email).to be_nil + end + + def when_i_click_on_back + click_on "Back" + end + + def then_i_see_the_search_input_prefilled_with_springfield_university + within(".autocomplete__wrapper") do + find_field "Add a provider", with: "Springfield University" + end + end + + def when_i_click_on_change + click_on "Change" + end +end diff --git a/spec/system/placements/schools/partner_providers/add_a_provider_using_multiple_tabs_spec.rb b/spec/system/placements/schools/partner_providers/add_a_provider_using_multiple_tabs_spec.rb new file mode 100644 index 0000000000..2e40d81d55 --- /dev/null +++ b/spec/system/placements/schools/partner_providers/add_a_provider_using_multiple_tabs_spec.rb @@ -0,0 +1,242 @@ +require "rails_helper" + +RSpec.describe "School user adds providers to their list of providers using multiple tabs", service: :placements, type: :system do + scenario "User adds two providers in separate tabs simultaneously", :js do + given_provider_exists + and_i_am_signed_in + + when_i_use_two_tabs_to_add_providers + and_i_am_on_the_providers_index_page_in_the_first_tab + and_i_click_on_add_provider_in_the_first_tab + and_i_enter_springfield_university + then_i_see_a_dropdown_item_for_springfield_university + + when_i_click_on_the_springfield_university_dropdown_item + and_i_click_on_tab_one_continue + then_i_see_confirm_provider_details_page_for_springfield_university + + when_i_am_on_the_providers_index_page_in_the_second_tab + and_i_click_on_add_provider_in_the_second_tab + and_i_enter_shelbyville_university + then_i_see_a_dropdown_item_for_shelbyville_university + + when_i_click_on_the_shelbyville_university_dropdown_item + and_i_click_on_tab_two_continue + then_i_see_confirm_provider_details_page_for_shelbyville_university + + when_i_return_to_the_first_tab_and_refresh_the_page + then_i_see_that_springfield_university_details_have_not_changed + + when_i_click_on_tab_one_confirm_and_add_provider + then_i_return_to_the_tab_one_provider_index + and_i_see_springfield_university_listed + + when_i_return_to_the_second_tab_and_refresh_the_page + then_i_see_that_shelbyville_university_details_have_not_changed + + when_i_click_on_tab_two_confirm_and_add_provider + then_i_return_to_the_tab_two_provider_index + and_i_see_shelbyville_university_listed + end + + private + + def given_provider_exists + @springfield_university = create(:placements_provider, + name: "Springfield University", + ukprn: "10101010", + urn: "101010", + email_address: "reception@springfield.ac.uk", + telephone: "0101 010 0101", + website: "http://www.springfield.ac.uk", + address1: "Undisclosed") + + @shelbyville_university = create(:placements_provider, + name: "Shelbyville University", + ukprn: "99999999", + urn: "999999", + email_address: "reception@shelbyville.ac.uk", + telephone: "9999 999 9999", + website: "http://www.shelbyville.ac.uk", + address1: "1 Sycamore Avenue") + end + + def and_i_am_signed_in + @school = create(:school, :placements) + @windows = [open_new_window, open_new_window] + end + + def when_i_use_two_tabs_to_add_providers + sign_in_placements_user(organisations: [@school]) + end + + def and_i_am_on_the_providers_index_page_in_the_first_tab + within_window @windows.first do + visit placements_school_partner_providers_path(@school) + + expect(page).to have_current_path(placements_school_partner_providers_path(@school)) + expect(page).to have_title("Providers you work with - Manage school placements - GOV.UK") + expect(primary_navigation).to have_current_item("Providers") + expect(page).to have_h1("Providers you work with") + end + end + alias_method :then_i_return_to_the_tab_one_provider_index, :and_i_am_on_the_providers_index_page_in_the_first_tab + + def and_i_click_on_add_provider_in_the_first_tab + within_window @windows.first do + click_on "Add provider" + end + end + + def and_i_enter_springfield_university + within_window @windows.first do + fill_in "Add a provider", with: "Springfield University" + end + end + + def then_i_see_a_dropdown_item_for_springfield_university + within_window @windows.first do + expect(page).to have_css(".autocomplete__option", text: "Springfield University") + end + end + + def when_i_click_on_the_springfield_university_dropdown_item + within_window @windows.first do + page.find(".autocomplete__option", text: "Springfield University").click + end + end + + # First tab only + def and_i_click_on_tab_one_continue + within_window @windows.first do + click_on "Continue" + end + end + + def then_i_see_confirm_provider_details_page_for_springfield_university + within_window @windows.first do + expect(page).to have_title("Confirm provider details - Provider details - Manage school placements - GOV.UK") + expect(primary_navigation).to have_current_item("Providers") + expect(page).to have_h1("Confirm provider details") + expect(page).to have_element(:p, text: "Adding them means you will be able to assign them to your placements. We will send them an email to let them know you have added them.", class: "govuk-body") + expect(page).to have_h2("Provider") + expect(page).to have_summary_list_row("Name", "Springfield University") + expect(page).to have_summary_list_row("UK provider reference number (UKPRN)", "10101010") + expect(page).to have_summary_list_row("Unique reference number (URN)", "101010") + expect(page).to have_summary_list_row("Email address", "reception@springfield.ac.uk") + expect(page).to have_summary_list_row("Telephone number", "0101 010 0101") + expect(page).to have_summary_list_row("Address", "Undisclosed") + expect(page).to have_button("Confirm and add provider") + expect(page).to have_link("Cancel", href: "/schools/#{@school.id}/partner_providers") + end + end + alias_method :then_i_see_that_springfield_university_details_have_not_changed, :then_i_see_confirm_provider_details_page_for_springfield_university + + def when_i_am_on_the_providers_index_page_in_the_second_tab + within_window @windows.second do + visit placements_school_partner_providers_path(@school) + + expect(page).to have_current_path(placements_school_partner_providers_path(@school)) + expect(page).to have_title("Providers you work with - Manage school placements - GOV.UK") + expect(primary_navigation).to have_current_item("Providers") + expect(page).to have_h1("Providers you work with") + end + end + alias_method :then_i_return_to_the_tab_two_provider_index, :when_i_am_on_the_providers_index_page_in_the_second_tab + + def and_i_click_on_add_provider_in_the_second_tab + within_window @windows.second do + click_on "Add provider" + end + end + + def and_i_enter_shelbyville_university + within_window @windows.second do + fill_in "Add a provider", with: "Shelbyville University" + end + end + + def then_i_see_a_dropdown_item_for_shelbyville_university + within_window @windows.second do + expect(page).to have_css(".autocomplete__option", text: "Shelbyville University") + end + end + + def when_i_click_on_the_shelbyville_university_dropdown_item + within_window @windows.second do + page.find(".autocomplete__option", text: "Shelbyville University").click + end + end + + # Second tab only + def and_i_click_on_tab_two_continue + within_window @windows.second do + click_on "Continue" + end + end + + def then_i_see_confirm_provider_details_page_for_shelbyville_university + within_window @windows.second do + expect(page).to have_title("Confirm provider details - Provider details - Manage school placements - GOV.UK") + expect(primary_navigation).to have_current_item("Providers") + expect(page).to have_h1("Confirm provider details") + expect(page).to have_element(:p, text: "Adding them means you will be able to assign them to your placements. We will send them an email to let them know you have added them.", class: "govuk-body") + expect(page).to have_h2("Provider") + expect(page).to have_summary_list_row("Name", "Shelbyville University") + expect(page).to have_summary_list_row("UK provider reference number (UKPRN)", "99999999") + expect(page).to have_summary_list_row("Unique reference number (URN)", "999999") + expect(page).to have_summary_list_row("Email address", "reception@shelbyville.ac.uk") + expect(page).to have_summary_list_row("Telephone number", "9999 999 9999") + expect(page).to have_summary_list_row("Address", "1 Sycamore Avenue") + expect(page).to have_button("Confirm and add provider") + expect(page).to have_link("Cancel", href: "/schools/#{@school.id}/partner_providers") + end + end + alias_method :then_i_see_that_shelbyville_university_details_have_not_changed, :then_i_see_confirm_provider_details_page_for_shelbyville_university + + def when_i_return_to_the_first_tab_and_refresh_the_page + within_window @windows.first do + visit current_path + end + end + + # First tab only + def when_i_click_on_tab_one_confirm_and_add_provider + within_window @windows.first do + click_on "Confirm and add provider" + end + end + + def and_i_see_springfield_university_listed + within_window @windows.first do + expect(page).to have_table_row({ + "Name" => "Springfield University", + "UK provider reference number (UKPRN)" => "10101010", + }, + wait: 10) + end + end + + def when_i_return_to_the_second_tab_and_refresh_the_page + within_window @windows.second do + visit current_path + end + end + + # Second tab only + def when_i_click_on_tab_two_confirm_and_add_provider + within_window @windows.second do + click_on "Confirm and add provider" + end + end + + def and_i_see_shelbyville_university_listed + within_window @windows.second do + expect(page).to have_table_row({ + "Name" => "Shelbyville University", + "UK provider reference number (UKPRN)" => "99999999", + }, + wait: 10) + end + end +end diff --git a/spec/system/placements/schools/partner_providers/add_a_provider_without_javascript_spec.rb b/spec/system/placements/schools/partner_providers/add_a_provider_without_javascript_spec.rb new file mode 100644 index 0000000000..32cda3eb42 --- /dev/null +++ b/spec/system/placements/schools/partner_providers/add_a_provider_without_javascript_spec.rb @@ -0,0 +1,300 @@ +require "rails_helper" + +RSpec.describe "School user adds a provider to their list of providers", + service: :placements, type: :system do + include ActiveJob::TestHelper + + around do |example| + perform_enqueued_jobs { example.run } + end + + scenario do + given_provider_exists + and_i_am_signed_in + + when_i_am_on_the_providers_index_page + and_i_click_on_add_provider + and_i_click_on_continue + then_i_see_a_validation_error_for_entering_a_provider_search_term + + given_shelbyville_university_is_already_in_my_list_of_providers + when_i_enter_shelb + and_i_click_on_continue + then_i_see_a_list_of_search_results_for_shelb + + when_i_choose_shelbyville_university + and_i_click_on_continue + then_i_see_a_validation_error_for_shelbyville_university_is_already_in_my_list_of_providers + + given_ogdenville_university_has_not_been_onboarded_to_the_placements_service + when_i_am_on_the_providers_index_page + and_i_click_on_add_provider + when_i_enter_ogden + and_i_click_on_continue + then_i_see_a_list_of_search_results_for_ogden + + when_i_choose_ogdenville_university + and_i_click_on_continue + then_i_see_confirm_provider_details_page_for_ogdenville_university + + when_i_click_on_confirm_and_add_provider + then_i_see_success_message_for_ogdenville + and_i_see_the_providers_index_page + and_i_see_ogdenville_university_listed + and_a_notification_email_is_not_sent_to_ogdenville_university + + when_i_click_on_add_provider + and_i_enter_spring + and_i_click_on_continue + then_i_see_a_list_of_search_results_for_spring + + when_i_choose_springfield_university + and_i_click_on_continue + then_i_see_confirm_provider_details_page_for_springfield_university + + # User reconsiders selecting a provider using back link + when_i_click_on_back + then_i_see_a_list_of_search_results_for_spring + and_the_option_for_springfield_university_is_preselected + + when_i_click_on_back + then_i_see_the_search_input_prefilled_with_spring + + when_i_click_on_continue + and_i_choose_springfield_university + and_i_click_on_continue + then_i_see_confirm_provider_details_page_for_springfield_university + + # User reconsiders selecting a provider using change link + when_i_click_on_change + then_i_see_the_search_input_prefilled_with_spring + + when_i_click_on_continue + and_i_choose_springfield_university + and_i_click_on_continue + then_i_see_confirm_provider_details_page_for_springfield_university + + when_i_click_on_confirm_and_add_provider + then_i_see_success_message_for_springfield_university + and_i_see_the_providers_index_page + and_i_see_springfield_university_listed + and_a_notification_email_is_sent_to_springfield_university + end + + private + + def given_provider_exists + @springfield_university = create(:placements_provider, + name: "Springfield University", + ukprn: "10101010", + urn: "101010", + email_address: "reception@springfield.ac.uk", + telephone: "0101 010 0101", + website: "http://www.springfield.ac.uk", + address1: "Undisclosed") + @springfield_university_user = create(:placements_user, providers: [@springfield_university]) + + @ogdenville_university = create(:placements_provider, + name: "Ogdenville University", + ukprn: "00100010", + urn: "000010", + email_address: "reception@ogdenville.ac.uk", + telephone: "0000 000 1111", + website: "http://www.ogdenville.ac.uk", + address1: "1 Main Street") + @ogdenville_university_user = create(:placements_user, providers: [@ogdenville_university]) + + @shelbyville_university = create(:placements_provider, name: "Shelbyville University") + @shelbyville_college = create(:placements_provider, name: "Shelbyville College") + @ogdenville_teacher_training_centre = create(:placements_provider, name: "Ogdenville Teacher Training Centre") + @springfield_polytechnic = create(:placements_provider, name: "Springfield Polytechnic") + end + + def and_i_am_signed_in + @school = create(:school, :placements) + given_i_am_signed_in_as_a_placements_user(organisations: [@school]) + end + + def when_i_am_on_the_providers_index_page + page.find(".app-primary-navigation__nav").click_on("Providers") + + expect(page).to have_current_path(placements_school_partner_providers_path(@school)) + expect(page).to have_title("Providers you work with - Manage school placements - GOV.UK") + expect(primary_navigation).to have_current_item("Providers") + expect(page).to have_h1("Providers you work with") + end + alias_method :and_i_see_the_providers_index_page, :when_i_am_on_the_providers_index_page + + def and_i_click_on_add_provider + click_on "Add provider" + end + alias_method :when_i_click_on_add_provider, :and_i_click_on_add_provider + + def and_i_enter_spring + fill_in "Add a provider", with: "Spring" + end + + def then_i_see_a_list_of_search_results_for_spring + expect(page).to have_content("Springfield University") + expect(page).to have_content("Springfield Polytechnic") + expect(page).not_to have_content("Springfield Grammar") + end + + def and_i_choose_springfield_university + choose "Springfield University" + end + alias_method :when_i_choose_springfield_university, :and_i_choose_springfield_university + + def and_i_click_on_continue + click_on "Continue" + end + alias_method :when_i_click_on_continue, :and_i_click_on_continue + + def then_i_see_confirm_provider_details_page_for_springfield_university + expect(page).to have_title("Confirm provider details - Provider details - Manage school placements - GOV.UK") + expect(primary_navigation).to have_current_item("Providers") + expect(page).to have_h1("Confirm provider details") + expect(page).to have_element(:p, text: "Adding them means you will be able to assign them to your placements. We will send them an email to let them know you have added them.", class: "govuk-body") + expect(page).to have_h2("Provider") + expect(page).to have_summary_list_row("Name", "Springfield University") + expect(page).to have_summary_list_row("UK provider reference number (UKPRN)", "10101010") + expect(page).to have_summary_list_row("Unique reference number (URN)", "101010") + expect(page).to have_summary_list_row("Email address", "reception@springfield.ac.uk") + expect(page).to have_summary_list_row("Telephone number", "0101 010 0101") + expect(page).to have_summary_list_row("Address", "Undisclosed") + expect(page).to have_button("Confirm and add provider") + expect(page).to have_link("Cancel", href: "/schools/#{@school.id}/partner_providers") + end + + def when_i_click_on_confirm_and_add_provider + click_on "Confirm and add provider" + end + + def and_i_see_springfield_university_listed + expect(page).to have_table_row({ + "Name" => "Springfield University", + "UK provider reference number (UKPRN)" => "10101010", + }) + end + + def then_i_see_success_message_for_springfield_university + expect(page).to have_success_banner("Provider added", "You can now add Springfield University to your placements.") + end + + def springfield_university_notification + ActionMailer::Base.deliveries.find do |delivery| + delivery.to.include?(@springfield_university_user.email) && + delivery.subject == "A school has added you" + end + end + + def and_a_notification_email_is_sent_to_springfield_university + email = springfield_university_notification + + expect(email).not_to be_nil + end + + def then_i_see_a_validation_error_for_entering_a_provider_search_term + expect(page).to have_validation_error("Enter a provider name, United Kingdom provider number (UKPRN), unique reference number (URN) or postcode") + end + + def given_shelbyville_university_is_already_in_my_list_of_providers + create(:placements_partnership, school: @school, provider: @shelbyville_university) + end + + def when_i_enter_shelb + fill_in "Add a provider", with: "Shelb" + end + + def then_i_see_a_list_of_search_results_for_shelb + expect(page).to have_content("Shelbyville University") + expect(page).to have_content("Shelbyville College") + expect(page).not_to have_content("Shelbyville Grammar") + end + + def when_i_choose_shelbyville_university + choose "Shelbyville University" + end + + def then_i_see_a_validation_error_for_shelbyville_university_is_already_in_my_list_of_providers + expect(page).to have_validation_error("Shelbyville University has already been added. Try another provider") + end + + def given_ogdenville_university_has_not_been_onboarded_to_the_placements_service + @ogdenville_university.update!(placements_service: false) + end + + def when_i_enter_ogden + fill_in "Add a provider", with: "Ogden" + end + + def then_i_see_a_list_of_search_results_for_ogden + expect(page).to have_content("Ogdenville University") + expect(page).to have_content("Ogdenville Teacher Training Centre") + expect(page).not_to have_content("Ogdenville Grammar") + end + + def when_i_choose_ogdenville_university + choose "Ogdenville University" + end + + def then_i_see_confirm_provider_details_page_for_ogdenville_university + expect(page).to have_title("Confirm provider details - Provider details - Manage school placements - GOV.UK") + expect(primary_navigation).to have_current_item("Providers") + expect(page).to have_h1("Confirm provider details") + expect(page).to have_element(:p, text: "Adding them means you will be able to assign them to your placements. We will send them an email to let them know you have added them.", class: "govuk-body") + expect(page).to have_h2("Provider") + expect(page).to have_summary_list_row("Name", "Ogdenville University") + expect(page).to have_summary_list_row("UK provider reference number (UKPRN)", "00100010") + expect(page).to have_summary_list_row("Unique reference number (URN)", "000010") + expect(page).to have_summary_list_row("Email address", "reception@ogdenville.ac.uk") + expect(page).to have_summary_list_row("Telephone number", "0000 000 1111") + expect(page).to have_summary_list_row("Address", "1 Main Street") + expect(page).to have_button("Confirm and add provider") + expect(page).to have_link("Cancel", href: "/schools/#{@school.id}/partner_providers") + end + + def and_i_see_ogdenville_university_listed + expect(page).to have_table_row({ + "Name" => "Ogdenville University", + "UK provider reference number (UKPRN)" => "00100010", + }) + end + + def then_i_see_success_message_for_ogdenville + expect(page).to have_success_banner("Provider added", "You can now add Ogdenville University to your placements.") + end + + def ogdenville_university_notification + ActionMailer::Base.deliveries.find do |delivery| + delivery.to.include?(@ogdenville_university_user.email) && + delivery.subject == "A school has added you" + end + end + + def and_a_notification_email_is_not_sent_to_ogdenville_university + email = ogdenville_university_notification + + expect(email).to be_nil + end + + def when_i_click_on_back + click_on "Back" + end + + def and_i_click_on_back + click_on "Back" + end + + def and_the_option_for_springfield_university_is_preselected + expect(page).to have_checked_field("Springfield University") + end + + def then_i_see_the_search_input_prefilled_with_spring + find_field "Add a provider", with: "Spring" + end + + def when_i_click_on_change + click_on "Change" + end +end