From 4ca72da57b77f23dbda0bf07ffff8a28fe4d302c Mon Sep 17 00:00:00 2001 From: ashkan18 Date: Sun, 27 Aug 2017 16:37:33 -0400 Subject: [PATCH] Disable users on vacation #1 , add byebug --- .gitignore | 1 + Gemfile | 1 + Gemfile.lock | 4 ++- slack-sup/models/team.rb | 21 ++++++++++----- spec/models/team_spec.rb | 56 +++++++++++++++++++++++++++++++++++----- 5 files changed, 69 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index aea4ab7..cab2d9b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ .bundle log .env +.byebug_history diff --git a/Gemfile b/Gemfile index 6fd4962..dc8960b 100644 --- a/Gemfile +++ b/Gemfile @@ -17,6 +17,7 @@ gem 'time_ago_in_words' gem 'wannabe_bool' group :development, :test do + gem 'byebug' gem 'foreman' gem 'rake', '~> 10.4' gem 'rubocop', '0.49.1' diff --git a/Gemfile.lock b/Gemfile.lock index 764b694..f6b4362 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -18,6 +18,7 @@ GEM thread_safe (~> 0.3, >= 0.3.1) bson (4.2.2) builder (3.2.3) + byebug (9.0.6) capybara (2.15.1) addressable mini_mime (>= 0.1.3) @@ -272,6 +273,7 @@ PLATFORMS DEPENDENCIES ambit + byebug capybara chronic database_cleaner @@ -305,4 +307,4 @@ RUBY VERSION ruby 2.4.1p111 BUNDLED WITH - 1.15.3 + 1.15.4 diff --git a/slack-sup/models/team.rb b/slack-sup/models/team.rb index 008be51..698b7ad 100644 --- a/slack-sup/models/team.rb +++ b/slack-sup/models/team.rb @@ -142,13 +142,7 @@ def update_cc_text def sync! client = Slack::Web::Client.new(token: token) members = client.paginate(:users_list, presence: false).map(&:members).flatten - humans = members.select do |member| - !member.is_bot && - !member.deleted && - !member.is_restricted && - !member.is_ultra_restricted && - member.id != 'USLACKBOT' - end.map do |member| + humans = members.select { |member| active_member?(member) }.map do |member| existing_user = User.where(user_id: member.id).first existing_user ||= User.new(user_id: member.id, team: self) existing_user.user_name = member.name @@ -181,6 +175,19 @@ def sync! private + def active_member?(member) + !member.is_bot && + !member.deleted && + !member.is_restricted && + !member.is_ultra_restricted && + !on_vacation?(member) && + member.id != 'USLACKBOT' + end + + def on_vacation?(member) + [member.name, member.real_name, member.profile.status_text].join =~ /(ooo|vacationing)/i + end + def validate_team_field_label return unless team_field_label && team_field_label_changed? client = Slack::Web::Client.new(token: access_token) diff --git a/spec/models/team_spec.rb b/spec/models/team_spec.rb index 4fd46d8..472017b 100644 --- a/spec/models/team_spec.rb +++ b/spec/models/team_spec.rb @@ -108,16 +108,57 @@ end context 'team' do let(:team) { Fabricate(:team, sup_wday: Time.now.utc.in_time_zone('Eastern Time (US & Canada)').wday) } - before do - allow(team).to receive(:sync!) - end context '#sync!' do - pending 'adds new users' - pending 'disables dead users' - pending 'reactivates users that are back' + let(:member_default_attr) do + { + id: 'member-id', + is_bot: false, + deleted: false, + is_restricted: false, + is_ultra_restricted: false, + name: 'Forrest Gump', + real_name: 'Real Forrest Gump', + profile: double(email: nil, status: nil, status_text: nil) + } + end + let(:bot_member) { double(member_default_attr.merge(id: 'bot-user', is_bot: true)) } + let(:deleted_member) { double(member_default_attr.merge(id: 'deleted-user', deleted: true)) } + let(:restricted_member) { double(member_default_attr.merge(id: 'restricted-user', is_restricted: true)) } + let(:ultra_restricted_member) { double(member_default_attr.merge(id: 'ult-rest-user', is_ultra_restricted: true)) } + let(:ooo_member) { double(member_default_attr.merge(id: 'ooo-user', name: 'member-name-on-ooo')) } + let(:available_member) { double(member_default_attr) } + let(:members) do + [bot_member, deleted_member, restricted_member, ultra_restricted_member, ooo_member, available_member] + end + before do + allow_any_instance_of(Slack::Web::Client).to receive(:paginate).and_return([double(members: members)]) + end + it 'adds new users' do + expect { team.sync! }.to change(User, :count).by(1) + new_user = User.last + expect(new_user.user_id).to eq 'member-id' + expect(new_user.user_name).to eq 'Forrest Gump' + end + it 'disables dead users' do + available_user = Fabricate(:user, team: team, user_id: available_member.id, enabled: true) + to_be_disabled_users = [deleted_member, restricted_member, ultra_restricted_member, ooo_member].map do |member| + Fabricate(:user, team: team, user_id: member.id, enabled: true) + end + expect { team.sync! }.to change(User, :count).by(0) + expect(to_be_disabled_users.map(&:reload).map(&:enabled)).to eq [false] * 4 + expect(available_user.reload.enabled).to be true + end + it 'reactivates users that are back' do + disabled_user = Fabricate(:user, team: team, enabled: false, user_id: available_member.id) + expect { team.sync! }.to change(User, :count).by(0) + expect(disabled_user.reload.enabled).to be true + end pending 'fetches user custom team information' end context '#sup!' do + before do + allow(team).to receive(:sync!) + end it 'creates a round for a team' do expect do team.sup! @@ -127,6 +168,9 @@ end end context '#sup?' do + before do + allow(team).to receive(:sync!) + end context 'without rounds' do it 'is true' do expect(team.sup?).to be true