From 7d881b7253f5bdf3350bc245f6e1ee8f1a0dd803 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Thu, 25 Mar 2021 22:34:32 +0000 Subject: [PATCH] Fixes #3472 - Mentions migration fails because of unexpected User notification_config matrix state. --- db/migrate/20201110000001_mention_init.rb | 28 ++++++---- spec/db/migrate/mention_init_spec.rb | 67 +++++++++++++++++++++++ 2 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 spec/db/migrate/mention_init_spec.rb diff --git a/db/migrate/20201110000001_mention_init.rb b/db/migrate/20201110000001_mention_init.rb index f42bf7f0e..f6b687cc2 100644 --- a/db/migrate/20201110000001_mention_init.rb +++ b/db/migrate/20201110000001_mention_init.rb @@ -18,7 +18,7 @@ class MentionInit < ActiveRecord::Migration[5.2] Mention.reset_column_information create_overview - update_user_matrix + update_users end def create_overview @@ -43,24 +43,32 @@ class MentionInit < ActiveRecord::Migration[5.2] ) end - def update_user_matrix + def update_users User.with_permissions('ticket.agent').each do |user| next if user.preferences.blank? next if user.preferences['notification_config'].blank? next if user.preferences['notification_config']['matrix'].blank? - update_user_matrix_by_user(user) + update_matrix(user.preferences['notification_config']['matrix']) + + user.save! end end - def update_user_matrix_by_user(user) - %w[create update].each do |type| - user.preferences['notification_config']['matrix'][type]['criteria']['subscribed'] = true + def update_matrix(matrix) + matrix_type_defaults.each do |type, default| + matrix[type] ||= {} + matrix[type]['criteria'] ||= {} + matrix[type]['criteria']['subscribed'] = default end + end - %w[reminder_reached escalation].each do |type| - user.preferences['notification_config']['matrix'][type]['criteria']['subscribed'] = false - end - user.save! + def matrix_type_defaults + @matrix_type_defaults ||= { + 'create' => true, + 'update' => true, + 'reminder_reached' => false, + 'escalation' => false, + } end end diff --git a/spec/db/migrate/mention_init_spec.rb b/spec/db/migrate/mention_init_spec.rb new file mode 100644 index 000000000..e69275ce4 --- /dev/null +++ b/spec/db/migrate/mention_init_spec.rb @@ -0,0 +1,67 @@ +require 'rails_helper' + +RSpec.describe MentionInit, type: :db_migration do + + let(:mocked_table_actions) do + lambda { |migration| + # mock DB connection with null object to "null" all connection actions + allow(migration).to receive(:connection).and_return(double('ActiveRecord::ConnectionAdapters::*').as_null_object) # rubocop:disable RSpec/VerifiedDoubles + } + end + + context 'when agent is present' do + + subject(:user) do + agent = create(:agent) + agent.preferences['notification_config'] = notification_config + agent.tap(&:save!) + end + + context 'when matrix misses type key' do + + let(:notification_config) do + { + 'matrix' => { + 'create' => { + 'criteria' => { + 'subscribed' => true + } + }, + 'update' => { + # 'criteria' => { + # 'subscribed' => true + # } + }, + 'reminder_reached' => { + 'criteria' => { + 'subscribed' => false + } + }, + 'escalation' => { + 'criteria' => { + 'subscribed' => false + } + }, + } + } + end + + it 'adds type' do # rubocop:disable RSpec/ExampleLength + expect do + migrate(&mocked_table_actions) + end + .to change { + user.reload.preferences['notification_config']['matrix']['update'] + } + .from({}) + .to( + { + 'criteria' => { + 'subscribed' => true + } + } + ) + end + end + end +end