stackmob 0.0.0

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