require "rails_helper" RSpec.describe OrganisationRelationshipsController, type: :request do let(:organisation) { user.organisation } let!(:unauthorised_organisation) { FactoryBot.create(:organisation) } let(:headers) { { "Accept" => "text/html" } } let(:page) { Capybara::Node::Simple.new(response.body) } context "when user is signed in" do let(:user) { FactoryBot.create(:user, :data_coordinator) } context "with a data coordinator user" do before do sign_in user end context "when accessing the housing providers tab" do context "with an organisation that the user belongs to" do let!(:housing_provider) { FactoryBot.create(:organisation) } let!(:other_org_housing_provider) { FactoryBot.create(:organisation, name: "Foobar LTD") } let!(:other_organisation) { FactoryBot.create(:organisation, name: "Foobar LTD 2") } before do FactoryBot.create(:organisation_relationship, child_organisation: organisation, parent_organisation: housing_provider) FactoryBot.create(:organisation_relationship, child_organisation: other_organisation, parent_organisation: other_org_housing_provider) get "/organisations/#{organisation.id}/housing-providers", headers:, params: {} end it "shows the tab navigation" do expected_html = "<nav class=\"app-primary-navigation\"" expect(response.body).to include(expected_html) end it "shows an add housing provider button" do expect(page).to have_link("Add a housing provider") end it "shows a table of housing providers" do expected_html = "<table class=\"govuk-table\"" expect(response.body).to include(expected_html) expect(response.body).to include(housing_provider.name) end it "shows only housing providers for the current user's organisation" do expect(page).to have_content(housing_provider.name) expect(page).not_to have_content(other_org_housing_provider.name) end it "shows the pagination count" do expect(page).to have_content("1 total housing providers") end context "when adding a housing provider" do before do get "/organisations/#{organisation.id}/housing-providers/add", headers:, params: {} end it "has the correct header" do expect(response.body).to include("What is the name of your housing provider?") end it "shows an add button" do expect(page).to have_button("Add") end end end context "with an organisation that are not in scope for the user, i.e. that they do not belong to" do before do get "/organisations/#{unauthorised_organisation.id}/housing-providers", headers:, params: {} end it "returns not found 404 from users page" do expect(response).to have_http_status(:not_found) end end end context "when accessing the managing agents tab" do context "with an organisation that the user belongs to" do let!(:managing_agent) { FactoryBot.create(:organisation) } let!(:other_org_managing_agent) { FactoryBot.create(:organisation, name: "Foobar LTD") } let!(:other_organisation) { FactoryBot.create(:organisation, name: "Foobar LTD") } before do FactoryBot.create(:organisation_relationship, parent_organisation: organisation, child_organisation: managing_agent) FactoryBot.create(:organisation_relationship, parent_organisation: other_organisation, child_organisation: other_org_managing_agent) get "/organisations/#{organisation.id}/managing-agents", headers:, params: {} end it "shows the tab navigation" do expected_html = "<nav class=\"app-primary-navigation\"" expect(response.body).to include(expected_html) end it "shows an add managing-agent button" do expect(page).to have_link("Add a managing agent") end it "shows a table of managing-agents" do expected_html = "<table class=\"govuk-table\"" expect(response.body).to include(expected_html) expect(response.body).to include(managing_agent.name) end it "shows only managing-agents for the current user's organisation" do expect(page).to have_content(managing_agent.name) expect(page).not_to have_content(other_org_managing_agent.name) end it "shows the pagination count" do expect(page).to have_content("1 total agents") end end context "when adding a managing agent" do before do get "/organisations/#{organisation.id}/managing-agents/add", headers:, params: {} end it "has the correct header" do expect(response.body).to include("What is the name of your managing agent?") end end context "with an organisation that are not in scope for the user, i.e. that they do not belong to" do before do get "/organisations/#{unauthorised_organisation.id}/managing-agents", headers:, params: {} end it "returns not found 404 from users page" do expect(response).to have_http_status(:not_found) end end end describe "organisation_relationships#create_housing_provider" do let!(:housing_provider) { FactoryBot.create(:organisation) } let(:params) do { "organisation_relationship": { "parent_organisation_id": housing_provider.id, }, } end let(:request) { post "/organisations/#{organisation.id}/housing-providers", headers:, params: } it "creates a new organisation relationship" do expect { request }.to change(OrganisationRelationship, :count).by(1) end it "sets the organisation relationship attributes correctly" do request expect(OrganisationRelationship).to exist(child_organisation_id: organisation.id, parent_organisation_id: housing_provider.id) end it "redirects to the organisation list" do request expect(response).to redirect_to("/organisations/#{organisation.id}/housing-providers") end end describe "organisation_relationships#create_managing_agent" do let!(:managing_agent) { FactoryBot.create(:organisation) } let(:params) do { "organisation_relationship": { "child_organisation_id": managing_agent.id, }, } end let(:request) { post "/organisations/#{organisation.id}/managing-agents", headers:, params: } it "creates a new organisation relationship" do expect { request }.to change(OrganisationRelationship, :count).by(1) end it "sets the organisation relationship attributes correctly" do request expect(OrganisationRelationship).to exist(parent_organisation_id: organisation.id, child_organisation_id: managing_agent.id) end it "redirects to the organisation list" do request expect(response).to redirect_to("/organisations/#{organisation.id}/managing-agents") end end describe "organisation_relationships#delete_housing_provider" do let!(:housing_provider) { FactoryBot.create(:organisation) } let(:params) do { "target_organisation_id": housing_provider.id, } end let(:request) { delete "/organisations/#{organisation.id}/housing-providers", headers:, params: } before do FactoryBot.create(:organisation_relationship, child_organisation: organisation, parent_organisation: housing_provider) end it "deletes the new organisation relationship" do expect { request }.to change(OrganisationRelationship, :count).by(-1) end it "redirects to the organisation list" do request expect(response).to redirect_to("/organisations/#{organisation.id}/housing-providers") end end describe "organisation_relationships#delete_managing_agent" do let!(:managing_agent) { FactoryBot.create(:organisation) } let(:params) do { "target_organisation_id": managing_agent.id, } end let(:request) { delete "/organisations/#{organisation.id}/managing-agents", headers:, params: } before do FactoryBot.create( :organisation_relationship, parent_organisation: organisation, child_organisation: managing_agent, ) end it "deletes the new organisation relationship" do expect { request }.to change(OrganisationRelationship, :count).by(-1) end it "redirects to the organisation list" do request expect(response).to redirect_to("/organisations/#{organisation.id}/managing-agents") end end end context "with a data provider user" do let(:user) { FactoryBot.create(:user) } before do sign_in user end context "when accessing the housing providers tab" do context "with an organisation that the user belongs to" do let!(:housing_provider) { FactoryBot.create(:organisation) } let!(:other_org_housing_provider) { FactoryBot.create(:organisation, name: "Foobar LTD") } let!(:other_organisation) { FactoryBot.create(:organisation, name: "Foobar LTD") } before do FactoryBot.create(:organisation_relationship, child_organisation: organisation, parent_organisation: housing_provider) FactoryBot.create(:organisation_relationship, child_organisation: other_organisation, parent_organisation: other_org_housing_provider) get "/organisations/#{organisation.id}/housing-providers", headers:, params: {} end it "shows the tab navigation" do expected_html = "<nav class=\"app-primary-navigation\"" expect(response.body).to include(expected_html) end it "doesn't show an add housing provider button" do expect(page).not_to have_link("Add a housing provider") end it "shows a table of housing providers" do expected_html = "<table class=\"govuk-table\"" expect(response.body).to include(expected_html) expect(response.body).to include(housing_provider.name) end it "shows only housing providers for the current user's organisation" do expect(page).to have_content(housing_provider.name) expect(page).not_to have_content(other_org_housing_provider.name) end it "shows the pagination count" do expect(page).to have_content("1 total housing providers") end end context "with an organisation that are not in scope for the user, i.e. that they do not belong to" do before do get "/organisations/#{unauthorised_organisation.id}/housing-providers", headers:, params: {} end it "returns not found 404 from users page" do expect(response).to have_http_status(:not_found) end end end context "when accessing the managing agents tab" do context "with an organisation that the user belongs to" do let!(:managing_agent) { FactoryBot.create(:organisation) } let!(:other_org_managing_agent) { FactoryBot.create(:organisation, name: "Foobar LTD") } let!(:other_organisation) { FactoryBot.create(:organisation, name: "Foobar LTD") } before do FactoryBot.create(:organisation_relationship, parent_organisation: organisation, child_organisation: managing_agent) FactoryBot.create(:organisation_relationship, parent_organisation: other_organisation, child_organisation: other_org_managing_agent) get "/organisations/#{organisation.id}/managing-agents", headers:, params: {} end it "shows the tab navigation" do expected_html = "<nav class=\"app-primary-navigation\"" expect(response.body).to include(expected_html) end it "doesn't show an add managing agent button" do expect(page).not_to have_link("Add a managing agent") end it "shows a table of managing agents" do expected_html = "<table class=\"govuk-table\"" expect(response.body).to include(expected_html) expect(response.body).to include(managing_agent.name) end it "shows only managing agents for the current user's organisation" do expect(page).to have_content(managing_agent.name) expect(page).not_to have_content(other_org_managing_agent.name) end it "shows the pagination count" do expect(page).to have_content("1 total agents") end end context "when adding a managing agent" do before do get "/organisations/#{organisation.id}/managing-agents/add", headers:, params: {} end it "has the correct header" do expect(response.body).to include("What is the name of your managing agent?") end end context "with an organisation that are not in scope for the user, i.e. that they do not belong to" do before do get "/organisations/#{unauthorised_organisation.id}/managing-agents", headers:, params: {} end it "returns not found 404 from users page" do expect(response).to have_http_status(:not_found) end end end end context "with a support user" do let(:user) { FactoryBot.create(:user, :support) } before do allow(user).to receive(:need_two_factor_authentication?).and_return(false) sign_in user end describe "organisation_relationships#create_housing_provider" do let!(:housing_provider) { FactoryBot.create(:organisation) } let(:params) do { "organisation_relationship": { "parent_organisation_id": housing_provider.id, }, } end let(:request) { post "/organisations/#{organisation.id}/housing-providers", headers:, params: } it "creates a new organisation relationship" do expect { request }.to change(OrganisationRelationship, :count).by(1) end it "sets the organisation relationship attributes correctly" do request expect(OrganisationRelationship).to exist(child_organisation_id: organisation.id, parent_organisation_id: housing_provider.id) end it "redirects to the organisation list" do request expect(response).to redirect_to("/organisations/#{organisation.id}/housing-providers") end end describe "organisation_relationships#create_managing_agent" do let!(:managing_agent) { FactoryBot.create(:organisation) } let(:params) do { "organisation_relationship": { "child_organisation_id": managing_agent.id, }, } end let(:request) { post "/organisations/#{organisation.id}/managing-agents", headers:, params: } it "creates a new organisation relationship" do expect { request }.to change(OrganisationRelationship, :count).by(1) end it "sets the organisation relationship attributes correctly" do request expect(OrganisationRelationship).to exist(parent_organisation_id: organisation.id, child_organisation_id: managing_agent.id) end it "redirects to the organisation list" do request expect(response).to redirect_to("/organisations/#{organisation.id}/managing-agents") end end describe "organisation_relationships#delete_housing_provider" do let!(:housing_provider) { FactoryBot.create(:organisation) } let(:params) do { "target_organisation_id": housing_provider.id, } end let(:request) { delete "/organisations/#{organisation.id}/housing-providers", headers:, params: } before do FactoryBot.create(:organisation_relationship, child_organisation: organisation, parent_organisation: housing_provider) end it "deletes the new organisation relationship" do expect { request }.to change(OrganisationRelationship, :count).by(-1) end it "redirects to the organisation list" do request expect(response).to redirect_to("/organisations/#{organisation.id}/housing-providers") end end describe "organisation_relationships#delete_managing_agent" do let!(:managing_agent) { FactoryBot.create(:organisation) } let(:params) do { "target_organisation_id": managing_agent.id, } end let(:request) { delete "/organisations/#{organisation.id}/managing-agents", headers:, params: } before do FactoryBot.create( :organisation_relationship, parent_organisation: organisation, child_organisation: managing_agent, ) end it "deletes the new organisation relationship" do expect { request }.to change(OrganisationRelationship, :count).by(-1) end it "redirects to the organisation list" do request expect(response).to redirect_to("/organisations/#{organisation.id}/managing-agents") end end context "when viewing a specific organisation's housing providers" do let!(:housing_provider) { FactoryBot.create(:organisation) } let!(:other_org_housing_provider) { FactoryBot.create(:organisation, name: "Foobar LTD") } let!(:other_organisation) { FactoryBot.create(:organisation, name: "Foobar LTD 2") } before do FactoryBot.create(:organisation_relationship, child_organisation: organisation, parent_organisation: housing_provider) FactoryBot.create(:organisation_relationship, child_organisation: other_organisation, parent_organisation: other_org_housing_provider) get "/organisations/#{organisation.id}/housing-providers", headers:, params: {} end it "displays the name of the organisation" do expect(page).to have_content(organisation.name) end it "has a sub-navigation with correct tabs" do expect(page).to have_css(".app-sub-navigation") expect(page).to have_content("Users") end it "shows a table of housing providers" do expected_html = "<table class=\"govuk-table\"" expect(response.body).to include(expected_html) expect(response.body).to include(housing_provider.name) end it "shows only housing providers for this organisation" do expect(page).to have_content(housing_provider.name) expect(page).not_to have_content(other_org_housing_provider.name) end it "shows remove link(s)" do expect(response.body).to include("Remove") end it "shows the pagination count" do expect(page).to have_content("1 total housing providers") end context "when adding a housing provider" do before do get "/organisations/#{organisation.id}/housing-providers/add", headers:, params: {} end it "has the correct header" do expect(response.body).to include("What is the name of this organisation's housing provider?") end it "shows an add button" do expect(page).to have_button("Add") end end end context "when viewing a specific organisation's managing agents" do let!(:managing_agent) { FactoryBot.create(:organisation) } let!(:other_org_managing_agent) { FactoryBot.create(:organisation, name: "Foobar LTD") } let!(:other_organisation) { FactoryBot.create(:organisation, name: "Foobar LTD 2") } before do FactoryBot.create(:organisation_relationship, parent_organisation: organisation, child_organisation: managing_agent) FactoryBot.create(:organisation_relationship, parent_organisation: other_organisation, child_organisation: other_org_managing_agent) get "/organisations/#{organisation.id}/managing-agents", headers:, params: {} end it "displays the name of the organisation" do expect(page).to have_content(organisation.name) end it "has a sub-navigation with correct tabs" do expect(page).to have_css(".app-sub-navigation") expect(page).to have_content("Users") end it "shows a table of managing agents" do expected_html = "<table class=\"govuk-table\"" expect(response.body).to include(expected_html) expect(response.body).to include(managing_agent.name) end it "shows only managing agents for this organisation" do expect(page).to have_content(managing_agent.name) expect(page).not_to have_content(other_org_managing_agent.name) end it "shows the pagination count" do expect(page).to have_content("1 total agents") end it "shows remove link(s)" do expect(response.body).to include("Remove") end context "when adding a housing provider" do before do get "/organisations/#{organisation.id}/managing-agents/add", headers:, params: {} end it "has the correct header" do expect(response.body).to include("What is the name of this organisation's managing agent?") end it "shows an add button" do expect(page).to have_button("Add") end end end end end end