diff --git a/app/controllers/admin/comments_controller.rb b/app/controllers/admin/comments_controller.rb index aa8423fc..4fa39d32 100644 --- a/app/controllers/admin/comments_controller.rb +++ b/app/controllers/admin/comments_controller.rb @@ -8,6 +8,8 @@ module Admin @posted_comments = grouped_comments(accessible_ordered_comments.find_comments_by_user(current_user)) end + private + def accessible_ordered_comments Comment.accessible_by(current_ability).joins('INNER JOIN events ON commentable_id = events.id').order('events.title', 'comments.created_at DESC') end diff --git a/spec/controllers/admin/comments_controller_spec.rb b/spec/controllers/admin/comments_controller_spec.rb index f202c423..b8140640 100644 --- a/spec/controllers/admin/comments_controller_spec.rb +++ b/spec/controllers/admin/comments_controller_spec.rb @@ -1,32 +1,81 @@ require 'spec_helper' -describe Admin::CommentsController do +describe Admin::CommentsController, type: :controller do -# some settings to be done before like creating objects used by tests - describe 'GET #index' do - context 'all comments' do - it 'populates a hash with conference, event, and comment objects' - it 'renders the :index template' - end + context 'not logged in user' do + describe 'GET #index' do + it 'renders the :index template' do + conference = create(:conference) + first_user = create(:user) + organizer_role = create(:role, name: 'organizer', resource: conference) + organizer = create(:user, role_ids: organizer_role.id) + event = create(:event, conference: conference) + comment = create(:comment, commentable_type: 'Event', commentable_id: event.id) - context 'unread_comments' do - it 'populates a hash with conference, event, and comment objects created since last login of current_user' - it 'renders the :index template' - end - - context 'posted_comments' do - it 'populates a hash with conference, event, and comments posted by current_user' - it 'renders the :index template' + get :index + expect(response).to redirect_to(user_session_path) + end end end - describe 'accessible_ordered_comments' do - it 'returns comments' - it 'sorts comments by created_at and event title' + context 'logged in as admin, organizer or cfp' do + describe 'GET #index' do + it 'populates a hash with comments' do + conference = create(:conference) + first_user = create(:user) + organizer_role = create(:role, name: 'organizer', resource: conference) + organizer = create(:user, role_ids: organizer_role.id) + event = create(:event, conference: conference) + comment = create(:comment, commentable_type: 'Event', commentable_id: event.id) + sign_in(organizer) + + get :index + expect(assigns(:comments)).to be_a(Hash) + # assigns(:comments).first returns an array of first pair key-value from hash. + # Calling again 'first' returns the key, meaning the Conference object. + expect(assigns(:comments).first.first.title).to eq(comment.commentable.conference.title) + end + it 'has status 200: OK' do + conference = create(:conference) + first_user = create(:user) + organizer_role = create(:role, name: 'organizer', resource: conference) + organizer = create(:user, role_ids: organizer_role.id) + event = create(:event, conference: conference) + comment = create(:comment, commentable_type: 'Event', commentable_id: event.id) + sign_in(organizer) + + get :index + expect(response).to have_http_status(:ok) + end + it 'renders the :index template' do + conference = create(:conference) + first_user = create(:user) + organizer_role = create(:role, name: 'organizer', resource: conference) + organizer = create(:user, role_ids: organizer_role.id) + event = create(:event, conference: conference) + comment = create(:comment, commentable_type: 'Event', commentable_id: event.id) + sign_in(organizer) + + get :index + expect(response).to render_template(:index) + end + end end - describe 'grouped_comments(remarks)' do - it 'groups comments by conference and by event' - it 'returns a hash' + context 'logged in with any other role or normal user' do + describe 'GET#index' do + it 'requires organizer privileges' do + conference = create(:conference) + first_user = create(:user) + participant = create(:user) + event = create(:event, conference: conference) + comment = create(:comment, commentable_type: 'Event', commentable_id: event.id) + sign_in(participant) + + get :index + expect(response).to redirect_to(root_path) + expect(flash[:alert]).to match('You are not authorized to access this area!') + end + end end end diff --git a/spec/factories/users.rb b/spec/factories/users.rb index e5c0b7c1..1f566252 100644 --- a/spec/factories/users.rb +++ b/spec/factories/users.rb @@ -6,6 +6,7 @@ FactoryGirl.define do sequence(:username) { |n| "username#{n}" } password 'changeme' password_confirmation 'changeme' + last_sign_in_at { Time.now - 10.days } confirmed_at { Time.now } biography <<-EOS Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus enim