diff --git a/app/models/concerns/contact/identical.rb b/app/models/concerns/contact/identical.rb index 1c490b75d..f529e09ac 100644 --- a/app/models/concerns/contact/identical.rb +++ b/app/models/concerns/contact/identical.rb @@ -1,18 +1,34 @@ module Concerns::Contact::Identical extend ActiveSupport::Concern - ATTRIBUTE_FILTER = %w[ + IDENTIFIABLE_ATTRIBUTES = %w[ name + email + phone + fax ident ident_type ident_country_code - phone - email + org_name ] - private_constant :ATTRIBUTE_FILTER + private_constant :IDENTIFIABLE_ATTRIBUTES def identical(registrar) - self.class.where(attributes.slice(*ATTRIBUTE_FILTER)).where(registrar: registrar) + self.class.where(identifiable_hash) + .where(["statuses = ?::character varying[]", "{#{read_attribute(:statuses).join(',')}}"]) + .where(registrar: registrar) .where.not(id: id).take end + + private + + def identifiable_hash + attributes = IDENTIFIABLE_ATTRIBUTES + + if self.class.address_processing? + attributes += self.class.address_attribute_names + end + + slice(*attributes) + end end diff --git a/test/fixtures/contacts.yml b/test/fixtures/contacts.yml index 5f6dc3e81..691570d21 100644 --- a/test/fixtures/contacts.yml +++ b/test/fixtures/contacts.yml @@ -9,16 +9,22 @@ john: code: john-001 auth_info: cacb5b -william: +william: &william name: William email: william@inbox.test phone: '+555.555' + fax: +555.555 ident: 1234 ident_type: priv ident_country_code: US registrar: bestnames code: william-001 auth_info: 6573d0 + street: Main Street + zip: 12345 + city: New York + state: New York + country_code: US statuses: - ok @@ -56,17 +62,10 @@ jack: auth_info: e2c440 identical_to_william: - name: William - email: william@inbox.test - phone: '+555.555' - ident: 1234 - ident_type: priv - ident_country_code: US + <<: *william registrar: goodnames code: william-002 auth_info: 5ab865 - statuses: - - ok invalid: name: any diff --git a/test/models/contact/identical_test.rb b/test/models/contact/identical_test.rb index 10fbc3a66..05802b7c2 100644 --- a/test/models/contact/identical_test.rb +++ b/test/models/contact/identical_test.rb @@ -1,30 +1,57 @@ require 'test_helper' class ContactIdenticalTest < ActiveSupport::TestCase + REGULAR_FILTER_ATTRIBUTES = %i[ + name + email + phone + fax + ident + ident_type + ident_country_code + org_name + ] + def setup @contact = contacts(:william) @identical = contacts(:identical_to_william) end - def test_identical + def test_returns_identical assert_equal @identical, @contact.identical(@identical.registrar) end - def test_not_identical - filter_attributes = %i[ - name - ident - ident_type - ident_country_code - phone - email - ] + def test_does_not_return_non_identical + REGULAR_FILTER_ATTRIBUTES.each do |attribute| + previous_value = @identical.public_send(attribute) + @identical.update_attribute(attribute, 'other') + assert_nil @contact.identical(@identical.registrar) + @identical.update_attribute(attribute, previous_value) + end - filter_attributes.each do |attribute| + @identical.update!({ statuses: %w[ok linked] }) + assert_nil @contact.identical(@identical.registrar) + end + + def test_takes_address_into_account_when_processing_enabled + Setting.address_processing = true + + Contact.address_attribute_names.each do |attribute| previous_value = @identical.public_send(attribute) @identical.update_attribute(attribute, 'other') assert_nil @contact.identical(@identical.registrar) @identical.update_attribute(attribute, previous_value) end end + + def test_ignores_address_when_processing_disabled + Setting.address_processing = false + + Contact.address_attribute_names.each do |attribute| + previous_value = @identical.public_send(attribute) + @identical.update_attribute(attribute, 'other') + assert_equal @identical, @contact.identical(@identical.registrar) + @identical.update_attribute(attribute, previous_value) + end + end end