active_harmony 1.0.1

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.
@@ -0,0 +1,185 @@
1
+ require "spec_helper"
2
+
3
+ # Bacon.
4
+ class Bacon
5
+ include ::Mongoid::Document
6
+
7
+ include ActiveHarmony::Synchronizable::Core
8
+ include ActiveHarmony::Synchronizable::Mongoid
9
+
10
+ field :tastyness
11
+ end
12
+
13
+ # Wire up connections
14
+ synchronizer = ActiveHarmony::Synchronizer.new
15
+ synchronizer.service = ActiveHarmony::Service.new
16
+ synchronizer.factory = Bacon
17
+ synchronizer.configure do |config|
18
+ config.synchronize :tastyness
19
+ end
20
+ Bacon.synchronizer = synchronizer
21
+
22
+ module ActiveHarmony
23
+ describe Synchronizer do
24
+ before :all do
25
+ # References to wired up objects
26
+ @synchronizer = Bacon.synchronizer
27
+ @service = Bacon.synchronizer.service
28
+ end
29
+
30
+ before :each do
31
+ Bacon.delete_all
32
+ end
33
+
34
+ ####################################################
35
+ # Initialization
36
+
37
+ describe "#factory=" do
38
+ it "should set factory class for finding and creating objects" do
39
+ synchronizer = Synchronizer.new
40
+ factory = Class.new
41
+ synchronizer.factory = factory
42
+ synchronizer.factory.should == factory
43
+ end
44
+
45
+ it "should set service" do
46
+ synchronizer = Synchronizer.new
47
+ service = Service.new
48
+ synchronizer.service = service
49
+ synchronizer.service.should == service
50
+ end
51
+ end
52
+
53
+ ###################################################
54
+ # Configuration
55
+
56
+ describe "#configure" do
57
+ it "should raise an exception when there's no block" do
58
+ synchronizer = Synchronizer.new
59
+ lambda {
60
+ synchronizer.configure
61
+ }.should raise_exception LocalJumpError
62
+ end
63
+
64
+ it "should yield synchronizer configuration object" do
65
+ synchronizer = Synchronizer.new
66
+ synchronizer.configure do |config|
67
+ config.should == synchronizer.configuration
68
+ end
69
+ end
70
+ end
71
+
72
+
73
+ describe "#object_name" do
74
+ it "should return object name for our factory class" do
75
+ # @synchronizer is now reference to Bacon's synchronizer, remember?
76
+ # If not, take a look at before filter on lines 26-27.
77
+ @synchronizer.object_name.should == :bacon
78
+ end
79
+ end
80
+
81
+ describe "#pull_object" do
82
+ it "should update local object" do
83
+ local_bacon = Bacon.create({
84
+ :_remote_id => 123,
85
+ :tastyness => 'Meh'
86
+ })
87
+ @service.expects(:show).with(:bacon, 123).returns({
88
+ 'id' => 123,
89
+ 'tastyness' => 'Average'
90
+ })
91
+ @synchronizer.pull_object(123)
92
+ local_bacon.reload
93
+ local_bacon.tastyness.should == 'Average'
94
+ end
95
+
96
+ it "should create a new local object" do
97
+ # In the Before Block, we're deleting all Bacons.
98
+ Bacon.count.should == 0 # <-- Do you believe me now?
99
+ @service.expects(:show).with(:bacon, 123).returns({
100
+ 'id' => 123,
101
+ 'tastyness' => 'Average'
102
+ })
103
+ @synchronizer.pull_object(123)
104
+ bacon = Bacon.last
105
+ bacon._remote_id.should == 123
106
+ bacon.tastyness.should == 'Average'
107
+ end
108
+ end
109
+
110
+ describe "#push_object" do
111
+ before :each do
112
+ @bacon = Bacon.create(:tastyness => "Tasty")
113
+ end
114
+
115
+ context "remote object exists" do
116
+ before :each do
117
+ @bacon._remote_id = 123
118
+ end
119
+
120
+ it "should update remote object" do
121
+ @service.expects(:update).with(:bacon, 123, {"tastyness" => "Tasty"})
122
+ @synchronizer.push_object(@bacon)
123
+ end
124
+ end
125
+
126
+ context "remote object does not exist" do
127
+ before :each do
128
+ @bacon._remote_id = nil
129
+ end
130
+
131
+ it "should create a new remote object" do
132
+ @service.expects(:update).never
133
+ @service.expects(:create).with(:bacon, {"tastyness" => "Tasty"})
134
+ @synchronizer.push_object(@bacon)
135
+ end
136
+
137
+ it "should save remote id of newly created remote object" do
138
+ @service.
139
+ expects(:create).
140
+ with(:bacon, {"tastyness" => "Tasty"}).
141
+ returns({"id" => 202, "tastyness" => "Average"})
142
+ @synchronizer.push_object(@bacon)
143
+ @bacon.reload
144
+ @bacon._remote_id.should == 202
145
+ @bacon.tastyness.should == "Average"
146
+ end
147
+ end
148
+ end
149
+
150
+ describe "#pull_collection" do
151
+ before :each do
152
+ @bacons = [
153
+ Bacon.create(:_remote_id => 1, :tastyness => 'Meh'),
154
+ Bacon.create(:_remote_id => 2, :tastyness => 'Average')
155
+ ]
156
+
157
+ @service.expects(:list).with(:bacon).returns([
158
+ {'id' => 1, 'tastyness' => 'Super Meh'},
159
+ {'id' => 2, 'tastyness' => 'Super Average'},
160
+ {'id' => 3, 'tastyness' => 'Mmmmmmmmmm'}
161
+ ])
162
+
163
+ @synchronizer.pull_collection
164
+ @bacons.each { |b| b.reload }
165
+ end
166
+
167
+ it "should update objects" do
168
+ @bacons[0].tastyness.should == 'Super Meh'
169
+ @bacons[1].tastyness.should == 'Super Average'
170
+ end
171
+
172
+ it "should create new object" do
173
+ new_bacon = Bacon.last
174
+ new_bacon.tastyness.should == 'Mmmmmmmmmm'
175
+ end
176
+
177
+ it 'should set order' do
178
+ # bacons = Bacon.all.to_a
179
+ # bacons[0]._collection_order.should == 0
180
+ # bacons[1]._collection_order.should == 1
181
+ # bacons[2]._collection_order.should == 2
182
+ end
183
+ end
184
+ end
185
+ end
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: active_harmony
3
+ version: !ruby/object:Gem::Version
4
+ hash: 21
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 1
10
+ version: 1.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Vojto Rinik
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-09-22 00:00:00 -04:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: Active Harmony is a Ruby library that takes care of synchronizing changes between local Ruby objects and remote REST services.
23
+ email: vojto@rinik.net
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files:
29
+ - LICENSE
30
+ - README.markdown
31
+ files:
32
+ - .bundle/config
33
+ - CHANGELOG
34
+ - Gemfile
35
+ - Gemfile.lock
36
+ - LICENSE
37
+ - README.markdown
38
+ - Rakefile
39
+ - VERSION
40
+ - active_harmony.gemspec
41
+ - lib/active_harmony.rb
42
+ - lib/active_harmony/queue.rb
43
+ - lib/active_harmony/queue_item.rb
44
+ - lib/active_harmony/service.rb
45
+ - lib/active_harmony/service_manager.rb
46
+ - lib/active_harmony/service_url.rb
47
+ - lib/active_harmony/synchronizable.rb
48
+ - lib/active_harmony/synchronizable/core.rb
49
+ - lib/active_harmony/synchronizable/mongoid.rb
50
+ - lib/active_harmony/synchronizer.rb
51
+ - lib/active_harmony/synchronizer_configuration.rb
52
+ - spec/spec_helper.rb
53
+ - spec/unit/active_harmony/queue_item_spec.rb
54
+ - spec/unit/active_harmony/queue_spec.rb
55
+ - spec/unit/active_harmony/service_manager_spec.rb
56
+ - spec/unit/active_harmony/service_spec.rb
57
+ - spec/unit/active_harmony/synchronizable/core_spec.rb
58
+ - spec/unit/active_harmony/synchronizable/mongoid_spec.rb
59
+ - spec/unit/active_harmony/synchronizer_configuration_spec.rb
60
+ - spec/unit/active_harmony/synchronizer_spec.rb
61
+ has_rdoc: true
62
+ homepage: http://github.com/vojto/active_harmony
63
+ licenses: []
64
+
65
+ post_install_message:
66
+ rdoc_options:
67
+ - --charset=UTF-8
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ hash: 3
76
+ segments:
77
+ - 0
78
+ version: "0"
79
+ required_rubygems_version: !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ requirements: []
89
+
90
+ rubyforge_project:
91
+ rubygems_version: 1.3.7
92
+ signing_key:
93
+ specification_version: 3
94
+ summary: Ruby synchronization with REST services
95
+ test_files:
96
+ - spec/spec_helper.rb
97
+ - spec/unit/active_harmony/queue_item_spec.rb
98
+ - spec/unit/active_harmony/queue_spec.rb
99
+ - spec/unit/active_harmony/service_manager_spec.rb
100
+ - spec/unit/active_harmony/service_spec.rb
101
+ - spec/unit/active_harmony/synchronizable/core_spec.rb
102
+ - spec/unit/active_harmony/synchronizable/mongoid_spec.rb
103
+ - spec/unit/active_harmony/synchronizer_configuration_spec.rb
104
+ - spec/unit/active_harmony/synchronizer_spec.rb