From 6c40e567aaa166eb618c316d1de2eb81b8eced9a Mon Sep 17 00:00:00 2001
From: Shuhei Kitagawa <shuheiktgw@users.noreply.github.com>
Date: Wed, 2 May 2018 21:13:52 +0900
Subject: [PATCH] Add missing tests for user.rb (#7306)

---
 dump.rdb                 | Bin 0 -> 851 bytes
 spec/models/user_spec.rb | 214 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 214 insertions(+)
 create mode 100644 dump.rdb

diff --git a/dump.rdb b/dump.rdb
new file mode 100644
index 0000000000000000000000000000000000000000..ade9c6abc4f911663879c263bd869f94e8649256
GIT binary patch
literal 851
zcmWG?b@2=~Ffg$A#aWb^l3A=<mRiJWqGzCI`HKr8kd#?ce8AxsYjR0uZt5Yer7xp?
zag-LPrs(FT<{o0m6lD0tlbD~TTTqmmn46T7dVt{{!*4DoUYX*|l+^6ZLfzuzjMS9U
zoYW$#ywr-4c#tW@c6JO53`z_P3``6RVx`5YMe)fwsfl@|1@Umz5|Ty+h8DU8rn&~k
z3I?WDCMH$}1`65+1_lQI8N`Z95=*So5;JpBQ>@_Xj1Dj`a3jeaU|^60a|?>{lT(X}
zQPnas@S#c`U}Rz|EKMy<EoNj-Nli;E%_;fg64|bj%*epNqmSvGg3{uQ)D$c1&KDPF
zU|<k{`0#>4z{@B$F!>)_xa1@jlNByT=;6Y|3G-<&qd{6xYHF%(UcRnxVzN_yeztBv
zQNFH)sa{Tga$=5^xuJ!jv6Y#LiMfe|skw=nrP&`{wsi_1zp{|5m4&siG&8k?H7zlx
zIF%(cFD?JD!v%*A^3_Ti`Nbu9iMgptR!UghBad*9l8#bwNn%k+YD#=!iISC}sgbFX
zvAMK~nYo^cnVFHXiII*{L1u~)#Nj$hC5h<@f$X`7#U=SE`FRR9^2zym$)!a_sd>qj
zN>-*iN|2aTvWixM#3e(Cf-*BG$`aTZavbvbb3uuxs8}ghM=2*UDK*DIM}eCyGbJ^z
zB(p@p^?~SyhE8@^_$aJowlq_!Wl2g+ED;1d&CJluz*Nt|*xbO#oF%EWxbgtQ|Dc;*
Ko_~+#cLD&&!wuvB

literal 0
HcmV?d00001

diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 8171c939a9..760214dede 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -324,4 +324,218 @@ RSpec.describe User, type: :model do
       expect(admin.role?('moderator')).to be true
     end
   end
+
+  describe '#disable!' do
+    subject(:user) { Fabricate(:user, disabled: false, current_sign_in_at: current_sign_in_at, last_sign_in_at: nil) }
+    let(:current_sign_in_at) { Time.zone.now }
+
+    before do
+      user.disable!
+    end
+
+    it 'disables user' do
+      expect(user).to have_attributes(disabled: true, current_sign_in_at: nil, last_sign_in_at: current_sign_in_at)
+    end
+  end
+
+  describe '#disable!' do
+    subject(:user) { Fabricate(:user, disabled: false, current_sign_in_at: current_sign_in_at, last_sign_in_at: nil) }
+    let(:current_sign_in_at) { Time.zone.now }
+
+    before do
+      user.disable!
+    end
+
+    it 'disables user' do
+      expect(user).to have_attributes(disabled: true, current_sign_in_at: nil, last_sign_in_at: current_sign_in_at)
+    end
+  end
+
+  describe '#enable!' do
+    subject(:user) { Fabricate(:user, disabled: true) }
+
+    before do
+      user.enable!
+    end
+
+    it 'enables user' do
+      expect(user).to have_attributes(disabled: false)
+    end
+  end
+
+  describe '#confirm!' do
+    subject(:user) { Fabricate(:user, confirmed_at: confirmed_at) }
+
+    before do
+      ActionMailer::Base.deliveries.clear
+      user.confirm!
+    end
+
+    after { ActionMailer::Base.deliveries.clear }
+
+    context 'when user is new' do
+      let(:confirmed_at) { nil }
+
+      it 'confirms user' do
+        expect(user.confirmed_at).to be_present
+      end
+
+      it 'delivers mails' do
+        expect(ActionMailer::Base.deliveries.count).to eq 2
+      end
+    end
+
+    context 'when user is not new' do
+      let(:confirmed_at) { Time.zone.now }
+
+      it 'confirms user' do
+        expect(user.confirmed_at).to be_present
+      end
+
+      it 'does not deliver mail' do
+        expect(ActionMailer::Base.deliveries.count).to eq 0
+      end
+    end
+  end
+
+  describe '#promote!' do
+    subject(:user) { Fabricate(:user, admin: is_admin, moderator: is_moderator) }
+
+    before do
+      user.promote!
+    end
+
+    context 'when user is an admin' do
+      let(:is_admin) { true }
+
+      context 'when user is a moderator' do
+        let(:is_moderator) { true }
+
+        it 'changes moderator filed false' do
+          expect(user).to be_admin
+          expect(user).not_to be_moderator
+        end
+      end
+
+      context 'when user is not a moderator' do
+        let(:is_moderator) { false }
+
+        it 'does not change status' do
+          expect(user).to be_admin
+          expect(user).not_to be_moderator
+        end
+      end
+    end
+
+    context 'when user is not admin' do
+      let(:is_admin) { false }
+
+      context 'when user is a moderator' do
+        let(:is_moderator) { true }
+
+        it 'changes user into an admin' do
+          expect(user).to be_admin
+          expect(user).not_to be_moderator
+        end
+      end
+
+      context 'when user is not a moderator' do
+        let(:is_moderator) { false }
+
+        it 'changes user into a moderator' do
+          expect(user).not_to be_admin
+          expect(user).to be_moderator
+        end
+      end
+    end
+  end
+
+  describe '#demote!' do
+    subject(:user) { Fabricate(:user, admin: admin, moderator: moderator) }
+
+    before do
+      user.demote!
+    end
+
+    context 'when user is an admin' do
+      let(:admin) { true }
+
+      context 'when user is a moderator' do
+        let(:moderator) { true }
+
+        it 'changes user into a moderator' do
+          expect(user).not_to be_admin
+          expect(user).to be_moderator
+        end
+      end
+
+      context 'when user is not a moderator' do
+        let(:moderator) { false }
+
+        it 'changes user into a moderator' do
+          expect(user).not_to be_admin
+          expect(user).to be_moderator
+        end
+      end
+    end
+
+    context 'when user is not an admin' do
+      let(:admin) { false }
+
+      context 'when user is a moderator' do
+        let(:moderator) { true }
+
+        it 'changes user into a plain user' do
+          expect(user).not_to be_admin
+          expect(user).not_to be_moderator
+        end
+      end
+
+      context 'when user is not a moderator' do
+        let(:moderator) { false }
+
+        it 'does not change any fields' do
+          expect(user).not_to be_admin
+          expect(user).not_to be_moderator
+        end
+      end
+    end
+  end
+
+  describe '#active_for_authentication?' do
+    subject { user.active_for_authentication? }
+    let(:user) { Fabricate(:user, disabled: disabled, confirmed_at: confirmed_at) }
+
+    context 'when user is disabled' do
+      let(:disabled) { true }
+
+      context 'when user is confirmed' do
+        let(:confirmed_at) { Time.zone.now }
+
+        it { is_expected.to be false }
+      end
+
+      context 'when user is not confirmed' do
+        let(:confirmed_at) { nil }
+
+        it { is_expected.to be false }
+      end
+    end
+
+    context 'when user is not disabled' do
+      let(:disabled) { false }
+
+      context 'when user is confirmed' do
+        let(:confirmed_at) { Time.zone.now }
+
+        it { is_expected.to be true }
+      end
+
+      context 'when user is not confirmed' do
+        let(:confirmed_at) { nil }
+
+        it { is_expected.to be false }
+      end
+    end
+  end
 end
-- 
GitLab