active_harmony 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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