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.
		
		
		
		
		
			
		
			
				
					
					
						
							96 lines
						
					
					
						
							3.4 KiB
						
					
					
				
			
		
		
	
	
							96 lines
						
					
					
						
							3.4 KiB
						
					
					
				require "rails_helper" | 
						|
 | 
						|
RSpec.describe DeviseNotifyMailer do | 
						|
  describe "Intercept mail" do | 
						|
    let(:notify_client) { instance_double(Notifications::Client) } | 
						|
    let(:devise_notify_mailer) { described_class.new } | 
						|
    let(:organisation) { FactoryBot.create(:organisation) } | 
						|
    let(:name) { "test" } | 
						|
    let(:password) { "password" } | 
						|
    let(:role) { "data_coordinator" } | 
						|
    let(:bad_request_error) do | 
						|
      # rubocop:disable RSpec/VerifiedDoubles | 
						|
      Notifications::Client::BadRequestError.new(double(code: 200, body: "")) | 
						|
      # rubocop:enable RSpec/VerifiedDoubles | 
						|
    end | 
						|
 | 
						|
    before do | 
						|
      allow(described_class).to receive(:new).and_return(devise_notify_mailer) | 
						|
      allow(devise_notify_mailer).to receive(:notify_client).and_return(notify_client) | 
						|
      allow(notify_client).to receive(:send_email).and_return(true) | 
						|
    end | 
						|
 | 
						|
    context "when the rails environment is staging" do | 
						|
      before do | 
						|
        allow(Rails.env).to receive(:test?).and_return(false) | 
						|
        allow(Rails.env).to receive(:staging?).and_return(true) | 
						|
      end | 
						|
 | 
						|
      context "when the email domain is not in the allowlist" do | 
						|
        let(:email) { "test@example.com" } | 
						|
 | 
						|
        it "does not send emails" do | 
						|
          expect(notify_client).not_to receive(:send_email) | 
						|
          User.create!(name:, organisation:, email:, password:, role:) | 
						|
        end | 
						|
      end | 
						|
 | 
						|
      context "when the email domain is in the allowlist" do | 
						|
        let(:domain) { Rails.application.credentials[:email_allowlist].first } | 
						|
        let(:email) { "test@#{domain}" } | 
						|
 | 
						|
        it "does send emails" do | 
						|
          expect(notify_client).to receive(:send_email).once | 
						|
          User.create!(name:, organisation:, email:, password:, role:) | 
						|
        end | 
						|
      end | 
						|
 | 
						|
      context "when notify mailer raises BadRequestError" do | 
						|
        before do | 
						|
          allow(notify_client).to receive(:send_email).and_raise(bad_request_error) | 
						|
        end | 
						|
 | 
						|
        let(:domain) { Rails.application.credentials[:email_allowlist].first } | 
						|
        let(:email) { "test@#{domain}" } | 
						|
 | 
						|
        it "does not raise an error" do | 
						|
          expect { | 
						|
            User.create!(name:, organisation:, email:, password:, role:) | 
						|
          }.not_to raise_error | 
						|
        end | 
						|
      end | 
						|
    end | 
						|
 | 
						|
    context "when the rails environment is not staging" do | 
						|
      context "when the email domain is not in the allowlist" do | 
						|
        let(:email) { "test@example.com" } | 
						|
 | 
						|
        it "does send emails" do | 
						|
          expect(notify_client).to receive(:send_email).once | 
						|
          User.create!(name:, organisation:, email:, password:, role:) | 
						|
        end | 
						|
      end | 
						|
    end | 
						|
 | 
						|
    context "when a user is invited for the first time" do | 
						|
      let(:email) { "test@example.com" } | 
						|
 | 
						|
      it "sends initial confirmation template" do | 
						|
        expect(notify_client).to receive(:send_email).with(hash_including(template_id: User::CONFIRMABLE_TEMPLATE_ID)) | 
						|
        User.create!(name:, organisation:, email:, password:, role:) | 
						|
      end | 
						|
    end | 
						|
 | 
						|
    context "when a user requests further confirmation links" do | 
						|
      let(:email) { "test@example.com" } | 
						|
 | 
						|
      it "sends re-confirmation template" do | 
						|
        user = User.create!(name:, organisation:, email:, password:, role:) | 
						|
        expect(notify_client).to receive(:send_email).with(hash_including(template_id: User::RECONFIRMABLE_TEMPLATE_ID)) | 
						|
        user.send_confirmation_instructions | 
						|
        expect(notify_client).to receive(:send_email).with(hash_including(template_id: User::RECONFIRMABLE_TEMPLATE_ID)) | 
						|
        user.send_confirmation_instructions | 
						|
      end | 
						|
    end | 
						|
  end | 
						|
end
 | 
						|
 |