diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb index b7dc560bdfbae4b631f7ba38ef68efefe105243d..561c52ea0945064f7b5d1a5d25959656ba92f8a7 100644 --- a/app/controllers/registrations_controller.rb +++ b/app/controllers/registrations_controller.rb @@ -3,7 +3,7 @@ # the COPYRIGHT file. class RegistrationsController < Devise::RegistrationsController - before_action :check_registrations_open_or_valid_invite!, :check_valid_invite! + before_action :check_registrations_open_or_valid_invite! layout -> { request.format == :mobile ? "application" : "with_header" } @@ -28,19 +28,11 @@ class RegistrationsController < Devise::RegistrationsController private - def check_valid_invite! - return true if AppConfig.settings.enable_registrations? #this sucks - return true if invite && invite.can_be_used? - flash[:error] = t('registrations.invalid_invite') - redirect_to new_user_session_path - end - def check_registrations_open_or_valid_invite! - return true if invite.present? - unless AppConfig.settings.enable_registrations? - flash[:error] = t('registrations.closed') - redirect_to new_user_session_path - end + return true if AppConfig.settings.enable_registrations? || invite.try(:can_be_used?) + + flash[:error] = params[:invite] ? t("registrations.invalid_invite") : t("registrations.closed") + redirect_to new_user_session_path end def invite diff --git a/app/models/user.rb b/app/models/user.rb index 8d941a8c540ce0644babfe1ad75a781d98b6f1a5..e2243d73b0e7b727db6aa74a79215057cc1399c0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -99,10 +99,9 @@ class User < ActiveRecord::Base def process_invite_acceptence(invite) self.invited_by = invite.user - invite.use! + invite.use! unless AppConfig.settings.enable_registrations? end - def invitation_code InvitationCode.find_or_create_by(user_id: self.id) end diff --git a/app/views/invitations/new.html.haml b/app/views/invitations/new.html.haml index 43a3603977e4a4e03933dc8b139f3a83191599c2..187a6fa12a91c01280ee1c07e603af0eea027ba6 100644 --- a/app/views/invitations/new.html.haml +++ b/app/views/invitations/new.html.haml @@ -1,7 +1,7 @@ #paste_link = t('.paste_link') %span#codes_left - = '(' + t('.codes_left', count: @invite_code.count) + ')' + = "(" + t(".codes_left", count: @invite_code.count) + ")" unless AppConfig.settings.enable_registrations? .form-horizontal .control-group = invite_link(@invite_code) diff --git a/db/migrate/20160810230114_cleanup_invitation_columns_from_users.rb b/db/migrate/20160810230114_cleanup_invitation_columns_from_users.rb index b1bbf103aac527e668de71281d0c3980fe79cceb..0ef8272490556dc0fea41f42e6d08b2c338c55d3 100644 --- a/db/migrate/20160810230114_cleanup_invitation_columns_from_users.rb +++ b/db/migrate/20160810230114_cleanup_invitation_columns_from_users.rb @@ -1,4 +1,7 @@ class CleanupInvitationColumnsFromUsers < ActiveRecord::Migration + class InvitationCode < ActiveRecord::Base + end + class User < ActiveRecord::Base end @@ -20,7 +23,7 @@ class CleanupInvitationColumnsFromUsers < ActiveRecord::Migration add_index :users, :email, name: :index_users_on_email, unique: true, length: 191 - drop_invitations_table + cleanup_invitations end def username_not_null @@ -36,10 +39,14 @@ class CleanupInvitationColumnsFromUsers < ActiveRecord::Migration end end - def drop_invitations_table + def cleanup_invitations reversible do |dir| dir.up do drop_table :invitations + + # reset negative invitation counters + new_counter = AppConfig.settings.enable_registrations? ? AppConfig["settings.invitations.count"] : 0 + InvitationCode.where("count < 0").update_all(count: new_counter) end dir.down do diff --git a/features/step_definitions/user_steps.rb b/features/step_definitions/user_steps.rb index 45e1ded4c97a063ccda36c63f5585af5291dbaa3..af59a406cd2bed94bbf67f288678a3c1f38bcdd0 100644 --- a/features/step_definitions/user_steps.rb +++ b/features/step_definitions/user_steps.rb @@ -47,6 +47,7 @@ Given /^I have been invited by an admin$/ do end Given /^I have been invited by "([^\"]+)"$/ do |email| + AppConfig.settings.enable_registrations = false @inviter = User.find_by_email(email) @inviter_invite_count = @inviter.invitation_code.count i = EmailInviter.new("new_invitee@example.com", @inviter) diff --git a/features/support/env.rb b/features/support/env.rb index 297b63f3e95b76b5b80d8eef1944eec9912aec58..c26248a98fe76bfdae01016fce3e7af761b64455 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -70,6 +70,9 @@ Before do |scenario| page.driver.headers = if scenario.source_tag_names.include? "@mobile" {"User-Agent" => "Mozilla/5.0 (Mobile; rv:18.0) Gecko/18.0 Firefox/18.0"} else - page.driver.headers = {} + {} end + + # Reset overridden settings + AppConfig.reset_dynamic! end diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb index 41e3916c9411a796f14bb87b16c5b7c63cd3b1ae..1a7c4398713b243a9e8ce2a61f4183db9ab1a123 100644 --- a/spec/controllers/registrations_controller_spec.rb +++ b/spec/controllers/registrations_controller_spec.rb @@ -20,32 +20,50 @@ describe RegistrationsController, type: :controller do } } - describe '#check_registrations_open!' do + describe "#check_registrations_open_or_valid_invite!" do before do AppConfig.settings.enable_registrations = false end - it 'redirects #new to the login page' do + it "redirects #new to the login page" do get :new - expect(flash[:error]).to eq(I18n.t('registrations.closed')) + expect(flash[:error]).to eq(I18n.t("registrations.closed")) expect(response).to redirect_to new_user_session_path end - it 'redirects #create to the login page' do + it "redirects #create to the login page" do post :create, valid_params - expect(flash[:error]).to eq(I18n.t('registrations.closed')) + expect(flash[:error]).to eq(I18n.t("registrations.closed")) expect(response).to redirect_to new_user_session_path end - it 'does not redirect if there is a valid invite token' do - i = InvitationCode.create(:user => bob) - get :new, :invite => {:token => i.token} + it "does not redirect if there is a valid invite token" do + code = InvitationCode.create(user: bob) + get :new, invite: {token: code.token} expect(response).not_to be_redirect end - it 'does redirect if there is an invalid invite token' do - get :new, :invite => {:token => 'fssdfsd'} - expect(response).to be_redirect + it "does redirect if there is an invalid invite token" do + get :new, invite: {token: "fssdfsd"} + expect(response).to redirect_to new_user_session_path + end + + it "does redirect if there are no invites available with this code" do + code = InvitationCode.create(user: bob) + code.update_attributes(count: 0) + + get :new, invite: {token: code.token} + expect(response).to redirect_to new_user_session_path + end + + it "does not redirect when the registration is open" do + AppConfig.settings.enable_registrations = true + + code = InvitationCode.create(user: bob) + code.update_attributes(count: 0) + + get :new, invite: {token: code.token} + expect(response).not_to be_redirect end end @@ -53,12 +71,6 @@ describe RegistrationsController, type: :controller do render_views context "with valid parameters" do - before do - AppConfig.settings.enable_registrations = true - user = FactoryGirl.build(:user) - allow(User).to receive(:build).and_return(user) - end - it "creates a user" do expect { get :create, valid_params @@ -75,18 +87,38 @@ describe RegistrationsController, type: :controller do expect(flash[:notice]).not_to be_blank end - it "uses the invite code" do - code = InvitationCode.create(user: bob) - - expect { - get :create, valid_params.merge(invite: {token: code.token}) - }.to change { code.reload.count }.by(-1) - end - it "redirects to the home path" do get :create, valid_params expect(response).to be_redirect - expect(response.location).to match /^#{stream_url}\??$/ + expect(response.location).to match(/^#{getting_started_url}$/) + end + + context "with invite code" do + it "reduces number of available invites when the registration is closed" do + AppConfig.settings.enable_registrations = false + + code = InvitationCode.create(user: bob) + + expect { + get :create, valid_params.merge(invite: {token: code.token}) + }.to change { code.reload.count }.by(-1) + end + + it "doesn't reduce number of available invites when the registration is open" do + code = InvitationCode.create(user: bob) + + expect { + get :create, valid_params.merge(invite: {token: code.token}) + }.not_to change { code.reload.count } + end + + it "links inviter with the user" do + code = InvitationCode.create(user: bob) + + post :create, valid_params.merge(invite: {token: code.token}) + + expect(User.find_by(username: "jdoe").invited_by).to eq(bob) + end end end @@ -112,6 +144,8 @@ describe RegistrationsController, type: :controller do end it "doesn't reduce number of available invites" do + AppConfig.settings.enable_registrations = false + code = InvitationCode.create(user: bob) expect {