You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							145 lines
						
					
					
						
							5.3 KiB
						
					
					
				
			
		
		
	
	
							145 lines
						
					
					
						
							5.3 KiB
						
					
					
				require "rails_helper" | 
						|
 | 
						|
RSpec.describe OrganisationsController, type: :request do | 
						|
  let(:user) { create(:user, :support) } | 
						|
  let(:headers) { { "Accept" => "text/html" } } | 
						|
  let(:page) { Capybara::Node::Simple.new(response.body) } | 
						|
 | 
						|
  before do | 
						|
    allow(user).to receive(:need_two_factor_authentication?).and_return(false) | 
						|
    sign_in user | 
						|
  end | 
						|
 | 
						|
  describe "#new" do | 
						|
    before do | 
						|
      get new_organisation_path | 
						|
    end | 
						|
 | 
						|
    it "displays the rent periods question" do | 
						|
      expect(page).to have_content "What are the rent periods for the organisation?" | 
						|
    end | 
						|
 | 
						|
    it "the checkboxes for each rent period are checked by default" do | 
						|
      checkboxes = page.all "input[type='checkbox'][name='organisation[rent_periods][]']" | 
						|
      expect(checkboxes.count).to be > 5 | 
						|
      expect(checkboxes.all? { |box| box[:checked] }).to be true | 
						|
    end | 
						|
  end | 
						|
 | 
						|
  describe "#create" do | 
						|
    let(:org_name) { "abode team" } | 
						|
    let(:expected_rent_periods) { [1, 2, 3] } | 
						|
    let(:params) do | 
						|
      { | 
						|
        "organisation": { | 
						|
          name: org_name, | 
						|
          provider_type: "LA", | 
						|
          rent_periods: expected_rent_periods, | 
						|
        }, | 
						|
      } | 
						|
    end | 
						|
 | 
						|
    before do | 
						|
      post organisations_path headers:, params: | 
						|
    end | 
						|
 | 
						|
    it "creates organisation rent periods with the correct rent period and organisation id" do | 
						|
      org = Organisation.includes(:organisation_rent_periods).find_by_name(org_name) | 
						|
      org_rent_periods = org.organisation_rent_periods | 
						|
      expect(org_rent_periods.count).to be expected_rent_periods.count | 
						|
      expect(org_rent_periods.map(&:rent_period)).to match_array expected_rent_periods | 
						|
      expect(org_rent_periods.map(&:organisation_id)).to all be org.id | 
						|
    end | 
						|
  end | 
						|
 | 
						|
  describe "#edit" do | 
						|
    let(:organisation) { create(:organisation) } | 
						|
    let(:fake_rent_periods) do | 
						|
      { | 
						|
        "1" => { "value" => "Every minute" }, | 
						|
        "2" => { "value" => "Every decade" }, | 
						|
      } | 
						|
    end | 
						|
    let(:checked_rent_period_id) { "1" } | 
						|
 | 
						|
    before do | 
						|
      allow(RentPeriod).to receive(:rent_period_mappings).and_return fake_rent_periods | 
						|
      create(:organisation_rent_period, organisation:, rent_period: checked_rent_period_id) | 
						|
      get edit_organisation_path organisation | 
						|
    end | 
						|
 | 
						|
    it "displays the rent periods question" do | 
						|
      expect(page).to have_content "What are the rent periods for the organisation?" | 
						|
    end | 
						|
 | 
						|
    it "the checkboxes for each rent period are checked where appropriate" do | 
						|
      checkboxes = page.all "input[type='checkbox']" | 
						|
      expect(checkboxes.count).to be 2 | 
						|
      expected_checked_checkbox = checkboxes.find { |cb| cb[:value] == checked_rent_period_id } | 
						|
      expect(expected_checked_checkbox[:checked]).to be true | 
						|
      expected_not_checked_checkbox = checkboxes.find { |cb| cb[:value] != checked_rent_period_id } | 
						|
      expect(expected_not_checked_checkbox[:checked]).to be false | 
						|
    end | 
						|
  end | 
						|
 | 
						|
  describe "#update" do | 
						|
    let(:organisation) { create(:organisation) } | 
						|
    let(:initially_checked_rent_period_id) { "1" } | 
						|
    let(:initially_unchecked_rent_period_id) { "2" } | 
						|
    let(:params) do | 
						|
      { | 
						|
        "organisation": { | 
						|
          name: organisation.name, | 
						|
          rent_periods: [initially_unchecked_rent_period_id], | 
						|
          all_rent_periods: [initially_unchecked_rent_period_id, initially_checked_rent_period_id], | 
						|
        }, | 
						|
      } | 
						|
    end | 
						|
 | 
						|
    it "creates and destroys organisation rent periods as appropriate" do | 
						|
      create(:organisation_rent_period, organisation:, rent_period: initially_checked_rent_period_id) | 
						|
 | 
						|
      rent_periods = Organisation.includes(:organisation_rent_periods) | 
						|
                                 .find(organisation.id) | 
						|
                                 .organisation_rent_periods | 
						|
      expect(rent_periods.count).to be 1 | 
						|
      expect(rent_periods.first.rent_period.to_s).to eq initially_checked_rent_period_id | 
						|
 | 
						|
      patch organisation_path(organisation, headers:, params:) | 
						|
 | 
						|
      rent_periods = Organisation.includes(:organisation_rent_periods) | 
						|
                                 .find(organisation.id) | 
						|
                                 .organisation_rent_periods | 
						|
      expect(rent_periods.count).to be 1 | 
						|
      expect(rent_periods.first.rent_period.to_s).to eq initially_unchecked_rent_period_id | 
						|
    end | 
						|
 | 
						|
    context "when a user creates a log with a certain rent period while another user is on the edit page" do | 
						|
      let(:period_to_not_delete) { "4" } | 
						|
      let(:period_to_create) { "5" } | 
						|
      let(:coordinator) { create(:user, :data_coordinator, organisation:) } | 
						|
      let(:params) do | 
						|
        { | 
						|
          "organisation": { | 
						|
            name: organisation.name, | 
						|
            rent_periods: [period_to_create], | 
						|
            all_rent_periods: [period_to_not_delete], | 
						|
          }, | 
						|
        } | 
						|
      end | 
						|
 | 
						|
      it "does not delete rent periods that are in use by that organisation" do | 
						|
        create(:organisation_rent_period, organisation:, rent_period: period_to_not_delete) | 
						|
        create(:lettings_log, :setup_completed, period: period_to_not_delete, assigned_to: coordinator, owning_organisation: organisation, managing_organisation: organisation) | 
						|
 | 
						|
        patch organisation_path(organisation, headers:, params:) | 
						|
 | 
						|
        rent_periods = Organisation.includes(:organisation_rent_periods) | 
						|
                                   .find(organisation.id) | 
						|
                                   .organisation_rent_periods | 
						|
 | 
						|
        expect(rent_periods.map(&:rent_period).map(&:to_s)).to match_array([period_to_create, period_to_not_delete]) | 
						|
      end | 
						|
    end | 
						|
  end | 
						|
end
 | 
						|
 |