123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- require 'rails_helper'
- RSpec.describe 'Clearbit', aggregate_failures: true, current_user_id: 1, integration: true, performs_jobs: true, required_envs: %w[CLEARBIT_CI_API_KEY] do
- let(:clearbit_config_organization_shared) { false }
- let(:clearbit_config_user_bio) { 'user.note' }
- let(:clearbit_config_company_bio) { 'organization.note' }
- let(:clearbit_config_user_familyname) { 'user.lastname' }
- before do
- Setting.set('clearbit_integration', true)
- Setting.set('clearbit_config', {
- api_key: ENV['CLEARBIT_CI_API_KEY'],
- organization_autocreate: true,
- organization_shared: clearbit_config_organization_shared,
- user_sync: {
- 'person.name.givenName' => 'user.firstname',
- 'person.name.familyName' => clearbit_config_user_familyname,
- 'person.email' => 'user.email',
- 'person.bio' => clearbit_config_user_bio,
- 'company.url' => 'user.web',
- 'person.site' => 'user.web',
- 'company.location' => 'user.address',
- 'person.location' => 'user.address',
- },
- organization_sync: {
- 'company.legalName' => 'organization.name',
- 'company.name' => 'organization.name',
- 'company.description' => clearbit_config_company_bio,
- },
- })
- end
- describe 'case 1 - person + company (demo data set)' do
- let(:customer) do
- User.create!(
- firstname: '',
- lastname: 'Should be still there',
- email: 'alex@alexmaccaw.com',
- note: '',
- )
- end
- before do
- customer
- perform_enqueued_jobs commit_transaction: true
- customer.reload
- end
- it 'enriches the customer' do
- expect(ExternalSync).to exist(source: 'clearbit', object: 'User', o_id: customer.id)
- expect(customer).to have_attributes(
- firstname: 'Should',
- lastname: 'be still there',
- note: 'O\'Reilly author, software engineer & traveller. Founder of <a href="https://clearbit.com" rel="nofollow noreferrer noopener" target="_blank">https://clearbit.com</a>',
- address: '1455 Market Street, San Francisco, CA 94103, USA',
- )
- end
- it 'creates organization with enriched data' do
- expect(ExternalSync).to exist(source: 'clearbit', object: 'Organization', o_id: customer.organization.id)
- expect(customer.organization).to have_attributes(
- name: 'Uber, Inc.',
- shared: false,
- note: 'Uber is a mobile app connecting passengers with drivers for hire.'
- )
- end
- context 'with organization shared set to true' do
- let(:clearbit_config_organization_shared) { true }
- it 'creates organization with enriched data' do
- expect(customer.organization).to have_attributes(
- name: 'Uber, Inc.',
- shared: true,
- )
- end
- end
- context 'with non existing note field' do
- let(:clearbit_config_user_bio) { 'user.note_not_existing' }
- let(:clearbit_config_company_bio) { 'organization.note_not_existing' }
- it 'syncs the rest of user fields' do
- expect(ExternalSync).to exist(source: 'clearbit', object: 'User', o_id: customer.id)
- expect(customer).to have_attributes(
- firstname: 'Should',
- lastname: 'be still there',
- note: '',
- )
- end
- it 'syncs the rest of organization fields' do
- expect(ExternalSync).to exist(source: 'clearbit', object: 'Organization', o_id: customer.organization.id)
- expect(customer.organization).to have_attributes(
- name: 'Uber, Inc.',
- note: ''
- )
- end
- end
- end
- describe 'case 2 - person + company' do
- let(:customer) do
- User.create!(
- firstname: '',
- lastname: '',
- email: 'me@example.com',
- note: '',
- )
- end
- before do
- customer
- perform_enqueued_jobs commit_transaction: true
- customer.reload
- end
- it 'enriches the customer' do
- expect(ExternalSync).to exist(source: 'clearbit', object: 'User', o_id: customer.id)
- expect(customer).to have_attributes(
- firstname: 'Martin',
- lastname: 'Edenhofer',
- note: "Open Source professional and geek. Also known as OTRS inventor. ;)\r\nEntrepreneur and Advisor for open source people in need.",
- address: 'Norsk-Data-Straße 1, 61352 Bad Homburg vor der Höhe, Germany',
- )
- end
- it 'creates organization with enriched data' do
- expect(ExternalSync).to exist(source: 'clearbit', object: 'Organization', o_id: customer.organization.id)
- expect(customer.organization).to have_attributes(
- name: 'OTRS',
- note: 'OTRS is an Open Source helpdesk software and an IT Service Management software free of licence costs. Improve your Customer Service Management with OTRS.'
- )
- end
- context 'when email changes' do
- before do
- customer.update!(
- email: 'me2@example.com',
- )
- Enrichment::Clearbit::User.new(customer).synced?
- perform_enqueued_jobs commit_transaction: true
- end
- it 'Update with another email data' do
- expect(customer.reload).to have_attributes(
- firstname: 'Martini',
- lastname: 'Edenhofer',
- address: 'Norsk-Data-Straße 1, 61352 Bad Homburg vor der Höhe, Germany',
- )
- end
- end
- context 'when updated locally' do
- before do
- customer.update!(
- firstname: 'Martini',
- note: 'changed by my self',
- )
- Enrichment::Clearbit::User.new(customer).synced?
- perform_enqueued_jobs commit_transaction: true
- end
- it 'stores locally updated value' do
- expect(customer.reload).to have_attributes(
- firstname: 'Martini',
- lastname: 'Edenhofer',
- note: 'changed by my self',
- address: 'Norsk-Data-Straße 1, 61352 Bad Homburg vor der Höhe, Germany',
- )
- end
- context 'when set to empty value' do
- before do
- customer.update!(
- firstname: '',
- note: 'changed by my self again',
- )
- Enrichment::Clearbit::User.new(customer).synced?
- perform_enqueued_jobs commit_transaction: true
- end
- it 'reverts to enriched data' do
- expect(customer.reload).to have_attributes(
- firstname: 'Martin',
- lastname: 'Edenhofer',
- note: 'changed by my self again',
- address: 'Norsk-Data-Straße 1, 61352 Bad Homburg vor der Höhe, Germany',
- )
- end
- end
- end
- end
- describe 'case 3 - no person' do
- let(:customer) do
- User.create!(
- firstname: '',
- lastname: '',
- email: 'testing3@znuny.com',
- note: '',
- )
- end
- before do
- customer
- perform_enqueued_jobs commit_transaction: true
- customer.reload
- end
- it 'does not enrich the customer' do
- expect(ExternalSync).not_to exist(source: 'clearbit', object: 'User', o_id: customer.id)
- expect(customer.reload).to have_attributes(
- firstname: '',
- lastname: '',
- note: '',
- web: 'http://znuny.com',
- address: 'Marienstraße 11, 10117 Berlin, Germany',
- )
- end
- it 'creates organization with enriched data' do
- expect(ExternalSync).to exist(source: 'clearbit', object: 'Organization', o_id: customer.organization.id)
- expect(customer.organization).to have_attributes(
- name: 'Znuny / ES for OTRS',
- note: 'OTRS Support, Consulting, Development, Training and Customizing - Znuny GmbH'
- )
- end
- end
- describe 'case 4 - person with organization but organization is already assigned (own created)' do
- let(:customer) do
- User.create!(
- firstname: '',
- lastname: '',
- email: 'testing4@znuny.com',
- note: '',
- organization_id: 1,
- )
- end
- before do
- customer
- perform_enqueued_jobs commit_transaction: true
- customer.reload
- end
- it 'enriches the customer' do
- expect(customer).to have_attributes(
- firstname: 'Fred',
- lastname: 'Jupiter',
- note: 'some_fred_bio',
- web: 'http://fred.znuny.com',
- address: 'Marienstraße 11, 10117 Berlin, Germany',
- )
- end
- it 'does not create organization with enriched data' do
- expect(customer.organization).to be_present
- expect(Organization).not_to exist(name: 'ZnunyOfFred')
- end
- end
- describe 'case 5 - person with organization but organization is already assigned (own created)' do
- let(:customer) do
- User.create!(
- firstname: '',
- lastname: '',
- email: 'testing5@znuny.com',
- note: '',
- created_by_id: 1,
- updated_by_id: 1,
- organization_id: another_clearbit_organization.id,
- )
- end
- let(:another_clearbit_organization) do
- user = User.create!(email: 'testing3@znuny.com')
- perform_enqueued_jobs commit_transaction: true
- user.reload.organization
- end
- before do
- customer
- perform_enqueued_jobs commit_transaction: true
- customer.reload
- end
- it 'enriches the customer' do
- expect(ExternalSync).to exist(source: 'clearbit', object: 'User', o_id: customer.id)
- expect(customer).to have_attributes(
- firstname: 'Alex',
- lastname: 'Dont',
- note: 'some_bio_alex',
- web: 'http://znuny.com',
- address: 'Marienstraße 11, 10117 Berlin, Germany',
- )
- end
- it 'updates existing organization with enriched data' do
- expect(customer.organization).to have_attributes(
- name: 'Znuny GmbH',
- note: 'OTRS Support, Consulting, Development, Training and Customizing - Znuny GmbH'
- )
- expect(another_clearbit_organization.id).to eq customer.organization.id
- end
- end
- describe 'case 6 - no person / real api call' do
- let(:customer) do
- User.create!(
- firstname: '',
- lastname: '',
- email: 'testing6@clearbit.com',
- note: '',
- )
- end
- before do
- customer
- VCR.configure do |c|
- c.ignore_hosts 'person-stream.clearbit.com'
- end
- perform_enqueued_jobs commit_transaction: true
- VCR.configure do |c|
- c.unignore_hosts 'person-stream.clearbit.com'
- end
- customer.reload
- end
- it 'does not enrich the customer' do
- expect(ExternalSync).not_to exist(source: 'clearbit', object: 'User', o_id: customer.id)
- expect(customer).to have_attributes(
- firstname: '',
- lastname: '',
- note: '',
- web: '',
- address: be_in(
- [
- 'San Francisco, CA, USA',
- 'San Francisco, CA 94103, USA',
- '90 Sheridan St, San Francisco, CA 94103, USA',
- '90 Sheridan, San Francisco, CA 94103, USA',
- '3030 16th St, San Francisco, CA 94103, USA',
- '548 Market St, San Francisco, CA 94104, USA',
- ]
- )
- )
- end
- it 'creates organization with enriched data' do
- expect(ExternalSync).to exist(source: 'clearbit', object: 'Organization', o_id: customer.organization.id)
- expect(customer.organization).to have_attributes(
- name: be_present,
- note: %r{Clearbit},
- )
- end
- end
- context 'when using custom attribute', db_strategy: :reset do
- let(:clearbit_config_user_familyname) { 'user.test_input' }
- let(:customer) do
- User.create!(
- firstname: '',
- lastname: '',
- email: 'testing6@znuny.com',
- note: '',
- )
- end
- before do
- create(:object_manager_attribute_text, object_name: 'User', name: 'test_input', data_option_maxlength: 2)
- ObjectManager::Attribute.migration_execute
- customer
- perform_enqueued_jobs commit_transaction: true
- customer.reload
- end
- it 'Limits enrichment data to database limit' do
- expect(ExternalSync).to exist(source: 'clearbit', object: 'User', o_id: customer.id)
- expect(customer.test_input).to eq 'Sm'
- end
- end
- end
|