describe Manager::AdministrateursController, type: :controller do
  let(:super_admin) { create(:super_admin) }
  let(:administrateur) { create(:administrateur) }

  before do
    sign_in super_admin
  end

  describe '#show' do
    let(:subject) { get :show, params: { id: administrateur.id } }

    context 'with 2FA not enabled' do
      let(:super_admin) { create(:super_admin, otp_required_for_login: false) }
      it { expect(subject).to redirect_to(edit_super_admin_otp_path) }
    end

    context 'with 2FA enabled' do
      render_views
      let(:super_admin) { create(:super_admin, otp_required_for_login: true) }

      before do
        subject
      end

      it { expect(response.body).to include(administrateur.email) }
    end
  end

  describe 'GET #new' do
    render_views
    it 'displays form to create a new admin' do
      get :new
      expect(response).to have_http_status(:success)
    end
  end

  describe 'POST #create' do
    let(:email) { 'plop@plop.com' }
    let(:password) { 'my-s3cure-p4ssword' }

    subject { post :create, params: { administrateur: { email: email } } }

    context 'when email and password are correct' do
      it 'add new administrateur in database' do
        expect { subject }.to change(Administrateur, :count).by(1)
      end

      it 'alert new mail are send' do
        expect(AdministrationMailer).to receive(:invite_admin).and_return(AdministrationMailer)
        expect(AdministrationMailer).to receive(:deliver_later)
        subject
      end
    end

    context 'when email or password are missing' do
      let(:email) { '' }

      it { expect { subject }.to change(Administrateur, :count).by(0) }
    end
  end

  describe '#delete' do
    subject { delete :delete, params: { id: administrateur.id } }

    it 'deletes the admin' do
      subject

      expect(Administrateur.find_by(id: administrateur.id)).to be_nil
    end
  end

  describe '#index' do
    render_views

    it 'searches admin by email' do
      get :index, params: { search: administrateur.email }
      expect(response).to have_http_status(:success)
    end
  end
end
