From c4de5655e1464ce73201512b56b4c9633f49bb6e Mon Sep 17 00:00:00 2001 From: Alex Sherman Date: Wed, 15 Jul 2020 15:11:47 +0500 Subject: [PATCH] Add company controlled contacts to registrant API Fix tests. --- app/models/contact.rb | 28 ++++++------------- app/models/domain.rb | 17 +++++++++++ .../registrant_api_contacts_test.rb | 4 +-- .../v1/registrant/contacts/details_test.rb | 9 ++++-- .../api/v1/registrant/contacts/list_test.rb | 6 ++-- .../api/v1/registrant/contacts/update_test.rb | 3 ++ test/models/contact_test.rb | 9 +++--- test/models/domain_test.rb | 4 +-- 8 files changed, 45 insertions(+), 35 deletions(-) diff --git a/app/models/contact.rb b/app/models/contact.rb index 779f24e0f..e29789be1 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -253,17 +253,8 @@ class Contact < ApplicationRecord def registrant_user_contacts(registrant_user) registrant_user_direct_contacts(registrant_user) + .or(registrant_user_company_contacts(registrant_user)) .or(registrant_user_indirect_contacts(registrant_user)) - # .or(registrant_user_indirect_admin_registrar_contacts(registrant_user)) - end - - def registrant_user_indirect_admin_registrar_contacts(registrant_user) - indirect_contacts = registrant_user_indirect_contacts(registrant_user) - admin_contact_ids = admin_contact_ids(indirect_contacts) - reg_contact_ids = registrar_contact_ids(indirect_contacts) - - total_ids = (admin_contact_ids + reg_contact_ids).uniq - where(id: total_ids) end def registrant_user_direct_contacts(registrant_user) @@ -271,9 +262,7 @@ class Contact < ApplicationRecord .country.alpha2) end - private - - def registrant_user_indirect_contacts(registrant_user) + def registrant_user_company_contacts(registrant_user) ident = registrant_user.companies.collect(&:registration_number) # ident = ['12345678'] @@ -282,14 +271,13 @@ class Contact < ApplicationRecord ident_country_code: registrant_user.country.alpha2) end - def admin_contact_ids(indirect_contacts) - domains = indirect_contacts.map(&:admin_domains).flatten - domains.map(&:contacts).flatten.collect(&:id) - end + def registrant_user_indirect_contacts(registrant_user) + company_domains = Domain.registrant_user_indirect_domains(registrant_user) + company_contact_ids = company_domains.map(&:contacts).flatten.collect(&:id) + company_ids = Contact.registrant_user_company_contacts(registrant_user).collect(&:id) + total_ids = (company_contact_ids + company_ids).uniq - def registrar_contact_ids(indirect_contacts) - registrar_domains = indirect_contacts.map(&:registrant_domains).flatten - registrar_domains.map(&:contacts).flatten.collect(&:id) + where(id: total_ids) end end diff --git a/app/models/domain.rb b/app/models/domain.rb index fff0d4a08..a97a2bc8a 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -200,6 +200,7 @@ class Domain < ApplicationRecord def registrant_user_domains(registrant_user) from( "(#{registrant_user_domains_by_registrant(registrant_user).to_sql} UNION " \ + "#{registrant_user_indirect_domains(registrant_user).to_sql} UNION " \ "#{registrant_user_domains_by_contact(registrant_user).to_sql}) AS domains" ) end @@ -218,6 +219,14 @@ class Domain < ApplicationRecord ) end + def registrant_user_indirect_domains(registrant_user) + companies = Contact.registrant_user_company_contacts(registrant_user) + from( + "(#{registrant_user_company_registrant(companies).to_sql} UNION "\ + "#{registrant_user_domains_company(companies).to_sql}) AS domains" + ) + end + private def registrant_user_domains_by_registrant(registrant_user) @@ -240,6 +249,14 @@ class Domain < ApplicationRecord def registrant_user_direct_domains_by_contact(registrant_user) joins(:domain_contacts).where(domain_contacts: { contact_id: registrant_user.direct_contacts }) end + + def registrant_user_company_registrant(companies) + where(registrant: companies) + end + + def registrant_user_domains_company(companies) + joins(:domain_contacts).where(domain_contacts: { contact: companies }) + end end def name=(value) diff --git a/test/integration/api/registrant/registrant_api_contacts_test.rb b/test/integration/api/registrant/registrant_api_contacts_test.rb index c2950a5f8..af57c1c1a 100644 --- a/test/integration/api/registrant/registrant_api_contacts_test.rb +++ b/test/integration/api/registrant/registrant_api_contacts_test.rb @@ -12,7 +12,7 @@ class RegistrantApiContactsTest < ApplicationIntegrationTest def test_root_accepts_limit_and_offset_parameters contacts(:william).update!(ident: '1234', ident_type: 'priv', ident_country_code: 'US') - assert_equal 3, @user.contacts.size + assert_equal 4, @user.contacts.size get '/api/v1/registrant/contacts', params: { 'limit' => 1, 'offset' => 0 }, headers: @auth_headers @@ -22,7 +22,7 @@ class RegistrantApiContactsTest < ApplicationIntegrationTest get '/api/v1/registrant/contacts', headers: @auth_headers response_json = JSON.parse(response.body, symbolize_names: true) - assert_equal(3, response_json.count) + assert_equal(@user.contacts.size, response_json.count) end def test_get_contact_details_by_uuid diff --git a/test/integration/api/v1/registrant/contacts/details_test.rb b/test/integration/api/v1/registrant/contacts/details_test.rb index 901d5be92..0352ade8d 100644 --- a/test/integration/api/v1/registrant/contacts/details_test.rb +++ b/test/integration/api/v1/registrant/contacts/details_test.rb @@ -75,8 +75,11 @@ class RegistrantApiV1ContactDetailsTest < ActionDispatch::IntegrationTest end def test_unmanaged_contact_cannot_be_accessed - assert_equal 'US-1234', @user.registrant_ident - @contact.update!(ident: '12345') + @user.update!(registrant_ident: 'US-12345') + @contact.update!(ident: '12345879') + companies = Contact.where(ident_type: 'org') + companies.update_all(ident: '78964521') + companies.reload get api_v1_registrant_contact_path(@contact.uuid), as: :json, headers: { 'HTTP_AUTHORIZATION' => auth_token } @@ -93,4 +96,4 @@ class RegistrantApiV1ContactDetailsTest < ActionDispatch::IntegrationTest hash = token_creator.token_in_hash "Bearer #{hash[:access_token]}" end -end \ No newline at end of file +end diff --git a/test/integration/api/v1/registrant/contacts/list_test.rb b/test/integration/api/v1/registrant/contacts/list_test.rb index 864d56c0d..a42aca694 100644 --- a/test/integration/api/v1/registrant/contacts/list_test.rb +++ b/test/integration/api/v1/registrant/contacts/list_test.rb @@ -35,8 +35,8 @@ class RegistrantApiV1ContactListTest < ActionDispatch::IntegrationTest get api_v1_registrant_contacts_path, as: :json, headers: { 'HTTP_AUTHORIZATION' => auth_token } response_json = JSON.parse(response.body, symbolize_names: true) - assert_equal 1, response_json.size - assert_equal 'acme-ltd-001', response_json.first[:code] + assert_equal @user.contacts.count, response_json.size + assert_includes response_json.map{ |hash| hash[:code] }, @contact.code end def test_returns_direct_contacts_when_company_register_is_unavailable @@ -70,4 +70,4 @@ class RegistrantApiV1ContactListTest < ActionDispatch::IntegrationTest hash = token_creator.token_in_hash "Bearer #{hash[:access_token]}" end -end \ No newline at end of file +end diff --git a/test/integration/api/v1/registrant/contacts/update_test.rb b/test/integration/api/v1/registrant/contacts/update_test.rb index 6e0c0eea3..0a2322bf5 100644 --- a/test/integration/api/v1/registrant/contacts/update_test.rb +++ b/test/integration/api/v1/registrant/contacts/update_test.rb @@ -214,6 +214,9 @@ class RegistrantApiV1ContactUpdateTest < ActionDispatch::IntegrationTest def test_unmanaged_contact_cannot_be_updated assert_equal 'US-1234', @user.registrant_ident @contact.update!(ident: '12345') + companies = Contact.where(ident_type: 'org') + companies.update_all(ident: '78964521') + companies.reload patch api_v1_registrant_contact_path(@contact.uuid), params: { name: 'new name' }, as: :json, diff --git a/test/models/contact_test.rb b/test/models/contact_test.rb index 4e500e98d..bf7c242a7 100644 --- a/test/models/contact_test.rb +++ b/test/models/contact_test.rb @@ -150,13 +150,12 @@ class ContactTest < ActiveSupport::TestCase end def test_returns_registrant_user_indirect_contacts - @contact.update!(ident_type: Contact::ORG) - assert_equal '1234', @contact.ident + @contact.update!(ident_type: Contact::ORG, ident: '1234321') assert_equal 'US', @contact.ident_country_code - registrant_user = RegistrantUser.new(registrant_ident: 'US-1234') + registrant_user = RegistrantUser.new(registrant_ident: 'US-1234321') - registrant_user.stub(:companies, [OpenStruct.new(registration_number: '1234')]) do - assert_equal [@contact], Contact.registrant_user_contacts(registrant_user) + registrant_user.stub(:companies, [OpenStruct.new(registration_number: '1234321')]) do + assert_equal registrant_user.contacts, Contact.registrant_user_contacts(registrant_user) end end diff --git a/test/models/domain_test.rb b/test/models/domain_test.rb index 83e12118d..03b7bfc27 100644 --- a/test/models/domain_test.rb +++ b/test/models/domain_test.rb @@ -273,7 +273,7 @@ class DomainTest < ActiveSupport::TestCase def test_returns_registrant_user_domains_by_registrant registrant = contacts(:john).becomes(Registrant) assert_equal registrant, @domain.registrant - registrant_user = RegistrantUser.new + registrant_user = RegistrantUser.new(registrant_ident: 'US-12345') registrant_user.stub(:contacts, [registrant]) do assert_includes Domain.registrant_user_domains(registrant_user), @domain @@ -284,7 +284,7 @@ class DomainTest < ActiveSupport::TestCase contact = contacts(:jane) assert_not_equal contact.becomes(Registrant), @domain.registrant assert_includes @domain.contacts, contact - registrant_user = RegistrantUser.new + registrant_user = RegistrantUser.new(registrant_ident: 'US-12345') registrant_user.stub(:contacts, [contact]) do assert_includes Domain.registrant_user_domains(registrant_user), @domain