buff 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,12 @@
1
+ HTTP/1.1 200 Awesome
2
+ Content-Type: application/json;charset=UTF-8
3
+ Date: Wed, 15 May 2013 01:43:34 GMT
4
+ Server: Apache
5
+ Vary: Accept-Encoding,User-Agent
6
+ x-frame-options: SAMEORIGIN
7
+ Content-Length: 828
8
+ Connection: keep-alive
9
+
10
+ {
11
+ "shares":47348
12
+ }
@@ -0,0 +1,11 @@
1
+ HTTP/1.1 200 Awesome
2
+ Content-Type: application/json;charset=UTF-8
3
+ Date: Tue, 14 May 2013 05:02:18 GMT
4
+ Server: Apache
5
+ Vary: Accept-Encoding,User-Agent
6
+ X-Cache: Awwww Yea
7
+ x-frame-options: SAMEORIGIN
8
+ Content-Length: 845
9
+ Connection: keep-alive
10
+
11
+ [{"_id":"5160746d13f04a5e3a00000f","avatar":"http:\/\/a0.twimg.com\/profile_images\/3604112130.jpeg","avatar_https":"https:\/\/twimg0-a.akamaihd.net\/profile_images\/3604112130.jpeg","counts":{"pending":1,"sent":40},"created_at":1365275757,"default":true,"disconnected":null,"formatted_service":"Twitter","formatted_username":"@example","id":"5160746d13d04a5e3a00000f","quick_signin":true,"schedules":[{"days":["mon","tue","wed","thu","fri","sat","sun"],"times":["06:13","09:10","11:58","12:17","13:49","18:07","21:04","22:13"]}],"service":"twitter","service_id":"737649619","service_type":"profile","service_username":"example","statistics":{"followers":179},"timezone":"America\/New_York","user_id":"5160746d13d04a5e3a00000d","utm_tracking":"enabled","verb":"tweet"}]
@@ -0,0 +1,10 @@
1
+ HTTP/1.1 200 Awesome
2
+ Content-Type: application/json;charset=UTF-8
3
+ Date: Wed, 15 May 2013 01:53:50 GMT
4
+ Server: Apache
5
+ Vary: Accept-Encoding,User-Agent
6
+ x-frame-options: SAMEORIGIN
7
+ Content-Length: 128
8
+ Connection: keep-alive
9
+
10
+ [{"days":["mon","tue","wed","thu","fri","sat","sun"],"times":["06:13","09:10","11:58","12:17","13:49","18:07","21:04","22:13"]}]
@@ -0,0 +1,10 @@
1
+ HTTP/1.1 200 Awesome
2
+ Content-Type: application/json;charset=UTF-8
3
+ Date: Wed, 15 May 2013 01:43:34 GMT
4
+ Server: Apache
5
+ Vary: Accept-Encoding,User-Agent
6
+ x-frame-options: SAMEORIGIN
7
+ Content-Length: 828
8
+ Connection: keep-alive
9
+
10
+ {"_id":"5160746d13d04a5e3a00000f","avatar":"http:\/\/a0.twimg.com\/profile_images\/3604112130.jpeg","avatar_https":"https:\/\/twimg0-a.akamaihd.net\/profile_images\/3604112130.jpeg","counts":{"pending":1,"sent":46},"created_at":1365275757,"disconnected":null,"formatted_service":"Twitter","formatted_username":"@example","id":"5160746d13d04a5e3a00000f","quick_signin":true,"schedules":[{"days":["mon","tue","wed","thu","fri","sat","sun"],"times":["06:13","09:10","11:58","12:17","13:49","18:07","21:04","22:13"]}],"service":"twitter","service_id":"737649619","service_type":"profile","service_username":"example","statistics":{"followers":179},"timezone":"America\/New_York","user_id":"5160746d13d04a5e3a00000d","utm_tracking":"enabled","verb":"tweet"}
@@ -0,0 +1,10 @@
1
+ HTTP/1.1 200 Awesome
2
+ Content-Type: application/json;charset=UTF-8
3
+ Date: Wed, 15 May 2013 01:43:34 GMT
4
+ Server: Apache
5
+ Vary: Accept-Encoding,User-Agent
6
+ x-frame-options: SAMEORIGIN
7
+ Content-Length: 828
8
+ Connection: keep-alive
9
+
10
+ {"id":"4eb8565e0acb04bb82000004","created_at":1320703582,"day":"Monday 7th November","due_at":1320742680,"due_time":"10:09 pm","profile_id":"4eb854340acb04e870000010","profile_service":"twitter","sent_at":1320744001,"service_update_id":"133667319959392256","statistics":{"reach":2460,"clicks":56,"retweets":20,"favorites":1,"mentions":1},"status":"sent","text":"This is just the beginning, the very beginning, of the transfor...","text_formatted":"This is just the beginning, the very beginning, of th...","user_id":"4eb9276e0acb04bb81000067","via":"chrome"}
@@ -0,0 +1,9 @@
1
+ HTTP/1.1 401 Authorization Required
2
+ Content-Type: text/html; charset=UTF-8
3
+ Date: Fri, 17 May 2013 02:46:37 GMT
4
+ Server: Apache
5
+ Vary: Accept-Encoding,User-Agent
6
+ WWW-Authenticate: OAuth realm='Service', error='invalid_request', error_description='The request is missing a required parameter, includes an unsupported parameter or parameter value, repeats the same parameter, uses more than one method for including an access token, or is otherwise malformed.'
7
+ Content-Length: 0
8
+ Connection: keep-alive
9
+
@@ -0,0 +1,10 @@
1
+ HTTP/1.1 200 Awesome
2
+ Content-Type: application/json;charset=UTF-8
3
+ Date: Wed, 15 May 2013 01:43:34 GMT
4
+ Server: Apache
5
+ Vary: Accept-Encoding,User-Agent
6
+ x-frame-options: SAMEORIGIN
7
+ Content-Length: 828
8
+ Connection: keep-alive
9
+
10
+ {"total":8,"updates":[{"id":"4ec93ae4512f7e6307000002","created_at":1320703582,"day":"Monday 7th November","due_at":1320543480,"due_time":"07:01 pm","profile_id":"4eb854340acb04e870000010","profile_service":"twitter","status":"buffer","text":"This is me in an alternate life where i can breakdance j.mp/w...","text_formatted":"This is me in an alternate life where i can breakda...","user_id":"4eb9276e0acb04bb81000067","via":"firefox"},] }
@@ -0,0 +1,10 @@
1
+ HTTP/1.1 200 Awesome
2
+ Content-Type: application/json;charset=UTF-8
3
+ Date: Thu, 16 May 2013 04:48:14 GMT
4
+ Server: Apache
5
+ Vary: Accept-Encoding,User-Agent
6
+ x-frame-options: SAMEORIGIN
7
+ Content-Length: 737
8
+ Connection: keep-alive
9
+
10
+ {"total":1,"updates":[{"_id":"519464f2872cad3734000028","created_at":1368679666,"day":"Today","due_at":1368699180,"due_time":"6:13 am","id":"519464f2872cad3734000028","profile_id":"5160746d13d04a5e3a00000f","profile_service":"twitter","shared_now":false,"status":"buffer","text":"Exciting to have even 1 person fork my fork of a repo :) jaysonlane\/buffer-ruby \u00b7 GitHub http:\/\/bit.ly\/15OS4ap","text_formatted":"Exciting to have even 1 person fork my fork of a repo :) jaysonlane\/buffer-ruby \u00b7 GitHub <a class=\"url\" href=\"http:\/\/bit.ly\/15OS4ap\" rel=\"external nofollow\" target=\"_blank\">http:\/\/bit.ly\/15OS4ap<\/a>","type":"link","updated_at":1368679666,"user_id":"5160746d54f04a5e3a00000d","via":"bookmarklet"}]}
@@ -0,0 +1,19 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx/0.7.65
3
+ Date: Thu, 03 Mar 2011 19:25:34 GMT
4
+ Content-Type: application/json
5
+ Connection: keep-alive
6
+ Keep-Alive: timeout=20
7
+ Content-Length: 380
8
+
9
+ {
10
+ "_id":"4f0c0a06512f7ef214000000",
11
+ "activity_at":1343654640,
12
+ "created_at":1326189062,
13
+ "id":"4f0c0a06512f7ef214000000",
14
+ "plan":"free",
15
+ "referral_link":"http:\/\/bufferapp.com\/r\/abcde",
16
+ "referral_token":"abcde",
17
+ "secret_email":"supersecret@to.bufferapp.com",
18
+ "timezone":"Asia\/Tel_Aviv"
19
+ }
@@ -0,0 +1,87 @@
1
+ require 'spec_helper'
2
+
3
+ describe Buff::Client::Profile do
4
+ let(:id) { "5160746d54f04a5e3a00000f" }
5
+
6
+ subject do
7
+ Buff::Client.new("some_token")
8
+ end
9
+
10
+ describe "#profiles" do
11
+ let(:rash) { Buff::Client.new("some_token").profiles }
12
+
13
+ before(:each) do
14
+ url = "#{ base_path }/profiles.json"
15
+ stub_with_to_return(:get, url, 'profile_authenticated.txt')
16
+ end
17
+
18
+ it "makes the correct url request" do
19
+ subject.profiles
20
+ end
21
+
22
+ it "returns a Rash collection object" do
23
+ rash[0].class.should eq(Buff::Profile)
24
+ end
25
+
26
+ it "provides an accessor for plan" do
27
+ rash[0].service.should eq("twitter")
28
+ end
29
+ end
30
+
31
+ describe "#profile_by_id" do
32
+ let(:id) { "5160746d54f04a5e3a00000f" }
33
+ before(:each) do
34
+ url = "#{base_path}/profiles/#{id}.json"
35
+ fixture_name = "profiles_by_id.txt"
36
+ stub_with_to_return(:get, url, fixture_name)
37
+ end
38
+
39
+ let(:rash) { Buff::Client.new("some_token").profile_by_id(id) }
40
+
41
+ it "returns a rash collection" do
42
+ rash.class.should eq(Buff::Profile)
43
+ end
44
+
45
+ it "accesses formatted service" do
46
+ rash.formatted_service.should eq("Twitter")
47
+ end
48
+ end
49
+
50
+ describe "#schedules_by_profile_id" do
51
+ before(:each) do
52
+ url = "#{base_path}/profiles/#{id}/schedules.json"
53
+ fixture_name = 'profile_schedules_by_id.txt'
54
+ stub_with_to_return(:get, url, fixture_name)
55
+ end
56
+
57
+ let(:rash) { Buff::Client.new("some_token").schedules_by_profile_id(id) }
58
+
59
+ it "returns a rash collection" do
60
+ rash[0].class.should eq(Buff::Schedule)
61
+ end
62
+
63
+ it "accesses days" do
64
+ expect(rash[0].days).to include("mon")
65
+ end
66
+
67
+ it "accesses times" do
68
+ expect(rash[0].times).to include("06:13")
69
+ end
70
+ end
71
+
72
+
73
+ describe "#info" do
74
+ before do
75
+ stub_request(:get, "#{base_path}/info/configuration.json?access_token=some_token").
76
+ to_return(fixture("info.txt"))
77
+ end
78
+
79
+ it "connects to the correct endpoint" do
80
+ subject.info
81
+ end
82
+
83
+ it "retrieves the correct name" do
84
+ subject.info.services.twitter.types.profile.name.should eq("Twitter")
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+
3
+ describe Buff::Schedules do
4
+ before do
5
+ @schedule = JSON.parse <<EOF
6
+ {
7
+ "days" : [
8
+ "mon",
9
+ "tue",
10
+ "wed",
11
+ "thu",
12
+ "fri"
13
+ ],
14
+ "times" : [
15
+ "12:00",
16
+ "17:00",
17
+ "18:00"
18
+ ]
19
+ }
20
+ EOF
21
+
22
+ @sample_schedules = JSON.parse <<EOF
23
+ { "schedules" : [{
24
+ "days" : [
25
+ "mon",
26
+ "tue",
27
+ "wed",
28
+ "thu",
29
+ "fri"
30
+ ],
31
+ "times" : [
32
+ "12:00",
33
+ "17:00",
34
+ "18:00"
35
+ ]
36
+ },
37
+ {
38
+ "days" : [
39
+ "mon",
40
+ "tue",
41
+ "wed",
42
+ "thu",
43
+ "fri"
44
+ ],
45
+ "times" : [
46
+ "12:00",
47
+ "17:00",
48
+ "18:00"
49
+ ]
50
+ }]
51
+ }
52
+ EOF
53
+ end
54
+
55
+ it "accepts an array of days" do
56
+ lambda {
57
+ schedules = Buff::Schedules.new
58
+ schedules << Buff::Schedule.new
59
+ }.should_not raise_error
60
+ end
61
+
62
+ it "dumping a double schedule yields correct json" do
63
+ schedules = Buff::Schedules.new
64
+ schedules << @schedule << @schedule
65
+ @sample_schedules = @sample_schedules.to_json
66
+
67
+ schedules.dump.should eq(@sample_schedules)
68
+ end
69
+
70
+ describe "#set_schedules" do
71
+ let(:id) { "5160746d54f04a5e3a00000f" }
72
+ it "throw error if schedules is empty" do
73
+ lambda {
74
+ Buff::Client.new("some_token").set_schedules(id) }.
75
+ should raise_error(ArgumentError)
76
+
77
+ end
78
+ end
79
+ end
80
+
@@ -60,15 +60,59 @@ describe Buff::Client do
60
60
  end
61
61
 
62
62
  describe "#interactions_by_update_id" do
63
- xit "requires an id"
64
- xit "connects to the correct endpoint"
65
- xit "returns an object where total is accessible"
66
- it "allows optional params" do
67
- url = "https://api.bufferapp.com/1/updates/4ecda476542f7ee521000006/interactions.json?access_token=some_token&page=2"
68
- id = "4ecda476542f7ee521000006"
63
+ let(:url) { "https://api.bufferapp.com/1/updates/4ecda476542f7ee521000006/interactions.json?access_token=some_token&page=2" }
64
+ let(:id) { "4ecda476542f7ee521000006" }
65
+
66
+ before do
69
67
  stub_request(:get, url).
70
68
  to_return(fixture("interactions_by_update_id.txt"))
71
- client.interactions_by_update_id(id, page: 2)
69
+ end
70
+
71
+ it "requires an id" do
72
+ lambda { client.interactions_by_update_id(page: 2) }.
73
+ should raise_error(Buff::InvalidIdLength)
74
+ end
75
+
76
+ it "allows optional params" do
77
+ response =<<EOF
78
+ {
79
+ "total":2,
80
+ "interactions":[
81
+ {
82
+ "_id":"50f98310c5ac415d7f2e74fd",
83
+ "created_at":1358509258,
84
+ "event":"favorite",
85
+ "id":"50f98310c5ac415d7f2e74fd",
86
+ "interaction_id":"292235127847788544",
87
+ "user":{
88
+ "username":"Crispy Potatoes",
89
+ "followers":160,
90
+ "avatar":"http:\/\/si0.twimg.com\/profile_images\/...",
91
+ "avatar_https":"https:\/\/si0.twimg.com\/profile_images\/...",
92
+ "twitter_id":"70712344376"
93
+ }
94
+ },
95
+ {
96
+ "_id":"50f8623ac5ac415d7f1d4f77",
97
+ "created_at":1358454592,
98
+ "event":"retweet",
99
+ "id":"50f8623ac5ac415d7f1d4f77",
100
+ "interaction_id":"292005842654461953",
101
+ "user":{
102
+ "username":"Lucky Number 8",
103
+ "followers":36079,
104
+ "avatar":"http:\/\/si0.twimg.com\/profile_images\/2901468678\/...",
105
+ "avatar_https":"https:\/\/si0.twimg.com\/profile_images\/2901468678\/...",
106
+ "twitter_id":"1423444249"
107
+ }
108
+ }
109
+ ]
110
+ }
111
+ EOF
112
+ stub_request(:get, "https://api.bufferapp.com/1/updates/4ecda476542f7ee521000006/interactions.json?access_token=some_token&count=3&event=favorite&page=2").
113
+ with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Faraday v0.8.7'}).
114
+ to_return(:status => 200, :body => response, :headers => {})
115
+ client.interactions_by_update_id(id, page: 2, count: 3, event: "favorite")
72
116
  end
73
117
  end
74
118
 
@@ -97,9 +141,8 @@ describe Buff::Client do
97
141
  stub_request(:post, %r{https://api\.bufferapp\.com/1/profiles/4ecda256512f7ee521000001/updates/reorder\.json\?access_token=.*}).
98
142
  with(:body => {"order"=>["4ecda256512f7ee521000001", "4ecda256512f7ee521000001", "4ecda256512f7ee521000001"]},
99
143
  :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/x-www-form-urlencoded', 'User-Agent'=>'Faraday v0.8.7'}).
100
- to_return(:status => 200, :body => "", :headers => {})
144
+ to_return(:status => 200, :body => reorder_updates_body_response, :headers => {})
101
145
  client.reorder_updates(id_no, order_hash)
102
-
103
146
  end
104
147
  end
105
148
 
@@ -107,19 +150,71 @@ describe Buff::Client do
107
150
  it "connects to appropriate endpoint" do
108
151
  id_no = "4ecda256512f7ee521000001"
109
152
  stub_request(:post, %r{https://api\.bufferapp\.com/1/profiles/4ecda256512f7ee521000001/updates/shuffle\.json\?access_token=.*}).
110
- with(:body => {"count"=>"10"})
111
- client.shuffle_updates(id_no, {count: 10})
153
+ with(:body => {"count"=>"10"}).
154
+ to_return(:status => 200, :body => '{"success": true,
155
+ "updates": [],
156
+ "time_to_shuffle":0.0041220188140869}')
157
+ client.shuffle_updates(id_no, count: 10)
112
158
  end
113
159
  end
160
+
114
161
  describe "#share_update" do
115
162
  it "should connect to correct endpoint" do
116
163
  stub_request(:post, %r{https://api\.bufferapp\.com/1/updates/4ecda256512f7ee521000001/share\.json\?access_token=.*}).
117
- to_return(:status => 200, :body => "{'success': true}", :headers => {})
164
+ to_return(:status => 200, :body => '{"success": true}', :headers => {})
118
165
  update_id = "4ecda256512f7ee521000001"
119
166
  client.share_update(update_id)
120
167
  end
121
168
  end
122
169
 
170
+ describe "#create_update" do
171
+
172
+ let(:body_content) do {text: "Text for an update",
173
+ profile_ids: [
174
+ "4eb854340acb04e870000010",
175
+ "4eb9276e0acb04bb81000067"
176
+ ]}
177
+ end
178
+
179
+ let(:url) { %r{https://api\.bufferapp\.com/1/updates/create\.json\?access_token=.*} }
180
+
181
+ context "should create an update" do
182
+ it "when only required params are present" do
183
+ stub_request(:post, url).
184
+ with(:body => body_content).
185
+ to_return(:status => 200, :body => create_update_return_body, :headers => {})
186
+ client.create_update(body: body_content)
187
+ end
188
+ it "when optional params are included" do
189
+ body_content[:media] = {}
190
+ body_content[:media][:link] = "http://google.com"
191
+ body_content[:media][:description] = "Google Homepage"
192
+ stub_request(:post, url).
193
+ with(:body => body_content).
194
+ to_return(:status => 200, :body => create_update_return_body, :headers => {})
195
+ client.create_update(body: body_content)
196
+
197
+ end
198
+ end
199
+ end
200
+
201
+ describe "#modify_update_text" do
202
+
203
+ let(:body_content) { {text: "Text for an updated text for update"} }
204
+
205
+ id = "4ecda256512f7ee521000004"
206
+ let(:url) { %r{https://api\.bufferapp\.com/1/updates/#{ id }/update\.json\?access_token=.*} }
207
+
208
+ context "should modify an update" do
209
+ it "when params are present" do
210
+ stub_request(:post, url).
211
+ with(:body => body_content).
212
+ to_return(:status => 200, :body => modify_update_response, :headers => {})
213
+ client.modify_update_text(id, body: body_content)
214
+ end
215
+ end
216
+ end
217
+
123
218
  describe "#destroy_update" do
124
219
  it "connects to correct endpoint" do
125
220
  stub_request(:post, %r{https://api\.bufferapp\.com/1/updates/4ecda256512f7ee521000001/destroy\.json\?access_token=.*}).
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Buff::Client::User do
4
+ let(:id) { "5160746d54f04a5e3a00000f" }
5
+
6
+ subject do
7
+ Buff::Client.new("some_token")
8
+ end
9
+
10
+ describe "#user_info" do
11
+ let(:rash) { subject.user_info }
12
+
13
+ before(:each) do
14
+ url = "#{ base_path }/user.json"
15
+ stub_with_to_return(:get, url, "user_authenticated.txt")
16
+ end
17
+
18
+ it "returns a Rash object" do
19
+ rash.class.should eq(Buff::UserInfo)
20
+ end
21
+
22
+ it "provides an accessor for plan" do
23
+ rash.plan.should eq("free")
24
+ end
25
+ end
26
+ end