chatwork 0.4.1 → 0.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d2ec46371c65f86e2ddc3b8bfadc923baf5d8559
4
- data.tar.gz: 9ff2c4b3a393512d1e284439f1019e78b6421c6b
3
+ metadata.gz: be16993941272b82492aa6671c2cce25e9ea8a4d
4
+ data.tar.gz: 63c1282e35926da56a30e5a1cca103633414fd02
5
5
  SHA512:
6
- metadata.gz: 568b24fe5ec5992cbd4da25ef51281715ad30208615138e0566fc37796add9aa3e2cf6fc3d9ecc0332b78a3103398e73c31f5fac93298a910b198698dc62b81c
7
- data.tar.gz: dcf5f3b3e096f590ecd6fb7eabcfa799d5b1d6351bd133a506a905fb1ec7214f61bba970d4ed398638ceb8a87f283cbae07351faa47d4464048d0364dcedf049
6
+ metadata.gz: 33cdf63bf2505a9a02da3958f86ed11851e01838a75da820cb6b67ba3db401686aeb746a05d68f25b1be7a33b8274d4b6b555677b2f66772cbbf84e2b5e96c37
7
+ data.tar.gz: dce5ad9a60dcb6f843761055fd122a8414472d97f343198466e3b63c0238514a5455126e4bdb6d75af95fa02d12c3629c7aacec41fb94fa999193800985a81af
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/CHANGELOG.md ADDED
@@ -0,0 +1,98 @@
1
+ # Change Log
2
+
3
+ ## [v0.4.1](https://github.com/asonas/chatwork-ruby/tree/v0.4.1) (2017-02-17)
4
+ [Full Changelog](https://github.com/asonas/chatwork-ruby/compare/v0.4.0...v0.4.1)
5
+
6
+ **Merged pull requests:**
7
+
8
+ - Relax faraday dependency for faraday v0.11.0 [\#18](https://github.com/asonas/chatwork-ruby/pull/18) ([sue445](https://github.com/sue445))
9
+
10
+ ## [v0.4.0](https://github.com/asonas/chatwork-ruby/tree/v0.4.0) (2017-01-31)
11
+ [Full Changelog](https://github.com/asonas/chatwork-ruby/compare/v0.3.1...v0.4.0)
12
+
13
+ **Merged pull requests:**
14
+
15
+ - api v2 release [\#14](https://github.com/asonas/chatwork-ruby/pull/14) ([hatappi](https://github.com/hatappi))
16
+ - 🏠 Set the homepage URL [\#13](https://github.com/asonas/chatwork-ruby/pull/13) ([amatsuda](https://github.com/amatsuda))
17
+
18
+ ## [v0.3.1](https://github.com/asonas/chatwork-ruby/tree/v0.3.1) (2016-07-20)
19
+ [Full Changelog](https://github.com/asonas/chatwork-ruby/compare/v0.3.0...v0.3.1)
20
+
21
+ **Closed issues:**
22
+
23
+ - api\_keyはデフォルトで環境変数を使ってほしい [\#11](https://github.com/asonas/chatwork-ruby/issues/11)
24
+
25
+ **Merged pull requests:**
26
+
27
+ - Fixed a typo and bug [\#9](https://github.com/asonas/chatwork-ruby/pull/9) ([henteko](https://github.com/henteko))
28
+
29
+ ## [v0.3.0](https://github.com/asonas/chatwork-ruby/tree/v0.3.0) (2016-06-20)
30
+ [Full Changelog](https://github.com/asonas/chatwork-ruby/compare/v0.2.0...v0.3.0)
31
+
32
+ **Merged pull requests:**
33
+
34
+ - api\_keyのデフォルトを環境変数にする [\#12](https://github.com/asonas/chatwork-ruby/pull/12) ([hatappi](https://github.com/hatappi))
35
+
36
+ ## [v0.2.0](https://github.com/asonas/chatwork-ruby/tree/v0.2.0) (2015-10-21)
37
+ [Full Changelog](https://github.com/asonas/chatwork-ruby/compare/v0.1.2...v0.2.0)
38
+
39
+ **Merged pull requests:**
40
+
41
+ - Implement Contacts \#get method [\#10](https://github.com/asonas/chatwork-ruby/pull/10) ([cy-ken-goto](https://github.com/cy-ken-goto))
42
+
43
+ ## [v0.1.2](https://github.com/asonas/chatwork-ruby/tree/v0.1.2) (2015-02-24)
44
+ [Full Changelog](https://github.com/asonas/chatwork-ruby/compare/v0.1.1...v0.1.2)
45
+
46
+ **Merged pull requests:**
47
+
48
+ - Implement Member\#get method. [\#8](https://github.com/asonas/chatwork-ruby/pull/8) ([tamano](https://github.com/tamano))
49
+
50
+ ## [v0.1.1](https://github.com/asonas/chatwork-ruby/tree/v0.1.1) (2015-01-29)
51
+ [Full Changelog](https://github.com/asonas/chatwork-ruby/compare/v0.1.0...v0.1.1)
52
+
53
+ **Merged pull requests:**
54
+
55
+ - Define Room\#get method. [\#7](https://github.com/asonas/chatwork-ruby/pull/7) ([tokada](https://github.com/tokada))
56
+
57
+ ## [v0.1.0](https://github.com/asonas/chatwork-ruby/tree/v0.1.0) (2015-01-26)
58
+ [Full Changelog](https://github.com/asonas/chatwork-ruby/compare/v0.0.7...v0.1.0)
59
+
60
+ **Merged pull requests:**
61
+
62
+ - Implements tasks [\#6](https://github.com/asonas/chatwork-ruby/pull/6) ([asonas](https://github.com/asonas))
63
+
64
+ ## [v0.0.7](https://github.com/asonas/chatwork-ruby/tree/v0.0.7) (2015-01-20)
65
+ [Full Changelog](https://github.com/asonas/chatwork-ruby/compare/v0.0.6...v0.0.7)
66
+
67
+ **Merged pull requests:**
68
+
69
+ - Add get messages API. [\#5](https://github.com/asonas/chatwork-ruby/pull/5) ([tamano](https://github.com/tamano))
70
+
71
+ ## [v0.0.6](https://github.com/asonas/chatwork-ruby/tree/v0.0.6) (2014-12-19)
72
+ [Full Changelog](https://github.com/asonas/chatwork-ruby/compare/v0.0.5...v0.0.6)
73
+
74
+ **Merged pull requests:**
75
+
76
+ - Add Tasks [\#4](https://github.com/asonas/chatwork-ruby/pull/4) ([tamano](https://github.com/tamano))
77
+
78
+ ## [v0.0.5](https://github.com/asonas/chatwork-ruby/tree/v0.0.5) (2014-04-20)
79
+ [Full Changelog](https://github.com/asonas/chatwork-ruby/compare/v0.0.3...v0.0.5)
80
+
81
+ **Merged pull requests:**
82
+
83
+ - faraday gem update [\#2](https://github.com/asonas/chatwork-ruby/pull/2) ([yoneapp](https://github.com/yoneapp))
84
+
85
+ ## [v0.0.3](https://github.com/asonas/chatwork-ruby/tree/v0.0.3) (2013-12-30)
86
+ [Full Changelog](https://github.com/asonas/chatwork-ruby/compare/v0.0.2...v0.0.3)
87
+
88
+ ## [v0.0.2](https://github.com/asonas/chatwork-ruby/tree/v0.0.2) (2013-11-29)
89
+ [Full Changelog](https://github.com/asonas/chatwork-ruby/compare/v0.0.1...v0.0.2)
90
+
91
+ **Merged pull requests:**
92
+
93
+ - Fix a typo in ChatWork module [\#1](https://github.com/asonas/chatwork-ruby/pull/1) ([eitoball](https://github.com/eitoball))
94
+
95
+ ## [v0.0.1](https://github.com/asonas/chatwork-ruby/tree/v0.0.1) (2013-11-28)
96
+
97
+
98
+ \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
data/README.md CHANGED
@@ -18,6 +18,8 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
+ ### Case 1. with API Key
22
+
21
23
  ``` ruby
22
24
  require "chatwork"
23
25
 
@@ -36,6 +38,54 @@ ChatWork::Message.create(room_id: 1234, body: "Hello, ChatWork!")
36
38
  $ CHATWORK_API_TOKEN=xxx ruby send_message.rb
37
39
  ```
38
40
 
41
+ ### Case 2. with OAuth access token
42
+ ``` ruby
43
+ require "chatwork"
44
+
45
+ # Create message
46
+ ChatWork.access_token = "XXX"
47
+ ChatWork::Message.create(room_id: 1234, body: "Hello, ChatWork!")
48
+ ```
49
+
50
+ or
51
+
52
+ ``` sh
53
+ $ cat send_message_with_access_token.rb
54
+ require "chatwork"
55
+
56
+ ChatWork::Message.create(room_id: 1234, body: "Hello, ChatWork!")
57
+ $ CHATWORK_ACCESS_TOKEN=xxx ruby send_message_with_access_token.rb
58
+ ```
59
+
60
+ ### Case 3. Refresh access token with refresh token
61
+ ``` ruby
62
+ require "chatwork"
63
+
64
+ ChatWork.client_id = "XXX"
65
+ ChatWork.client_secret = "XXX"
66
+ refresh_token = "XXX"
67
+ token = ChatWork::Token.refresh_access_token(refresh_token)
68
+ new_access_token = token["access_token"]
69
+
70
+ # Create message
71
+ ChatWork.access_token = new_access_token
72
+ ChatWork::Message.create(room_id: 1234, body: "Hello, ChatWork!")
73
+ ```
74
+
75
+ or
76
+
77
+ ``` sh
78
+ $ cat refresh_access_token.rb
79
+ require "chatwork"
80
+
81
+ token = ChatWork::Token.refresh_access_token(ENV["REFRESH_TOKEN"])
82
+ new_access_token = token["access_token"]
83
+
84
+ # Create message
85
+ ChatWork.access_token = new_access_token
86
+ ChatWork::Message.create(room_id: 1234, body: "Hello, ChatWork!")
87
+ $ CHATWORK_CLIENT_ID=xxx CHATWORK_CLIENT_SECRET=xxx REFRESH_TOKEN=xxx ruby refresh_access_token.rb
88
+ ```
39
89
 
40
90
  ## Contributing
41
91
 
data/chatwork.gemspec CHANGED
@@ -22,5 +22,6 @@ Gem::Specification.new do |spec|
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.3"
24
24
  spec.add_development_dependency "rake"
25
- spec.add_development_dependency "rspec", "~> 3.1.0"
25
+ spec.add_development_dependency "rspec"
26
+ spec.add_development_dependency "rspec-its"
26
27
  end
data/lib/chatwork.rb CHANGED
@@ -1,7 +1,10 @@
1
1
  require "chatwork/version"
2
2
 
3
3
  module ChatWork
4
+ autoload(:BaseClient, 'chatwork/base_client')
4
5
  autoload(:Client, 'chatwork/client')
6
+ autoload(:OAuthClient, 'chatwork/oauth_client')
7
+ autoload(:Token, 'chatwork/token')
5
8
  autoload(:Operations, 'chatwork/operations')
6
9
  autoload(:ChatWorkError, 'chatwork/chatwork_error')
7
10
  autoload(:APIConnectionError, 'chatwork/chatwork_error')
@@ -16,12 +19,20 @@ module ChatWork
16
19
  autoload(:Contacts, 'chatwork/contacts')
17
20
 
18
21
  @api_base = 'https://api.chatwork.com/'
22
+ @oauth_api_base = 'https://oauth.chatwork.com/'
19
23
  @api_version = '/v2'
20
24
  @api_key = nil
25
+ @access_token = nil
26
+ @client_id = nil
27
+ @client_secret = nil
21
28
 
22
29
  class << self
23
30
  def client
24
- @client ||= Client.new(api_key, api_base, api_version)
31
+ @client ||= Client.new(api_key, access_token, api_base, api_version)
32
+ end
33
+
34
+ def oauth_client
35
+ @oauth_client ||= OAuthClient.new(client_id, client_secret, oauth_api_base)
25
36
  end
26
37
 
27
38
  def api_base=(new_value)
@@ -29,19 +40,57 @@ module ChatWork
29
40
  @client = nil
30
41
  end
31
42
 
43
+ def oauth_api_base=(new_value)
44
+ @oauth_api_base = new_value
45
+ @oauth_client = nil
46
+ end
47
+
32
48
  def api_key=(new_value)
33
49
  @api_key = new_value
50
+ @access_token = nil
51
+ @client = nil
52
+ end
53
+
54
+ def access_token=(new_value)
55
+ @api_key = nil
56
+ @access_token = new_value
34
57
  @client = nil
35
58
  end
36
59
 
60
+ def client_id=(new_value)
61
+ @client_id = new_value
62
+ @oauth_client = nil
63
+ end
64
+
65
+ def client_secret=(new_value)
66
+ @client_secret = new_value
67
+ @oauth_client = nil
68
+ end
69
+
37
70
  def api_base
38
71
  @api_base
39
72
  end
40
73
 
74
+ def oauth_api_base
75
+ @oauth_api_base
76
+ end
77
+
41
78
  def api_key
42
79
  @api_key || ENV['CHATWORK_API_TOKEN']
43
80
  end
44
81
 
82
+ def access_token
83
+ @access_token || ENV['CHATWORK_ACCESS_TOKEN']
84
+ end
85
+
86
+ def client_id
87
+ @client_id || ENV['CHATWORK_CLIENT_ID']
88
+ end
89
+
90
+ def client_secret
91
+ @client_secret || ENV['CHATWORK_CLIENT_SECRET']
92
+ end
93
+
45
94
  def api_version
46
95
  @api_version
47
96
  end
@@ -0,0 +1,48 @@
1
+ require 'faraday'
2
+ require 'json'
3
+
4
+ module ChatWork
5
+ class BaseClient
6
+ def initialize(api_base, api_version, header)
7
+ default_header = {
8
+ 'User-Agent' => "ChatWork#{api_version} RubyBinding/#{ChatWork::VERSION}"
9
+ }
10
+
11
+ default_header.merge!(header)
12
+
13
+ @conn = Faraday.new("#{api_base}#{api_version}", headers: default_header) do |builder|
14
+ builder.request :url_encoded
15
+ builder.adapter Faraday.default_adapter
16
+ end
17
+ @api_version = api_version
18
+ end
19
+
20
+ def handle_response(response)
21
+ case response.status
22
+ when 204
23
+ ChatWork::ChatWorkError.from_response(response.status, response.body, response.headers)
24
+ when 200..299
25
+ begin
26
+ JSON.parse(response.body)
27
+ rescue JSON::ParserError => e
28
+ raise ChatWork::APIConnectionError.new("Response JSON is broken. #{e.message}: #{response.body}", e)
29
+ end
30
+ else
31
+ ChatWork::ChatWorkError.from_response(response.status, response.body, response.headers)
32
+ end
33
+ end
34
+
35
+ Faraday::Connection::METHODS.each do |method|
36
+ define_method(method) do |url, *args, &block|
37
+ begin
38
+ response = @conn.__send__(method, @api_version + url, *args)
39
+ rescue Faraday::Error::ClientError => e
40
+ raise ChatWork::APIConnectionError.faraday_error(e)
41
+ end
42
+ payload = handle_response(response)
43
+ block.call(payload, response.headers) if block
44
+ payload
45
+ end
46
+ end
47
+ end
48
+ end
@@ -2,7 +2,7 @@ require 'json'
2
2
  module ChatWork
3
3
  class ChatWorkError < StandardError
4
4
 
5
- def self.from_response(status, body)
5
+ def self.from_response(status, body, headers)
6
6
  # HTTP status 204 don't have body.
7
7
  return APIError.new(status, "") if status == 204
8
8
 
@@ -16,6 +16,10 @@ module ChatWork
16
16
  return APIConnectionError.new("Invalid response #{body}")
17
17
  end
18
18
 
19
+ if headers.has_key?('WWW-Authenticate')
20
+ return AuthenticateError.new(headers['WWW-Authenticate'], status, hash['errors'])
21
+ end
22
+
19
23
  APIError.new(status, hash['errors'])
20
24
  end
21
25
 
@@ -49,4 +53,18 @@ module ChatWork
49
53
  super(error_response[0], status, error_response)
50
54
  end
51
55
  end
56
+
57
+ class AuthenticateError < ChatWorkError
58
+ attr_reader :error, :error_description
59
+
60
+ def initialize(message, status, error_response)
61
+ message =~ /error="([^\"]+)"/
62
+ @error = Regexp.last_match(1)
63
+
64
+ message =~ /error_description="([^\"]+)"/
65
+ @error_description = Regexp.last_match(1)
66
+
67
+ super(message, status, error_response)
68
+ end
69
+ end
52
70
  end
@@ -1,44 +1,12 @@
1
- require 'faraday'
2
- require 'json'
3
-
4
1
  module ChatWork
5
- class Client
6
- def initialize(api_key, api_base, api_version)
7
- default_header = {
8
- 'X-ChatWorkToken' => api_key,
9
- 'User-Agent' => "ChatWork#{api_version} RubyBinding/#{ChatWork::VERSION}"
10
- }
11
-
12
- @conn = Faraday.new("#{api_base}#{api_version}", headers: default_header) do |builder|
13
- builder.request :url_encoded
14
- builder.adapter Faraday.default_adapter
15
- end
16
- @api_version = api_version
17
- end
18
-
19
- def handle_response(response)
20
- case response.status
21
- when 204
22
- ChatWork::ChatWorkError.from_response(response.status, response.body)
23
- when 200..299
24
- begin
25
- JSON.parse(response.body)
26
- rescue JSON::ParserError => e
27
- raise ChatWork::APIConnectionError.new("Response JSON is broken. #{e.message}: #{response.body}", e)
28
- end
2
+ class Client < BaseClient
3
+ def initialize(api_key, access_token, api_base, api_version)
4
+ if api_key
5
+ super(api_base, api_version, {'X-ChatWorkToken' => api_key})
6
+ elsif access_token
7
+ super(api_base, api_version, {'Authorization' => "Bearer #{access_token}"})
29
8
  else
30
- ChatWork::ChatWorkError.from_response(response.status, response.body)
31
- end
32
- end
33
-
34
- Faraday::Connection::METHODS.each do |method|
35
- define_method(method) do |url, *args|
36
- begin
37
- response = @conn.__send__(method, @api_version + url, *args)
38
- rescue Faraday::Error::ClientError => e
39
- raise ChatWork::APIConnectionError.faraday_error(e)
40
- end
41
- handle_response(response)
9
+ raise "Either api_key or access_token is required"
42
10
  end
43
11
  end
44
12
  end
@@ -0,0 +1,10 @@
1
+ require 'base64'
2
+
3
+ module ChatWork
4
+ class OAuthClient < BaseClient
5
+ def initialize(client_id, client_secret, oauth_api_base)
6
+ signature = Base64.encode64("#{client_id}:#{client_secret}").gsub("\n", "")
7
+ super(oauth_api_base, "", {'Authorization' => "Basic #{signature}"})
8
+ end
9
+ end
10
+ end
@@ -11,20 +11,20 @@ module ChatWork
11
11
 
12
12
  def define_get
13
13
  instance_eval do
14
- def get(params = {})
14
+ def get(params = {}, &block)
15
15
  @assign_path = parse_if_hash_key_exists(path, params, :room_id)
16
16
  attach_nested_resource_id(params)
17
- convert(ChatWork.client.get(@assign_path, params))
17
+ convert(ChatWork.client.get(@assign_path, params, &block))
18
18
  end
19
19
  end
20
20
  end
21
21
 
22
22
  def define_create
23
23
  instance_eval do
24
- def create(params = {})
24
+ def create(params = {}, &block)
25
25
  @assign_path = parse_if_hash_key_exists(path, params, :room_id)
26
26
  attach_nested_resource_id(params)
27
- convert(ChatWork.client.post(@assign_path, params))
27
+ convert(ChatWork.client.post(@assign_path, params, &block))
28
28
  end
29
29
  end
30
30
  end
@@ -0,0 +1,30 @@
1
+ module ChatWork
2
+ class Token
3
+ # refresh access_token with refresh_token
4
+ #
5
+ # @param refresh_token [String]
6
+ # @param scope [Array<String>]
7
+ #
8
+ # @return [Hash]
9
+ # @example response
10
+ # {
11
+ # "access_token" => "new_access_token",
12
+ # "token_type" => "Bearer",
13
+ # "expires_in" => "1800",
14
+ # "refresh_token" => "refresh_token",
15
+ # "scope" => "users.all:read rooms.all:read_write contacts.all:read_write",
16
+ # }
17
+ # ["access_token", "token_type", "expires_in", "refresh_token", "scope"]
18
+ def self.refresh_access_token(refresh_token, scope = [])
19
+ params = {
20
+ grant_type: "refresh_token",
21
+ refresh_token: refresh_token,
22
+ }
23
+ params[:scope] = scope.join(" ") unless scope.empty?
24
+
25
+ response = ChatWork.oauth_client.post("/token", params)
26
+ raise response if response.kind_of?(Exception)
27
+ response
28
+ end
29
+ end
30
+ end
@@ -1,3 +1,3 @@
1
1
  module ChatWork
2
- VERSION = "0.4.1"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -0,0 +1,26 @@
1
+ describe ChatWork::ChatWorkError do
2
+ describe '.from_response' do
3
+ subject { ChatWork::ChatWorkError.from_response(status, body, headers) }
4
+
5
+ context "with WWW-Authenticate header" do
6
+ let(:status) { 401 }
7
+
8
+ let(:body) do
9
+ <<-JSON
10
+ {"errors":["Invalid API Token"]}
11
+ JSON
12
+ end
13
+
14
+ let(:headers) do
15
+ {
16
+ 'WWW-Authenticate' => 'Bearer error="invalid_token", error_description="The access token expired"'
17
+ }
18
+ end
19
+
20
+ it { should be_an_instance_of ChatWork::AuthenticateError }
21
+ its(:error) { should eq 'invalid_token' }
22
+ its(:error_description) { should eq 'The access token expired' }
23
+ its(:error_response) { should eq ['Invalid API Token'] }
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,34 @@
1
+ describe ChatWork::Client do
2
+ describe '#initialize' do
3
+ subject { ChatWork::Client.new(api_key, access_token, api_base, api_version) }
4
+
5
+ let(:api_key) { nil }
6
+ let(:access_token) { nil }
7
+ let(:api_base) { 'https://api.chatwork.com/' }
8
+ let(:api_version) { '/v2' }
9
+
10
+ context 'with api_key' do
11
+ let(:api_key) { 'my_api_key' }
12
+
13
+ it 'client has X-ChatWorkToken header' do
14
+ connection = subject.instance_variable_get(:@conn)
15
+
16
+ expect(connection.headers['X-ChatWorkToken']).to eq "my_api_key"
17
+ end
18
+ end
19
+
20
+ context 'with access_token' do
21
+ let(:access_token) { 'my_access_token' }
22
+
23
+ it 'client has Authorization header' do
24
+ connection = subject.instance_variable_get(:@conn)
25
+
26
+ expect(connection.headers['Authorization']).to eq "Bearer my_access_token"
27
+ end
28
+ end
29
+
30
+ context 'without both api_key and access_token' do
31
+ it { expect { subject }.to raise_error 'Either api_key or access_token is required' }
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,15 @@
1
+ describe ChatWork::Member do
2
+ include_context 'shared stubs'
3
+ describe 'get room members' do
4
+ it 'should work' do
5
+ expect(ChatWork::Member.get(room_id: 1)).to eq([{ "account_id"=> 123, "name"=> "John Smith"}])
6
+ end
7
+
8
+ it 'should work with block' do
9
+ ChatWork::Member.get(room_id: 1) do |body, headers|
10
+ expect(body).to eq([{ "account_id"=> 123, "name"=> "John Smith"}])
11
+ expect(headers).to eq({'X-ratelimit-limit'=> '100', 'X-ratelimit-remaining'=> '44'})
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ describe ChatWork::OAuthClient do
2
+ describe '#initialize' do
3
+ subject { ChatWork::OAuthClient.new(client_id, client_secret, api_base) }
4
+
5
+ let(:client_id) { 'client_id' }
6
+ let(:client_secret) { 'client_secret' }
7
+ let(:api_base) { 'https://token.chatwork.com/' }
8
+ let(:signature) { 'Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ=' }
9
+
10
+ it 'client has Authorization header' do
11
+ connection = subject.instance_variable_get(:@conn)
12
+
13
+ expect(connection.headers['Authorization']).to eq "Basic #{signature}"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ require_relative '../../shared_oauth_stubs.rb'
2
+
3
+ describe ChatWork::Token do
4
+ include_context 'shared oauth stubs'
5
+
6
+ describe '.refresh_access_token' do
7
+ subject { ChatWork::Token.refresh_access_token(refresh_token, scope) }
8
+
9
+ let(:scope) { [] }
10
+
11
+ its(["access_token"]) { should eq "new_access_token" }
12
+ its(["token_type"]) { should eq "Bearer" }
13
+ its(["expires_in"]) { should eq "1800" }
14
+ its(["refresh_token"]) { should eq "refresh_token" }
15
+ its(["scope"]) { should eq "users.all:read rooms.all:read_write contacts.all:read_write" }
16
+ end
17
+ end
@@ -1,9 +1,11 @@
1
- require 'spec_helper'
2
- require 'chatwork'
3
-
4
1
  describe ChatWork do
5
2
  describe '#client' do
6
3
  subject { super().client }
4
+
5
+ before do
6
+ allow(ChatWork).to receive(:api_key) { "aaaa" }
7
+ end
8
+
7
9
  it { should be_a(ChatWork::Client) }
8
10
  end
9
11
 
@@ -38,4 +40,18 @@ describe ChatWork do
38
40
  it { is_expected.to eq test_token }
39
41
  end
40
42
  end
43
+
44
+ describe '#access_token' do
45
+ context 'when does not set env' do
46
+ subject { super().access_token }
47
+ it { should be_nil }
48
+ end
49
+
50
+ context 'when sets env' do
51
+ let(:test_token) { 'chatwork_test_token' }
52
+ before { ENV['CHATWORK_ACCESS_TOKEN'] = test_token }
53
+ subject { super().access_token }
54
+ it { is_expected.to eq test_token }
55
+ end
56
+ end
41
57
  end
@@ -0,0 +1,49 @@
1
+ require 'faraday'
2
+
3
+ RSpec.shared_context "shared oauth stubs" do
4
+ let(:client_id) { 'client_id' }
5
+ let(:client_secret) { 'client_secret' }
6
+ let(:refresh_token) { 'refresh_token' }
7
+ let(:api_version) { ChatWork.api_version }
8
+ let(:oauth_api_base) { ChatWork.oauth_api_base }
9
+ let(:signature) { 'Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ=' }
10
+
11
+ let(:test_adapter) {
12
+ token = {
13
+ access_token: 'new_access_token',
14
+ token_type: 'Bearer',
15
+ expires_in: '1800',
16
+ refresh_token: refresh_token,
17
+ scope: 'users.all:read rooms.all:read_write contacts.all:read_write'
18
+ }
19
+
20
+ Faraday::Adapter::Test::Stubs.new do |stub|
21
+ stub.post("/token") {
22
+ [200,
23
+ {"Content-Type" => "application/json"},
24
+ token.to_json ]
25
+ }
26
+ end
27
+ }
28
+
29
+ let(:faraday) {
30
+ default_header = {
31
+ 'Authorization': "Basic #{signature}",
32
+ 'User-Agent': "ChatWork#{api_version} RubyBinding/#{ChatWork::VERSION}"
33
+ }
34
+ Faraday.new(oauth_api_base, headers: default_header) do |builder|
35
+ builder.request :url_encoded
36
+ builder.adapter Faraday.default_adapter
37
+ builder.adapter :test, test_adapter
38
+ end
39
+ }
40
+
41
+ let(:oauth_client) {
42
+ allow(Faraday).to receive(:new).and_return(faraday)
43
+ ChatWork::OAuthClient.new(client_id, client_secret, oauth_api_base)
44
+ }
45
+
46
+ before(:each) do
47
+ allow(ChatWork).to receive(:oauth_client).and_return(oauth_client)
48
+ end
49
+ end
@@ -0,0 +1,39 @@
1
+ require 'faraday'
2
+
3
+ RSpec.shared_context "shared stubs" do
4
+ let(:api_key) { 'api_key' }
5
+ let(:access_token) { nil }
6
+ let(:api_version) { ChatWork.api_version }
7
+ let(:api_base) { ChatWork.api_base }
8
+
9
+ let(:test_adapter) {
10
+ Faraday::Adapter::Test::Stubs.new do |stub|
11
+ stub.get("#{api_version}/rooms/1/members") { [200,
12
+ {'X-RateLimit-Limit': '100', 'X-RateLimit-Remaining': '44'},
13
+ [{ "account_id"=> 123, "name"=> "John Smith"}].to_json ]
14
+ }
15
+ end
16
+ }
17
+
18
+ let(:faraday) {
19
+ default_header = {
20
+ 'X-ChatWorkToken': api_key,
21
+ 'User-Agent': "ChatWork#{api_version} RubyBinding/#{ChatWork::VERSION}"
22
+ }
23
+ Faraday.new("#{api_base}#{api_version}", headers: default_header) do |builder|
24
+ builder.request :url_encoded
25
+ builder.adapter Faraday.default_adapter
26
+ builder.adapter :test, test_adapter
27
+ end
28
+ }
29
+
30
+ let(:client) {
31
+ allow(Faraday).to receive(:new).and_return(faraday)
32
+ client = ChatWork::Client.new(api_key, access_token, api_base, api_version)
33
+ client
34
+ }
35
+
36
+ before(:each) do
37
+ allow(ChatWork).to receive(:client).and_return(client)
38
+ end
39
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,9 @@
1
1
  # encoding: utf-8
2
2
  #
3
3
  $: << File.expand_path(File.join(*%w{.. .. lib}), __FILE__)
4
+
5
+ require 'chatwork'
6
+
7
+ require 'rspec/its'
8
+ require_relative './shared_stubs'
9
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chatwork
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - asonas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-17 00:00:00.000000000 Z
11
+ date: 2017-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -56,16 +56,30 @@ dependencies:
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 3.1.0
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 3.1.0
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-its
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description: ChatWork is cloud-based business chat tool
70
84
  email:
71
85
  - hzw1258@gmail.com
@@ -74,12 +88,15 @@ extensions: []
74
88
  extra_rdoc_files: []
75
89
  files:
76
90
  - ".gitignore"
91
+ - ".rspec"
92
+ - CHANGELOG.md
77
93
  - Gemfile
78
94
  - LICENSE.txt
79
95
  - README.md
80
96
  - Rakefile
81
97
  - chatwork.gemspec
82
98
  - lib/chatwork.rb
99
+ - lib/chatwork/base_client.rb
83
100
  - lib/chatwork/chatwork_error.rb
84
101
  - lib/chatwork/client.rb
85
102
  - lib/chatwork/contacts.rb
@@ -88,11 +105,20 @@ files:
88
105
  - lib/chatwork/member.rb
89
106
  - lib/chatwork/message.rb
90
107
  - lib/chatwork/my_task.rb
108
+ - lib/chatwork/oauth_client.rb
91
109
  - lib/chatwork/operations.rb
92
110
  - lib/chatwork/room.rb
93
111
  - lib/chatwork/task.rb
112
+ - lib/chatwork/token.rb
94
113
  - lib/chatwork/version.rb
114
+ - spec/lib/chatwork/chatwork_error_spec.rb
115
+ - spec/lib/chatwork/client_spec.rb
116
+ - spec/lib/chatwork/member_spec.rb
117
+ - spec/lib/chatwork/oauth_client_spec.rb
118
+ - spec/lib/chatwork/token_spec.rb
95
119
  - spec/lib/chatwork_spec.rb
120
+ - spec/shared_oauth_stubs.rb
121
+ - spec/shared_stubs.rb
96
122
  - spec/spec_helper.rb
97
123
  homepage: https://github.com/asonas/chatwork-ruby
98
124
  licenses:
@@ -114,10 +140,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
140
  version: '0'
115
141
  requirements: []
116
142
  rubyforge_project:
117
- rubygems_version: 2.6.8
143
+ rubygems_version: 2.6.11
118
144
  signing_key:
119
145
  specification_version: 4
120
146
  summary: Ruby bindings of Chatwork API
121
147
  test_files:
148
+ - spec/lib/chatwork/chatwork_error_spec.rb
149
+ - spec/lib/chatwork/client_spec.rb
150
+ - spec/lib/chatwork/member_spec.rb
151
+ - spec/lib/chatwork/oauth_client_spec.rb
152
+ - spec/lib/chatwork/token_spec.rb
122
153
  - spec/lib/chatwork_spec.rb
154
+ - spec/shared_oauth_stubs.rb
155
+ - spec/shared_stubs.rb
123
156
  - spec/spec_helper.rb