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.
- test - przekierowanie do strony logowania, gdy nie jest zalogowany/nie jest adminem
- 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