maestrano-connector-rails 0.4.4 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/README.md +1 -1
- data/VERSION +1 -1
- data/app/controllers/maestrano/connec_controller.rb +17 -19
- data/app/jobs/maestrano/connector/rails/all_synchronizations_job.rb +1 -1
- data/app/jobs/maestrano/connector/rails/push_to_connec_job.rb +11 -11
- data/app/jobs/maestrano/connector/rails/synchronization_job.rb +20 -11
- data/app/models/maestrano/connector/rails/concerns/complex_entity.rb +66 -74
- data/app/models/maestrano/connector/rails/concerns/connec_helper.rb +102 -0
- data/app/models/maestrano/connector/rails/concerns/entity.rb +233 -231
- data/app/models/maestrano/connector/rails/concerns/external.rb +7 -0
- data/app/models/maestrano/connector/rails/concerns/sub_entity_base.rb +14 -43
- data/app/models/maestrano/connector/rails/connec_helper.rb +5 -0
- data/app/models/maestrano/connector/rails/organization.rb +8 -2
- data/db/20160524112054_add_encryption_on_oauth_keys.rb +8 -0
- data/lib/generators/connector/install_generator.rb +1 -0
- data/lib/generators/connector/templates/complex_entity_example/contact.rb +1 -1
- data/lib/generators/connector/templates/complex_entity_example/contact_and_lead.rb +2 -2
- data/lib/generators/connector/templates/entity.rb +13 -19
- data/lib/generators/connector/templates/example_entity.rb +2 -2
- data/lib/generators/connector/templates/example_entity_spec.rb +73 -0
- data/lib/generators/connector/templates/external.rb +11 -0
- data/maestrano-connector-rails.gemspec +13 -8
- data/release_notes.md +81 -0
- data/spec/controllers/connec_controller_spec.rb +19 -6
- data/spec/dummy/app/models/maestrano/connector/rails/entity.rb +0 -7
- data/spec/dummy/app/models/maestrano/connector/rails/external.rb +7 -0
- data/spec/dummy/app/views/home/index.html.erb +1 -36
- data/spec/factories.rb +3 -0
- data/spec/integration/connec_to_external_spec.rb +188 -0
- data/spec/integration/external_to_connec_spec.rb +155 -0
- data/spec/integration/integration_complex_spec.rb +281 -0
- data/spec/integration/singleton_spec.rb +288 -0
- data/spec/jobs/all_synchronizations_job_spec.rb +5 -0
- data/spec/jobs/push_to_connec_job_spec.rb +3 -6
- data/spec/jobs/synchronization_job_spec.rb +29 -17
- data/spec/models/complex_entity_spec.rb +257 -412
- data/spec/models/connec_helper_spec.rb +143 -0
- data/spec/models/entity_spec.rb +420 -348
- data/spec/models/external_spec.rb +4 -0
- data/spec/models/organization_spec.rb +2 -1
- data/spec/models/sub_entity_base_spec.rb +28 -69
- data/template/factories.rb +3 -1
- data/template/maestrano-connector-template.rb +11 -13
- data/template/maestrano.rb +2 -1
- data/template/settings/development.yml +4 -2
- data/template/settings/production.yml +1 -11
- data/template/settings/settings.yml +8 -0
- data/template/settings/test.yml +2 -0
- data/template/settings/uat.yml +1 -9
- metadata +12 -7
- data/Gemfile.lock +0 -256
- data/realse_notes.md +0 -16
- data/spec/dummy/app/views/admin/index.html.erb +0 -51
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
@@ -7,6 +7,11 @@ describe Maestrano::Connector::Rails::AllSynchronizationsJob do
|
|
7
7
|
|
8
8
|
subject { Maestrano::Connector::Rails::AllSynchronizationsJob.perform_now() }
|
9
9
|
|
10
|
+
# before{
|
11
|
+
# organization_not_active.update(encrypted_oauth_token: Maestrano::Connector::Rails::Organization.encrypt_oauth_token('123', key: 'This is a key that is 256 bits!!', iv: 'This iv is 12 bytes or longer'))
|
12
|
+
# organization_to_process.update(encrypted_oauth_token: Maestrano::Connector::Rails::Organization.encrypt_oauth_token('123', key: 'This is a key that is 256 bits!!', iv: 'This iv is 12 bytes or longer'))
|
13
|
+
# }
|
14
|
+
|
10
15
|
describe 'perform' do
|
11
16
|
it 'does not calls sync entity' do
|
12
17
|
expect(Maestrano::Connector::Rails::SynchronizationJob).to_not receive(:perform_later).with(organization_not_linked, anything)
|
@@ -6,9 +6,6 @@ describe Maestrano::Connector::Rails::PushToConnecJob do
|
|
6
6
|
let(:entity_name2) { 'entity2' }
|
7
7
|
before {
|
8
8
|
class Entities::Entity1 < Maestrano::Connector::Rails::Entity
|
9
|
-
def map_to_connec(entity, organization)
|
10
|
-
entity
|
11
|
-
end
|
12
9
|
end
|
13
10
|
allow_any_instance_of(Entities::Entity1).to receive(:push_entities_to_connec)
|
14
11
|
allow(Entities::Entity1).to receive(:external_entity_name).and_return('ext_entity1')
|
@@ -16,7 +13,7 @@ describe Maestrano::Connector::Rails::PushToConnecJob do
|
|
16
13
|
end
|
17
14
|
allow_any_instance_of(Entities::Entity2).to receive(:consolidate_and_map_data).and_return({})
|
18
15
|
allow_any_instance_of(Entities::Entity2).to receive(:push_entities_to_connec)
|
19
|
-
allow(Entities::Entity2).to receive(:connec_entities_names).and_return(
|
16
|
+
allow(Entities::Entity2).to receive(:connec_entities_names).and_return(['Connec name'])
|
20
17
|
allow(Entities::Entity2).to receive(:external_entities_names).and_return(%w(Subs ll))
|
21
18
|
module Entities::SubEntities end;
|
22
19
|
class Entities::SubEntities::Sub < Maestrano::Connector::Rails::SubEntityBase
|
@@ -66,7 +63,7 @@ describe Maestrano::Connector::Rails::PushToConnecJob do
|
|
66
63
|
before { organization.update(synchronized_entities: {:"#{entity_name1}" => false, :"#{entity_name2}" => true})}
|
67
64
|
|
68
65
|
it 'calls consolidate and map data on the complex entity with the right arguments' do
|
69
|
-
expect_any_instance_of(Entities::Entity2).to receive(:consolidate_and_map_data).with({}, {"Subs"=>[entity21], "ll"=>[]}
|
66
|
+
expect_any_instance_of(Entities::Entity2).to receive(:consolidate_and_map_data).with({"Connec name" => []}, {"Subs"=>[entity21], "ll"=>[]})
|
70
67
|
expect_any_instance_of(Entities::Entity2).to receive(:push_entities_to_connec)
|
71
68
|
subject
|
72
69
|
end
|
@@ -87,7 +84,7 @@ describe Maestrano::Connector::Rails::PushToConnecJob do
|
|
87
84
|
before { organization.update(synchronized_entities: {:"#{entity_name1}" => true, :"#{entity_name2}" => false})}
|
88
85
|
|
89
86
|
it 'calls consolidate_and_map_data on the non complex entity with the right arguments' do
|
90
|
-
expect_any_instance_of(Entities::Entity1).to receive(:consolidate_and_map_data).with([], [entity11, entity12]
|
87
|
+
expect_any_instance_of(Entities::Entity1).to receive(:consolidate_and_map_data).with([], [entity11, entity12]).and_return({})
|
91
88
|
expect_any_instance_of(Entities::Entity1).to receive(:push_entities_to_connec)
|
92
89
|
subject
|
93
90
|
end
|
@@ -69,29 +69,41 @@ describe Maestrano::Connector::Rails::SynchronizationJob do
|
|
69
69
|
|
70
70
|
it { performes }
|
71
71
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
72
|
+
context 'first sync' do
|
73
|
+
it 'does two half syncs' do
|
74
|
+
expect_any_instance_of(Maestrano::Connector::Rails::SynchronizationJob).to receive(:sync_entity).exactly(2 * organization.synchronized_entities.count).times
|
75
|
+
subject
|
76
|
+
end
|
77
77
|
end
|
78
78
|
|
79
|
-
context '
|
80
|
-
|
81
|
-
let(:opts) { {only_entities: %w(people price)} }
|
79
|
+
context 'subsequent sync' do
|
80
|
+
let!(:old_sync) { create(:synchronization, partial: false, status: 'SUCCESS', organization: organization) }
|
82
81
|
|
83
|
-
|
84
|
-
|
82
|
+
it 'calls sync entity on all the organization synchronized entities set to true' do
|
83
|
+
organization.synchronized_entities[organization.synchronized_entities.keys.first] = false
|
84
|
+
expect_any_instance_of(Maestrano::Connector::Rails::SynchronizationJob).to receive(:sync_entity).exactly(organization.synchronized_entities.count - 1).times
|
85
85
|
|
86
|
-
|
87
|
-
|
86
|
+
subject
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'with options' do
|
90
|
+
context 'with only_entities' do
|
91
|
+
let(:opts) { {only_entities: %w(people price)} }
|
88
92
|
|
89
|
-
|
90
|
-
|
91
|
-
|
93
|
+
it 'calls sync entity on the specified entities' do
|
94
|
+
expect_any_instance_of(Maestrano::Connector::Rails::SynchronizationJob).to receive(:sync_entity).twice
|
95
|
+
|
96
|
+
subject
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'set the current syncrhonization as partial' do
|
100
|
+
subject
|
101
|
+
expect(Maestrano::Connector::Rails::Synchronization.last.partial).to be(true)
|
102
|
+
end
|
92
103
|
end
|
93
104
|
end
|
94
105
|
end
|
106
|
+
|
95
107
|
end
|
96
108
|
end
|
97
109
|
|
@@ -107,7 +119,7 @@ describe Maestrano::Connector::Rails::SynchronizationJob do
|
|
107
119
|
it 'calls the seven methods' do
|
108
120
|
expect_any_instance_of(Entities::Person).to receive(:before_sync)
|
109
121
|
expect_any_instance_of(Entities::Person).to receive(:get_connec_entities)
|
110
|
-
expect_any_instance_of(Entities::Person).to receive(:
|
122
|
+
expect_any_instance_of(Entities::Person).to receive(:get_external_entities_wrapper)
|
111
123
|
expect_any_instance_of(Entities::Person).to receive(:consolidate_and_map_data).and_return({})
|
112
124
|
expect_any_instance_of(Entities::Person).to receive(:push_entities_to_external)
|
113
125
|
expect_any_instance_of(Entities::Person).to receive(:push_entities_to_connec)
|
@@ -125,7 +137,7 @@ describe Maestrano::Connector::Rails::SynchronizationJob do
|
|
125
137
|
it 'calls the seven methods' do
|
126
138
|
expect_any_instance_of(Entities::SomeStuff).to receive(:before_sync)
|
127
139
|
expect_any_instance_of(Entities::SomeStuff).to receive(:get_connec_entities)
|
128
|
-
expect_any_instance_of(Entities::SomeStuff).to receive(:
|
140
|
+
expect_any_instance_of(Entities::SomeStuff).to receive(:get_external_entities_wrapper)
|
129
141
|
expect_any_instance_of(Entities::SomeStuff).to receive(:consolidate_and_map_data).and_return({})
|
130
142
|
expect_any_instance_of(Entities::SomeStuff).to receive(:push_entities_to_external)
|
131
143
|
expect_any_instance_of(Entities::SomeStuff).to receive(:push_entities_to_connec)
|
@@ -2,496 +2,341 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Maestrano::Connector::Rails::ComplexEntity do
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
it { expect{ subject.class.connec_entities_names }.to raise_error('Not implemented') }
|
11
|
-
end
|
12
|
-
describe 'external_entities_names' do
|
13
|
-
it { expect{ subject.class.external_entities_names }.to raise_error('Not implemented') }
|
14
|
-
end
|
15
|
-
describe 'connec_model_to_external_model' do
|
16
|
-
it { expect{ subject.connec_model_to_external_model({}, nil) }.to raise_error('Not implemented') }
|
17
|
-
end
|
18
|
-
describe 'external_model_to_connec_model' do
|
19
|
-
it { expect{ subject.external_model_to_connec_model({}, nil) }.to raise_error('Not implemented') }
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe 'general methods' do
|
24
|
-
let(:organization) { create(:organization) }
|
25
|
-
|
26
|
-
describe 'map_to_external_with_idmap' do
|
27
|
-
let(:id) { '322j-bbfg4' }
|
28
|
-
let(:entity) { {'id' => id, 'name' => 'John', 'updated_at' => 2.day.ago} }
|
29
|
-
let(:mapped_entity) { {'first_name' => 'John'} }
|
30
|
-
let(:connec_name) { 'Connec_name' }
|
31
|
-
let(:external_name) { 'External_name' }
|
32
|
-
let(:sub_instance) { Maestrano::Connector::Rails::SubEntityBase.new }
|
33
|
-
let(:human_name) { 'ET' }
|
34
|
-
before {
|
35
|
-
allow(sub_instance.class).to receive(:external?).and_return(false)
|
36
|
-
allow(sub_instance.class).to receive(:entity_name).and_return(connec_name)
|
37
|
-
allow(sub_instance).to receive(:map_to).and_return(mapped_entity)
|
38
|
-
allow(sub_instance.class).to receive(:object_name_from_connec_entity_hash).and_return(human_name)
|
39
|
-
}
|
40
|
-
|
41
|
-
context 'when entity has no idmap' do
|
42
|
-
it 'creates one' do
|
43
|
-
expect {
|
44
|
-
subject.map_to_external_with_idmap(entity, organization, external_name, sub_instance)
|
45
|
-
}.to change{ Maestrano::Connector::Rails::IdMap.count }.by(1)
|
46
|
-
end
|
5
|
+
describe 'class methods' do
|
6
|
+
subject { Maestrano::Connector::Rails::ComplexEntity }
|
7
|
+
|
8
|
+
describe 'connec_entities_names' do
|
9
|
+
it { expect{ subject.connec_entities_names }.to raise_error('Not implemented') }
|
47
10
|
end
|
48
|
-
|
49
|
-
expect
|
11
|
+
describe 'external_entities_names' do
|
12
|
+
it { expect{ subject.external_entities_names }.to raise_error('Not implemented') }
|
50
13
|
end
|
14
|
+
end
|
51
15
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
it 'returns the mapped entity with its idmap' do
|
64
|
-
expect(subject.map_to_external_with_idmap(entity, organization, external_name, sub_instance)).to eql({entity: mapped_entity, idmap: idmap})
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
context 'when entity has an idmap with a more recent last_push_to_external' do
|
69
|
-
let!(:idmap) { create(:idmap, organization: organization, connec_id: id, connec_entity: connec_name.downcase, last_push_to_external: 1.second.ago, external_entity: external_name.downcase) }
|
70
|
-
|
71
|
-
it 'discards the entity' do
|
72
|
-
expect(subject.map_to_external_with_idmap(entity, organization, external_name, sub_instance)).to be_nil
|
73
|
-
end
|
16
|
+
describe 'instance methods' do
|
17
|
+
let!(:organization) { create(:organization, uid: 'cld-123') }
|
18
|
+
let!(:connec_client) { Maestrano::Connec::Client[organization.tenant].new(organization.uid) }
|
19
|
+
let!(:external_client) { Object.new }
|
20
|
+
let(:opts) { {} }
|
21
|
+
subject { Maestrano::Connector::Rails::ComplexEntity.new(organization, connec_client, external_client, opts) }
|
22
|
+
|
23
|
+
#Complex specific methods
|
24
|
+
describe 'complex specific methods' do
|
25
|
+
describe 'connec_model_to_external_model' do
|
26
|
+
it { expect{ subject.connec_model_to_external_model({}) }.to raise_error('Not implemented') }
|
74
27
|
end
|
75
|
-
|
76
|
-
|
77
|
-
let!(:idmap) { create(:idmap, organization: organization, connec_id: id, connec_entity: connec_name.downcase, to_external: false, external_entity: external_name.downcase) }
|
78
|
-
|
79
|
-
it 'discards the entity' do
|
80
|
-
expect(subject.map_to_external_with_idmap(entity, organization, external_name, sub_instance)).to be_nil
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
context 'when entity has an idmap with external_inactive set to true' do
|
85
|
-
let!(:idmap) { create(:idmap, organization: organization, connec_id: id, connec_entity: connec_name.downcase, external_inactive: true, external_entity: external_name.downcase) }
|
86
|
-
|
87
|
-
it 'discards the entity' do
|
88
|
-
expect(subject.map_to_external_with_idmap(entity, organization, external_name, sub_instance)).to be_nil
|
89
|
-
end
|
28
|
+
describe 'external_model_to_connec_model' do
|
29
|
+
it { expect{ subject.external_model_to_connec_model({}) }.to raise_error('Not implemented') }
|
90
30
|
end
|
91
31
|
end
|
92
32
|
|
93
33
|
describe 'filter_connec_entities' do
|
94
|
-
it { expect(subject.filter_connec_entities({'lead' => [{a: 2}]}
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
describe 'methods with sub complex entities' do
|
99
|
-
before {
|
100
|
-
module Entities::SubEntities
|
101
|
-
end
|
102
|
-
class Entities::SubEntities::ScE1 < Maestrano::Connector::Rails::SubEntityBase
|
103
|
-
end
|
104
|
-
class Entities::SubEntities::ScE2 < Maestrano::Connector::Rails::SubEntityBase
|
105
|
-
end
|
106
|
-
}
|
107
|
-
|
108
|
-
describe 'get_connec_entities' do
|
109
|
-
before {
|
110
|
-
allow(subject.class).to receive(:connec_entities_names).and_return(%w(sc_e1 ScE2))
|
111
|
-
}
|
112
|
-
|
113
|
-
it 'calls get_connec_entities on each connec sub complex entities' do
|
114
|
-
expect_any_instance_of(Entities::SubEntities::ScE1).to receive(:get_connec_entities).with(nil, nil, nil, {opts: true})
|
115
|
-
expect_any_instance_of(Entities::SubEntities::ScE2).to receive(:get_connec_entities).with(nil, nil, nil, {opts: true})
|
116
|
-
subject.get_connec_entities(nil, nil, nil, {opts: true})
|
117
|
-
end
|
118
|
-
|
119
|
-
let(:arr1) { [{'name' => 'Water'}, {'name' => 'Sugar'}] }
|
120
|
-
let(:arr2) { [{'price' => 92}, {'price' => 300}] }
|
121
|
-
it 'returns an hash of the connec_entities keyed by connec_entity_name' do
|
122
|
-
allow_any_instance_of(Entities::SubEntities::ScE1).to receive(:get_connec_entities).and_return(arr1)
|
123
|
-
allow_any_instance_of(Entities::SubEntities::ScE2).to receive(:get_connec_entities).and_return(arr2)
|
124
|
-
expect(subject.get_connec_entities(nil, nil, nil, {opts: true})).to eql({'sc_e1' => arr1, 'ScE2' => arr2})
|
125
|
-
end
|
34
|
+
it { expect(subject.filter_connec_entities({'lead' => [{a: 2}]})).to eql({'lead' => [{a: 2}]}) }
|
126
35
|
end
|
127
36
|
|
128
|
-
describe '
|
37
|
+
describe 'methods with sub complex entities' do
|
129
38
|
before {
|
130
|
-
|
39
|
+
module Entities::SubEntities
|
40
|
+
end
|
41
|
+
class Entities::SubEntities::ScE1 < Maestrano::Connector::Rails::SubEntityBase
|
42
|
+
end
|
43
|
+
class Entities::SubEntities::ScE2 < Maestrano::Connector::Rails::SubEntityBase
|
44
|
+
end
|
131
45
|
}
|
132
46
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
end
|
138
|
-
|
139
|
-
let(:arr1) { [{'name' => 'Water'}, {'name' => 'Sugar'}] }
|
140
|
-
let(:arr2) { [{'price' => 92}, {'price' => 300}] }
|
141
|
-
it 'returns an hash of the external_entities keyed by external_entity_name' do
|
142
|
-
allow_any_instance_of(Entities::SubEntities::ScE1).to receive(:get_external_entities).and_return(arr1)
|
143
|
-
allow_any_instance_of(Entities::SubEntities::ScE2).to receive(:get_external_entities).and_return(arr2)
|
144
|
-
expect(subject.get_external_entities(nil, nil, nil, {opts: true})).to eql({'sc_e1' => arr1, 'ScE2' => arr2})
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
|
149
|
-
describe 'consolidate_and_map_data' do
|
150
|
-
let(:opt) { {opt: true} }
|
151
|
-
let(:organization) { create(:organization) }
|
47
|
+
describe 'get_connec_entities' do
|
48
|
+
before {
|
49
|
+
allow(subject.class).to receive(:connec_entities_names).and_return(%w(sc_e1 ScE2))
|
50
|
+
}
|
152
51
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
52
|
+
it 'calls get_connec_entities on each connec sub complex entities' do
|
53
|
+
expect_any_instance_of(Entities::SubEntities::ScE1).to receive(:get_connec_entities).with(nil)
|
54
|
+
expect_any_instance_of(Entities::SubEntities::ScE2).to receive(:get_connec_entities).with(nil)
|
55
|
+
subject.get_connec_entities(nil)
|
56
|
+
end
|
158
57
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
58
|
+
let(:arr1) { [{'name' => 'Water'}, {'name' => 'Sugar'}] }
|
59
|
+
let(:arr2) { [{'price' => 92}, {'price' => 300}] }
|
60
|
+
it 'returns an hash of the connec_entities keyed by connec_entity_name' do
|
61
|
+
allow_any_instance_of(Entities::SubEntities::ScE1).to receive(:get_connec_entities).and_return(arr1)
|
62
|
+
allow_any_instance_of(Entities::SubEntities::ScE2).to receive(:get_connec_entities).and_return(arr2)
|
63
|
+
expect(subject.get_connec_entities(nil)).to eql({'sc_e1' => arr1, 'ScE2' => arr2})
|
64
|
+
end
|
163
65
|
end
|
164
66
|
|
165
|
-
describe '
|
166
|
-
|
167
|
-
|
168
|
-
{
|
169
|
-
'sc_e1' => {'ext1' => [{'name' => 'John'}, {'name' => 'Jane'}]},
|
170
|
-
'ScE2' => {'ext1' => [{'name' => 'Robert'}], 'ext2' => [{'price' => 45}]}
|
171
|
-
}
|
172
|
-
}
|
173
|
-
before{
|
174
|
-
allow(subject).to receive(:external_model_to_connec_model).and_return({})
|
175
|
-
allow(subject).to receive(:connec_model_to_external_model).and_return(connec_hash)
|
67
|
+
describe 'get_external_entities' do
|
68
|
+
before {
|
69
|
+
allow(subject.class).to receive(:external_entities_names).and_return(%w(sc_e1 ScE2))
|
176
70
|
}
|
177
71
|
|
178
|
-
it 'calls
|
179
|
-
|
180
|
-
|
72
|
+
it 'calls get_external_entities on each connec sub complex entities' do
|
73
|
+
expect_any_instance_of(Entities::SubEntities::ScE1).to receive(:get_external_entities_wrapper).with(nil)
|
74
|
+
expect_any_instance_of(Entities::SubEntities::ScE2).to receive(:get_external_entities_wrapper).with(nil)
|
75
|
+
subject.get_external_entities_wrapper(nil)
|
181
76
|
end
|
182
|
-
end
|
183
77
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
let(:external_hash) {
|
193
|
-
{
|
194
|
-
'sc_e1' => {'Connec1' => [entity1]},
|
195
|
-
'ScE2' => {'Connec1' => [entity1], 'connec2' => [entity2]}
|
196
|
-
}
|
197
|
-
}
|
198
|
-
let(:connec_hash) { {} }
|
199
|
-
let(:human_name) { 'Jabba' }
|
200
|
-
before{
|
201
|
-
allow(subject).to receive(:external_model_to_connec_model).and_return(external_hash)
|
202
|
-
allow(subject).to receive(:connec_model_to_external_model).and_return(connec_hash)
|
203
|
-
allow(Entities::SubEntities::ScE1).to receive(:external?).and_return(true)
|
204
|
-
allow(Entities::SubEntities::ScE1).to receive(:entity_name).and_return('sc_e1')
|
205
|
-
allow(Entities::SubEntities::ScE1).to receive(:id_from_external_entity_hash).with(entity1).and_return(id1)
|
206
|
-
allow(Entities::SubEntities::ScE1).to receive(:last_update_date_from_external_entity_hash).and_return(1.minute.ago)
|
207
|
-
allow_any_instance_of(Entities::SubEntities::ScE1).to receive(:map_to).with('Connec1', entity1, organization).and_return(mapped_entity1)
|
208
|
-
allow(Entities::SubEntities::ScE2).to receive(:external?).and_return(true)
|
209
|
-
allow(Entities::SubEntities::ScE2).to receive(:entity_name).and_return('Sce2')
|
210
|
-
allow(Entities::SubEntities::ScE2).to receive(:id_from_external_entity_hash).with(entity1).and_return(id1)
|
211
|
-
allow(Entities::SubEntities::ScE2).to receive(:id_from_external_entity_hash).with(entity2).and_return(id2)
|
212
|
-
allow(Entities::SubEntities::ScE2).to receive(:last_update_date_from_external_entity_hash).and_return(1.minute.ago)
|
213
|
-
allow_any_instance_of(Entities::SubEntities::ScE2).to receive(:map_to).with('Connec1', entity1, organization).and_return(mapped_entity1)
|
214
|
-
allow_any_instance_of(Entities::SubEntities::ScE2).to receive(:map_to).with('connec2', entity2, organization).and_return(mapped_entity2)
|
215
|
-
allow(Entities::SubEntities::ScE1).to receive(:object_name_from_external_entity_hash).and_return(human_name)
|
216
|
-
allow(Entities::SubEntities::ScE2).to receive(:object_name_from_external_entity_hash).and_return(human_name)
|
217
|
-
}
|
78
|
+
let(:arr1) { [{'name' => 'Water'}, {'name' => 'Sugar'}] }
|
79
|
+
let(:arr2) { [{'price' => 92}, {'price' => 300}] }
|
80
|
+
it 'returns an hash of the external_entities keyed by external_entity_name' do
|
81
|
+
allow_any_instance_of(Entities::SubEntities::ScE1).to receive(:get_external_entities_wrapper).and_return(arr1)
|
82
|
+
allow_any_instance_of(Entities::SubEntities::ScE2).to receive(:get_external_entities_wrapper).and_return(arr2)
|
83
|
+
expect(subject.get_external_entities_wrapper(nil)).to eql({'sc_e1' => arr1, 'ScE2' => arr2})
|
84
|
+
end
|
85
|
+
end
|
218
86
|
|
219
|
-
context 'when entities have no idmaps' do
|
220
87
|
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
88
|
+
describe 'consolidate and map methods' do
|
89
|
+
let(:human_name) { 'Jabba' }
|
90
|
+
let(:mapped_entity) { {mapped: 'entity'} }
|
91
|
+
let(:date) { 2.hour.ago }
|
92
|
+
|
93
|
+
describe 'consolidate_and_map_data' do
|
94
|
+
before{
|
95
|
+
allow(subject).to receive(:external_model_to_connec_model).and_return({})
|
96
|
+
allow(subject).to receive(:connec_model_to_external_model).and_return({})
|
97
|
+
}
|
98
|
+
|
99
|
+
it 'calls external_model_to_connec_model' do
|
100
|
+
expect(subject).to receive(:external_model_to_connec_model).with({a: {}}).and_return({})
|
101
|
+
subject.consolidate_and_map_data({}, {a: {}})
|
225
102
|
end
|
226
103
|
|
227
|
-
it '
|
228
|
-
|
229
|
-
|
230
|
-
'sc_e1' => {'Connec1' => [{entity: mapped_entity1, idmap: Maestrano::Connector::Rails::IdMap.first}]},
|
231
|
-
'ScE2' => {
|
232
|
-
'Connec1' => [{entity: mapped_entity1, idmap: Maestrano::Connector::Rails::IdMap.second}],
|
233
|
-
'connec2' => [{entity: mapped_entity2, idmap: Maestrano::Connector::Rails::IdMap.last}],
|
234
|
-
}
|
235
|
-
},
|
236
|
-
connec_entities: {})
|
104
|
+
it 'calls connec_model_to_external_model' do
|
105
|
+
expect(subject).to receive(:connec_model_to_external_model).with({a: {}}).and_return({})
|
106
|
+
subject.consolidate_and_map_data({a: {}}, {})
|
237
107
|
end
|
238
|
-
end
|
239
108
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
it 'discards the entities' do
|
246
|
-
mapped_entities = subject.consolidate_and_map_data({}, external_hash, organization, opt)
|
247
|
-
expect(mapped_entities).to eql(external_entities: {
|
248
|
-
'sc_e1' => {'Connec1' => []},
|
249
|
-
'ScE2' => {
|
250
|
-
'Connec1' => [],
|
251
|
-
'connec2' => [],
|
252
|
-
}
|
253
|
-
},
|
254
|
-
connec_entities: {})
|
109
|
+
it 'calls the consolidation on both connec and external and returns an hash with the results' do
|
110
|
+
expect(subject).to receive(:consolidate_and_map_connec_entities).with({}, {}).and_return({connec_result: 1})
|
111
|
+
expect(subject).to receive(:consolidate_and_map_external_entities).with({}).and_return({ext_result: 1})
|
112
|
+
expect(subject.consolidate_and_map_data({}, {})).to eql({connec_entities: {connec_result: 1}, external_entities: {ext_result: 1}})
|
255
113
|
end
|
256
114
|
end
|
257
115
|
|
258
|
-
describe '
|
116
|
+
describe 'consolidate_and_map_external_entities' do
|
117
|
+
let(:entity) { {'id' => id, 'name' => 'Jane'} }
|
118
|
+
let(:id) { 'id' }
|
119
|
+
let(:external_name) { 'sc_e1' }
|
120
|
+
let(:connec_name) { 'connec1' }
|
121
|
+
let(:modeled_external_entities) { {external_name => {connec_name => [entity]}} }
|
122
|
+
before {
|
123
|
+
allow(Entities::SubEntities::ScE1).to receive(:external?).and_return(true)
|
124
|
+
allow(Entities::SubEntities::ScE1).to receive(:entity_name).and_return(external_name)
|
125
|
+
allow(Entities::SubEntities::ScE1).to receive(:id_from_external_entity_hash).and_return(id)
|
126
|
+
allow(Entities::SubEntities::ScE1).to receive(:object_name_from_external_entity_hash).and_return(human_name)
|
127
|
+
allow(Entities::SubEntities::ScE1).to receive(:last_update_date_from_external_entity_hash).and_return(date)
|
128
|
+
allow_any_instance_of(Entities::SubEntities::ScE1).to receive(:map_to).and_return(mapped_entity)
|
129
|
+
}
|
259
130
|
|
260
|
-
context '
|
261
|
-
let!(:
|
262
|
-
let!(:idmap21) { create(:idmap, organization: organization, external_id: id1, external_entity: 'sce2', connec_entity: 'connec1', external_inactive: true) }
|
263
|
-
let!(:idmap22) { create(:idmap, organization: organization, external_id: id2, external_entity: 'sce2', connec_entity: 'connec2', external_inactive: true) }
|
131
|
+
context 'when idmap exists' do
|
132
|
+
let!(:idmap) { create(:idmap, organization: organization, connec_entity: connec_name.downcase, external_entity: external_name.downcase, external_id: id) }
|
264
133
|
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
134
|
+
it 'does not create one' do
|
135
|
+
expect{
|
136
|
+
subject.consolidate_and_map_external_entities(modeled_external_entities)
|
137
|
+
}.to_not change{ Maestrano::Connector::Rails::IdMap.count }
|
138
|
+
end
|
270
139
|
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
140
|
+
it 'returns the mapped entity with the idmap' do
|
141
|
+
expect(subject.consolidate_and_map_external_entities(modeled_external_entities)).to eql({external_name => {connec_name => [{entity: mapped_entity, idmap: idmap}]}})
|
142
|
+
end
|
143
|
+
|
144
|
+
context 'when to_connec is false' do
|
145
|
+
before { idmap.update(to_connec: false) }
|
146
|
+
|
147
|
+
it 'discards the entity' do
|
148
|
+
expect(subject.consolidate_and_map_external_entities(modeled_external_entities)).to eql({external_name => {connec_name => []}})
|
280
149
|
end
|
281
150
|
end
|
282
151
|
|
283
|
-
context '
|
152
|
+
context 'when entity is inactive' do
|
284
153
|
before {
|
285
|
-
allow(Entities::SubEntities::
|
286
|
-
allow(Entities::SubEntities::ScE1).to receive(:inactive_from_external_entity_hash?).and_return(false)
|
287
|
-
[idmap1, idmap21, idmap22].each{|i| i.update(last_push_to_connec: 1.second.ago)} #Used only to simplify specing
|
154
|
+
allow(Entities::SubEntities::ScE1).to receive(:inactive_from_external_entity_hash?).and_return(true)
|
288
155
|
}
|
289
156
|
|
157
|
+
it 'discards the entity' do
|
158
|
+
expect(subject.consolidate_and_map_external_entities(modeled_external_entities)).to eql({external_name => {connec_name => []}})
|
159
|
+
end
|
160
|
+
|
290
161
|
it 'updates the idmaps' do
|
291
|
-
subject.
|
292
|
-
expect(
|
293
|
-
|
294
|
-
expect(idmap22.reload.external_inactive).to be false
|
295
|
-
end
|
162
|
+
subject.consolidate_and_map_external_entities(modeled_external_entities)
|
163
|
+
expect(idmap.reload.external_inactive).to be true
|
164
|
+
end
|
296
165
|
end
|
297
|
-
end
|
298
166
|
|
299
|
-
|
300
|
-
|
301
|
-
let!(:idmap21) { create(:idmap, organization: organization, external_id: id1, external_entity: 'sce2', connec_entity: 'connec1', external_inactive: false) }
|
302
|
-
let!(:idmap22) { create(:idmap, organization: organization, external_id: id2, external_entity: 'sce2', connec_entity: 'connec2', external_inactive: false) }
|
167
|
+
context 'when last_push_to_connec is recent' do
|
168
|
+
before { idmap.update(last_push_to_connec: 2.second.ago) }
|
303
169
|
|
304
|
-
|
305
|
-
|
306
|
-
allow(Entities::SubEntities::ScE2).to receive(:inactive_from_external_entity_hash?).and_return(true)
|
307
|
-
allow(Entities::SubEntities::ScE1).to receive(:inactive_from_external_entity_hash?).and_return(true)
|
308
|
-
}
|
309
|
-
|
310
|
-
it 'discards the entities and updates the idmaps' do
|
311
|
-
expect(subject.consolidate_and_map_data({}, external_hash, organization, opt)).to eql(external_entities: {
|
312
|
-
'sc_e1' => {'Connec1' => []},
|
313
|
-
'ScE2' => {
|
314
|
-
'Connec1' => [],
|
315
|
-
'connec2' => [],
|
316
|
-
}
|
317
|
-
},
|
318
|
-
connec_entities: {})
|
319
|
-
expect(idmap1.reload.external_inactive).to be true
|
320
|
-
expect(idmap21.reload.external_inactive).to be true
|
321
|
-
expect(idmap22.reload.external_inactive).to be true
|
170
|
+
it 'discards the entity' do
|
171
|
+
expect(subject.consolidate_and_map_external_entities(modeled_external_entities)).to eql({external_name => {connec_name => []}})
|
322
172
|
end
|
323
173
|
end
|
324
|
-
end
|
325
|
-
end
|
326
174
|
|
327
|
-
context 'when entities have idmaps with more recent last_push_to_connec' do
|
328
|
-
let!(:idmap1) { create(:idmap, organization: organization, external_id: id1, external_entity: 'sc_e1', connec_entity: 'connec1', last_push_to_connec: 1.second.ago) }
|
329
|
-
let!(:idmap21) { create(:idmap, organization: organization, external_id: id1, external_entity: 'sce2', connec_entity: 'connec1', last_push_to_connec: 1.second.ago) }
|
330
|
-
let!(:idmap22) { create(:idmap, organization: organization, external_id: id2, external_entity: 'sce2', connec_entity: 'connec2', last_push_to_connec: 1.second.ago) }
|
331
|
-
|
332
|
-
it 'discards the entities' do
|
333
|
-
mapped_entities = subject.consolidate_and_map_data({}, external_hash, organization, opt)
|
334
|
-
expect(mapped_entities).to eql(external_entities: {
|
335
|
-
'sc_e1' => {'Connec1' => []},
|
336
|
-
'ScE2' => {
|
337
|
-
'Connec1' => [],
|
338
|
-
'connec2' => [],
|
339
|
-
}
|
340
|
-
},
|
341
|
-
connec_entities: {})
|
342
175
|
end
|
343
176
|
end
|
344
177
|
|
345
|
-
|
178
|
+
describe 'consolidate_and_map_connec_entities' do
|
179
|
+
let(:id) { 'external-unfolded-id' }
|
180
|
+
let(:connec_id) { 'connec-id' }
|
181
|
+
let(:entity) { {'id' => id, 'name' => 'John', 'updated_at' => date} }
|
182
|
+
let(:modeled_connec_entities) { {connec_name => {external_name => [entity]}} }
|
183
|
+
let(:modeled_external_entities) { {} }
|
184
|
+
let(:connec_name) { 'sc_e1' }
|
185
|
+
let(:external_name) { 'ext1' }
|
346
186
|
before{
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
allow(Entities::SubEntities::Connec1).to receive(:external?).and_return(false)
|
353
|
-
allow(Entities::SubEntities::Connec1).to receive(:entity_name).and_return('Connec1')
|
354
|
-
allow(Entities::SubEntities::Connec1).to receive(:object_name_from_connec_entity_hash).and_return('human name')
|
187
|
+
allow(Entities::SubEntities::ScE1).to receive(:external?).and_return(false)
|
188
|
+
allow(Entities::SubEntities::ScE1).to receive(:entity_name).and_return(connec_name)
|
189
|
+
allow_any_instance_of(Entities::SubEntities::ScE1).to receive(:map_to).with(external_name, entity).and_return(mapped_entity)
|
190
|
+
allow(Entities::SubEntities::ScE1).to receive(:object_name_from_connec_entity_hash).and_return(human_name)
|
191
|
+
allow(Maestrano::Connector::Rails::ConnecHelper).to receive(:unfold_references).and_return(entity.merge(__connec_id: connec_id))
|
355
192
|
}
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
it 'returns the entity with their idmaps' do
|
364
|
-
subject.consolidate_and_map_data({'Connec1' => []}, {'sc_e1' => []}, organization, opt)
|
365
|
-
expect(external_hash).to eql({
|
366
|
-
'sc_e1' => {'Connec1' => [{entity: mapped_entity1, idmap: idmap1}]},
|
367
|
-
'ScE2' => {
|
368
|
-
'Connec1' => [{entity: mapped_entity1, idmap: idmap21}],
|
369
|
-
'connec2' => [{entity: mapped_entity2, idmap: idmap22}],
|
370
|
-
}
|
371
|
-
})
|
193
|
+
|
194
|
+
context 'when idmaps do not exist' do
|
195
|
+
it 'creates the idmaps with a name and returns the mapped entities with their idmaps' do
|
196
|
+
expect{
|
197
|
+
expect(subject.consolidate_and_map_connec_entities(modeled_connec_entities, {})).to eql({connec_name => {external_name => [{entity: {mapped: 'entity'}, idmap: Maestrano::Connector::Rails::IdMap.first}]}})
|
198
|
+
}.to change{ Maestrano::Connector::Rails::IdMap.count }.by(1)
|
199
|
+
expect(Maestrano::Connector::Rails::IdMap.last.name).to eql(human_name)
|
372
200
|
end
|
373
201
|
end
|
374
202
|
|
375
|
-
context '
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
203
|
+
context 'when idmap exists' do
|
204
|
+
let!(:idmap1) { create(:idmap, organization: organization, connec_entity: connec_name.downcase, external_entity: external_name.downcase, external_id: id, connec_id: connec_id) }
|
205
|
+
|
206
|
+
it 'does not create an idmap' do
|
207
|
+
expect{
|
208
|
+
subject.consolidate_and_map_connec_entities(modeled_connec_entities, {})
|
209
|
+
}.to_not change{ Maestrano::Connector::Rails::IdMap.count }
|
210
|
+
end
|
211
|
+
|
212
|
+
it 'returns the entity with its idmap' do
|
213
|
+
expect(subject.consolidate_and_map_connec_entities(modeled_connec_entities, {})).to eql({connec_name => {external_name => [{entity: {mapped: 'entity'}, idmap: idmap1}]}})
|
214
|
+
end
|
215
|
+
|
216
|
+
context 'when external inactive' do
|
217
|
+
before { idmap1.update(external_inactive: true) }
|
218
|
+
it 'discards the entity' do
|
219
|
+
expect(subject.consolidate_and_map_connec_entities(modeled_connec_entities, {})).to eql({connec_name => {external_name => []}})
|
391
220
|
end
|
221
|
+
end
|
392
222
|
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
mapped_entities = subject.consolidate_and_map_data({'Connec1' => []}, {'sc_e1' => []}, organization, opt)
|
398
|
-
expect(mapped_entities[:connec_entities]).to eq({'Connec1' => {'sc_e1' => []}, 'connec2' => {'sc_e1' => [], 'ScE2' => []}})
|
399
|
-
expect(mapped_entities[:external_entities]).to eql({
|
400
|
-
'sc_e1' => {'Connec1' => [{entity: mapped_entity1, idmap: idmap1}]},
|
401
|
-
'ScE2' => {
|
402
|
-
'Connec1' => [{entity: mapped_entity1, idmap: idmap21}],
|
403
|
-
'connec2' => [{entity: mapped_entity2, idmap: idmap22}],
|
404
|
-
}
|
405
|
-
})
|
406
|
-
end
|
223
|
+
context 'when to external flag is false' do
|
224
|
+
before { idmap1.update(to_external: false) }
|
225
|
+
it 'discards the entity' do
|
226
|
+
expect(subject.consolidate_and_map_connec_entities(modeled_connec_entities, {})).to eql({connec_name => {external_name => []}})
|
407
227
|
end
|
408
228
|
end
|
409
229
|
|
410
|
-
context '
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
230
|
+
context 'when last_push_to_external is recent' do
|
231
|
+
before { idmap1.update(last_push_to_external: 2.second.ago) }
|
232
|
+
it 'discards the entity' do
|
233
|
+
expect(subject.consolidate_and_map_connec_entities(modeled_connec_entities, {})).to eql({connec_name => {external_name => []}})
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
context 'when conflict' do
|
238
|
+
let(:external_entity_1) { {'id' => id} }
|
239
|
+
let(:modeled_external_entities) { {external_name => {connec_name => [external_entity_1]}} }
|
240
|
+
before {
|
241
|
+
allow(Entities::SubEntities::ScE1).to receive(:id_from_external_entity_hash).and_return(id)
|
242
|
+
}
|
243
|
+
|
244
|
+
context 'with opts' do
|
245
|
+
context 'with connec preemption false' do
|
246
|
+
it 'discards the entity and keep the external one' do
|
247
|
+
subject.instance_variable_set(:@opts, {connec_preemption: false})
|
248
|
+
expect(subject.consolidate_and_map_connec_entities(modeled_connec_entities, modeled_external_entities)).to eql({connec_name => {external_name => []}})
|
249
|
+
expect(modeled_external_entities[external_name][connec_name]).to_not be_empty
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
context 'with connec preemption true' do
|
254
|
+
it 'keeps the entity and discards the external one' do
|
255
|
+
subject.instance_variable_set(:@opts, {connec_preemption: true})
|
256
|
+
expect(subject.consolidate_and_map_connec_entities(modeled_connec_entities, modeled_external_entities)).to eql({connec_name => {external_name => [{entity: {mapped: 'entity'}, idmap: Maestrano::Connector::Rails::IdMap.first}]}})
|
257
|
+
expect(modeled_external_entities[external_name][connec_name]).to be_empty
|
258
|
+
end
|
422
259
|
end
|
423
260
|
end
|
424
261
|
|
425
|
-
context '
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
262
|
+
context 'without opts' do
|
263
|
+
before {
|
264
|
+
allow(Entities::SubEntities::ScE1).to receive(:last_update_date_from_external_entity_hash).and_return(external_date)
|
265
|
+
}
|
266
|
+
|
267
|
+
context 'with connec one more recent' do
|
268
|
+
let(:external_date) { 1.year.ago }
|
269
|
+
let(:date) { 1.day.ago }
|
270
|
+
|
271
|
+
it 'keeps the entity and discards the external one' do
|
272
|
+
expect(subject.consolidate_and_map_connec_entities(modeled_connec_entities, modeled_external_entities)).to eql({connec_name => {external_name => [{entity: {mapped: 'entity'}, idmap: Maestrano::Connector::Rails::IdMap.first}]}})
|
273
|
+
expect(modeled_external_entities[external_name][connec_name]).to be_empty
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
context 'with external one more recent' do
|
278
|
+
let(:external_date) { 1.month.ago }
|
279
|
+
let(:date) { 1.year.ago }
|
280
|
+
|
281
|
+
it 'discards the entity and keep the external one' do
|
282
|
+
expect(subject.consolidate_and_map_connec_entities(modeled_connec_entities, modeled_external_entities)).to eql({connec_name => {external_name => []}})
|
283
|
+
expect(modeled_external_entities[external_name][connec_name]).to_not be_empty
|
284
|
+
end
|
438
285
|
end
|
439
286
|
end
|
440
287
|
end
|
441
288
|
end
|
442
289
|
end
|
443
290
|
end
|
444
|
-
end
|
445
291
|
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
{
|
451
|
-
|
452
|
-
|
292
|
+
|
293
|
+
describe 'push_entities_to_connec' do
|
294
|
+
let(:idmap) { nil }
|
295
|
+
let(:mapped_entity_with_idmap) { {entity: {}, idmap: idmap} }
|
296
|
+
let(:external_hash) {
|
297
|
+
{
|
298
|
+
'sc_e1' => {'Connec1' => [mapped_entity_with_idmap]},
|
299
|
+
'ScE2' => {'Connec1' => [mapped_entity_with_idmap, mapped_entity_with_idmap], 'connec2' => [mapped_entity_with_idmap]}
|
300
|
+
}
|
453
301
|
}
|
454
|
-
}
|
455
302
|
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
303
|
+
it 'calls push_entities_to_connec on each sub complex entity' do
|
304
|
+
expect_any_instance_of(Entities::SubEntities::ScE1).to receive(:push_entities_to_connec_to).once.with([mapped_entity_with_idmap], 'Connec1')
|
305
|
+
expect_any_instance_of(Entities::SubEntities::ScE2).to receive(:push_entities_to_connec_to).twice
|
306
|
+
subject.push_entities_to_connec(external_hash)
|
307
|
+
end
|
461
308
|
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
allow(
|
309
|
+
describe 'full call' do
|
310
|
+
let(:idmap) { create(:idmap, organization: organization) }
|
311
|
+
before {
|
312
|
+
[Entities::SubEntities::ScE1, Entities::SubEntities::ScE2].each do |klass|
|
313
|
+
allow(klass).to receive(:external?).and_return(true)
|
314
|
+
allow(klass).to receive(:entity_name).and_return('n')
|
315
|
+
end
|
316
|
+
allow(connec_client).to receive(:batch).and_return(ActionDispatch::Response.new(200, {}, {results: [{status: 200, body: {connec1s: {id: [{provider: 'connec', id: 'connec-id'}]}}}]}.to_json, {}), ActionDispatch::Response.new(200, {}, {results: [{status: 200, body: {connec1s: {id: [{provider: 'connec', id: 'connec-id'}]}}}]}.to_json, {}), ActionDispatch::Response.new(200, {}, {results: [{status: 200, body: {connec2s: {id: [{provider: 'connec', id: 'connec-id'}]}}}]}.to_json, {}))
|
317
|
+
}
|
318
|
+
it 'is successful' do
|
319
|
+
subject.push_entities_to_connec(external_hash)
|
320
|
+
idmap.reload
|
321
|
+
expect(idmap.message).to be nil
|
470
322
|
end
|
471
|
-
allow(client).to receive(:batch).and_return(ActionDispatch::Response.new(200, {}, {results: [{status: 200, body: {connec1s: {}}}]}.to_json, {}))
|
472
|
-
}
|
473
|
-
it 'is successful' do
|
474
|
-
subject.push_entities_to_connec(client, external_hash, organization)
|
475
|
-
idmap.reload
|
476
|
-
expect(idmap.message).to be nil
|
477
323
|
end
|
478
324
|
end
|
479
|
-
end
|
480
325
|
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
326
|
+
describe 'push_entities_to_external' do
|
327
|
+
let(:mapped_entity_with_idmap) { {entity: {}, idmap: nil} }
|
328
|
+
let(:connec_hash) {
|
329
|
+
{
|
330
|
+
'sc_e1' => {'ext1' => [mapped_entity_with_idmap]},
|
331
|
+
'ScE2' => {'ext1' => [mapped_entity_with_idmap, mapped_entity_with_idmap], 'ext2' => [mapped_entity_with_idmap]}
|
332
|
+
}
|
488
333
|
}
|
489
|
-
}
|
490
334
|
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
335
|
+
it 'calls push_entities_to_connec on each sub complex entity' do
|
336
|
+
expect_any_instance_of(Entities::SubEntities::ScE1).to receive(:push_entities_to_external_to).once.with([mapped_entity_with_idmap], 'ext1')
|
337
|
+
expect_any_instance_of(Entities::SubEntities::ScE2).to receive(:push_entities_to_external_to).twice
|
338
|
+
subject.push_entities_to_external(connec_hash)
|
339
|
+
end
|
495
340
|
end
|
496
341
|
end
|
497
342
|
end
|