flowdock 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +66 -5
- data/VERSION +1 -1
- data/flowdock.gemspec +3 -3
- data/lib/flowdock.rb +77 -18
- data/spec/flowdock_spec.rb +136 -13
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f1b21f2284092dd5c694e22637cd1f00bb85df48
|
4
|
+
data.tar.gz: ef80fc3c8718925b0efdcb7e2dadb6a6da8ffc85
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38b75fa2a1bbeb1e912507c5672dec632601a8790e354029c00978b7e1564c678fb991b117cfcd62e3aa1d3ddec37c1f93f5101d8ae6abe302eaee1b4bf4cf23
|
7
|
+
data.tar.gz: a3f11ccf01ea48600d1208dbef5709ebc68fe8e3d36844d300f0f0e9adc7d984dc43da0d6686d2f826d3c260d2c2cc8062d7705b42bec0a4316d924ef06d0fb8
|
data/README.md
CHANGED
@@ -21,9 +21,65 @@ If you're using JRuby, you'll also need to install jruby-openssl gem.
|
|
21
21
|
|
22
22
|
## Usage
|
23
23
|
|
24
|
-
To post content to Chat or Team Inbox
|
24
|
+
To post content to Chat or Team Inbox using `Flowdock::Flow`, you need to use the target flow's API token.
|
25
25
|
|
26
|
-
|
26
|
+
Alternatively you can use your personal api token and the `Flowdock::Client`.
|
27
|
+
|
28
|
+
All tokens can be found in [tokens page](https://www.flowdock.com/account/tokens).
|
29
|
+
|
30
|
+
### REST API
|
31
|
+
|
32
|
+
To create an api client you need your personal api token:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
require 'rubygems'
|
36
|
+
require 'flowdock'
|
37
|
+
|
38
|
+
# Create a client that uses you api token to authenticate
|
39
|
+
client = Flowdock::Client.new(api_token: '__MY_PERSONAL_API_TOKEN__')
|
40
|
+
```
|
41
|
+
|
42
|
+
#### Posting to Chat
|
43
|
+
|
44
|
+
To send a chat message or comment, you can use the client.chat_message:
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
flow_id = 'acdcabbacd0123456789'
|
48
|
+
|
49
|
+
# Send a simple chat message
|
50
|
+
client.chat_message(flow: flow_id, content: "I'm sending a message!", tags: ['foo', 'bar'])
|
51
|
+
|
52
|
+
# Send a comment to message 1234
|
53
|
+
client.chat_message(flow: flow_id, content: "Now I'm commenting!", message: 1234)
|
54
|
+
```
|
55
|
+
|
56
|
+
Both methods return the created message as a hash.
|
57
|
+
|
58
|
+
#### Arbitary api access
|
59
|
+
|
60
|
+
You can use the client to access api in other ways too. See [REST API documentation](http://www.flowdock.com/api/rest) for all the resources.
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
|
64
|
+
# Fetch all my flows
|
65
|
+
flows = client.get('/flows')
|
66
|
+
|
67
|
+
# Update a flow's name
|
68
|
+
client.put('/flows/acme/my_flow', name: 'Your flow')
|
69
|
+
|
70
|
+
# Delete a message
|
71
|
+
client.delete('/flows/acme/my_flow/messages/12345')
|
72
|
+
|
73
|
+
# Create an invitation
|
74
|
+
client.post('/flows/acme/my_flow/invitations', email: 'user@example.com', message: "I'm inviting you to our flow using api.")
|
75
|
+
|
76
|
+
```
|
77
|
+
|
78
|
+
### Push api
|
79
|
+
|
80
|
+
To use the push api, you need a flow token:
|
81
|
+
|
82
|
+
#### Posting to Chat
|
27
83
|
|
28
84
|
```ruby
|
29
85
|
require 'rubygems'
|
@@ -36,7 +92,7 @@ flow = Flowdock::Flow.new(:api_token => "__FLOW_TOKEN__", :external_user_name =>
|
|
36
92
|
flow.push_to_chat(:content => "Hello!", :tags => ["cool", "stuff"])
|
37
93
|
```
|
38
94
|
|
39
|
-
|
95
|
+
#### Posting to Team Inbox
|
40
96
|
|
41
97
|
```ruby
|
42
98
|
# create a new Flow object with target flow's api token and sender information for Team Inbox posting
|
@@ -49,7 +105,7 @@ flow.push_to_team_inbox(:subject => "Greetings from Flowdock API Gem!",
|
|
49
105
|
:tags => ["cool", "stuff"], :link => "http://www.flowdock.com/")
|
50
106
|
```
|
51
107
|
|
52
|
-
|
108
|
+
#### Posting to multiple flows
|
53
109
|
|
54
110
|
```ruby
|
55
111
|
require 'rubygems'
|
@@ -63,7 +119,7 @@ flow = Flowdock::Flow.new(:api_token => ["__FLOW_TOKEN__", "__ANOTHER_FLOW_TOKEN
|
|
63
119
|
|
64
120
|
## API methods
|
65
121
|
|
66
|
-
* Flow methods
|
122
|
+
* `Flowdock::Flow` methods
|
67
123
|
|
68
124
|
`push_to_team_inbox` - Send message to Team Inbox. See [API documentation](http://www.flowdock.com/api/team-inbox) for details.
|
69
125
|
|
@@ -71,6 +127,11 @@ flow = Flowdock::Flow.new(:api_token => ["__FLOW_TOKEN__", "__ANOTHER_FLOW_TOKEN
|
|
71
127
|
|
72
128
|
`send_message(params)` - Deprecated. Please use `push_to_team_inbox` instead.
|
73
129
|
|
130
|
+
* `Flowdock::Client` methods
|
131
|
+
|
132
|
+
`chat_message` - Send message to Chat.
|
133
|
+
|
134
|
+
`post`, `get`, `put`, `delete` - Send arbitary api calls. First parameter is the path, second is data. See [REST API documentation](http://www.flowdock.com/api/rest).
|
74
135
|
|
75
136
|
## Deployment notifications
|
76
137
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
data/flowdock.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: flowdock 0.
|
5
|
+
# stub: flowdock 0.5.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "flowdock"
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "0.5.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Antti Pitk\u{e4}nen"]
|
14
|
-
s.date = "2014-
|
14
|
+
s.date = "2014-09-23"
|
15
15
|
s.email = "team@flowdock.com"
|
16
16
|
s.extra_rdoc_files = [
|
17
17
|
"LICENSE",
|
data/lib/flowdock.rb
CHANGED
@@ -5,11 +5,29 @@ require 'multi_json'
|
|
5
5
|
module Flowdock
|
6
6
|
FLOWDOCK_API_URL = "https://api.flowdock.com/v1"
|
7
7
|
|
8
|
+
class InvalidParameterError < StandardError; end
|
9
|
+
class ApiError < StandardError; end
|
10
|
+
|
11
|
+
module Helpers
|
12
|
+
def blank?(var)
|
13
|
+
var.nil? || var.respond_to?(:length) && var.length == 0
|
14
|
+
end
|
15
|
+
|
16
|
+
def handle_response(resp)
|
17
|
+
json = MultiJson.decode(resp.body || '{}')
|
18
|
+
unless resp.code >= 200 && resp.code < 300
|
19
|
+
errors = json["errors"].map {|k,v| "#{k}: #{v.join(',')}"}.join("\n") unless json["errors"].nil?
|
20
|
+
raise ApiError, "Flowdock API returned error:\nStatus: #{resp.code}\n Message: #{json["message"]}\n Errors:\n#{errors}"
|
21
|
+
end
|
22
|
+
json
|
23
|
+
rescue MultiJson::DecodeError
|
24
|
+
raise ApiError, "Flowdock API returned error:\nStatus: #{resp.code}\nBody: #{resp.body}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
8
28
|
class Flow
|
9
29
|
include HTTParty
|
10
|
-
|
11
|
-
class ApiError < StandardError; end
|
12
|
-
|
30
|
+
include Helpers
|
13
31
|
attr_reader :api_token, :source, :project, :from, :external_user_name
|
14
32
|
|
15
33
|
# Required options keys: :api_token
|
@@ -77,12 +95,16 @@ module Flowdock
|
|
77
95
|
|
78
96
|
tags = (params[:tags].kind_of?(Array)) ? params[:tags] : []
|
79
97
|
tags.reject! { |tag| !tag.kind_of?(String) || blank?(tag) }
|
98
|
+
thread_id = params[:thread_id]
|
99
|
+
message_id = params[:message_id] || params[:message]
|
80
100
|
|
81
101
|
params = {
|
82
102
|
:content => params[:content],
|
83
103
|
:external_user_name => @external_user_name
|
84
104
|
}
|
85
105
|
params[:tags] = tags.join(",") if tags.size > 0
|
106
|
+
params[:thread_id] = thread_id if thread_id
|
107
|
+
params[:message_id] = message_id if message_id
|
86
108
|
|
87
109
|
# Send the request
|
88
110
|
resp = self.class.post(get_flowdock_api_url("messages/chat"), :body => params)
|
@@ -98,25 +120,62 @@ module Flowdock
|
|
98
120
|
|
99
121
|
private
|
100
122
|
|
101
|
-
def
|
102
|
-
|
123
|
+
def get_flowdock_api_url(path)
|
124
|
+
"#{FLOWDOCK_API_URL}/#{path}/#{@api_token}"
|
103
125
|
end
|
104
126
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
end
|
115
|
-
end
|
127
|
+
end
|
128
|
+
|
129
|
+
class Client
|
130
|
+
include HTTParty
|
131
|
+
include Helpers
|
132
|
+
attr_reader :api_token
|
133
|
+
def initialize(options = {})
|
134
|
+
@api_token = options[:api_token]
|
135
|
+
raise InvalidParameterError, "Client must have :api_token attribute" if blank?(@api_token)
|
116
136
|
end
|
117
137
|
|
118
|
-
def
|
119
|
-
"
|
138
|
+
def chat_message(params)
|
139
|
+
raise InvalidParameterError, "Message must have :content" if blank?(params[:content])
|
140
|
+
raise InvalidParameterError, "Message must have :flow" if blank?(params[:flow])
|
141
|
+
params = params.clone
|
142
|
+
tags = (params[:tags].kind_of?(Array)) ? params[:tags] : []
|
143
|
+
params[:message] = params.delete(:message_id) if params[:message_id]
|
144
|
+
tags.reject! { |tag| !tag.kind_of?(String) || blank?(tag) }
|
145
|
+
event = if params[:message] then 'comment' else 'message' end
|
146
|
+
post(event + 's', params.merge(tags: tags, event: event))
|
147
|
+
end
|
148
|
+
|
149
|
+
def post(path, data = {})
|
150
|
+
resp = self.class.post(api_url(path), :body => MultiJson.dump(data), :basic_auth => {:username => @api_token, :password => ''}, :headers => headers)
|
151
|
+
handle_response(resp)
|
152
|
+
end
|
153
|
+
|
154
|
+
def get(path, data = {})
|
155
|
+
resp = self.class.get(api_url(path), :query => data, :basic_auth => {:username => @api_token, :password => ''}, :headers => headers)
|
156
|
+
handle_response(resp)
|
157
|
+
end
|
158
|
+
|
159
|
+
def put(path, data = {})
|
160
|
+
resp = self.class.put(api_url(path), :body => MultiJson.dump(data), :basic_auth => {:username => @api_token, :password => ''}, :headers => headers)
|
161
|
+
handle_response(resp)
|
162
|
+
end
|
163
|
+
|
164
|
+
def delete(path)
|
165
|
+
resp = self.class.delete(api_url(path), :basic_auth => {:username => @api_token, :password => ''}, :headers => headers)
|
166
|
+
handle_response(resp)
|
167
|
+
end
|
168
|
+
|
169
|
+
private
|
170
|
+
|
171
|
+
def api_url(path)
|
172
|
+
File.join(FLOWDOCK_API_URL, path)
|
173
|
+
end
|
174
|
+
|
175
|
+
def headers
|
176
|
+
{"Content-Type" => "application/json", "Accept" => "application/json"}
|
120
177
|
end
|
121
178
|
end
|
179
|
+
|
180
|
+
|
122
181
|
end
|
data/spec/flowdock_spec.rb
CHANGED
@@ -11,7 +11,7 @@ describe Flowdock do
|
|
11
11
|
it "should fail without token" do
|
12
12
|
lambda {
|
13
13
|
@flow = Flowdock::Flow.new(:api_token => "")
|
14
|
-
}.should raise_error(Flowdock::
|
14
|
+
}.should raise_error(Flowdock::InvalidParameterError)
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should succeed with array of tokens" do
|
@@ -36,46 +36,46 @@ describe Flowdock do
|
|
36
36
|
lambda {
|
37
37
|
@flow = Flowdock::Flow.new(@flow_attributes.merge(:source => ""))
|
38
38
|
@flow.push_to_team_inbox(@valid_attributes)
|
39
|
-
}.should raise_error(Flowdock::
|
39
|
+
}.should raise_error(Flowdock::InvalidParameterError)
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should not send when source is not alphanumeric" do
|
43
43
|
lambda {
|
44
44
|
@flow = Flowdock::Flow.new(@flow_attributes.merge(:source => "$foobar"))
|
45
45
|
@flow.push_to_team_inbox(@valid_attributes)
|
46
|
-
}.should raise_error(Flowdock::
|
46
|
+
}.should raise_error(Flowdock::InvalidParameterError)
|
47
47
|
end
|
48
48
|
|
49
49
|
it "should not send when project is not alphanumeric" do
|
50
50
|
lambda {
|
51
51
|
@flow = Flowdock::Flow.new(:api_token => "test", :source => "myapp", :project => "$foobar")
|
52
52
|
@flow.push_to_team_inbox(@valid_attributes)
|
53
|
-
}.should raise_error(Flowdock::
|
53
|
+
}.should raise_error(Flowdock::InvalidParameterError)
|
54
54
|
end
|
55
55
|
|
56
56
|
it "should not send without sender information" do
|
57
57
|
lambda {
|
58
58
|
@flow = Flowdock::Flow.new(@flow_attributes.merge(:from => nil))
|
59
59
|
@flow.push_to_team_inbox(@valid_attributes)
|
60
|
-
}.should raise_error(Flowdock::
|
60
|
+
}.should raise_error(Flowdock::InvalidParameterError)
|
61
61
|
end
|
62
62
|
|
63
63
|
it "should not send without subject" do
|
64
64
|
lambda {
|
65
65
|
@flow.push_to_team_inbox(@valid_attributes.merge(:subject => ""))
|
66
|
-
}.should raise_error(Flowdock::
|
66
|
+
}.should raise_error(Flowdock::InvalidParameterError)
|
67
67
|
end
|
68
68
|
|
69
69
|
it "should not send without content" do
|
70
70
|
lambda {
|
71
71
|
@flow.push_to_team_inbox(@valid_attributes.merge(:content => ""))
|
72
|
-
}.should raise_error(Flowdock::
|
72
|
+
}.should raise_error(Flowdock::InvalidParameterError)
|
73
73
|
end
|
74
74
|
|
75
75
|
it "should send without reply_to address" do
|
76
76
|
lambda {
|
77
77
|
@flow.push_to_team_inbox(@valid_attributes.merge(:reply_to => ""))
|
78
|
-
}.should_not raise_error(Flowdock::
|
78
|
+
}.should_not raise_error(Flowdock::InvalidParameterError)
|
79
79
|
end
|
80
80
|
|
81
81
|
it "should succeed with correct token, source and sender information" do
|
@@ -221,7 +221,7 @@ describe Flowdock do
|
|
221
221
|
to_return(:body => "Internal Server Error", :status => 500)
|
222
222
|
|
223
223
|
@flow.push_to_team_inbox(:subject => "Hello World", :content => @example_content).should be_false
|
224
|
-
}.should raise_error(Flowdock::
|
224
|
+
}.should raise_error(Flowdock::ApiError)
|
225
225
|
end
|
226
226
|
end
|
227
227
|
|
@@ -235,19 +235,19 @@ describe Flowdock do
|
|
235
235
|
it "should not send without content" do
|
236
236
|
lambda {
|
237
237
|
@flow.push_to_chat(@valid_parameters.merge(:content => ""))
|
238
|
-
}.should raise_error(Flowdock::
|
238
|
+
}.should raise_error(Flowdock::InvalidParameterError)
|
239
239
|
end
|
240
240
|
|
241
241
|
it "should not send without external_user_name" do
|
242
242
|
lambda {
|
243
243
|
@flow.push_to_chat(@valid_parameters.merge(:external_user_name => ""))
|
244
|
-
}.should raise_error(Flowdock::
|
244
|
+
}.should raise_error(Flowdock::InvalidParameterError)
|
245
245
|
end
|
246
246
|
|
247
247
|
it "should not send with invalid external_user_name" do
|
248
248
|
lambda {
|
249
249
|
@flow.push_to_chat(@valid_parameters.merge(:external_user_name => "foo bar"))
|
250
|
-
}.should raise_error(Flowdock::
|
250
|
+
}.should raise_error(Flowdock::InvalidParameterError)
|
251
251
|
end
|
252
252
|
|
253
253
|
it "should send with valid parameters and return true" do
|
@@ -290,7 +290,29 @@ describe Flowdock do
|
|
290
290
|
:status => 400)
|
291
291
|
|
292
292
|
@flow.push_to_chat(@valid_parameters).should be_false
|
293
|
-
}.should raise_error(Flowdock::
|
293
|
+
}.should raise_error(Flowdock::ApiError)
|
294
|
+
end
|
295
|
+
|
296
|
+
it "should send supplied message to create comments" do
|
297
|
+
lambda {
|
298
|
+
stub_request(:post, push_to_chat_url(@token)).
|
299
|
+
with(:body => /message_id=12345/).
|
300
|
+
to_return(:body => "", :status => 200)
|
301
|
+
|
302
|
+
@flow = Flowdock::Flow.new(:api_token => @token, :external_user_name => "foobar")
|
303
|
+
@flow.push_to_chat(@valid_parameters.merge(:message_id => 12345))
|
304
|
+
}.should_not raise_error
|
305
|
+
end
|
306
|
+
|
307
|
+
it "should send supplied thread_id to post to threads" do
|
308
|
+
lambda {
|
309
|
+
stub_request(:post, push_to_chat_url(@token)).
|
310
|
+
with(:body => /thread_id=acdcabbacd/).
|
311
|
+
to_return(:body => "", :status => 200)
|
312
|
+
|
313
|
+
@flow = Flowdock::Flow.new(:api_token => @token, :external_user_name => "foobar")
|
314
|
+
@flow.push_to_chat(@valid_parameters.merge(:thread_id => 'acdcabbacd'))
|
315
|
+
}.should_not raise_error
|
294
316
|
end
|
295
317
|
end
|
296
318
|
|
@@ -310,3 +332,104 @@ describe Flowdock do
|
|
310
332
|
end
|
311
333
|
end
|
312
334
|
end
|
335
|
+
|
336
|
+
describe Flowdock::Client do
|
337
|
+
|
338
|
+
let(:token) { SecureRandom.hex(8) }
|
339
|
+
let(:client) { Flowdock::Client.new(api_token: token) }
|
340
|
+
|
341
|
+
describe 'initializing' do
|
342
|
+
|
343
|
+
it 'should initialize with access token' do
|
344
|
+
expect {
|
345
|
+
client = Flowdock::Client.new(api_token: token)
|
346
|
+
expect(client.api_token).to equal(token)
|
347
|
+
}.not_to raise_error
|
348
|
+
end
|
349
|
+
it 'should raise error if initialized without access token' do
|
350
|
+
expect {
|
351
|
+
client = Flowdock::Client.new(api_token: nil)
|
352
|
+
}.to raise_error(Flowdock::InvalidParameterError)
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
describe 'posting to chat' do
|
357
|
+
|
358
|
+
let(:flow) { SecureRandom.hex(8) }
|
359
|
+
|
360
|
+
it 'posts to /messages' do
|
361
|
+
expect {
|
362
|
+
stub_request(:post, "https://#{token}:@api.flowdock.com/v1/messages").
|
363
|
+
with(:body => MultiJson.dump(flow: flow, content: "foobar", tags: [], event: "message"), :headers => {"Accept" => "application/json", "Content-Type" => "application/json"}).
|
364
|
+
to_return(:status => 201, :body => '{"id":123}', :headers => {"Content-Type" => "application/json"})
|
365
|
+
res = client.chat_message(flow: flow, content: 'foobar')
|
366
|
+
expect(res).to eq({"id" => 123})
|
367
|
+
}.not_to raise_error
|
368
|
+
end
|
369
|
+
it 'posts to /comments' do
|
370
|
+
expect {
|
371
|
+
stub_request(:post, "https://#{token}:@api.flowdock.com/v1/comments").
|
372
|
+
with(:body => MultiJson.dump(flow: flow, content: "foobar", message: 12345, tags: [], event: "comment"), :headers => {"Accept" => "application/json", "Content-Type" => "application/json"}).
|
373
|
+
to_return(:status => 201, :body => '{"id":1234}', :headers => {"Content-Type" => "application/json"})
|
374
|
+
res = client.chat_message(flow: flow, content: 'foobar', message: 12345)
|
375
|
+
expect(res).to eq({"id" => 1234})
|
376
|
+
}.not_to raise_error
|
377
|
+
end
|
378
|
+
it 'raises without flow' do
|
379
|
+
expect {
|
380
|
+
client.chat_message(content: 'foobar')
|
381
|
+
}.to raise_error(Flowdock::InvalidParameterError)
|
382
|
+
end
|
383
|
+
it 'raises without content' do
|
384
|
+
expect {
|
385
|
+
client.chat_message(flow: flow)
|
386
|
+
}.to raise_error(Flowdock::InvalidParameterError)
|
387
|
+
end
|
388
|
+
it 'handles error responses' do
|
389
|
+
expect {
|
390
|
+
stub_request(:post, "https://#{token}:@api.flowdock.com/v1/messages").
|
391
|
+
to_return(:body => '{"message":"Validation error","errors":{"content":["can\'t be blank"],"external_user_name":["should not contain whitespace"]}}',
|
392
|
+
:status => 400)
|
393
|
+
client.chat_message(flow: flow, content: 'foobar')
|
394
|
+
}.to raise_error(Flowdock::ApiError)
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
describe 'GET' do
|
399
|
+
it 'does abstract get with params' do
|
400
|
+
stub_request(:get, "https://#{token}:@api.flowdock.com/v1/some_path?sort_by=date").
|
401
|
+
with(:headers => {'Accept'=>'application/json', 'Content-Type'=>'application/json'}).
|
402
|
+
to_return(:status => 200, :body => '{"id": 123}', :headers => {"Content-Type" => "application/json"})
|
403
|
+
expect(client.get('/some_path', {sort_by: 'date'})).to eq({"id" => 123})
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
describe 'POST' do
|
408
|
+
it 'does abstract post with body' do
|
409
|
+
stub_request(:post, "https://#{token}:@api.flowdock.com/v1/other_path").
|
410
|
+
with(:headers => {'Accept'=>'application/json', 'Content-Type'=>'application/json'}, :body => MultiJson.dump(name: 'foobar')).
|
411
|
+
to_return(:status => 200, :body => '{"id": 123,"name": "foobar"}', :headers => {"Content-Type" => "application/json"})
|
412
|
+
expect(client.post('other_path', {name: 'foobar'})).to eq({"id" => 123, "name" => "foobar"})
|
413
|
+
end
|
414
|
+
|
415
|
+
end
|
416
|
+
|
417
|
+
describe 'PUT' do
|
418
|
+
it 'does abstract put with body' do
|
419
|
+
stub_request(:put, "https://#{token}:@api.flowdock.com/v1/other_path").
|
420
|
+
with(:headers => {'Accept'=>'application/json', 'Content-Type'=>'application/json'}, :body => MultiJson.dump(name: 'foobar')).
|
421
|
+
to_return(:status => 200, :body => '{"id": 123,"name": "foobar"}', :headers => {"Content-Type" => "application/json"})
|
422
|
+
expect(client.put('other_path', {name: 'foobar'})).to eq({"id" => 123, "name" => "foobar"})
|
423
|
+
end
|
424
|
+
end
|
425
|
+
|
426
|
+
describe 'DELETE' do
|
427
|
+
it 'does abstract delete with params' do
|
428
|
+
stub_request(:delete, "https://#{token}:@api.flowdock.com/v1/some_path").
|
429
|
+
with(:headers => {'Accept'=>'application/json', 'Content-Type'=>'application/json'}).
|
430
|
+
to_return(:status => 200, :body => '', :headers => {"Content-Type" => "application/json"})
|
431
|
+
expect(client.delete('/some_path')).to eq({})
|
432
|
+
end
|
433
|
+
end
|
434
|
+
|
435
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flowdock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Antti Pitkänen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|