yam 0.0.6 → 1.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.
Files changed (88) hide show
  1. data.tar.gz.sig +0 -0
  2. data/.travis.yml +5 -0
  3. data/.yardopts +10 -0
  4. data/AUTHORS +1 -0
  5. data/CHANGELOG.md +7 -0
  6. data/CONTRIBUTING.md +0 -7
  7. data/Gemfile +27 -1
  8. data/README.md +190 -67
  9. data/Rakefile +9 -3
  10. data/certs/public.pem +20 -0
  11. data/lib/yammer.rb +47 -0
  12. data/lib/yammer/api.rb +29 -0
  13. data/lib/yammer/api/autocomplete.rb +39 -0
  14. data/lib/yammer/api/group.rb +92 -0
  15. data/lib/yammer/api/group_membership.rb +46 -0
  16. data/lib/yammer/api/invitation.rb +39 -0
  17. data/lib/yammer/api/like.rb +57 -0
  18. data/lib/yammer/api/message.rb +227 -0
  19. data/lib/yammer/api/network.rb +35 -0
  20. data/lib/yammer/api/notification.rb +32 -0
  21. data/lib/yammer/api/open_graph_object.rb +92 -0
  22. data/lib/yammer/api/pending_attachment.rb +64 -0
  23. data/lib/yammer/api/search.rb +42 -0
  24. data/lib/yammer/api/subscription.rb +32 -0
  25. data/lib/yammer/api/thread.rb +37 -0
  26. data/lib/yammer/api/topic.rb +37 -0
  27. data/lib/yammer/api/user.rb +168 -0
  28. data/lib/yammer/api_handler.rb +27 -0
  29. data/lib/yammer/api_response.rb +57 -0
  30. data/lib/yammer/base.rb +208 -0
  31. data/lib/yammer/client.rb +100 -0
  32. data/lib/yammer/configurable.rb +81 -0
  33. data/lib/yammer/error.rb +75 -0
  34. data/lib/yammer/group.rb +27 -0
  35. data/lib/yammer/group_membership.rb +25 -0
  36. data/lib/yammer/http_adapter.rb +100 -0
  37. data/lib/yammer/identity_map.rb +56 -0
  38. data/lib/yammer/message.rb +32 -0
  39. data/lib/yammer/message_body.rb +27 -0
  40. data/lib/yammer/pending_attachment.rb +19 -0
  41. data/lib/yammer/thread.rb +58 -0
  42. data/lib/yammer/user.rb +66 -0
  43. data/lib/yammer/version.rb +32 -0
  44. data/{lib/yam/configuration.rb → spec/api/autocomplete_spec.rb} +18 -23
  45. data/spec/api/group_membership_spec.rb +48 -0
  46. data/spec/api/group_spec.rb +76 -0
  47. data/spec/api/invitation_spec.rb +60 -0
  48. data/spec/api/like_spec.rb +46 -0
  49. data/spec/api/message_spec.rb +136 -0
  50. data/spec/api/network_spec.rb +41 -0
  51. data/{lib/yam/client.rb → spec/api/notification_spec.rb} +22 -4
  52. data/spec/api/open_graph_object_spec.rb +67 -0
  53. data/spec/api/pending_attachment_spec.rb +56 -0
  54. data/{lib/yam/constants.rb → spec/api/search_spec.rb} +21 -8
  55. data/spec/api/subscription_spec.rb +41 -0
  56. data/{lib/yam.rb → spec/api/thread_spec.rb} +19 -12
  57. data/{lib/yam/request.rb → spec/api/topic_spec.rb} +19 -15
  58. data/spec/api/user_spec.rb +108 -0
  59. data/spec/api_response.rb +86 -0
  60. data/spec/client_spec.rb +364 -0
  61. data/spec/error_spec.rb +88 -0
  62. data/spec/fixtures/group.json +1 -0
  63. data/spec/fixtures/message.json +1 -0
  64. data/spec/fixtures/messages_in_thread.json +1 -0
  65. data/spec/fixtures/portal_thread.json +1 -0
  66. data/spec/fixtures/private_thread.json +1 -0
  67. data/spec/fixtures/public_thread.json +1 -0
  68. data/spec/fixtures/user.json +1 -0
  69. data/spec/fixtures/users_followed.json +1 -0
  70. data/spec/fixtures/users_following.json +1 -0
  71. data/spec/http_adapter_spec.rb +109 -0
  72. data/spec/identity_map_spec.rb +127 -0
  73. data/spec/mocks/attachment.txt +1 -0
  74. data/spec/model/base_spec.rb +196 -0
  75. data/spec/model/group_membership_spec.rb +57 -0
  76. data/spec/model/group_spec.rb +73 -0
  77. data/spec/model/message_spec.rb +74 -0
  78. data/spec/model/thread_spec.rb +91 -0
  79. data/spec/model/user_spec.rb +222 -0
  80. data/spec/spec_helper.rb +39 -14
  81. data/yam.gemspec +50 -28
  82. metadata +270 -187
  83. metadata.gz.sig +0 -0
  84. data/lib/yam/api.rb +0 -53
  85. data/lib/yam/connection.rb +0 -57
  86. data/lib/yam/version.rb +0 -20
  87. data/spec/yam/client_spec.rb +0 -50
  88. data/spec/yam_spec.rb +0 -87
@@ -0,0 +1,86 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ # Copyright (c) Microsoft Corporation
4
+ # All rights reserved.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
13
+ # ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY
14
+ # IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR
15
+ # PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT.
16
+ #
17
+ # See the Apache Version 2.0 License for specific language governing
18
+ # permissions and limitations under the License.
19
+
20
+ require File.expand_path('../spec_helper', __FILE__)
21
+ require 'yammer/response'
22
+
23
+ describe Yammer::ApiResponse do
24
+
25
+ context 'successful response' do
26
+ subject do
27
+ headers = { 'Location' => 'https://www.yammer.com/api/v1/messages/2' }
28
+ body = '{ "system_message":false, "direct_message":true, "id":10928508, "privacy":"private", "network_id":1 }'
29
+ code = '200'
30
+ Yammer::ApiResponse.new(headers, body, code)
31
+ end
32
+
33
+ describe '#raw_body' do
34
+ it 'returns a string' do
35
+ expect(subject.raw_body).to eq('{ "system_message":false, "direct_message":true, "id":10928508, "privacy":"private", "network_id":1 }')
36
+ end
37
+ end
38
+
39
+ describe '#body' do
40
+ it 'return a hash' do
41
+ expect(subject.body).to eq({ :system_message => false, :direct_message => true, :id => 10928508, :privacy => 'private', :network_id => 1 })
42
+ end
43
+ end
44
+
45
+ describe '#success' do
46
+ it 'returns true' do
47
+ expect(subject.success?).to eq true
48
+ end
49
+ end
50
+
51
+ describe '#created?' do
52
+ it 'returns true' do
53
+ expect(subject.created?).to eq false
54
+ end
55
+ end
56
+ end
57
+
58
+ context 'failed response' do
59
+
60
+ subject { Yammer::ApiResponse.new(double( :headers => {}, :body => '', :code => '500')) }
61
+
62
+ describe '#raw_body' do
63
+ it 'returns a string' do
64
+ expect(subject.raw_body).to eq('')
65
+ end
66
+ end
67
+
68
+ describe '#body' do
69
+ it 'return a hash' do
70
+ expect(subject.body).to eq('')
71
+ end
72
+ end
73
+
74
+ describe '#success' do
75
+ it 'returns true' do
76
+ expect(subject.success?).to eq false
77
+ end
78
+ end
79
+
80
+ describe '#created?' do
81
+ it 'returns true' do
82
+ expect(subject.created?).to eq false
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,364 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ # Copyright (c) Microsoft Corporation
4
+ # All rights reserved.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
13
+ # ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY
14
+ # IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR
15
+ # PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT.
16
+ #
17
+ # See the Apache Version 2.0 License for specific language governing
18
+ # permissions and limitations under the License.
19
+
20
+ require File.expand_path('../spec_helper', __FILE__)
21
+
22
+ describe Yammer::Client do
23
+
24
+ before :each do
25
+ @configuration = {
26
+ :site_url => 'https://www.yammer.com',
27
+ :client_id => 'PRbTcg9qjgKsp4jjpm1pw',
28
+ :client_secret => 'Xn7kp7Ly0TCY4GtZWkmSsqGEPg10DmMADyjWkf2U',
29
+ :access_token => 'TolNOFka9Uls2DxahNi78A',
30
+ :connection_options => { :max_redirects => 5, :use_ssl => true },
31
+ :default_headers => {"Accept"=>"application/json", "User-Agent"=>"Yammer Ruby Gem #{Yammer::Version}"}
32
+ }
33
+
34
+ Yammer.configure do |config|
35
+ @configuration.each do |key, val|
36
+ config.send("#{key}=", val)
37
+ end
38
+ end
39
+ end
40
+
41
+ after :each do
42
+ Yammer.reset!
43
+ end
44
+
45
+ subject { Yammer::Client.new(@configuration) }
46
+
47
+ context "with module configuration" do
48
+
49
+ before :each do
50
+ @default_conf = {
51
+ :site_url => nil,
52
+ :client_id => nil,
53
+ :client_secret => nil,
54
+ :access_token => nil,
55
+ :default_headers => {"Accept"=>"application/json", "User-Agent"=>"Yammer Ruby Gem #{Yammer::Version}"},
56
+ :connection_options => {}
57
+ }
58
+ Yammer.configure do |config|
59
+ Yammer::Configurable.keys.each do |key|
60
+ config.send("#{key}=", @default_conf[key])
61
+ end
62
+ end
63
+ end
64
+
65
+ after do
66
+ Yammer.reset!
67
+ end
68
+
69
+ it "inherits the module configuration" do
70
+ client = Yammer::Client.new
71
+ @default_conf.each do |key, value|
72
+ expect(client.instance_variable_get(:"@#{key}")).to eq value
73
+ end
74
+ end
75
+
76
+ context "with initialization options" do
77
+ before(:all) do
78
+ @conf = {
79
+ :site_url => 'https://www.yammer.com',
80
+ :client_id => 'PRbTcg9qjgKsp4jjpm1pw',
81
+ :client_secret => 'Xn7kp7Ly0TCY4GtZWkmSsqGEPg10DmMADyjWkf2U',
82
+ :access_token => 'TolNOFka9Uls2DxahNi78A',
83
+ :default_headers => {"Accept"=>"application/json", "User-Agent"=>"Yammer Ruby Gem 0.1.1"},
84
+ :connection_options => { :max_redirects => 5, :use_ssl => true }
85
+ }
86
+ end
87
+
88
+ context "during initialization" do
89
+ it "overrides the module configuration" do
90
+ client = Yammer::Client.new(@conf)
91
+ Yammer::Configurable.keys.each do |key|
92
+ expect(client.instance_variable_get(:"@#{key}")).to eq @conf[key]
93
+ end
94
+ end
95
+ end
96
+
97
+ context "after initialization" do
98
+ it "overrides the module configuration" do
99
+ Yammer.configure {|c| c.connection_options = {}}
100
+ client = Yammer::Client.new
101
+ client.configure do |config|
102
+ @conf.each do |key, value|
103
+ config.send("#{key}=", value)
104
+ end
105
+ end
106
+ Yammer::Configurable.keys.each do |key|
107
+ expect(client.instance_variable_get(:"@#{key}")).to eq @conf[key]
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+
115
+
116
+ describe "#connection_options" do
117
+ context "with default connection options" do
118
+ it "returns empty hash" do
119
+ expect(subject.connection_options).to eq({ :max_redirects => 5, :use_ssl => true })
120
+ end
121
+ end
122
+
123
+ context "with custom connection options" do
124
+ it "returns default options" do
125
+ subject.connection_options = { :max_redirects => 5, :use_ssl => true }
126
+ expect(subject.connection_options).to eq({:max_redirects => 5, :use_ssl => true})
127
+ end
128
+ end
129
+ end
130
+
131
+ describe "#request" do
132
+ context "when method is not supported" do
133
+ it "raises an error" do
134
+ expect {subject.send(:request, :patch, '/')}.to raise_error
135
+ end
136
+ end
137
+
138
+ context "when method is get" do
139
+ it "returns an http response" do
140
+ path = '/oauth/authorize'
141
+ params = {:client_id => '001337', :client_secret => 'abcxyz'}
142
+ method = :get
143
+
144
+ normalized_path = '/oauth/authorize?client_id=001337&client_secret=abcxyz'
145
+
146
+ stub_request(:get, "https://www.yammer.com/oauth/authorize?client_id=001337&client_secret=abcxyz").with(
147
+ :headers => {
148
+ 'Accept'=>'application/json',
149
+ 'User-Agent'=>"Yammer Ruby Gem #{Yammer::Version}"
150
+ })
151
+ response = subject.send(:request, method, path, params)
152
+
153
+ expect(response.code).to eq 200
154
+ end
155
+ end
156
+
157
+ context "when method is delete" do
158
+ it "returns an http response" do
159
+ path = '/users/1'
160
+
161
+ stub_request(:delete, "https://www.yammer.com/users/1").with(
162
+ :headers => {
163
+ 'Accept'=>'application/json',
164
+ 'User-Agent'=>"Yammer Ruby Gem #{Yammer::Version}"
165
+ }).to_return(:status => 200, :body => "", :headers => {})
166
+
167
+ response = subject.send(:request, :delete, path)
168
+ expect(response.code).to eq 200
169
+ end
170
+ end
171
+
172
+ context "when method is post" do
173
+ it "returns an http response" do
174
+ path = '/users'
175
+ params = {:first_name => 'john', :last_name => 'smith'}
176
+ query = Addressable::URI.form_encode(params)
177
+ headers = {'Content-Type' => 'application/x-www-form-urlencoded' }.merge(subject.default_headers)
178
+
179
+ stub_request(:post, "https://www.yammer.com/users").with(
180
+ :body => {
181
+ "first_name"=>"john",
182
+ "last_name"=>"smith"
183
+ },
184
+ :headers => {
185
+ 'Accept'=>'application/json',
186
+ 'Content-Type'=>'application/x-www-form-urlencoded',
187
+ 'User-Agent'=>"Yammer Ruby Gem #{Yammer::Version}"
188
+ }).to_return(:status => 200, :body => "", :headers => {})
189
+
190
+ response =subject.send(:request, :post, path, params)
191
+ expect(response.code).to eq 200
192
+ end
193
+ end
194
+
195
+ context "when method is put" do
196
+ it "returns an http response" do
197
+ path = '/users/1'
198
+ params = {:first_name => 'jane', :last_name => 'doe'}
199
+ query = Addressable::URI.form_encode(params)
200
+ headers = {'Content-Type' => 'application/x-www-form-urlencoded' }.merge(subject.default_headers)
201
+
202
+ stub_request(:put, "https://www.yammer.com/users/1").with(
203
+ :body => {
204
+ "first_name" => "jane",
205
+ "last_name" => "doe"
206
+ },
207
+ :headers => {
208
+ 'Accept'=>'application/json',
209
+ 'Content-Type'=>'application/x-www-form-urlencoded',
210
+ 'Authorization'=>'Bearer TolNOFka9Uls2DxahNi78A',
211
+ 'User-Agent'=>"Yammer Ruby Gem #{Yammer::Version}"
212
+ }).
213
+ to_return(:status => 200, :body => "", :headers => {})
214
+
215
+ response = subject.send(:request, :put, path, params)
216
+ expect(response.code).to eq 200
217
+ end
218
+ end
219
+
220
+ it "follows redirect" do
221
+ params = {:first_name => 'jane', :last_name => 'doe'}
222
+ stub_request(:post, "https://www.yammer.com/users").with(
223
+ :body => params,
224
+ :headers => {
225
+ 'Accept' =>'application/json',
226
+ 'Accept-Encoding' => 'gzip, deflate',
227
+ 'Content-Type' => 'application/x-www-form-urlencoded',
228
+ 'User-Agent' => "Yammer Ruby Gem #{Yammer::Version}"
229
+ }
230
+ ).to_return(:status => 303, :body => "", :headers => { 'Location' => 'https://www.yammer.com/members'})
231
+
232
+ stub_request(:get, "https://www.yammer.com/members").
233
+ with(:headers => {'Accept'=>'application/json', 'Accept-Encoding'=>'gzip, deflate', 'User-Agent'=>"Yammer Ruby Gem #{Yammer::Version}"}).
234
+ to_return(:status => 200, :body => "", :headers => {})
235
+ response = subject.send(:request, :post, '/users', params)
236
+
237
+ expect(response.code).to eq 200
238
+ end
239
+
240
+ it "respects the redirect limit " do
241
+ subject.connection_options = { :max_redirects => 1 }
242
+
243
+ stub_request(:get, "https://www.yammer.com/users").
244
+ with(
245
+ :headers => {
246
+ 'Accept' => 'application/json',
247
+ 'Accept-Encoding'=> 'gzip, deflate',
248
+ 'User-Agent' => "Yammer Ruby Gem #{Yammer::Version}"
249
+ }
250
+ ).to_return(:status => 301, :body => "", :headers => { 'Location' => 'https://www.yammer.com/members'})
251
+
252
+
253
+ stub_request(:get, "https://www.yammer.com/members").
254
+ with(
255
+ :headers => {
256
+ 'Accept' => 'application/json',
257
+ 'Accept-Encoding'=> 'gzip, deflate',
258
+ 'User-Agent' => "Yammer Ruby Gem #{Yammer::Version}"
259
+ }
260
+ ).to_return(:status => 301, :body => "", :headers => { 'Location' => 'https://www.yammer.com/people'})
261
+
262
+ expect { subject.send(:request, :get, '/users') }.to raise_error(RestClient::MaxRedirectsReached)
263
+ end
264
+
265
+ it "modifies http 303 redirect from POST to GET " do
266
+ params = { :first_name => 'jane', :last_name => 'doe' }
267
+ stub_request(:post, "https://www.yammer.com/users").with(
268
+ :body => params,
269
+ :headers => {
270
+ 'Accept'=>'application/json',
271
+ 'Accept-Encoding'=>'gzip, deflate',
272
+ 'Content-Length'=>'29',
273
+ 'Content-Type'=>'application/x-www-form-urlencoded',
274
+ 'User-Agent'=>"Yammer Ruby Gem #{Yammer::Version}"
275
+ }
276
+ ).to_return(
277
+ :status => 303,
278
+ :body => "you are being redirected",
279
+ :headers => {'Location' => "http://yammer.com/members"}
280
+ )
281
+
282
+ stub_request(:get, "http://yammer.com/members").
283
+ with(
284
+ :headers => {
285
+ 'Accept'=>'application/json',
286
+ 'Accept-Encoding'=>'gzip, deflate',
287
+ 'User-Agent'=> "Yammer Ruby Gem #{Yammer::Version}"
288
+ }
289
+ ).to_return(:status => 200, :body => "", :headers => {})
290
+
291
+ response = subject.send(:request, :post, '/users', params )
292
+
293
+ expect(response.code).to eq 200
294
+ end
295
+ end
296
+
297
+ context 'http request' do
298
+ describe "#post" do
299
+ it "makes an http POST request" do
300
+ stub_post('/users').with(
301
+ :headers => {
302
+ 'Accept'=>'application/json',
303
+ 'Authorization'=>'Bearer TolNOFka9Uls2DxahNi78A',
304
+ 'Content-Type'=>'application/x-www-form-urlencoded',
305
+ 'User-Agent'=>"Yammer Ruby Gem #{Yammer::Version}"
306
+ },
307
+ :body => { :name => 'alice' }).to_return({
308
+ :status => 200, :body => "", :headers => {}
309
+ })
310
+ subject.post('/users', { :name => 'alice'})
311
+ end
312
+ end
313
+
314
+ describe "#put" do
315
+ it "makes an http PUT request" do
316
+ stub_put('/users/1').with(
317
+ :headers => {
318
+ 'Accept'=>'application/json',
319
+ 'Authorization'=>'Bearer TolNOFka9Uls2DxahNi78A',
320
+ 'Content-Type'=>'application/x-www-form-urlencoded',
321
+ 'User-Agent'=> "Yammer Ruby Gem #{Yammer::Version}"
322
+ },
323
+ :body => { :name => 'bob' }).to_return(
324
+ :status => 200, :body => "", :headers => {})
325
+
326
+ subject.put('/users/1', { :name => 'bob'})
327
+ end
328
+ end
329
+
330
+ describe "#get" do
331
+ it "makes an http GET request" do
332
+ stub_get('/users/1').with(:headers => { 'Authorization' => 'Bearer TolNOFka9Uls2DxahNi78A' })
333
+ subject.get('/users/1')
334
+ end
335
+ end
336
+
337
+ describe "#delete" do
338
+ it "makes an http DELETE request" do
339
+ stub_delete('/users/1').with(:headers => { 'Authorization' => 'Bearer TolNOFka9Uls2DxahNi78A' })
340
+ subject.delete('/users/1')
341
+ end
342
+ end
343
+
344
+ describe 'with invalid token' do
345
+ it 'raises exception' do
346
+ stub_get('/users/1').with(:headers => { 'Authorization' => 'Bearer TolNOFka9Uls2DxahNi78A' }).to_return(
347
+ :body => '{ "response": { "message": "Token not found.", "code": 16, "stat": "fail" } }',
348
+ :status => 401)
349
+
350
+ expect(subject.get('/users/1')).to eq('{ "response": { "message": "Token not found.", "code": 16, "stat": "fail" } }')
351
+ end
352
+ end
353
+
354
+ describe 'with too many requests' do
355
+ it 'raises exception' do
356
+ stub_get('/users/1').with(:headers => { 'Authorization' => 'Bearer TolNOFka9Uls2DxahNi78A' }).to_return(
357
+ :body => '{ "response": { "message": "Rate limited due to excessive requests.", "code": 33, "stat": "fail" } }',
358
+ :status => 429
359
+ )
360
+ expect(subject.get('/users/1')).to eq('{ "response": { "message": "Rate limited due to excessive requests.", "code": 33, "stat": "fail" } }')
361
+ end
362
+ end
363
+ end
364
+ end