rod-rest 0.0.1.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -35,7 +35,7 @@ module Rod
35
35
 
36
36
  let(:car_type) { "Test::Car" }
37
37
  let(:mercedes_300_hash) { { rod_id: mercedes_300_id, name: mercedes_300_name, type: car_type,
38
- owner: { rod_id: schumaher_id, type: person_type}, drivers: { count: drivers_count } } }
38
+ owner: schumaher_hash, drivers: { count: drivers_count } } }
39
39
  let(:mercedes_300_id) { 1 }
40
40
  let(:mercedes_300_name) { "Mercedes 300" }
41
41
 
@@ -74,13 +74,61 @@ module Rod
74
74
  mercedes_300.name.should == mercedes_300_name
75
75
  end
76
76
 
77
- it "has an valid 'owner' singular association" do
77
+ it "has a valid 'owner' singular association" do
78
78
  mercedes_300.owner.should == owner_object
79
79
  end
80
80
 
81
+ it "caches 'owner' singular association" do
82
+ mercedes_300.owner
83
+ mercedes_300.owner
84
+ expect(client).to have_received.fetch_object(schumaher_hash) { schumaher_object }.once
85
+ end
86
+
81
87
  it "has a valid 'drivers' plural association" do
82
88
  mercedes_300.drivers.should == collection_proxy
83
89
  end
90
+
91
+ it "caches 'drivers' plural association" do
92
+ mercedes_300.drivers
93
+ mercedes_300.drivers
94
+ expect(collection_proxy_factory).to have_received.new(anything,drivers_association_name,drivers_count,client) { collection_proxy }.once
95
+ end
96
+
97
+ describe "#inspect" do
98
+ it "reports that it is a proxy" do
99
+ mercedes_300.inspect.should match(/Proxy/)
100
+ end
101
+
102
+ it "reports the type of the object" do
103
+ mercedes_300.inspect.should match(/#{car_type}/)
104
+ end
105
+
106
+ it "reports the id of the object" do
107
+ mercedes_300.inspect.should match(/#{mercedes_300_id}/)
108
+ end
109
+
110
+ it "reports the name of the car" do
111
+ mercedes_300.inspect.should match(/name:#{mercedes_300_name}/)
112
+ end
113
+
114
+ it "reports the owner of the car" do
115
+ mercedes_300.inspect.should match(/owner:#{person_type}:#{schumaher_id}/)
116
+ end
117
+
118
+ it "reports the drivers of the car" do
119
+ mercedes_300.inspect.should match(/drivers\[#{drivers_count}\]/)
120
+ end
121
+ end
122
+
123
+ describe "#to_s" do
124
+ it "reports the type of the object" do
125
+ mercedes_300.to_s.should match(/#{car_type}/)
126
+ end
127
+
128
+ it "reports the id of the object" do
129
+ mercedes_300.to_s.should match(/#{mercedes_300_id}/)
130
+ end
131
+ end
84
132
  end
85
133
  end
86
134
  end
@@ -0,0 +1,80 @@
1
+ require 'bundler/setup'
2
+ require_relative 'test_helper'
3
+ require 'rod/rest/proxy_cache'
4
+
5
+ module Rod
6
+ module Rest
7
+ describe ProxyCache do
8
+ let(:cache) { ProxyCache.new }
9
+ let(:object) { object = stub!.rod_id { object_id }.subject
10
+ stub(object).type { object_type }
11
+ object
12
+ }
13
+ let(:object_id) { 1 }
14
+ let(:object_type) { "Car" }
15
+ let(:description) { {rod_id: object_id, type: object_type} }
16
+
17
+ describe "#store" do
18
+ it "stores objects" do
19
+ cache.store(object).should == object
20
+ end
21
+
22
+ it "raises InvalidData if the object cannot be stored" do
23
+ lambda { cache.store(Object.new) }.should raise_error(InvalidData)
24
+ end
25
+ end
26
+
27
+ describe "#has_key?" do
28
+ context "without object in the cache" do
29
+ it "returns false" do
30
+ cache.has_key?(description).should == false
31
+ end
32
+ end
33
+
34
+ context "with object in the cache" do
35
+ before do
36
+ cache.store(object)
37
+ end
38
+
39
+ it "returns true" do
40
+ cache.has_key?(description).should == true
41
+ end
42
+ end
43
+
44
+ context "with invalid description" do
45
+ let(:description) { Object.new }
46
+
47
+ it "raises InvalidData exception" do
48
+ lambda { cache.has_key?(description) }.should raise_error(InvalidData)
49
+ end
50
+ end
51
+ end
52
+
53
+ describe "#[description]" do
54
+ context "with object in the cache" do
55
+ before do
56
+ cache.store(object)
57
+ end
58
+
59
+ it "returns the object" do
60
+ cache[description].should == object
61
+ end
62
+ end
63
+
64
+ context "without object in the cache" do
65
+ it "raises CacheMissed exception" do
66
+ lambda { cache[description] }.should raise_error(CacheMissed)
67
+ end
68
+ end
69
+
70
+ context "with invalid description" do
71
+ let(:description) { Object.new }
72
+
73
+ it "raises InvalidData exception" do
74
+ lambda { cache[description] }.should raise_error(InvalidData)
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -5,7 +5,7 @@ require 'rod/rest/proxy_factory'
5
5
  module Rod
6
6
  module Rest
7
7
  describe ProxyFactory do
8
- let(:factory) { ProxyFactory.new(metadata,client,proxy_class: proxy_class) }
8
+ let(:factory) { ProxyFactory.new(metadata,client,proxy_class: proxy_class,cache: cache) }
9
9
  let(:metadata) { [car_metadata,person_metadata] }
10
10
  let(:car_metadata) { stub!.name { car_type }.subject }
11
11
  let(:person_metadata) { stub!.name { person_type }.subject }
@@ -17,6 +17,7 @@ module Rod
17
17
  stub(klass).new(person_metadata,client) { person_proxy_factory }
18
18
  klass
19
19
  }
20
+ let(:cache) { nil }
20
21
  let(:car_proxy_factory) { stub!.new(mercedes_300_hash) { mercedes_300 }.subject }
21
22
  let(:person_proxy_factory) { stub!.new(schumaher_hash) { schumaher }.subject }
22
23
  let(:mercedes_300_hash) { { rod_id: mercedes_300_id, type: car_type } }
@@ -39,6 +40,20 @@ module Rod
39
40
  it "raises UnknownResource for unknown resource type" do
40
41
  lambda { factory.build(unknown_hash) }.should raise_error(UnknownResource)
41
42
  end
43
+
44
+ describe "with cache" do
45
+ let(:cache) { cache = mock!.has_key?(mercedes_300_hash) { false }.subject
46
+ mock(cache).has_key?(mercedes_300_hash) { true }
47
+ mock(cache).[](mercedes_300_hash) { mercedes_300 }
48
+ cache
49
+ }
50
+
51
+ it "doesn't create objects twice" do
52
+ factory.build(mercedes_300_hash)
53
+ factory.build(mercedes_300_hash)
54
+ expect(car_proxy_factory).to have_received.new(mercedes_300_hash).once
55
+ end
56
+ end
42
57
  end
43
58
  end
44
59
  end
@@ -90,6 +90,18 @@ module Rod
90
90
  it "allows to iterate over the indexed properties" do
91
91
  resource_metadata.indexed_properties.should respond_to(:each)
92
92
  end
93
+
94
+ describe "#inspect" do
95
+ it "reports the description of the metadata" do
96
+ resource_metadata.inspect.should == description.inspect
97
+ end
98
+ end
99
+
100
+ describe "#to_s" do
101
+ it "reports the description of the metadata" do
102
+ resource_metadata.to_s.should == description.to_s
103
+ end
104
+ end
93
105
  end
94
106
  end
95
107
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rod-rest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.1
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-27 00:00:00.000000000 Z
12
+ date: 2014-02-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sinatra
@@ -121,6 +121,7 @@ files:
121
121
  - Gemfile.lock
122
122
  - Rakefile
123
123
  - Readme.md
124
+ - changelog.txt
124
125
  - lib/rod/rest.rb
125
126
  - lib/rod/rest/api.rb
126
127
  - lib/rod/rest/client.rb
@@ -132,6 +133,7 @@ files:
132
133
  - lib/rod/rest/naming.rb
133
134
  - lib/rod/rest/property_metadata.rb
134
135
  - lib/rod/rest/proxy.rb
136
+ - lib/rod/rest/proxy_cache.rb
135
137
  - lib/rod/rest/proxy_factory.rb
136
138
  - lib/rod/rest/resource_metadata.rb
137
139
  - rod-rest.gemspec
@@ -143,6 +145,7 @@ files:
143
145
  - test/spec/metadata.rb
144
146
  - test/spec/property_metadata.rb
145
147
  - test/spec/proxy.rb
148
+ - test/spec/proxy_cache.rb
146
149
  - test/spec/proxy_factory.rb
147
150
  - test/spec/resource_metadata.rb
148
151
  - test/spec/test_helper.rb
@@ -171,3 +174,4 @@ signing_key:
171
174
  specification_version: 3
172
175
  summary: REST API for ROD
173
176
  test_files: []
177
+ has_rdoc: