diff --git a/app/interactors/merge_contact_lists.rb b/app/interactors/merge_contact_lists.rb new file mode 100644 index 0000000..0efa50c --- /dev/null +++ b/app/interactors/merge_contact_lists.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +class MergeContactLists + include Interactor + + after do + context.from.contacts.reload + context.to.contacts.reload + end + + def call + ActiveRecord::Base.transaction do + context.from.contacts.each do |contact| + contact.update! contact_list: context.to + end + end + end +end diff --git a/app/models/contact_list.rb b/app/models/contact_list.rb index 4b98e5e..2ecd6d0 100644 --- a/app/models/contact_list.rb +++ b/app/models/contact_list.rb @@ -8,4 +8,6 @@ class ContactList < ApplicationRecord has_one :account has_one :person + + has_many :contacts, dependent: :restrict_with_exception end diff --git a/factories/contact_lists.rb b/factories/contact_lists.rb index 02bccd7..9802eee 100644 --- a/factories/contact_lists.rb +++ b/factories/contact_lists.rb @@ -2,4 +2,16 @@ FactoryBot.define do factory :empty_contact_list, class: ContactList + + factory :some_contact_list, parent: :empty_contact_list do + transient do + contacts_count { rand 1..5 } + end + + after :create do |contact_list, evaluator| + create_list :some_contact, + evaluator.contacts_count, + contact_list: contact_list + end + end end diff --git a/spec/interactors/merge_contact_lists_spec.rb b/spec/interactors/merge_contact_lists_spec.rb new file mode 100644 index 0000000..ef94d1a --- /dev/null +++ b/spec/interactors/merge_contact_lists_spec.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe MergeContactLists do + subject { described_class.call from: from, to: to } + + let(:from) { create :some_contact_list } + let(:to) { create :some_contact_list } + + specify do + expect { subject }.to \ + change(from.contacts, :count) + .from(from.contacts.count) + .to(0) + end + + specify do + expect { subject }.to \ + change(to.contacts, :count) + .from(to.contacts.count) + .to(from.contacts.count + to.contacts.count) + end + + specify do + expect { subject }.to \ + change(from.contacts, :to_a) + .from(from.contacts.to_a) + .to([]) + end + + specify do + expect { subject }.to \ + change(to.contacts, :to_a) + .from(to.contacts.to_a) + .to(to.contacts.to_a + from.contacts.to_a) + end +end diff --git a/spec/models/contact_list_spec.rb b/spec/models/contact_list_spec.rb index 7345afb..7755d5e 100644 --- a/spec/models/contact_list_spec.rb +++ b/spec/models/contact_list_spec.rb @@ -20,4 +20,12 @@ RSpec.describe ContactList do .dependent(:restrict_with_exception) end end + + describe '#contacts' do + it do + is_expected.to \ + have_many(:contacts) + .dependent(:restrict_with_exception) + end + end end