From df261cc9306744689a8d33e2d8ebb74756194049 Mon Sep 17 00:00:00 2001 From: Alex Kotov Date: Fri, 30 Nov 2018 14:23:46 +0500 Subject: [PATCH] Move confirmation to callbacks --- .../passport_confirmations_controller.rb | 9 +---- app/models/passport.rb | 8 ++++ .../passport_confirmations/create_spec.rb | 39 +++++++++++++++++++ 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/app/controllers/passport_confirmations_controller.rb b/app/controllers/passport_confirmations_controller.rb index b688e04..97e7148 100644 --- a/app/controllers/passport_confirmations_controller.rb +++ b/app/controllers/passport_confirmations_controller.rb @@ -7,14 +7,9 @@ class PassportConfirmationsController < ApplicationController # POST /passports/:passport_id/passport_confirmations def create - @passport_confirmation = PassportConfirmation.new( - passport: @passport, - user: current_user, - ) + authorize @passport.passport_confirmations.build user: current_user - authorize @passport_confirmation - - return redirect_to @passport unless @passport_confirmation.save + return redirect_to @passport unless @passport.save redirect_to @passport end diff --git a/app/models/passport.rb b/app/models/passport.rb index 819deb6..b033faa 100644 --- a/app/models/passport.rb +++ b/app/models/passport.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class Passport < ApplicationRecord + REQUIRED_CONFIRMATIONS = 3 + enum sex: %i[male female] has_one_attached :image @@ -25,4 +27,10 @@ class Passport < ApplicationRecord before_validation do self.patronymic = nil if patronymic.blank? end + + before_save do + next unless passport_confirmations.length >= REQUIRED_CONFIRMATIONS + + self.confirmed = true + end end diff --git a/spec/requests/passport_confirmations/create_spec.rb b/spec/requests/passport_confirmations/create_spec.rb index 2911bae..9b85326 100644 --- a/spec/requests/passport_confirmations/create_spec.rb +++ b/spec/requests/passport_confirmations/create_spec.rb @@ -73,4 +73,43 @@ RSpec.describe 'POST /passports/:passport_id/passport_confirmations' do end end end + + context 'when passport confirmations count is almost enough' do + let(:current_user) { create :user } + + before do + (Passport::REQUIRED_CONFIRMATIONS - 1).times do + create :passport_confirmation, passport: passport + end + + sign_in current_user + end + + specify do + expect { make_request }.to \ + change(PassportConfirmation, :count) + .from(Passport::REQUIRED_CONFIRMATIONS - 1) + .to(Passport::REQUIRED_CONFIRMATIONS) + end + + specify do + expect { make_request }.to \ + change { passport.reload.confirmed? }.from(false).to(true) + end + + context 'after request' do + before { make_request } + + specify do + expect(response).to redirect_to passport + end + + specify do + expect(PassportConfirmation.last).to have_attributes( + passport: passport, + user: current_user, + ) + end + end + end end