maestrano-connector-rails 1.3.5 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/app/models/maestrano/connector/rails/concerns/entity.rb +94 -19
- data/app/models/maestrano/connector/rails/concerns/sub_entity_base.rb +12 -14
- data/lib/generators/connector/templates/example_entity.rb +15 -0
- data/maestrano-connector-rails.gemspec +8 -8
- data/release_notes.md +9 -0
- data/spec/integration/complex_spec.rb +298 -4
- data/spec/integration/connec_to_external_spec.rb +117 -10
- data/spec/models/complex_entity_spec.rb +14 -10
- data/spec/models/entity_spec.rb +87 -72
- data/spec/models/sub_entity_base_spec.rb +33 -21
- metadata +7 -5
data/release_notes.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## 1.3.5
|
2
|
+
|
3
|
+
## Features
|
4
|
+
* Improve generated files
|
5
|
+
* Adds a built-in way to handle error when updating a deleted record
|
6
|
+
|
7
|
+
## Fixes
|
8
|
+
* Adds safety against potential infinite loop
|
9
|
+
|
1
10
|
## 1.3.4
|
2
11
|
`maestrano.rb` file should be updated with new synchronization paths.
|
3
12
|
|
@@ -71,7 +71,7 @@ describe 'complex entities workflow' do
|
|
71
71
|
def self.references
|
72
72
|
{'CompOrganization' => ['ref_id']}
|
73
73
|
end
|
74
|
-
def map_to(name, entity)
|
74
|
+
def map_to(name, entity, first_time_mapped = nil)
|
75
75
|
super.merge(is_supplier: false)
|
76
76
|
end
|
77
77
|
end
|
@@ -94,7 +94,7 @@ describe 'complex entities workflow' do
|
|
94
94
|
def self.references
|
95
95
|
{'CompOrganization' => ['ref_id']}
|
96
96
|
end
|
97
|
-
def map_to(name, entity)
|
97
|
+
def map_to(name, entity, first_time_mapped = nil)
|
98
98
|
super.merge(is_supplier: true)
|
99
99
|
end
|
100
100
|
end
|
@@ -213,11 +213,11 @@ describe 'complex entities workflow' do
|
|
213
213
|
}
|
214
214
|
let!(:supplier_idmap) { Entities::SubEntities::CompSupplier.create_idmap(organization_id: organization.id, external_id: ext_supplier_id, connec_entity: 'comporganization') }
|
215
215
|
|
216
|
-
before
|
216
|
+
before do
|
217
217
|
allow(connec_client).to receive(:get).and_return(ActionDispatch::Response.new(200, {}, {comporganizations: connec_orgs}.to_json, {}))
|
218
218
|
allow_any_instance_of(Entities::SubEntities::CompCustomer).to receive(:get_external_entities).and_return([ext_customer])
|
219
219
|
allow_any_instance_of(Entities::SubEntities::CompSupplier).to receive(:get_external_entities).and_return([ext_supplier])
|
220
|
-
|
220
|
+
end
|
221
221
|
|
222
222
|
subject { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity('customer_and_supplier', organization, connec_client, external_client, nil, {}) }
|
223
223
|
|
@@ -278,4 +278,298 @@ describe 'complex entities workflow' do
|
|
278
278
|
expect(connec_client).to receive(:batch).exactly(3).times.and_return(ActionDispatch::Response.new(201, {}, {results: []}.to_json, {}), ActionDispatch::Response.new(200, {}, {results: []}.to_json, {}))
|
279
279
|
subject
|
280
280
|
end
|
281
|
+
|
282
|
+
describe "when using creation_mapper_classes" do
|
283
|
+
|
284
|
+
before do
|
285
|
+
allow(connec_client).to receive(:get).and_return(ActionDispatch::Response.new(200, {}, {comporganizationmissingfields: connec_orgs}.to_json, {}))
|
286
|
+
allow_any_instance_of(Entities::SubEntities::CompCustomerMissingField).to receive(:get_external_entities).and_return([ext_customer])
|
287
|
+
allow_any_instance_of(Entities::SubEntities::CompSupplierMissingField).to receive(:get_external_entities).and_return([ext_supplier])
|
288
|
+
end
|
289
|
+
|
290
|
+
let(:subject_missing_field) { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity('customer_and_supplier_missing_field', organization, connec_client, external_client, nil, {}) }
|
291
|
+
|
292
|
+
class Entities::CustomerAndSupplierMissingField < Maestrano::Connector::Rails::ComplexEntity
|
293
|
+
def self.connec_entities_names
|
294
|
+
%w(CompOrganizationMissingField)
|
295
|
+
end
|
296
|
+
def self.external_entities_names
|
297
|
+
%w(CompCustomerMissingField CompSupplierMissingField)
|
298
|
+
end
|
299
|
+
def connec_model_to_external_model(connec_hash_of_entities)
|
300
|
+
organizations_missing_field = connec_hash_of_entities['CompOrganizationMissingField']
|
301
|
+
modelled_connec_entities = { 'CompOrganizationMissingField' => { 'CompSupplierMissingField' => [], 'CompCustomerMissingField' => [] } }
|
302
|
+
|
303
|
+
organizations_missing_field.each do |organization|
|
304
|
+
if organization['is_supplier']
|
305
|
+
modelled_connec_entities['CompOrganizationMissingField']['CompSupplierMissingField'] << organization
|
306
|
+
else
|
307
|
+
modelled_connec_entities['CompOrganizationMissingField']['CompCustomerMissingField'] << organization
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
return modelled_connec_entities
|
312
|
+
end
|
313
|
+
|
314
|
+
def external_model_to_connec_model(external_hash_of_entities)
|
315
|
+
return {'CompCustomerMissingField' => {'CompOrganizationMissingField' => external_hash_of_entities['CompCustomerMissingField']}, 'CompSupplierMissingField' => {'CompOrganizationMissingField' => external_hash_of_entities['CompSupplierMissingField']}}
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
class Entities::SubEntities::CompOrganizationMissingField < Entities::SubEntities::CompOrganization
|
320
|
+
|
321
|
+
def self.entity_name
|
322
|
+
'CompOrganizationMissingField'
|
323
|
+
end
|
324
|
+
|
325
|
+
def self.mapper_classes
|
326
|
+
{
|
327
|
+
'CompCustomerMissingField' => ::CompMapper,
|
328
|
+
'CompSupplierMissingField' => ::CompMapper
|
329
|
+
}
|
330
|
+
end
|
331
|
+
|
332
|
+
def self.creation_mapper_classes
|
333
|
+
{
|
334
|
+
'CompCustomerMissingField' => ::CreationCompMapper,
|
335
|
+
'CompSupplierMissingField' => ::CreationCompMapper
|
336
|
+
}
|
337
|
+
end
|
338
|
+
|
339
|
+
def self.references
|
340
|
+
{'CompCustomerMissingField' => ['ref_id'], 'CompSupplierMissingField' => ['ref_id']}
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
class Entities::SubEntities::CompCustomerMissingField < Maestrano::Connector::Rails::SubEntityBase
|
345
|
+
def self.external?
|
346
|
+
true
|
347
|
+
end
|
348
|
+
|
349
|
+
def self.entity_name
|
350
|
+
'CompCustomerMissingField'
|
351
|
+
end
|
352
|
+
|
353
|
+
def self.creation_mapper_classes
|
354
|
+
{'CompOrganizationMissingField' => ::CreationCompMapper}
|
355
|
+
end
|
356
|
+
|
357
|
+
def self.id_from_external_entity_hash(entity)
|
358
|
+
entity['id']
|
359
|
+
end
|
360
|
+
|
361
|
+
def self.object_name_from_external_entity_hash(entity)
|
362
|
+
entity['name']
|
363
|
+
end
|
364
|
+
|
365
|
+
def self.references
|
366
|
+
{'CompOrganizationMissingField' => ['ref_id']}
|
367
|
+
end
|
368
|
+
|
369
|
+
def map_to(name, entity, first_time_mapped = nil)
|
370
|
+
super.merge(is_supplier: false)
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
374
|
+
class Entities::SubEntities::CompSupplierMissingField < Maestrano::Connector::Rails::SubEntityBase
|
375
|
+
def self.external?
|
376
|
+
true
|
377
|
+
end
|
378
|
+
|
379
|
+
def self.entity_name
|
380
|
+
'CompSupplierMissingField'
|
381
|
+
end
|
382
|
+
|
383
|
+
def self.mapper_classes
|
384
|
+
{'CompOrganizationMissingField' => ::CompMapper}
|
385
|
+
end
|
386
|
+
|
387
|
+
def self.id_from_external_entity_hash(entity)
|
388
|
+
entity['id']
|
389
|
+
end
|
390
|
+
|
391
|
+
def self.object_name_from_external_entity_hash(entity)
|
392
|
+
entity['name']
|
393
|
+
end
|
394
|
+
|
395
|
+
def self.references
|
396
|
+
{'CompOrganizationMissingField' => ['ref_id']}
|
397
|
+
end
|
398
|
+
|
399
|
+
def map_to(name, entity, first_time_mapped = nil)
|
400
|
+
super.merge(is_supplier: true)
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
404
|
+
class CreationCompMapper < CompMapper
|
405
|
+
after_normalize do |input, output|
|
406
|
+
output[:missing_field] = "Default"
|
407
|
+
output
|
408
|
+
end
|
409
|
+
|
410
|
+
after_denormalize do |input, output|
|
411
|
+
output[:missing_field] = "Default"
|
412
|
+
output
|
413
|
+
end
|
414
|
+
end
|
415
|
+
|
416
|
+
let(:mapped_connec_org1) {
|
417
|
+
{
|
418
|
+
ref_id: connec_org1_ext_ref_id,
|
419
|
+
name: connec_org1_name,
|
420
|
+
missing_field: "Default"
|
421
|
+
}
|
422
|
+
}
|
423
|
+
|
424
|
+
let(:mapped_connec_org2) {
|
425
|
+
{
|
426
|
+
ref_id: connec_org2_ext_ref_id,
|
427
|
+
name: connec_org2_name,
|
428
|
+
id: connec_org2_ext_id,
|
429
|
+
missing_field: "Default"
|
430
|
+
}
|
431
|
+
}
|
432
|
+
|
433
|
+
let(:mapped_ext_customer) {
|
434
|
+
{
|
435
|
+
:id => [
|
436
|
+
{
|
437
|
+
:id => ext_customer_id,
|
438
|
+
:provider => provider,
|
439
|
+
:realm => oauth_uid
|
440
|
+
}
|
441
|
+
],
|
442
|
+
:ref_id => [
|
443
|
+
{
|
444
|
+
:id => ext_ref_id,
|
445
|
+
:provider => provider,
|
446
|
+
:realm => oauth_uid
|
447
|
+
}
|
448
|
+
],
|
449
|
+
:name => ext_customer_name,
|
450
|
+
:is_supplier => false,
|
451
|
+
:missing_field => "Default"
|
452
|
+
}
|
453
|
+
}
|
454
|
+
|
455
|
+
let(:mapped_ext_supplier) {
|
456
|
+
{
|
457
|
+
:id => [
|
458
|
+
{
|
459
|
+
:id => ext_supplier_id,
|
460
|
+
:provider => provider,
|
461
|
+
:realm => oauth_uid
|
462
|
+
}
|
463
|
+
],
|
464
|
+
:ref_id => [
|
465
|
+
{
|
466
|
+
:id => ext_ref_id,
|
467
|
+
:provider => provider,
|
468
|
+
:realm => oauth_uid
|
469
|
+
}
|
470
|
+
],
|
471
|
+
:name => ext_supplier_name,
|
472
|
+
:is_supplier => true
|
473
|
+
}
|
474
|
+
}
|
475
|
+
|
476
|
+
let!(:supplier_missing_field_idmap) { Entities::SubEntities::CompSupplierMissingField.create_idmap(organization_id: organization.id, external_id: ext_supplier_id, connec_entity: 'comporganizationmissingfield') }
|
477
|
+
|
478
|
+
it 'handles the mapping correctly' do
|
479
|
+
cust_idmap = Entities::SubEntities::CompCustomerMissingField.create_idmap(organization_id: organization.id, external_id: ext_customer_id, connec_entity: 'comporganizationmissingfield')
|
480
|
+
org1_idmap = Entities::SubEntities::CompOrganizationMissingField.create_idmap(organization_id: organization.id, external_id: connec_org1_ext_id, external_entity: 'compsuppliermissingfield')
|
481
|
+
org2_idmap = Entities::SubEntities::CompOrganizationMissingField.create_idmap(organization_id: organization.id, external_id: connec_org2_ext_id, external_entity: 'compcustomermissingfield')
|
482
|
+
allow(Maestrano::Connector::Rails::IdMap).to receive(:create).and_return(org1_idmap, org2_idmap, cust_idmap)
|
483
|
+
expect_any_instance_of(Entities::CustomerAndSupplierMissingField).to receive(:push_entities_to_external).with({'CompOrganizationMissingField' => {'CompSupplierMissingField' => [{entity: mapped_connec_org1.with_indifferent_access, idmap: org1_idmap, id_refs_only_connec_entity: {}}], 'CompCustomerMissingField' => [{entity: mapped_connec_org2.with_indifferent_access, idmap: org2_idmap, id_refs_only_connec_entity: {}}]}})
|
484
|
+
expect_any_instance_of(Entities::CustomerAndSupplierMissingField).to receive(:push_entities_to_connec).with({'CompCustomerMissingField' => {'CompOrganizationMissingField' => [{entity: mapped_ext_customer.with_indifferent_access, idmap: cust_idmap}]}, 'CompSupplierMissingField' => {'CompOrganizationMissingField' => [{entity: mapped_ext_supplier.with_indifferent_access, idmap: supplier_missing_field_idmap}]}})
|
485
|
+
subject_missing_field
|
486
|
+
end
|
487
|
+
|
488
|
+
context "with idmap and last_push_to_external field present it does not overwrite the missing field" do
|
489
|
+
|
490
|
+
let(:subject_already_pushed_entities) { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity('customer_and_supplier_missing_field', organization, connec_client, external_client, nil, {}) }
|
491
|
+
|
492
|
+
before do
|
493
|
+
allow(connec_client).to receive(:get).and_return(ActionDispatch::Response.new(200, {}, {comporganizationmissingfields: connec_orgs_already_pushed}.to_json, {}))
|
494
|
+
allow_any_instance_of(Entities::SubEntities::CompCustomerMissingField).to receive(:get_external_entities).and_return([ext_customer])
|
495
|
+
allow_any_instance_of(Entities::SubEntities::CompSupplierMissingField).to receive(:get_external_entities).and_return([ext_supplier])
|
496
|
+
end
|
497
|
+
|
498
|
+
let(:connec_org1_already_pushed) { connec_org1.merge!(updated_at: "2015-08-10T14:42:38Z", 'id' => connec_org1['id'].push({'provider' => provider, 'id' => connec_org1_ext_id, 'realm' => oauth_uid})) }
|
499
|
+
let(:connec_org2_already_pushed) { connec_org2.merge!(updated_at: "2015-08-10T14:42:38Z", 'id' => connec_org2['id'].push({'provider' => provider, 'id' => connec_org2_ext_id, 'realm' => oauth_uid})) }
|
500
|
+
|
501
|
+
let(:connec_orgs_already_pushed) { [connec_org1_already_pushed, connec_org2_already_pushed] }
|
502
|
+
|
503
|
+
let(:mapped_connec_org1) {
|
504
|
+
{
|
505
|
+
id: connec_org1_ext_id,
|
506
|
+
ref_id: connec_org1_ext_ref_id,
|
507
|
+
name: connec_org1_name
|
508
|
+
}
|
509
|
+
}
|
510
|
+
|
511
|
+
let(:mapped_connec_org2) {
|
512
|
+
{
|
513
|
+
id: connec_org2_ext_id,
|
514
|
+
ref_id: connec_org2_ext_ref_id,
|
515
|
+
name: connec_org2_name
|
516
|
+
|
517
|
+
}
|
518
|
+
}
|
519
|
+
|
520
|
+
let(:mapped_ext_customer) {
|
521
|
+
{
|
522
|
+
:id => [
|
523
|
+
{
|
524
|
+
:id => ext_customer_id,
|
525
|
+
:provider => provider,
|
526
|
+
:realm => oauth_uid
|
527
|
+
}
|
528
|
+
],
|
529
|
+
:ref_id => [
|
530
|
+
{
|
531
|
+
:id => ext_ref_id,
|
532
|
+
:provider => provider,
|
533
|
+
:realm => oauth_uid
|
534
|
+
}
|
535
|
+
],
|
536
|
+
:name => ext_customer_name,
|
537
|
+
:is_supplier => false,
|
538
|
+
:missing_field => "Default"
|
539
|
+
}
|
540
|
+
}
|
541
|
+
|
542
|
+
let(:mapped_ext_supplier) {
|
543
|
+
{
|
544
|
+
:id => [
|
545
|
+
{
|
546
|
+
:id => ext_supplier_id,
|
547
|
+
:provider => provider,
|
548
|
+
:realm => oauth_uid
|
549
|
+
}
|
550
|
+
],
|
551
|
+
:ref_id => [
|
552
|
+
{
|
553
|
+
:id => ext_ref_id,
|
554
|
+
:provider => provider,
|
555
|
+
:realm => oauth_uid
|
556
|
+
}
|
557
|
+
],
|
558
|
+
:name => ext_supplier_name,
|
559
|
+
:is_supplier => true
|
560
|
+
}
|
561
|
+
}
|
562
|
+
|
563
|
+
let!(:supplier_missing_field_idmap) { Entities::SubEntities::CompSupplierMissingField.create_idmap(organization_id: organization.id, external_id: ext_supplier_id, connec_entity: 'comporganizationmissingfield', last_push_to_external: "2014-08-10T14:42:38Z") }
|
564
|
+
let!(:customer_missing_field_idmap) { Entities::SubEntities::CompCustomerMissingField.create_idmap(organization_id: organization.id, external_id: ext_customer_id, connec_entity: 'comporganizationmissingfield', last_push_to_external: "2014-08-10T14:42:38Z") }
|
565
|
+
let!(:org1_missing_field_idmap) { Entities::SubEntities::CompOrganizationMissingField.create_idmap(organization_id: organization.id, external_id: connec_org1_ext_id, external_entity: 'compsuppliermissingfield', connec_id: connec_org1_id, name: connec_org1_name, last_push_to_external: "2014-08-10T14:42:38Z") }
|
566
|
+
let!(:org2_missing_field_idmap) { Entities::SubEntities::CompOrganizationMissingField.create_idmap(organization_id: organization.id, external_id: connec_org2_ext_id, external_entity: 'compcustomermissingfield', connec_id: connec_org2_id, name: connec_org2_name, last_push_to_external: "2014-08-10T14:42:38Z") }
|
567
|
+
#update idmap with last_push_to_external and check that the :missing_field is not updated
|
568
|
+
it 'does not overwrite the default field in the subsequent mapping' do
|
569
|
+
expect_any_instance_of(Entities::CustomerAndSupplierMissingField).to receive(:push_entities_to_external).with({'CompOrganizationMissingField' => {'CompSupplierMissingField' => [{entity: mapped_connec_org1.with_indifferent_access, idmap: org1_missing_field_idmap, id_refs_only_connec_entity: {}}], 'CompCustomerMissingField' => [{entity: mapped_connec_org2.with_indifferent_access, idmap: org2_missing_field_idmap, id_refs_only_connec_entity: {}}]}})
|
570
|
+
expect_any_instance_of(Entities::CustomerAndSupplierMissingField).to receive(:push_entities_to_connec).with({'CompCustomerMissingField' => {'CompOrganizationMissingField' => [{entity: mapped_ext_customer.with_indifferent_access, idmap: customer_missing_field_idmap}]}, 'CompSupplierMissingField' => {'CompOrganizationMissingField' => [{entity: mapped_ext_supplier.with_indifferent_access, idmap: supplier_missing_field_idmap}]}})
|
571
|
+
subject_already_pushed_entities
|
572
|
+
end
|
573
|
+
end
|
574
|
+
end
|
281
575
|
end
|
@@ -27,8 +27,18 @@ describe 'connec to the external application' do
|
|
27
27
|
entity['ID']
|
28
28
|
end
|
29
29
|
|
30
|
+
def before_sync(last_synchronization_date)
|
31
|
+
@elephant_count = 8
|
32
|
+
end
|
33
|
+
|
30
34
|
class PersonMapper
|
31
35
|
extend HashMapper
|
36
|
+
|
37
|
+
after_normalize do |input, output, opts|
|
38
|
+
output[:Count] = opts[:elephant_count]
|
39
|
+
output
|
40
|
+
end
|
41
|
+
|
32
42
|
map from('organization_id'), to('AccountId')
|
33
43
|
map from('first_name'), to('FirstName')
|
34
44
|
end
|
@@ -41,13 +51,17 @@ describe 'connec to the external application' do
|
|
41
51
|
let(:external_client) { Object.new }
|
42
52
|
let(:ext_org_id) { 'ext org id' }
|
43
53
|
let(:ext_contact_id) { 'ext contact id' }
|
54
|
+
let(:ext_contact_id2) { 'ext contact id 2' }
|
55
|
+
let(:connec_id1) { "23daf041-e18e-0133-7b6a-15461b913fab"}
|
56
|
+
let(:connec_id2) { "11daf041-e18e-0133-7b6a-15461b913yyy"}
|
57
|
+
|
44
58
|
let(:person1) {
|
45
59
|
{
|
46
60
|
"id" => [
|
47
61
|
{
|
48
62
|
"realm" => "org-fg4a",
|
49
63
|
"provider" => "connec",
|
50
|
-
"id" =>
|
64
|
+
"id" => connec_id1
|
51
65
|
}
|
52
66
|
],
|
53
67
|
"code" => "PE3",
|
@@ -75,13 +89,12 @@ describe 'connec to the external application' do
|
|
75
89
|
}
|
76
90
|
let(:person) { person1 }
|
77
91
|
|
78
|
-
|
79
|
-
before {
|
92
|
+
before do
|
80
93
|
allow(connec_client).to receive(:get).and_return(ActionDispatch::Response.new(200, {}, {people: [person]}.to_json, {}))
|
81
94
|
allow(connec_client).to receive(:batch).and_return(ActionDispatch::Response.new(200, {}, {results: [{status: 200, body: {people: {}}}]}.to_json, {}))
|
82
95
|
|
83
96
|
allow_any_instance_of(Entities::ConnecToExternal).to receive(:get_external_entities).and_return([])
|
84
|
-
|
97
|
+
end
|
85
98
|
|
86
99
|
subject { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity('connec_to_external', organization, connec_client, external_client, organization.last_synchronization_date, {}) }
|
87
100
|
|
@@ -93,7 +106,8 @@ describe 'connec to the external application' do
|
|
93
106
|
let(:mapped_entity) {
|
94
107
|
{
|
95
108
|
AccountId: ext_org_id,
|
96
|
-
FirstName: 'John'
|
109
|
+
FirstName: 'John',
|
110
|
+
Count: 8
|
97
111
|
}
|
98
112
|
}
|
99
113
|
|
@@ -102,8 +116,8 @@ describe 'connec to the external application' do
|
|
102
116
|
:sequential=>true,
|
103
117
|
:ops=> [
|
104
118
|
{
|
105
|
-
:method=>"put",
|
106
|
-
:url=>"/api/v2/#{organization.uid}/people/23daf041-e18e-0133-7b6a-15461b913fab",
|
119
|
+
:method=>"put",
|
120
|
+
:url=>"/api/v2/#{organization.uid}/people/23daf041-e18e-0133-7b6a-15461b913fab",
|
107
121
|
:params=>
|
108
122
|
{
|
109
123
|
:people=>{
|
@@ -157,7 +171,8 @@ describe 'connec to the external application' do
|
|
157
171
|
let(:mapped_entity) {
|
158
172
|
{
|
159
173
|
AccountId: ext_org_id,
|
160
|
-
FirstName: 'Jane'
|
174
|
+
FirstName: 'Jane',
|
175
|
+
Count: 8
|
161
176
|
}
|
162
177
|
}
|
163
178
|
|
@@ -177,12 +192,11 @@ describe 'connec to the external application' do
|
|
177
192
|
expect(connec_client).to_not receive(:batch)
|
178
193
|
subject
|
179
194
|
end
|
180
|
-
|
181
195
|
end
|
182
196
|
|
183
197
|
describe 'a creation from connec with references missing' do
|
184
198
|
let(:person) { person1.merge("organization_id" => [{"realm"=>"org-fg4a", "provider"=>"connec", "id"=>"2305c5e0-e18e-0133-890f-07d4de9f9781"}]) }
|
185
|
-
|
199
|
+
|
186
200
|
it 'pushes nothing and creates no idmap' do
|
187
201
|
expect_any_instance_of(Entities::ConnecToExternal).to_not receive(:create_external_entity)
|
188
202
|
expect_any_instance_of(Entities::ConnecToExternal).to_not receive(:update_external_entity)
|
@@ -211,4 +225,97 @@ describe 'connec to the external application' do
|
|
211
225
|
}.to_not change{ Maestrano::Connector::Rails::IdMap.count }
|
212
226
|
end
|
213
227
|
end
|
228
|
+
|
229
|
+
describe 'a creation from connec where the creation_only_mapper has to be used' do
|
230
|
+
#idmap.last_push_to_external is nil
|
231
|
+
before do
|
232
|
+
allow_any_instance_of(Entities::ConnecToExternalMissingField).to receive(:get_external_entities).and_return([])
|
233
|
+
end
|
234
|
+
|
235
|
+
subject { Maestrano::Connector::Rails::SynchronizationJob.new.sync_entity('connec_to_external_missing_field', organization, connec_client, external_client, organization.last_synchronization_date, {}) }
|
236
|
+
|
237
|
+
class Entities::ConnecToExternalMissingField < Entities::ConnecToExternal
|
238
|
+
|
239
|
+
def self.creation_mapper_class
|
240
|
+
CreationPersonMapper
|
241
|
+
end
|
242
|
+
|
243
|
+
class CreationPersonMapper < PersonMapper
|
244
|
+
after_normalize do |input, output|
|
245
|
+
output[:missing_connec_field] = "Default"
|
246
|
+
output
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
describe 'a new record created in connec with all references known' do
|
252
|
+
before {
|
253
|
+
allow(connec_client).to receive(:get).and_return(ActionDispatch::Response.new(200, {}, {people: [person2]}.to_json, {}))
|
254
|
+
allow(connec_client).to receive(:batch).and_return(ActionDispatch::Response.new(200, {}, {results: [{status: 200, body: {people: {}}}]}.to_json, {}))
|
255
|
+
|
256
|
+
allow_any_instance_of(Entities::ConnecToExternalMissingField).to receive(:create_external_entity).and_return({'ID' => ext_contact_id2})
|
257
|
+
}
|
258
|
+
|
259
|
+
let(:person2) { person1.merge('first_name' => 'Jack', 'id' => [{"realm" => "org-fg4a", "provider" => "connec", "id" => connec_id2 }]) }
|
260
|
+
|
261
|
+
let(:mapped_entity_missing_field) {
|
262
|
+
{
|
263
|
+
AccountId: ext_org_id,
|
264
|
+
FirstName: 'Jack',
|
265
|
+
missing_connec_field: "Default",
|
266
|
+
Count: 8
|
267
|
+
}
|
268
|
+
}
|
269
|
+
|
270
|
+
let(:batch_params) {
|
271
|
+
{
|
272
|
+
:sequential=>true,
|
273
|
+
:ops=> [
|
274
|
+
{
|
275
|
+
:method=>"put",
|
276
|
+
:url=>"/api/v2/#{organization.uid}/people/11daf041-e18e-0133-7b6a-15461b913yyy",
|
277
|
+
:params=>
|
278
|
+
{
|
279
|
+
:people=>{
|
280
|
+
id: [
|
281
|
+
{
|
282
|
+
:id=>"ext contact id 2",
|
283
|
+
:provider=>"provider",
|
284
|
+
:realm=>"oauth uid"
|
285
|
+
}
|
286
|
+
]
|
287
|
+
}
|
288
|
+
}
|
289
|
+
}
|
290
|
+
]
|
291
|
+
}
|
292
|
+
}
|
293
|
+
|
294
|
+
it 'handles the idmap correctly' do
|
295
|
+
expect{
|
296
|
+
subject
|
297
|
+
}.to change{ Maestrano::Connector::Rails::IdMap.count }.by(1)
|
298
|
+
idmap = Maestrano::Connector::Rails::IdMap.last
|
299
|
+
expect(idmap.name).to eql('Jack')
|
300
|
+
expect(idmap.connec_entity).to eql('person')
|
301
|
+
expect(idmap.external_entity).to eql('contact')
|
302
|
+
expect(idmap.message).to be_nil
|
303
|
+
expect(idmap.external_id).to eql(ext_contact_id2)
|
304
|
+
expect(idmap.connec_id).to eql("11daf041-e18e-0133-7b6a-15461b913yyy")
|
305
|
+
end
|
306
|
+
|
307
|
+
it 'does the mapping correctly' do
|
308
|
+
idmap = Entities::ConnecToExternalMissingField.create_idmap(organization_id: organization.id, external_id: ext_contact_id, connec_id: "23daf041-e18e-0133-7b6a-15461b913yyy")
|
309
|
+
allow(Entities::ConnecToExternalMissingField).to receive(:find_or_create_idmap).and_return(idmap)
|
310
|
+
expect_any_instance_of(Entities::ConnecToExternalMissingField).to receive(:push_entities_to_external).with([{entity: mapped_entity_missing_field.with_indifferent_access, idmap: idmap, id_refs_only_connec_entity: {}}])
|
311
|
+
subject
|
312
|
+
end
|
313
|
+
|
314
|
+
it 'send the external id to connec' do
|
315
|
+
expect(connec_client).to receive(:batch).with(batch_params)
|
316
|
+
subject
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
end
|
214
321
|
end
|