simplydb 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,236 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+ require "json"
3
+
4
+ SimplyDB::Server.get('/raise_error') do
5
+ raise SimplyDB::AccessFailure, "With explaination of why..."
6
+ end
7
+
8
+ describe SimplyDB::Server do
9
+ include Rack::Test::Methods
10
+
11
+ let(:default_domains) {["activity", "location", "notification", "person"]}
12
+
13
+ before do
14
+ Timecop.freeze Time.local(2011, 4, 13, 1, 40)
15
+ end
16
+
17
+ before(:all) do
18
+ Timecop.freeze Time.local(2011, 4, 13, 1, 40)
19
+
20
+ VCR.use_cassette("create_env", :record => :none) do
21
+
22
+ default_domains.each do |domain|
23
+ interface.create_domain(domain)
24
+ end
25
+ interface.put_attributes("activity", "testID", {"zip"=>"90210", "address"=>"123 Main St", "age"=>"27", "name"=>"John Smith", "state"=>"CA", "city"=>"San Francisco"}, {}, true)
26
+ interface.put_attributes("activity", "updateID", {"zip"=>"90210", "address"=>"123 Main St", "age"=>"27", "name"=>"John Smith", "state"=>"CA", "city"=>"San Francisco"}, {}, true)
27
+ interface.put_attributes("activity", "delete_partialID", {"zip"=>"90210", "address"=>"123 Main St", "age"=>"27", "name"=>"John Smith", "state"=>"CA", "city"=>"San Francisco"}, {}, true)
28
+ interface.put_attributes("activity", "delete_allID", {"zip"=>"90210", "address"=>"123 Main St", "age"=>"27", "name"=>"John Smith", "state"=>"CA", "city"=>"San Francisco"}, {}, true)
29
+ end
30
+ end
31
+
32
+ after(:all) do
33
+ Timecop.freeze Time.local(2011, 4, 13, 1, 40)
34
+ VCR.use_cassette("destroy_env", :record => :none) do
35
+ default_domains.each do |domain|
36
+ interface.delete_domain(domain)
37
+ end
38
+ end
39
+ Timecop.return
40
+ end
41
+
42
+ def app
43
+ SimplyDB::Server.set :aws_secret_key, ENV['AWS_SECRET_KEY'] || 'thhyyt9ZU3bo0Q/ZOt9C0dD8MZzJS8AUvrE9/B82'
44
+ SimplyDB::Server.set :aws_access_key, ENV['AWS_ACCESS_KEY'] || '1VRWH6Y8EA9RKV7NHSR2'
45
+ SimplyDB::Server.set :environment, :test
46
+ SimplyDB::Server
47
+ end
48
+
49
+ def interface
50
+ SimplyDB::Interface.new(
51
+ :secret_key => ENV['AWS_SECRET_KEY'] || 'thhyyt9ZU3bo0Q/ZOt9C0dD8MZzJS8AUvrE9/B82',
52
+ :access_key => ENV['AWS_ACCESS_KEY'] || '1VRWH6Y8EA9RKV7NHSR2'
53
+ )
54
+ end
55
+
56
+ shared_examples_for "successful JSON response" do
57
+ it "returns successful" do
58
+ last_response.status.should == 200
59
+ end
60
+
61
+ it "sets the content type for JSON" do
62
+ last_response.content_type.should == "application/json"
63
+ end
64
+ end
65
+
66
+ describe "domain operations" do
67
+
68
+ describe "GET#domains" do
69
+ use_vcr_cassette "get_domains", :record => :none
70
+
71
+ before do
72
+ get '/domains'
73
+ end
74
+
75
+ it_behaves_like "successful JSON response"
76
+
77
+ it "returns list of domains" do
78
+ JSON.parse(last_response.body).should == ["activity", "location", "notification", "person"]
79
+ end
80
+ end
81
+
82
+ describe "PUT#domains" do
83
+ use_vcr_cassette "put_domains", :record => :none
84
+
85
+ before do
86
+ put '/domains', {:name => 'information'}
87
+ end
88
+
89
+ after do
90
+ interface.delete_domain("information")
91
+ end
92
+
93
+ it_behaves_like "successful JSON response"
94
+
95
+ it "returns a list of current domains" do
96
+ JSON.parse(last_response.body).should == ["activity", "information", "location", "notification", "person"]
97
+ end
98
+ end
99
+
100
+ describe "DELETE#domains" do
101
+ use_vcr_cassette "delete_domains", :record => :none
102
+
103
+ before do
104
+ interface.create_domain("information")
105
+ delete '/domains', {:name => 'information'}
106
+ end
107
+
108
+ it_behaves_like "successful JSON response"
109
+
110
+ it "returns a list of current domains" do
111
+ JSON.parse(last_response.body).should == ["activity", "location", "notification", "person"]
112
+ end
113
+ end
114
+
115
+ describe "GET#domains by name" do
116
+ use_vcr_cassette "show_domains", :record => :none
117
+
118
+ before do
119
+ get '/domains/activity'
120
+ end
121
+
122
+ it_behaves_like "successful JSON response"
123
+
124
+ it "returns the meta data" do
125
+ attributes = JSON.parse(last_response.body)
126
+ attributes.delete("Timestamp")
127
+ attributes.should == {"ItemCount"=>"4", "ItemNamesSizeBytes"=>"42", "AttributeNameCount"=>"6", "AttributeNamesSizeBytes"=>"26", "AttributeValueCount"=>"24", "AttributeValuesSizeBytes"=>"172"}
128
+ end
129
+ end
130
+ end
131
+
132
+ describe "item operations" do
133
+ describe "GET#items by id" do
134
+ use_vcr_cassette "get_items", :record => :none
135
+
136
+ before do
137
+ get '/domains/activity/items/testID'
138
+ end
139
+
140
+ it_behaves_like "successful JSON response"
141
+
142
+ it "returns list of the current attributes" do
143
+ JSON.parse(last_response.body).should == {"zip"=>"90210", "address"=>"123 Main St", "age"=>"27", "name"=>"John Smith", "state"=>"CA", "city"=>"San Francisco"}
144
+ end
145
+ end
146
+
147
+ describe "PUT#items by id" do
148
+ use_vcr_cassette "put_items", :record => :none
149
+
150
+ before do
151
+ put '/domains/activity/items/updateID', "item" => {"zip" => "12345", "age" => "28"}
152
+ end
153
+
154
+ it_behaves_like "successful JSON response"
155
+
156
+ it "returns an empty response" do
157
+ last_response.body.should == ""
158
+ end
159
+
160
+ it "updates the attributes" do
161
+ interface.get_attributes("activity", "updateID").should == {"zip"=>"12345", "address"=>"123 Main St", "age"=>"28", "name"=>"John Smith", "state"=>"CA", "city"=>"San Francisco"}
162
+ end
163
+ end
164
+
165
+ describe "GET#items" do
166
+ use_vcr_cassette "get_all_items", :record => :none
167
+ before do
168
+ get '/domains/activity/items'
169
+ end
170
+
171
+ it_behaves_like "successful JSON response"
172
+
173
+ it "returns a hash of item id to attributes" do
174
+ JSON.parse(last_response.body).should == [
175
+ {"testID"=>{"zip"=>"90210", "address"=>"123 Main St", "name"=>"John Smith", "age"=>"27", "state"=>"CA", "city"=>"San Francisco"}},
176
+ {"updateID"=>{"zip"=>"12345", "address"=>"123 Main St", "name"=>"John Smith", "age"=>"28", "state"=>"CA", "city"=>"San Francisco"}},
177
+ {"delete_partialID"=>{"zip"=>"90210", "address"=>"123 Main St", "name"=>"John Smith", "age"=>"27", "state"=>"CA", "city"=>"San Francisco"}},
178
+ {"delete_allID"=>{"zip"=>"90210", "address"=>"123 Main St", "name"=>"John Smith", "age"=>"27", "state"=>"CA", "city"=>"San Francisco"}}
179
+ ]
180
+ end
181
+ end
182
+
183
+ describe "DELETE#items by id" do
184
+ context "delete certain attributes" do
185
+ use_vcr_cassette "delete_items", :record => :none
186
+
187
+ before do
188
+ delete '/domains/activity/items/delete_partialID', "item" => {"zip" => "90210", "age" => "27"}
189
+ end
190
+
191
+ it_behaves_like "successful JSON response"
192
+
193
+ it "returns an empty response" do
194
+ last_response.body.should == ""
195
+ end
196
+
197
+ it "updates the attributes" do
198
+ interface.get_attributes("activity", "delete_partialID").should == {"address"=>"123 Main St", "name"=>"John Smith", "state"=>"CA", "city"=>"San Francisco"}
199
+ end
200
+ end
201
+
202
+ context "deletes the entire item" do
203
+ use_vcr_cassette "delete_items_all", :record => :none
204
+
205
+ before do
206
+ delete '/domains/activity/items/delete_allID'
207
+ end
208
+
209
+ it_behaves_like "successful JSON response"
210
+
211
+ it "returns an empty response" do
212
+ last_response.body.should == ""
213
+ end
214
+
215
+ it "updates the attributes" do
216
+ interface.get_attributes("activity", "delete_allID").should == {}
217
+ end
218
+ end
219
+ end
220
+
221
+ describe "when handling errors from SimplyDB::Error" do
222
+ before do
223
+ get '/raise_error'
224
+ end
225
+
226
+ it "should proxy the HTTP error code associated with the SimplyDB::Error" do
227
+ last_response.status.should == SimplyDB::AccessFailure.http_status_code
228
+ end
229
+
230
+ it "should set a header with the supplied error message" do
231
+ last_response.headers['AMZ-ERROR-TYPE'].should == "AccessFailure"
232
+ last_response.headers['AMZ-ERROR-MESSAGE'].should == "With explaination of why..."
233
+ end
234
+ end
235
+ end
236
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,24 +1,32 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
- require 'simplydb'
4
- require 'spec'
5
- require 'spec/autorun'
6
3
 
7
4
  require 'rubygems'
5
+ require 'rack/test'
6
+ require 'rspec'
7
+ require 'webmock/rspec'
8
+ require 'vcr'
8
9
  require 'timecop'
10
+ require 'simplydb'
9
11
 
10
- Spec::Runner.configure do |config|
12
+ Dir[File.join(File.dirname(__FILE__), "support/**/*.rb")].each {|f| require f}
13
+
14
+ Rspec.configure do |config|
11
15
  def access_key
12
- return '12345'
16
+ '12345'
13
17
  end
14
18
 
15
19
  def secret_key
16
- return '67890'
20
+ '67890'
17
21
  end
18
-
19
- def run_today(time = Time.gm(2008, 9, 1, 12, 0, 0))
20
- Timecop.freeze(time) do
21
- yield
22
- end
22
+
23
+ config.extend VCR::RSpec::Macros
24
+
25
+ config.before do
26
+ Timecop.freeze Time.local(2011,4,11, 23, 9)
27
+ end
28
+
29
+ config.after do
30
+ Timecop.return
23
31
  end
24
32
  end
@@ -0,0 +1,7 @@
1
+ VCR.config do |c|
2
+ c.cassette_library_dir = File.join(File.dirname(__FILE__), '..', 'fixtures', 'vcr')
3
+ c.stub_with :webmock
4
+ c.default_cassette_options = {
5
+ :match_requests_on => [:uri, :method, :body]
6
+ }
7
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simplydb
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
5
- prerelease: false
4
+ hash: 25
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - JT Archie
@@ -15,43 +15,39 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-06 00:00:00 -07:00
18
+ date: 2011-04-14 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: rspec
22
+ name: sinatra
23
23
  prerelease: false
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- hash: 13
29
+ hash: 3
30
30
  segments:
31
- - 1
32
- - 2
33
- - 9
34
- version: 1.2.9
35
- type: :development
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
36
34
  version_requirements: *id001
37
35
  - !ruby/object:Gem::Dependency
38
- name: typhoeus
36
+ name: nokogiri
39
37
  prerelease: false
40
38
  requirement: &id002 !ruby/object:Gem::Requirement
41
39
  none: false
42
40
  requirements:
43
41
  - - ">="
44
42
  - !ruby/object:Gem::Version
45
- hash: 45
43
+ hash: 3
46
44
  segments:
47
45
  - 0
48
- - 1
49
- - 27
50
- version: 0.1.27
46
+ version: "0"
51
47
  type: :runtime
52
48
  version_requirements: *id002
53
49
  - !ruby/object:Gem::Dependency
54
- name: nokogiri
50
+ name: rest-client
55
51
  prerelease: false
56
52
  requirement: &id003 !ruby/object:Gem::Requirement
57
53
  none: false
@@ -60,69 +56,139 @@ dependencies:
60
56
  - !ruby/object:Gem::Version
61
57
  hash: 3
62
58
  segments:
63
- - 1
64
- - 4
65
- - 2
66
- version: 1.4.2
59
+ - 0
60
+ version: "0"
67
61
  type: :runtime
68
62
  version_requirements: *id003
69
63
  - !ruby/object:Gem::Dependency
70
- name: uuidtools
64
+ name: json
71
65
  prerelease: false
72
66
  requirement: &id004 !ruby/object:Gem::Requirement
73
67
  none: false
74
68
  requirements:
75
69
  - - ">="
76
70
  - !ruby/object:Gem::Version
77
- hash: 9
71
+ hash: 3
78
72
  segments:
79
- - 2
80
- - 1
81
- - 1
82
- version: 2.1.1
73
+ - 0
74
+ version: "0"
83
75
  type: :runtime
84
76
  version_requirements: *id004
85
- description: A minimal interface to Amazon SimpleDB that has separation of interfaces. From the low level HTTP request access to high level Ruby abstraction ORM.
86
- email: jtarchie@gmail.com
77
+ - !ruby/object:Gem::Dependency
78
+ name: rspec
79
+ prerelease: false
80
+ requirement: &id005 !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ hash: 3
86
+ segments:
87
+ - 0
88
+ version: "0"
89
+ type: :development
90
+ version_requirements: *id005
91
+ - !ruby/object:Gem::Dependency
92
+ name: rack-test
93
+ prerelease: false
94
+ requirement: &id006 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ hash: 3
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ type: :development
104
+ version_requirements: *id006
105
+ - !ruby/object:Gem::Dependency
106
+ name: webmock
107
+ prerelease: false
108
+ requirement: &id007 !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ hash: 3
114
+ segments:
115
+ - 0
116
+ version: "0"
117
+ type: :development
118
+ version_requirements: *id007
119
+ - !ruby/object:Gem::Dependency
120
+ name: vcr
121
+ prerelease: false
122
+ requirement: &id008 !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ hash: 3
128
+ segments:
129
+ - 0
130
+ version: "0"
131
+ type: :development
132
+ version_requirements: *id008
133
+ - !ruby/object:Gem::Dependency
134
+ name: timecop
135
+ prerelease: false
136
+ requirement: &id009 !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ hash: 3
142
+ segments:
143
+ - 0
144
+ version: "0"
145
+ type: :development
146
+ version_requirements: *id009
147
+ description: Simple interface for SimpleDB.
148
+ email:
149
+ - jtarchie@gmail.com
87
150
  executables: []
88
151
 
89
152
  extensions: []
90
153
 
91
- extra_rdoc_files:
92
- - LICENSE
93
- - README.rdoc
154
+ extra_rdoc_files: []
155
+
94
156
  files:
95
- - .document
96
157
  - .gitignore
97
- - LICENSE
98
- - README.rdoc
158
+ - Gemfile
159
+ - README.md
99
160
  - Rakefile
100
- - VERSION
101
- - examples/interface.rb
102
- - examples/record.rb
103
161
  - lib/simplydb.rb
104
162
  - lib/simplydb/client.rb
105
- - lib/simplydb/clients/typhoeus.rb
106
163
  - lib/simplydb/error.rb
107
- - lib/simplydb/extensions.rb
108
164
  - lib/simplydb/interface.rb
109
- - lib/simplydb/record.rb
110
- - lib/simplydb/record/base.rb
165
+ - lib/simplydb/server.rb
166
+ - lib/simplydb/version.rb
111
167
  - simplydb.gemspec
112
168
  - spec/client_spec.rb
113
169
  - spec/error_spec.rb
114
- - spec/extensions_spec.rb
170
+ - spec/fixtures/vcr/create_env.yml
171
+ - spec/fixtures/vcr/delete_domains.yml
172
+ - spec/fixtures/vcr/delete_items.yml
173
+ - spec/fixtures/vcr/delete_items_all.yml
174
+ - spec/fixtures/vcr/destroy_env.yml
175
+ - spec/fixtures/vcr/get_all_items.yml
176
+ - spec/fixtures/vcr/get_domains.yml
177
+ - spec/fixtures/vcr/get_items.yml
178
+ - spec/fixtures/vcr/put_domains.yml
179
+ - spec/fixtures/vcr/put_items.yml
180
+ - spec/fixtures/vcr/show_domains.yml
115
181
  - spec/interface_spec.rb
116
- - spec/record/base_spec.rb
117
- - spec/spec.opts
182
+ - spec/server_spec.rb
118
183
  - spec/spec_helper.rb
184
+ - spec/support/vcr.rb
119
185
  has_rdoc: true
120
- homepage: http://github.com/jtarchie/simplydb
186
+ homepage: http://rubygems.org/gems/simplydb
121
187
  licenses: []
122
188
 
123
189
  post_install_message:
124
- rdoc_options:
125
- - --charset=UTF-8
190
+ rdoc_options: []
191
+
126
192
  require_paths:
127
193
  - lib
128
194
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -145,17 +211,26 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
211
  version: "0"
146
212
  requirements: []
147
213
 
148
- rubyforge_project:
149
- rubygems_version: 1.3.7
214
+ rubyforge_project: simplydb
215
+ rubygems_version: 1.4.2
150
216
  signing_key:
151
217
  specification_version: 3
152
- summary: A minimal interface to Amazon SimpleDB.
218
+ summary: Simple interface for SimpleDB.
153
219
  test_files:
154
220
  - spec/client_spec.rb
155
221
  - spec/error_spec.rb
156
- - spec/extensions_spec.rb
222
+ - spec/fixtures/vcr/create_env.yml
223
+ - spec/fixtures/vcr/delete_domains.yml
224
+ - spec/fixtures/vcr/delete_items.yml
225
+ - spec/fixtures/vcr/delete_items_all.yml
226
+ - spec/fixtures/vcr/destroy_env.yml
227
+ - spec/fixtures/vcr/get_all_items.yml
228
+ - spec/fixtures/vcr/get_domains.yml
229
+ - spec/fixtures/vcr/get_items.yml
230
+ - spec/fixtures/vcr/put_domains.yml
231
+ - spec/fixtures/vcr/put_items.yml
232
+ - spec/fixtures/vcr/show_domains.yml
157
233
  - spec/interface_spec.rb
158
- - spec/record/base_spec.rb
234
+ - spec/server_spec.rb
159
235
  - spec/spec_helper.rb
160
- - examples/interface.rb
161
- - examples/record.rb
236
+ - spec/support/vcr.rb