stackmob 0.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.
@@ -0,0 +1,52 @@
1
+ require 'helper'
2
+ require 'rack/test'
3
+
4
+ class DummyApp
5
+ def call(env)
6
+ [200, {}, ""]
7
+ end
8
+ end
9
+
10
+ class SimpleOAuthProviderTest < MiniTest::Unit::TestCase
11
+ include Rack::Test::Methods
12
+
13
+ def app
14
+ StackMob::Rack::SimpleOAuthProvider.new(DummyApp.new)
15
+ end
16
+
17
+ def http_host
18
+ "jordan.panic.int.mob:3000"
19
+ end
20
+
21
+ def secret
22
+ "ebfe8b21-9401-421c-9b98-28bd721cf367"
23
+ end
24
+
25
+ def valid_oauth_header
26
+ "OAuth realm=\"\", oauth_signature=\"5JXBwMgL7yBrsDbxUCrfmidJ1gU%3D\", oauth_nonce=\"1312914650715662000\", oauth_signature_method=\"HMAC-SHA1\", oauth_consumer_key=\"655b062d-8c36-413d-ac0f-8354ca32c5ad\", oauth_timestamp=\"1312914650\""
27
+ end
28
+
29
+ def invalid_oauth_header
30
+ # this header has a slightly altered signature
31
+ "OAuth realm=\"\", oauth_signature=\"5XBwMgL7yBrsDbxUCrfmidJ1gU%3D\", oauth_nonce=\"1312914650715662000\", oauth_signature_method=\"HMAC-SHA1\", oauth_consumer_key=\"655b062d-8c36-413d-ac0f-8354ca32c5ad\", oauth_timestamp=\"1312914650\""
32
+ end
33
+
34
+ def setup
35
+ StackMob.stubs(:config).returns('development' => {}, 'production' => {})
36
+ StackMob.stubs(:secret).returns("ebfe8b21-9401-421c-9b98-28bd721cf367")
37
+ end
38
+
39
+ def test_successful_oauth
40
+ get "/", {}, {"HTTP_AUTHORIZATION" => valid_oauth_header, "HTTP_HOST" => http_host}
41
+
42
+ assert last_response.ok?, "OAuth Failed When it Shouldn't Have"
43
+ end
44
+
45
+ def test_failed_oauth
46
+ get "/", {}, {"HTTP_AUTHORIZATION" => invalid_oauth_header, "HTTP_HOST" => http_host}
47
+
48
+ assert !last_response.ok?, "OAuth Suceeded When it Shouldn't Have"
49
+ end
50
+
51
+ end
52
+
@@ -0,0 +1,105 @@
1
+ require 'helper'
2
+
3
+ class StackmobClientTest < MiniTest::Unit::TestCase
4
+
5
+ attr_reader :valid_client
6
+
7
+ def app_name
8
+ "test"
9
+ end
10
+
11
+ def app_vsn
12
+ 0
13
+ end
14
+
15
+ def test_params
16
+ {:abc => 123, :def => 456}
17
+ end
18
+
19
+ def stub_all_requests(method, resp_obj)
20
+ OAuth::AccessToken.any_instance.stubs(method).returns(resp_obj)
21
+ end
22
+
23
+ def setup
24
+ @valid_client = StackMob::Client.new("http://123.com/", app_name, app_vsn, "some-valid-test-key", "some-valid-test-secret")
25
+ @test_hash = {"a" => 1, "b" => 2}
26
+ @good_resp = mock("Net::HTTPResponse")
27
+ @good_resp.stubs(:code).returns(200)
28
+ @good_resp.stubs(:body).returns(Yajl::Encoder.encode(@test_hash))
29
+
30
+ # hack to give test suite access to underlying oauth object
31
+ class << valid_client
32
+ def _oauth
33
+ @oauth_client
34
+ end
35
+ end
36
+ end
37
+
38
+ def test_response_json_parsed
39
+ stub_all_requests(:get, @good_resp)
40
+
41
+ assert_equal @test_hash, valid_client.request(:get, :some_service, "/abc")
42
+ end
43
+
44
+ def test_requesting_invalid_method_raises_error
45
+ assert_raises StackMob::Client::InvalidRequestMethod do
46
+ valid_client.request(:invalid, :some_service, "/asd")
47
+ end
48
+ end
49
+
50
+ def test_when_resp_code_is_not_200
51
+ failed = mock("Net::HTTPResponse")
52
+ failed.stubs(:code).returns(404)
53
+ stub_all_requests(:get, failed)
54
+
55
+
56
+ assert_raises StackMob::Client::RequestError do
57
+ valid_client.request(:get, :some_service, "/asd")
58
+ end
59
+ end
60
+
61
+ def test_when_json_parsing_will_raise_an_error
62
+ resp_w_invalid_body = mock("Net::HTTPResponse")
63
+ resp_w_invalid_body.stubs(:code).returns(200)
64
+ resp_w_invalid_body.stubs(:body).returns("this is not valid json")
65
+ stub_all_requests(:get, resp_w_invalid_body)
66
+
67
+ assert_raises StackMob::Client::BadResponseBody do
68
+ valid_client.request(:get, :some_service, "/asd")
69
+ end
70
+ end
71
+
72
+ def test_get_with_request_params
73
+ service = :some_service
74
+ path = "user"
75
+
76
+ valid_client._oauth.expects(:get).with("/#{service}/#{app_vsn}/#{app_name}/#{path}?abc=123&def=456", "").returns(@good_resp)
77
+ valid_client.request(:get, service, path, test_params)
78
+ end
79
+
80
+ def test_post_with_request_params
81
+ service = :some_service
82
+ path = "user"
83
+ @good_resp.stubs(:code).returns(201)
84
+
85
+ valid_client._oauth.expects(:post).with("/#{service}/#{app_vsn}/#{app_name}/#{path}", Yajl::Encoder.encode(test_params)).returns(@good_resp)
86
+ valid_client.request(:post, service, path, test_params)
87
+ end
88
+
89
+ def test_delete_with_request_params
90
+ service = :a_service
91
+ path = "abc"
92
+
93
+ valid_client._oauth.expects(:delete).with("/#{service}/#{app_vsn}/#{app_name}/#{path}?something=123", "").returns(@good_resp)
94
+ valid_client.request(:delete, service, path, something: "123")
95
+ end
96
+
97
+ def test_put_with_request_params
98
+ service = :some_service
99
+ path = "abc"
100
+
101
+ valid_client._oauth.expects(:put).with("/#{service}/#{app_vsn}/#{app_name}/#{path}", Yajl::Encoder.encode(test_params)).returns(@good_resp)
102
+ valid_client.request(:put, service, path, test_params)
103
+ end
104
+
105
+ end
@@ -0,0 +1,83 @@
1
+ require 'helper'
2
+
3
+ class StackMobDataStoreTest < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ @mock_client = mock("StackMob::Client")
7
+ @datastore = StackMob::DataStore.new(@mock_client)
8
+ end
9
+
10
+ def test_given_client_is_returned_client
11
+ assert_equal @mock_client, @datastore.client
12
+ end
13
+
14
+ def test_api_schema_calls_listapi
15
+ @mock_client.expects(:request).with(:get, :api, "/listapi").returns("obj" => "")
16
+ @datastore.api_schema
17
+ end
18
+
19
+ def test_delete_call
20
+ uid = "abc"
21
+
22
+ @mock_client.expects(:request).with(:delete, :api, "/user", :user_id => uid).returns(nil)
23
+ @datastore.delete(:user, :user_id => uid)
24
+ end
25
+
26
+ def test_create_call
27
+ name = "test user"
28
+
29
+ @mock_client.expects(:request).with(:post, :api, "/user", :name => name).returns(nil)
30
+ @datastore.create(:user, :name => name)
31
+ end
32
+
33
+ def test_get_all_call
34
+ @mock_client.expects(:request).with(:get, :api, "/user", Hash.new).returns(nil)
35
+ @datastore.get(:user)
36
+ end
37
+
38
+ def test_update_call
39
+ uid = "abc"
40
+ name = "test user"
41
+ params = {:name => name}
42
+
43
+ @mock_client.expects(:request).with(:put, :api, "/user/#{uid}", params).returns(nil)
44
+ @datastore.update(:user, uid, params)
45
+ end
46
+
47
+ def test_create_returns_false_on_request_error
48
+ @mock_client.expects(:request).raises(StackMob::Client::RequestError)
49
+ assert !@datastore.create(:user, :name => "def")
50
+ end
51
+
52
+ def test_create_bang_does_not_catch_error
53
+ @mock_client.expects(:request).raises(StackMob::Client::RequestError)
54
+ assert_raises StackMob::Client::RequestError do
55
+ @datastore.create!(:user, :name => "def")
56
+ end
57
+ end
58
+
59
+ def test_update_returns_false_on_request_error
60
+ @mock_client.expects(:request).raises(StackMob::Client::RequestError)
61
+ assert !@datastore.update(:user, "123", :name => "def")
62
+ end
63
+
64
+ def test_update_bang_does_not_catch_error
65
+ @mock_client.expects(:request).raises(StackMob::Client::RequestError)
66
+ assert_raises StackMob::Client::RequestError do
67
+ @datastore.update!(:user, "123", :name => "def")
68
+ end
69
+ end
70
+
71
+ def test_delete_returns_false_on_request_error
72
+ @mock_client.expects(:request).raises(StackMob::Client::RequestError)
73
+ assert !@datastore.delete(:user, :name => "ads")
74
+ end
75
+
76
+ def test_delete_bang_does_not_catch_error
77
+ @mock_client.expects(:request).raises(StackMob::Client::RequestError)
78
+ assert_raises StackMob::Client::RequestError do
79
+ @datastore.delete!(:user, :name => "def")
80
+ end
81
+ end
82
+
83
+ end
@@ -0,0 +1,21 @@
1
+ require 'helper'
2
+
3
+ class StackMobDeployerTest < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ @mock_client = mock("StackMob::Client")
7
+ @deployer = StackMob::Deployer.new(@mock_client)
8
+ end
9
+
10
+ def test_register_call
11
+ hostname = "testing1234"
12
+ @mock_client.expects(:request).with(:post, :api, "heroku/app", :hostname => hostname)
13
+ @deployer.register(hostname)
14
+ end
15
+
16
+ def test_fetch_call
17
+ @mock_client.expects(:request).with(:get, :api, "heroku/app")
18
+ @deployer.fetch
19
+ end
20
+
21
+ end
@@ -0,0 +1,133 @@
1
+ require 'helper'
2
+
3
+ class StackMobPushTest < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ @test_token = "abcdefghijklmnopqrstuv"
7
+ @user_id = "123"
8
+
9
+ @mock_client = mock("StackMob::Client")
10
+ @push = StackMob::Push.new(@mock_client)
11
+ end
12
+
13
+ def test_given_client_is_returned_client
14
+ assert_equal @mock_client, @push.client
15
+ end
16
+
17
+ def test_register_call
18
+ @mock_client.expects(:request).with(:post, :push, "/device_tokens", :userId => @user_id, :token => @test_token).returns(nil)
19
+ @push.register(@user_id, @test_token)
20
+ end
21
+
22
+ def test_broadcast_call
23
+ badge = 1,
24
+ sound = "testsound.mp3"
25
+ alert = "testing"
26
+
27
+ expected_body = {:recipients => [],
28
+ :aps => {:alert => alert, :sound => sound, :badge => badge},
29
+ :areRecipientsDeviceTokens => true,
30
+ :exclude_tokens => []}
31
+ expected_params = [:post, :push, "/push_broadcast", expected_body]
32
+ @mock_client.expects(:request).with(*expected_params).returns(nil)
33
+
34
+ @push.broadcast(:badge => badge, :sound => sound, :alert => alert)
35
+ end
36
+
37
+ def test_broadcast_missing_alert_raises_error
38
+ assert_raises ArgumentError do
39
+ @push.broadcast(:badge => 0, :sound => "")
40
+ end
41
+ end
42
+
43
+ def test_broadcast_badge_defaults_to_zero
44
+ sound = "test.mp3"
45
+ alert = "alert message"
46
+
47
+ expected_body = {:recipients => [],
48
+ :aps => {:alert => alert, :sound => sound, :badge => 0},
49
+ :areRecipientsDeviceTokens => true,
50
+ :exclude_tokens => []}
51
+ expected_params = [:post, :push, "/push_broadcast", expected_body]
52
+ @mock_client.expects(:request).with(*expected_params).returns(nil)
53
+ @push.broadcast(:sound => sound, :alert => alert)
54
+ end
55
+
56
+ def test_broadcast_sound_defaults_to_empty_string
57
+ badge = 1
58
+ alert = "alert message"
59
+
60
+ expected_body = {:recipients => [],
61
+ :aps => {:alert => alert, :sound => "", :badge => badge},
62
+ :areRecipientsDeviceTokens => true,
63
+ :exclude_tokens => []}
64
+ expected_params = [:post, :push, "/push_broadcast", expected_body]
65
+ @mock_client.expects(:request).with(*expected_params).returns(nil)
66
+ @push.broadcast(:badge => badge, :alert => alert)
67
+ end
68
+
69
+ def test_send_messsage_to_one_call
70
+ sound = "testsound.mp3"
71
+ alert = "Single Message"
72
+ badge = 2
73
+ token = "abc"
74
+
75
+ expected_body = {:recipients => [token],
76
+ :aps => {:badge => badge, :sound => sound, :alert => alert},
77
+ :areRecipientsDeviceTokens => true,
78
+ :exclude_tokens => []}
79
+ expected_params = [:post, :push, "/push", expected_body]
80
+ @mock_client.expects(:request).with(*expected_params).returns(nil)
81
+ @push.send_message(token, :alert => alert, :sound => sound, :badge => badge)
82
+ end
83
+
84
+ def test_send_message_without_alert_raises_error
85
+ assert_raises ArgumentError do
86
+ @push.send_message("avc", :sound => "somefile.mp3", :badge => 1)
87
+ end
88
+ end
89
+
90
+ def test_send_message_defaults_badge_to_zero
91
+ sound = "testsound.mp3"
92
+ alert = "Single Message"
93
+ token = "abc"
94
+
95
+ expected_body = {:recipients => [token],
96
+ :aps => {:badge => 0, :sound => sound, :alert => alert},
97
+ :areRecipientsDeviceTokens => true,
98
+ :exclude_tokens => []}
99
+ expected_params = [:post, :push, "/push", expected_body]
100
+ @mock_client.expects(:request).with(*expected_params).returns(nil)
101
+ @push.send_message(token, :alert => alert, :sound => sound)
102
+ end
103
+
104
+ def test_send_message_defaults_sound_to_empty_string
105
+ alert = "Single Message"
106
+ badge = 2
107
+ token = "abc"
108
+
109
+ expected_body = {:recipients => [token],
110
+ :aps => {:badge => badge, :sound => "", :alert => alert},
111
+ :areRecipientsDeviceTokens => true,
112
+ :exclude_tokens => []}
113
+ expected_params = [:post, :push, "/push", expected_body]
114
+ @mock_client.expects(:request).with(*expected_params).returns(nil)
115
+ @push.send_message(token, :alert => alert, :badge => badge)
116
+ end
117
+
118
+ def test_send_message_with_user_ids
119
+ sound = "testsound.mp3"
120
+ alert = "Single Message"
121
+ badge = 2
122
+ token = "abc"
123
+
124
+ expected_body = {:recipients => [token],
125
+ :aps => {:badge => badge, :sound => sound, :alert => alert},
126
+ :areRecipientsDeviceTokens => false,
127
+ :exclude_tokens => []}
128
+ expected_params = [:post, :push, "/push", expected_body]
129
+ @mock_client.expects(:request).with(*expected_params).returns(nil)
130
+ @push.send_message(token, :alert => alert, :sound => sound, :badge => badge, :recipients_are_users => true)
131
+ end
132
+
133
+ end
metadata ADDED
@@ -0,0 +1,258 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stackmob
3
+ version: !ruby/object:Gem::Version
4
+ hash: 31
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 0
10
+ version: 0.0.0
11
+ platform: ruby
12
+ authors:
13
+ - StackMob
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-08-24 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ type: :runtime
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ hash: 5
28
+ segments:
29
+ - 0
30
+ - 4
31
+ - 5
32
+ version: 0.4.5
33
+ version_requirements: *id001
34
+ name: oauth
35
+ prerelease: false
36
+ - !ruby/object:Gem::Dependency
37
+ type: :runtime
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ hash: 59
44
+ segments:
45
+ - 0
46
+ - 8
47
+ - 2
48
+ version: 0.8.2
49
+ version_requirements: *id002
50
+ name: yajl-ruby
51
+ prerelease: false
52
+ - !ruby/object:Gem::Dependency
53
+ type: :development
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ version_requirements: *id003
64
+ name: minitest
65
+ prerelease: false
66
+ - !ruby/object:Gem::Dependency
67
+ type: :development
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ~>
72
+ - !ruby/object:Gem::Version
73
+ hash: 7
74
+ segments:
75
+ - 0
76
+ - 6
77
+ - 0
78
+ version: 0.6.0
79
+ version_requirements: *id004
80
+ name: yard
81
+ prerelease: false
82
+ - !ruby/object:Gem::Dependency
83
+ type: :development
84
+ requirement: &id005 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ hash: 3
90
+ segments:
91
+ - 0
92
+ version: "0"
93
+ version_requirements: *id005
94
+ name: cucumber
95
+ prerelease: false
96
+ - !ruby/object:Gem::Dependency
97
+ type: :development
98
+ requirement: &id006 !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ hash: 23
104
+ segments:
105
+ - 1
106
+ - 0
107
+ - 0
108
+ version: 1.0.0
109
+ version_requirements: *id006
110
+ name: bundler
111
+ prerelease: false
112
+ - !ruby/object:Gem::Dependency
113
+ type: :development
114
+ requirement: &id007 !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ~>
118
+ - !ruby/object:Gem::Version
119
+ hash: 7
120
+ segments:
121
+ - 1
122
+ - 6
123
+ - 4
124
+ version: 1.6.4
125
+ version_requirements: *id007
126
+ name: jeweler
127
+ prerelease: false
128
+ - !ruby/object:Gem::Dependency
129
+ type: :development
130
+ requirement: &id008 !ruby/object:Gem::Requirement
131
+ none: false
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ hash: 3
136
+ segments:
137
+ - 0
138
+ version: "0"
139
+ version_requirements: *id008
140
+ name: rcov
141
+ prerelease: false
142
+ - !ruby/object:Gem::Dependency
143
+ type: :development
144
+ requirement: &id009 !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ hash: 3
150
+ segments:
151
+ - 0
152
+ version: "0"
153
+ version_requirements: *id009
154
+ name: mocha
155
+ prerelease: false
156
+ - !ruby/object:Gem::Dependency
157
+ type: :development
158
+ requirement: &id010 !ruby/object:Gem::Requirement
159
+ none: false
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ hash: 3
164
+ segments:
165
+ - 0
166
+ version: "0"
167
+ version_requirements: *id010
168
+ name: rack-test
169
+ prerelease: false
170
+ - !ruby/object:Gem::Dependency
171
+ type: :development
172
+ requirement: &id011 !ruby/object:Gem::Requirement
173
+ none: false
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ hash: 3
178
+ segments:
179
+ - 0
180
+ version: "0"
181
+ version_requirements: *id011
182
+ name: bluecloth
183
+ prerelease: false
184
+ description: Support Gem for StackMob Heroku Add-On
185
+ email: jordan@stackmob.com
186
+ executables: []
187
+
188
+ extensions: []
189
+
190
+ extra_rdoc_files:
191
+ - LICENSE.txt
192
+ - README.md
193
+ files:
194
+ - .document
195
+ - Gemfile
196
+ - Gemfile.lock
197
+ - LICENSE.txt
198
+ - README.md
199
+ - Rakefile
200
+ - VERSION
201
+ - lib/stackmob.rb
202
+ - lib/stackmob/client.rb
203
+ - lib/stackmob/data_store.rb
204
+ - lib/stackmob/deployer.rb
205
+ - lib/stackmob/helpers.rb
206
+ - lib/stackmob/push.rb
207
+ - lib/stackmob/rack/simple_oauth_provider.rb
208
+ - lib/stackmob/rails.rb
209
+ - lib/stackmob/railtie.rb
210
+ - lib/stackmob/sinatra.rb
211
+ - lib/stackmob/tasks.rb
212
+ - stackmob.gemspec
213
+ - test/helper.rb
214
+ - test/integration/test_client.rb
215
+ - test/integration/test_data_store.rb
216
+ - test/integration/test_deployer.rb
217
+ - test/integration/test_push.rb
218
+ - test/integration_helper.rb
219
+ - test/unit/stackmob/rack/test_simple_oauth_provider.rb
220
+ - test/unit/stackmob/test_client.rb
221
+ - test/unit/stackmob/test_data_store.rb
222
+ - test/unit/stackmob/test_deployer.rb
223
+ - test/unit/stackmob/test_push.rb
224
+ homepage: http://github.com/stackmob/stackmob-ruby
225
+ licenses:
226
+ - MIT
227
+ post_install_message:
228
+ rdoc_options: []
229
+
230
+ require_paths:
231
+ - lib
232
+ required_ruby_version: !ruby/object:Gem::Requirement
233
+ none: false
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ hash: 3
238
+ segments:
239
+ - 0
240
+ version: "0"
241
+ required_rubygems_version: !ruby/object:Gem::Requirement
242
+ none: false
243
+ requirements:
244
+ - - ">="
245
+ - !ruby/object:Gem::Version
246
+ hash: 3
247
+ segments:
248
+ - 0
249
+ version: "0"
250
+ requirements: []
251
+
252
+ rubyforge_project:
253
+ rubygems_version: 1.8.6
254
+ signing_key:
255
+ specification_version: 3
256
+ summary: Support Gem for StackMob Heroku Add-On
257
+ test_files: []
258
+