RSPEC, post :create pod warunkiem admina

Cześć mam jeszcze pytanie co do tego fragmentu kodu (wcześniej loguje mi jako zwykły user).

describe ‘POST create’ do
it ‘redirects user to the login page’ do
post :create, {category: valid_attributes}, valid_session
expect(response).to redirect_to(new_user_session_path)
end
end

Rozumiem go tak, że po wykonaniu create w kategorii o określony valid_attributes i valid_session przekierowuje mnie do new_user_session_path i ok. Chciałbym to zmodyfikować w taki sposób, żeby post :create wykonany był pod warunkiem, że jestem adminem (stworzyć wymaganie do tego)

próbowałem to zrobić z if

describe 'POST create' do
  it 'redirects user to the login page' do
    if controller.current_user.try(:admin?)
    post :create, {category: valid_attributes}, valid_session
    else
    expect(response).to redirect_to(new_user_session_path)
    end
  end
end

ale w tym przypadku najpierw to sprawdza czy jestem adminem, a później jeśli jestem to pozwala stworzyć kategorię a jak nie jestem to przekierowuje, czyli nie tak miało być.

Da się to w ogóle w jakiś sposób zrobić by “przy próbie dodania kategorii musiałby być spełniony warunek ‘zalogowany jako admin’”?

Napisz osobny test. Testy nie powinny być rozgałęziane if-ami. Test ma testować jedną ścieżkę (przypadek). Pisanie skomplikowanych testów powoduje, że stają się one bezużyteczne.

  1. test - przekierowanie do strony logowania, gdy nie jest zalogowany/nie jest adminem
  2. test - utworzenie kategorii, gdy jest adminem

Tylko, że jeśli tak zrobię, to nie będę mieć pewności, że user nie będzie mógł utworzyć kategorii, a do tego dążę.

Mniej więcej coś takiego:

describe CategoriesController do
  let(:valid_attributes) { { name: 'MyString'} }
  let(:valid_session) { {} }
  let(:user) { build(:user) }

  before do
    sign_in user
    controller.stub(:user_signed_in?).and_return(true)
    controller.stub(:current_user).and_return(user)
    controller.stub(:authenticate_user!).and_return(user)
  end

  context 'user is not an admin' do
    before do
      controller.current_user.stub(admin?: false)
    end

    #przekierowanie do strony logowania gdy zalogowany? może zwrócić info, że musi być adminm?
    describe 'POST create' do
      it 'redirects user to the login page' do
        post :create, {category: valid_attributes}, valid_session
        expect(response).to redirect_to(new_user_session_path)
      end
    end
  end

  context 'user is an admin' do
    before do
      controller.current_user.stub(admin?: true)
    end

    describe 'POST create' do
      it 'creates category and redirect to it' do
        post :create, {category: valid_attributes}, valid_session
        expect(response).to redirect_to(Category.last)
      end
    end
  end
end