restforce-db 0.5.1 → 1.0.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/README.md +77 -21
- data/lib/restforce/db.rb +6 -0
- data/lib/restforce/db/associations/active_record.rb +1 -1
- data/lib/restforce/db/attribute_map.rb +5 -1
- data/lib/restforce/db/dsl.rb +80 -0
- data/lib/restforce/db/initializer.rb +3 -2
- data/lib/restforce/db/mapping.rb +20 -77
- data/lib/restforce/db/model.rb +7 -4
- data/lib/restforce/db/registry.rb +62 -0
- data/lib/restforce/db/strategies/always.rb +38 -0
- data/lib/restforce/db/strategies/passive.rb +37 -0
- data/lib/restforce/db/strategy.rb +25 -0
- data/lib/restforce/db/version.rb +1 -1
- data/test/cassettes/Restforce_DB_Initializer/_run/given_an_existing_Salesforce_record/{for_a_non-root_mapping → for_a_Passive_strategy}/does_not_create_a_database_record.yml +20 -20
- data/test/cassettes/Restforce_DB_Initializer/_run/given_an_existing_Salesforce_record/for_an_Always_strategy/creates_a_matching_database_record.yml +159 -0
- data/test/cassettes/Restforce_DB_Initializer/_run/given_an_existing_database_record/{for_a_root_mapping → for_an_Always_strategy}/populates_Salesforce_with_the_new_record.yml +44 -43
- data/test/cassettes/{Restforce_DB_Initializer/_run/given_an_existing_Salesforce_record/for_a_root_mapping/creates_a_matching_database_record.yml → Restforce_DB_Strategies_Always/_build_/given_a_Salesforce_record/wants_to_build_a_new_matching_record.yml} +30 -30
- data/test/cassettes/Restforce_DB_Strategies_Always/_build_/given_a_Salesforce_record/with_a_corresponding_database_record/does_not_want_to_build_a_new_record.yml +158 -0
- data/test/lib/restforce/db/associations/active_record_test.rb +6 -6
- data/test/lib/restforce/db/attribute_map_test.rb +5 -1
- data/test/lib/restforce/db/dsl_test.rb +80 -0
- data/test/lib/restforce/db/initializer_test.rb +8 -8
- data/test/lib/restforce/db/mapping_test.rb +7 -17
- data/test/lib/restforce/db/model_test.rb +8 -9
- data/test/lib/restforce/db/record_types/active_record_test.rb +10 -6
- data/test/lib/restforce/db/registry_test.rb +43 -0
- data/test/lib/restforce/db/strategies/always_test.rb +38 -0
- data/test/lib/restforce/db/strategies/passive_test.rb +17 -0
- data/test/lib/restforce/db/strategy_test.rb +19 -0
- data/test/support/utilities.rb +7 -9
- metadata +17 -5
@@ -13,29 +13,19 @@ describe Restforce::DB::Mapping do
|
|
13
13
|
column_two: "SF_Field_Two__c",
|
14
14
|
}
|
15
15
|
end
|
16
|
+
let(:through) { nil }
|
16
17
|
let!(:mapping) do
|
17
|
-
Restforce::DB::Mapping.new(
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
associations: associations,
|
22
|
-
)
|
23
|
-
end
|
24
|
-
|
25
|
-
describe ".each" do
|
26
|
-
|
27
|
-
# Restforce::DB::Mapping actually implements Enumerable, so we're just
|
28
|
-
# going with a trivially testable portion of the Enumerable API.
|
29
|
-
it "yields the registered record types" do
|
30
|
-
expect(Restforce::DB::Mapping.first).to_equal mapping
|
18
|
+
Restforce::DB::Mapping.new(database_model, salesforce_model).tap do |m|
|
19
|
+
m.fields = fields
|
20
|
+
m.associations = associations
|
21
|
+
m.through = through
|
31
22
|
end
|
32
23
|
end
|
33
24
|
|
34
25
|
describe "#initialize" do
|
35
26
|
|
36
|
-
it "
|
37
|
-
expect(Restforce::DB::
|
38
|
-
expect(Restforce::DB::Mapping[salesforce_model]).to_equal [mapping]
|
27
|
+
it "defaults to an initialization strategy of `Always`" do
|
28
|
+
expect(mapping.strategy).to_be_instance_of(Restforce::DB::Strategies::Always)
|
39
29
|
end
|
40
30
|
end
|
41
31
|
|
@@ -6,12 +6,6 @@ describe Restforce::DB::Model do
|
|
6
6
|
|
7
7
|
let(:database_model) { CustomObject }
|
8
8
|
let(:salesforce_model) { "CustomObject__c" }
|
9
|
-
let(:fields) do
|
10
|
-
{
|
11
|
-
name: "Name",
|
12
|
-
example: "Example_Field__c",
|
13
|
-
}
|
14
|
-
end
|
15
9
|
|
16
10
|
before do
|
17
11
|
database_model.send(:include, Restforce::DB::Model)
|
@@ -19,11 +13,16 @@ describe Restforce::DB::Model do
|
|
19
13
|
|
20
14
|
describe ".sync_with" do
|
21
15
|
before do
|
22
|
-
database_model.sync_with(salesforce_model
|
16
|
+
database_model.sync_with(salesforce_model) do
|
17
|
+
maps(
|
18
|
+
name: "Name",
|
19
|
+
example: "Example_Field__c",
|
20
|
+
)
|
21
|
+
end
|
23
22
|
end
|
24
23
|
|
25
|
-
it "
|
26
|
-
expect(Restforce::DB::
|
24
|
+
it "adds a mapping to the global Restforce::DB::Registry" do
|
25
|
+
expect(Restforce::DB::Registry[database_model]).to_not_be :empty?
|
27
26
|
end
|
28
27
|
end
|
29
28
|
|
@@ -26,6 +26,10 @@ describe Restforce::DB::RecordTypes::ActiveRecord do
|
|
26
26
|
end
|
27
27
|
let(:instance) { record_type.create!(create_from).record }
|
28
28
|
|
29
|
+
before do
|
30
|
+
Restforce::DB::Registry << mapping
|
31
|
+
end
|
32
|
+
|
29
33
|
it "creates a record in the database from the passed Salesforce record's attributes" do
|
30
34
|
expect(instance.salesforce_id).to_equal salesforce_id
|
31
35
|
expect(instance.name).to_equal attributes[:name]
|
@@ -39,12 +43,12 @@ describe Restforce::DB::RecordTypes::ActiveRecord do
|
|
39
43
|
let(:associations) { { user: "Friend__c" } }
|
40
44
|
|
41
45
|
before do
|
42
|
-
mapping = Restforce::DB::Mapping.new(
|
43
|
-
|
44
|
-
"
|
45
|
-
|
46
|
-
|
47
|
-
|
46
|
+
mapping = Restforce::DB::Mapping.new(User, "Contact").tap do |m|
|
47
|
+
m.through = "Friend__c"
|
48
|
+
m.fields = { email: "Email" }
|
49
|
+
end
|
50
|
+
Restforce::DB::Registry << mapping
|
51
|
+
|
48
52
|
salesforce_record_type = mapping.salesforce_record_type
|
49
53
|
|
50
54
|
# Stub out the `#find` method on the record type
|
@@ -0,0 +1,43 @@
|
|
1
|
+
describe Restforce::DB::Registry do
|
2
|
+
|
3
|
+
configure!
|
4
|
+
mappings!
|
5
|
+
|
6
|
+
describe ".<<" do
|
7
|
+
before do
|
8
|
+
Restforce::DB::Registry << mapping
|
9
|
+
end
|
10
|
+
|
11
|
+
it "appends a mapping in the registry under its ActiveRecord class" do
|
12
|
+
expect(Restforce::DB::Registry[database_model]).to_equal [mapping]
|
13
|
+
end
|
14
|
+
|
15
|
+
it "appends a mapping in the registry under its Salesforce object type" do
|
16
|
+
expect(Restforce::DB::Registry[salesforce_model]).to_equal [mapping]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe ".each" do
|
21
|
+
before do
|
22
|
+
Restforce::DB::Registry << mapping
|
23
|
+
end
|
24
|
+
|
25
|
+
# Restforce::DB::Registry actually implements Enumerable, so we're just
|
26
|
+
# going with a trivially testable portion of the Enumerable API.
|
27
|
+
it "yields the registered record types" do
|
28
|
+
expect(Restforce::DB::Registry.first).to_equal mapping
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe ".clean!" do
|
33
|
+
before do
|
34
|
+
Restforce::DB::Registry << mapping
|
35
|
+
end
|
36
|
+
|
37
|
+
it "clears out the currently registered mappings" do
|
38
|
+
expect(Restforce::DB::Registry.first).to_not_be_nil
|
39
|
+
Restforce::DB::Registry.clean!
|
40
|
+
expect(Restforce::DB::Registry.first).to_be_nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative "../../../../test_helper"
|
2
|
+
|
3
|
+
describe Restforce::DB::Strategies::Always do
|
4
|
+
|
5
|
+
configure!
|
6
|
+
mappings!
|
7
|
+
|
8
|
+
let(:strategy) { Restforce::DB::Strategies::Always.new }
|
9
|
+
|
10
|
+
it "is not a passive strategy" do
|
11
|
+
expect(strategy).to_not_be :passive?
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#build?", :vcr do
|
15
|
+
|
16
|
+
describe "given a Salesforce record" do
|
17
|
+
let(:salesforce_id) { Salesforce.create! salesforce_model }
|
18
|
+
let(:record) { mapping.salesforce_record_type.find(salesforce_id) }
|
19
|
+
|
20
|
+
it "wants to build a new matching record" do
|
21
|
+
expect(strategy.build?(record)).to_equal true
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "with a corresponding database record" do
|
25
|
+
before do
|
26
|
+
CustomObject.create!(
|
27
|
+
salesforce_id: salesforce_id,
|
28
|
+
synchronized_at: Time.now,
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "does not want to build a new record" do
|
33
|
+
expect(strategy.build?(record)).to_equal false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative "../../../../test_helper"
|
2
|
+
|
3
|
+
describe Restforce::DB::Strategies::Passive do
|
4
|
+
let(:strategy) { Restforce::DB::Strategies::Passive.new }
|
5
|
+
|
6
|
+
it "is a passive strategy" do
|
7
|
+
expect(strategy).to_be :passive?
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "#build?" do
|
11
|
+
|
12
|
+
it "returns false for any record" do
|
13
|
+
record = Object.new
|
14
|
+
expect(strategy.build?(record)).to_equal false
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative "../../../test_helper"
|
2
|
+
|
3
|
+
describe Restforce::DB::Strategy do
|
4
|
+
|
5
|
+
describe ".for" do
|
6
|
+
let(:strategy) { Restforce::DB::Strategy.for(type) }
|
7
|
+
|
8
|
+
describe ":always" do
|
9
|
+
let(:type) { :always }
|
10
|
+
it { expect(strategy).to_be_instance_of(Restforce::DB::Strategies::Always) }
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ":always" do
|
14
|
+
let(:type) { :passive }
|
15
|
+
it { expect(strategy).to_be_instance_of(Restforce::DB::Strategies::Passive) }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/test/support/utilities.rb
CHANGED
@@ -5,7 +5,7 @@ def configure!
|
|
5
5
|
end
|
6
6
|
|
7
7
|
after do
|
8
|
-
Restforce::DB::
|
8
|
+
Restforce::DB::Registry.clean!
|
9
9
|
DatabaseCleaner.clean
|
10
10
|
Salesforce.clean!
|
11
11
|
end
|
@@ -20,13 +20,11 @@ def mappings!
|
|
20
20
|
let(:conditions) { [] }
|
21
21
|
let(:through) { nil }
|
22
22
|
let!(:mapping) do
|
23
|
-
Restforce::DB::Mapping.new(
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
conditions: conditions,
|
30
|
-
)
|
23
|
+
Restforce::DB::Mapping.new(database_model, salesforce_model).tap do |m|
|
24
|
+
m.through = through
|
25
|
+
m.conditions = conditions
|
26
|
+
m.fields = fields
|
27
|
+
m.associations = associations
|
28
|
+
end
|
31
29
|
end
|
32
30
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: restforce-db
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Horner
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -227,6 +227,7 @@ files:
|
|
227
227
|
- lib/restforce/db/collector.rb
|
228
228
|
- lib/restforce/db/command.rb
|
229
229
|
- lib/restforce/db/configuration.rb
|
230
|
+
- lib/restforce/db/dsl.rb
|
230
231
|
- lib/restforce/db/initializer.rb
|
231
232
|
- lib/restforce/db/instances/active_record.rb
|
232
233
|
- lib/restforce/db/instances/base.rb
|
@@ -236,7 +237,11 @@ files:
|
|
236
237
|
- lib/restforce/db/record_types/active_record.rb
|
237
238
|
- lib/restforce/db/record_types/base.rb
|
238
239
|
- lib/restforce/db/record_types/salesforce.rb
|
240
|
+
- lib/restforce/db/registry.rb
|
239
241
|
- lib/restforce/db/runner.rb
|
242
|
+
- lib/restforce/db/strategies/always.rb
|
243
|
+
- lib/restforce/db/strategies/passive.rb
|
244
|
+
- lib/restforce/db/strategy.rb
|
240
245
|
- lib/restforce/db/synchronizer.rb
|
241
246
|
- lib/restforce/db/tracker.rb
|
242
247
|
- lib/restforce/db/version.rb
|
@@ -247,9 +252,9 @@ files:
|
|
247
252
|
- test/cassettes/Restforce_DB_Collector/_run/given_a_Salesforce_record_with_an_associated_database_record/returns_the_attributes_from_both_records.yml
|
248
253
|
- test/cassettes/Restforce_DB_Collector/_run/given_an_existing_Salesforce_record/returns_the_attributes_from_the_Salesforce_record.yml
|
249
254
|
- test/cassettes/Restforce_DB_Collector/_run/given_an_existing_database_record/returns_the_attributes_from_the_database_record.yml
|
250
|
-
- test/cassettes/Restforce_DB_Initializer/_run/given_an_existing_Salesforce_record/
|
251
|
-
- test/cassettes/Restforce_DB_Initializer/_run/given_an_existing_Salesforce_record/
|
252
|
-
- test/cassettes/Restforce_DB_Initializer/_run/given_an_existing_database_record/
|
255
|
+
- test/cassettes/Restforce_DB_Initializer/_run/given_an_existing_Salesforce_record/for_a_Passive_strategy/does_not_create_a_database_record.yml
|
256
|
+
- test/cassettes/Restforce_DB_Initializer/_run/given_an_existing_Salesforce_record/for_an_Always_strategy/creates_a_matching_database_record.yml
|
257
|
+
- test/cassettes/Restforce_DB_Initializer/_run/given_an_existing_database_record/for_an_Always_strategy/populates_Salesforce_with_the_new_record.yml
|
253
258
|
- test/cassettes/Restforce_DB_Instances_Salesforce/_copy_/updates_the_record_with_the_attributes_from_the_copied_object.yml
|
254
259
|
- test/cassettes/Restforce_DB_Instances_Salesforce/_synced_/when_a_matching_database_record_exists/returns_true.yml
|
255
260
|
- test/cassettes/Restforce_DB_Instances_Salesforce/_synced_/when_no_matching_database_record_exists/returns_false.yml
|
@@ -262,6 +267,8 @@ files:
|
|
262
267
|
- test/cassettes/Restforce_DB_RecordTypes_Salesforce/_find/given_a_set_of_mapping_conditions/when_a_record_does_not_meet_the_conditions/does_not_find_the_record.yml
|
263
268
|
- test/cassettes/Restforce_DB_RecordTypes_Salesforce/_find/given_a_set_of_mapping_conditions/when_a_record_meets_the_conditions/finds_the_record.yml
|
264
269
|
- test/cassettes/Restforce_DB_RecordTypes_Salesforce/_find/returns_nil_when_no_matching_record_exists.yml
|
270
|
+
- test/cassettes/Restforce_DB_Strategies_Always/_build_/given_a_Salesforce_record/wants_to_build_a_new_matching_record.yml
|
271
|
+
- test/cassettes/Restforce_DB_Strategies_Always/_build_/given_a_Salesforce_record/with_a_corresponding_database_record/does_not_want_to_build_a_new_record.yml
|
265
272
|
- test/cassettes/Restforce_DB_Synchronizer/_run/given_a_Salesforce_record_with_an_associated_database_record/updates_the_database_record.yml
|
266
273
|
- test/cassettes/Restforce_DB_Synchronizer/_run/given_a_Salesforce_record_with_an_associated_database_record/updates_the_salesforce_record.yml
|
267
274
|
- test/lib/restforce/db/accumulator_test.rb
|
@@ -269,6 +276,7 @@ files:
|
|
269
276
|
- test/lib/restforce/db/attribute_map_test.rb
|
270
277
|
- test/lib/restforce/db/collector_test.rb
|
271
278
|
- test/lib/restforce/db/configuration_test.rb
|
279
|
+
- test/lib/restforce/db/dsl_test.rb
|
272
280
|
- test/lib/restforce/db/initializer_test.rb
|
273
281
|
- test/lib/restforce/db/instances/active_record_test.rb
|
274
282
|
- test/lib/restforce/db/instances/salesforce_test.rb
|
@@ -276,7 +284,11 @@ files:
|
|
276
284
|
- test/lib/restforce/db/model_test.rb
|
277
285
|
- test/lib/restforce/db/record_types/active_record_test.rb
|
278
286
|
- test/lib/restforce/db/record_types/salesforce_test.rb
|
287
|
+
- test/lib/restforce/db/registry_test.rb
|
279
288
|
- test/lib/restforce/db/runner_test.rb
|
289
|
+
- test/lib/restforce/db/strategies/always_test.rb
|
290
|
+
- test/lib/restforce/db/strategies/passive_test.rb
|
291
|
+
- test/lib/restforce/db/strategy_test.rb
|
280
292
|
- test/lib/restforce/db/synchronizer_test.rb
|
281
293
|
- test/lib/restforce/db/tracker_test.rb
|
282
294
|
- test/lib/restforce/db_test.rb
|