diff --git a/app/controllers/conference_registrations_controller.rb b/app/controllers/conference_registrations_controller.rb index 40218b31..04779edf 100644 --- a/app/controllers/conference_registrations_controller.rb +++ b/app/controllers/conference_registrations_controller.rb @@ -5,6 +5,9 @@ class ConferenceRegistrationsController < ApplicationController before_action :set_registration, only: [:edit, :update, :destroy, :show] def new + @registration = Registration.new(conference_id: @conference.id) + authorize! :new, @registration + # Redirect to registration edit when user is already registered if @conference.user_registered?(current_user) redirect_to edit_conference_conference_registrations_path(@conference.short_title) @@ -15,19 +18,11 @@ class ConferenceRegistrationsController < ApplicationController return end - # avoid openid sign_in to redirect to register/new when the sign_in user had already a registration - if current_user && @conference.user_registered?(current_user) - redirect_to edit_conference_conference_registrations_path(@conference.short_title) - end - if @conference.registration_limit_exceeded? redirect_to root_path, alert: "Sorry, registration limit exceeded for #{@conference.title}" return end - @registration = Registration.new(conference_id: @conference.id) - # make sure that conference is open for registration - authorize! :new, @registration # @user variable needs to be set so that _sign_up_form_embedded works properly @user = @registration.build_user end @@ -91,9 +86,9 @@ class ConferenceRegistrationsController < ApplicationController redirect_to root_path, notice: "You are not registered for #{@conference.title} anymore!" else - redirect_to root_path, - error: "Could not update your registration for #{@conference.title}: "\ - "#{@registration.errors.full_messages.join('. ')}." + redirect_to conference_conference_registrations_path(@conference.short_title), + flash: { error: "Could not delete your registration for #{@conference.title}: "\ + "#{@registration.errors.full_messages.join('. ')}." } end end diff --git a/spec/controllers/conference_registration_controller_spec.rb b/spec/controllers/conference_registration_controller_spec.rb new file mode 100644 index 00000000..78870f25 --- /dev/null +++ b/spec/controllers/conference_registration_controller_spec.rb @@ -0,0 +1,284 @@ +require 'spec_helper' + +describe ConferenceRegistrationsController, type: :controller do + let!(:first_user) { create(:user) } + let(:conference) { create(:conference) } + let(:conference_with_open_registration) { create(:conference) } + let!(:open_registration_period) { create(:registration_period, conference: conference_with_open_registration, start_date: Date.current - 6.days) } + let(:user) { create(:user) } + + context 'user is not signed in' do + describe 'GET #new' do + context 'ichain is enabled' do + before do + CONFIG['authentication']['ichain']['enabled'] = true + get :new, conference_id: conference_with_open_registration.short_title + end + + after { CONFIG['authentication']['ichain']['enabled'] = false } + + it 'redirects to root path' do + expect(response).to redirect_to root_path + end + end + end + + describe 'POST #create' do + before do + post :create, user: attributes_for(:user), + registration: attributes_for(:registration), + conference_id: conference_with_open_registration.short_title + end + + it 'assigns user variable' do + expect(assigns(:user)).not_to be_nil + end + + it 'signs in registration user' do + expect(controller.current_user).not_to be_nil + end + + it 'shows success message in flash notice' do + expect(flash[:notice]).to match('You are now registered and will be receiving E-Mail notifications.') + end + + it 'redirects to registration show path' do + expect(response).to redirect_to conference_conference_registrations_path(conference_with_open_registration.short_title) + end + + it 'creates a new registration' do + expect(Registration.count).to eq 1 + end + end + end + + context 'user is signed in' do + before { sign_in(user) } + + describe 'GET #new' do + context 'user is registered to conference' do + before do + create(:registration, user: user, conference: conference_with_open_registration) + get :new, conference_id: conference_with_open_registration.short_title + end + + it 'redirects to edit registration page' do + expect(response).to redirect_to edit_conference_conference_registrations_path(conference_with_open_registration.short_title) + end + end + + context 'registration limit has reached' do + before do + conference_with_open_registration.update_attributes(registration_limit: 1) + create(:registration, conference: conference_with_open_registration) + get :new, conference_id: conference_with_open_registration.short_title + end + + it 'redirects to root path' do + expect(response).to redirect_to root_path + end + + it 'shows error in flash message' do + expect(flash[:alert]).to match "Sorry, registration limit exceeded for #{conference_with_open_registration.title}" + end + end + + context 'successful request' do + before do + get :new, conference_id: conference_with_open_registration.short_title + end + + it 'assigns registration and user variables' do + expect(assigns(:registration)).to be_instance_of(Registration) + expect(assigns(:user)).to be_instance_of(User) + end + + it 'renders the new template' do + expect(response).to render_template('new') + end + end + end + + describe 'GET #show' do + before do + @registration = create(:registration, conference: conference_with_open_registration, user: user) + end + + context 'user has purchased a ticket' do + before do + @ticket = create(:ticket, conference: conference_with_open_registration) + @purchased_ticket = create(:ticket_purchase, conference: conference_with_open_registration, + user: user, + ticket: @ticket) + get :show, conference_id: conference_with_open_registration.short_title + end + + it 'renders the show template' do + expect(response).to render_template('show') + end + + it 'assigns workshops variable' do + expect(assigns(:workshops)).to eq @registration.workshops + end + + it 'assigns price of purchased tickets to total_price and purchased tickets to tickets' do + expect(assigns(:total_price)).to eq Money.new(10000, 'USD') + expect(assigns(:tickets)).to match_array [@purchased_ticket] + end + end + + context 'user has not purchased any ticket' do + before do + get :show, conference_id: conference_with_open_registration.short_title + end + + it 'assigns 0 dollars to total_price and empty array to tickets variables' do + expect(assigns(:total_price)).to eq Money.new(0, 'USD') + expect(assigns(:tickets)).to match_array [] + end + end + end + + describe 'GET #edit' do + before do + create(:registration, conference: conference_with_open_registration, user: user) + get :edit, conference_id: conference_with_open_registration.short_title + end + + it 'renders the edit template' do + expect(response).to render_template('edit') + end + end + + describe 'POST #create' do + context "tickets are available and user hasn't bought any" do + before do + create(:ticket, conference: conference_with_open_registration) + post :create, registration: attributes_for(:registration), + conference_id: conference_with_open_registration.short_title + end + + it 'assigns user variable' do + expect(assigns(:user)).to eq user + end + + it 'redirects to conference tickets path' do + expect(response).to redirect_to conference_tickets_path(conference_with_open_registration.short_title) + end + + it 'creates a new registration' do + expect(Registration.count).to eq 1 + end + end + + context 'registration save fails' do + before do + allow_any_instance_of(Registration).to receive(:save).and_return(false) + post :create, registration: attributes_for(:registration), + conference_id: conference_with_open_registration.short_title + end + + it 'renders the new template' do + expect(response).to render_template('new') + end + + it 'does not create registration' do + expect(Registration.count).to eq 0 + end + end + end + + describe 'PATCH #update' do + before do + @registration = create(:registration, + conference: conference_with_open_registration, + user: user, + arrival: Date.new(2014, 04, 25)) + end + + context 'updates successfully' do + before do + patch :update, registration: attributes_for(:registration, arrival: Date.new(2014, 04, 29)), + conference_id: conference_with_open_registration.short_title + end + + it 'redirects to registration show path' do + expect(response).to redirect_to conference_conference_registrations_path(conference_with_open_registration.short_title) + end + + it 'shows success message in flash notice' do + expect(flash[:notice]).to match('Registration was successfully updated.') + end + + it 'updates the registration' do + @registration.reload + expect(@registration.arrival).to eq Date.new(2014, 04, 29) + end + end + + context 'update fails' do + before do + allow_any_instance_of(Registration).to receive(:update_attributes).and_return(false) + patch :update, registration: attributes_for(:registration, arrival: Date.new(2014, 04, 27)), + conference_id: conference_with_open_registration.short_title + end + + it 'renders edit template' do + expect(response).to render_template('edit') + end + + it 'shows error in flash message' do + expect(flash[:error]).to include 'Could not update your registration' + end + + it 'does not update the registration' do + @registration.reload + expect(@registration.arrival).to eq Date.new(2014, 04, 25) + end + end + end + + describe 'DELETE #destroy' do + before do + @registration = create(:registration, conference: conference_with_open_registration, user: user) + end + + context 'deletes successfully' do + before do + delete :destroy, conference_id: conference_with_open_registration.short_title + end + + it 'redirects to root path' do + expect(response).to redirect_to root_path + end + + it 'shows success message in flash notice' do + expect(flash[:notice]).to match("You are not registered for #{conference_with_open_registration.title} anymore!") + end + + it 'deletes the registration' do + expect(Registration.count).to eq 0 + end + end + + context 'delete fails' do + before do + allow_any_instance_of(Registration).to receive(:destroy).and_return(false) + delete :destroy, conference_id: conference_with_open_registration.short_title + end + + it 'redirects to registration show path' do + expect(response).to redirect_to conference_conference_registrations_path(conference_with_open_registration.short_title) + end + + it 'shows error in flash message' do + expect(flash[:error]).to include 'Could not delete your registration' + end + + it 'does not delete the registration' do + expect(Registration.last).to eq @registration + end + end + end + end +end diff --git a/spec/factories/registration.rb b/spec/factories/registration.rb index fb79cb4d..6debd8ae 100644 --- a/spec/factories/registration.rb +++ b/spec/factories/registration.rb @@ -4,5 +4,6 @@ FactoryGirl.define do factory :registration do user conference + arrival 3.days.ago end end diff --git a/spec/features/conference_registration_spec.rb b/spec/features/conference_registration_spec.rb index 3084e9d0..6fa644fe 100644 --- a/spec/features/conference_registration_spec.rb +++ b/spec/features/conference_registration_spec.rb @@ -1,6 +1,7 @@ require 'spec_helper' feature Registration do + let!(:first_user) { create(:user) } # first user is admin let!(:conference) { create(:conference, registration_period: create(:registration_period, start_date: 3.days.ago)) } let!(:participant) { create(:user) } @@ -28,13 +29,29 @@ feature Registration do expect(conference.user_registered?(participant)).to be(true) end - scenario 'unregisters for a conference', feature: true, js: true do - visit root_path - click_link 'My Registration' - expect(current_path).to eq(conference_conference_registrations_path(conference.short_title)) + context 'unregisters for a conference', feature: true, js: true do + before do + visit root_path + click_link 'My Registration' + end - click_link 'Unregister' - expect(conference.user_registered?(participant)).to be(false) + scenario 'deletion of registration is successful' do + expect(current_path).to eq(conference_conference_registrations_path(conference.short_title)) + + click_link 'Unregister' + expect(conference.user_registered?(participant)).to be(false) + expect(current_path).to eq root_path + expect(flash).to eq "You are not registered for #{conference.title} anymore!" + end + + scenario 'deletion of registration is unsuccessful' do + allow_any_instance_of(Registration).to receive(:destroy).and_return(false) + + click_link 'Unregister' + expect(conference.user_registered?(participant)).to be(true) + expect(current_path).to eq conference_conference_registrations_path(conference.short_title) + expect(flash).to eq "Could not delete your registration for #{conference.title}: #{registration.errors.full_messages.join('. ')}." + end end end @@ -54,7 +71,6 @@ feature Registration do let(:conference_with_closed_registration) { create(:conference, registration_period: create(:registration_period)) } scenario 'registers for a conference', feature: true do - participant.is_admin = false visit new_conference_conference_registrations_path(conference_with_closed_registration.short_title) expect(current_path).to eq(root_path) expect(flash).to eq 'You are not authorized to access this page.'