twimock 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +125 -0
- data/Rakefile +6 -0
- data/db/.gitkeep +0 -0
- data/lib/twimock/access_token.rb +31 -0
- data/lib/twimock/api/account/verify_credentials.rb +40 -0
- data/lib/twimock/api/application.rb +29 -0
- data/lib/twimock/api/intent/sessions.rb +60 -0
- data/lib/twimock/api/oauth/access_token.rb +65 -0
- data/lib/twimock/api/oauth/authenticate.rb +51 -0
- data/lib/twimock/api/oauth/request_token.rb +49 -0
- data/lib/twimock/api/oauth.rb +83 -0
- data/lib/twimock/api.rb +35 -0
- data/lib/twimock/application.rb +21 -0
- data/lib/twimock/auth_hash.rb +8 -0
- data/lib/twimock/config.rb +90 -0
- data/lib/twimock/database/table.rb +359 -0
- data/lib/twimock/database.rb +133 -0
- data/lib/twimock/errors.rb +13 -0
- data/lib/twimock/omniauth/strategies/twitter.rb +28 -0
- data/lib/twimock/omniauth_twitter.rb +36 -0
- data/lib/twimock/request_token.rb +23 -0
- data/lib/twimock/user.rb +58 -0
- data/lib/twimock/version.rb +3 -0
- data/lib/twimock.rb +39 -0
- data/spec/spec_helper.rb +18 -0
- data/spec/support/api_spec_helper.rb +30 -0
- data/spec/support/omniauth_twitter_helper.rb +26 -0
- data/spec/support/tables_helper.rb +54 -0
- data/spec/support/test_application_helper.rb +9 -0
- data/spec/twimock/access_token_spec.rb +128 -0
- data/spec/twimock/api/account/verify_credentials_spec.rb +125 -0
- data/spec/twimock/api/application_spec.rb +27 -0
- data/spec/twimock/api/intent/sessions_spec.rb +184 -0
- data/spec/twimock/api/oauth/access_token_spec.rb +185 -0
- data/spec/twimock/api/oauth/authenticate_spec.rb +96 -0
- data/spec/twimock/api/oauth/request_token_spec.rb +123 -0
- data/spec/twimock/api_spec.rb +81 -0
- data/spec/twimock/application_spec.rb +120 -0
- data/spec/twimock/auth_hash_spec.rb +7 -0
- data/spec/twimock/config_spec.rb +192 -0
- data/spec/twimock/database/table_spec.rb +769 -0
- data/spec/twimock/database_spec.rb +261 -0
- data/spec/twimock/omniauth_twitter_spec.rb +129 -0
- data/spec/twimock/request_token_spec.rb +140 -0
- data/spec/twimock/user_spec.rb +271 -0
- data/spec/twimock_spec.rb +76 -0
- data/twimock.gemspec +38 -0
- data/view/authenticate.html.erb +23 -0
- metadata +343 -0
data/lib/twimock/user.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'faker'
|
2
|
+
require 'twimock/database/table'
|
3
|
+
require 'twimock/access_token'
|
4
|
+
require 'twimock/request_token'
|
5
|
+
|
6
|
+
module Twimock
|
7
|
+
# TODO: 要改善 AccessTokenをUserから分離
|
8
|
+
class User < Database::Table
|
9
|
+
TABLE_NAME = :users
|
10
|
+
COLUMN_NAMES = [:id, :name, :twitter_id, :email, :password, :created_at]
|
11
|
+
CHILDREN = [ Twimock::AccessToken, Twimock::RequestToken ]
|
12
|
+
INFO_KEYS = [:id, :name, :created_at]
|
13
|
+
|
14
|
+
def initialize(options={})
|
15
|
+
opts = Hashie::Mash.new(options)
|
16
|
+
id = opts.id || opts.identifier
|
17
|
+
@id = (id.to_i > 0) ? id.to_i : (Faker::Number.number(10)).to_i
|
18
|
+
@name = opts.name || create_user_name
|
19
|
+
@twitter_id = opts.twitter_id || @name.downcase.gsub(" ", "_")
|
20
|
+
@email = opts.email || Faker::Internet.email
|
21
|
+
@password = opts.password || Faker::Internet.password
|
22
|
+
@created_at = opts.created_at
|
23
|
+
end
|
24
|
+
|
25
|
+
def info
|
26
|
+
info_hash = Hashie::Mash.new({})
|
27
|
+
INFO_KEYS.each { |key| info_hash[key] = self.instance_variable_get("@#{key}") }
|
28
|
+
info_hash.id_str = info_hash.id.to_s
|
29
|
+
info_hash
|
30
|
+
end
|
31
|
+
|
32
|
+
def generate_access_token(application_id=nil)
|
33
|
+
if application_id
|
34
|
+
application = Twimock::Application.find_by_id(application_id)
|
35
|
+
raise Twimock::Errors::ApplicationNotFound unless application
|
36
|
+
end
|
37
|
+
|
38
|
+
access_token = Twimock::AccessToken.new({ application_id: application_id })
|
39
|
+
if self.persisted?
|
40
|
+
access_token.user_id = self.id
|
41
|
+
access_token.save!
|
42
|
+
end
|
43
|
+
access_token
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.find_by_tiwtter_id_or_email(value)
|
47
|
+
user = Twimock::User.find_by_twitter_id(value)
|
48
|
+
user ||= Twimock::User.find_by_email(value)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def create_user_name
|
54
|
+
n = Faker::Name.name
|
55
|
+
(n.include?("'") || n.include?(".")) ? create_user_name : n
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/twimock.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require "active_support/time"
|
2
|
+
require "twimock/version"
|
3
|
+
require "twimock/database"
|
4
|
+
require "twimock/config"
|
5
|
+
require "twimock/application"
|
6
|
+
require "twimock/user"
|
7
|
+
require "twimock/access_token"
|
8
|
+
require "twimock/request_token"
|
9
|
+
require "twimock/auth_hash"
|
10
|
+
require "twimock/errors"
|
11
|
+
require "twimock/api"
|
12
|
+
require "twimock/omniauth_twitter"
|
13
|
+
|
14
|
+
module Twimock
|
15
|
+
extend self
|
16
|
+
|
17
|
+
def auth_hash(access_token_string=nil)
|
18
|
+
return Twimock::AuthHash.new unless validate_access_token_string(access_token_string)
|
19
|
+
|
20
|
+
if access_token = Twimock::AccessToken.find_by_string(access_token_string)
|
21
|
+
if user = Twimock::User.find_by_id(access_token.user_id)
|
22
|
+
hash = Twimock::AuthHash.new({
|
23
|
+
provider: "twitter",
|
24
|
+
uid: user.id,
|
25
|
+
info: { name: user.name },
|
26
|
+
credentials: { token: access_token.string, expires_at: Time.now + 60.days },
|
27
|
+
extra: { raw_info: { id: user.id, name: user.name } }
|
28
|
+
})
|
29
|
+
end
|
30
|
+
end
|
31
|
+
hash || Twimock::AuthHash.new
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def validate_access_token_string(string)
|
37
|
+
string.kind_of?(String) && string.size > 0
|
38
|
+
end
|
39
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
|
3
|
+
require 'simplecov'
|
4
|
+
require 'coveralls'
|
5
|
+
|
6
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
7
|
+
SimpleCov::Formatter::HTMLFormatter,
|
8
|
+
Coveralls::SimpleCov::Formatter
|
9
|
+
]
|
10
|
+
SimpleCov.start do
|
11
|
+
add_filter '.bundle/'
|
12
|
+
add_filter '/spec/'
|
13
|
+
end
|
14
|
+
|
15
|
+
# spec/support 以下のヘルパーを読み込み
|
16
|
+
Dir[File.expand_path('../support/', __FILE__) + '/**/*.rb'].each {|f| require f}
|
17
|
+
|
18
|
+
require 'twimock'
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module APISpecHelper
|
2
|
+
shared_examples 'TestRackApplication 200 OK' do
|
3
|
+
it 'should return 200 OK' do
|
4
|
+
expect(last_response.status).to eq 200
|
5
|
+
expect(last_response.body).to be_blank
|
6
|
+
expect(last_response.header).to be_blank
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
shared_examples 'API 401 UnAuthorized' do
|
11
|
+
it 'should return 401 Unauthorized' do
|
12
|
+
expect(last_response.status).to eq 401
|
13
|
+
expect(last_response.header).not_to be_blank
|
14
|
+
expect(last_response.header['Content-Length']).to eq last_response.body.bytesize.to_s
|
15
|
+
expect(last_response.header['Content-Type']).to eq "application/json; charset=utf-8"
|
16
|
+
expect(last_response.body).not_to be_blank
|
17
|
+
parsed_body = JSON.parse(last_response.body)
|
18
|
+
expect(parsed_body["error"]["code"]).to match /^Invalid.*/
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
shared_examples 'API 500 InternalServerError' do
|
23
|
+
it 'should return 500' do
|
24
|
+
expect(last_response.status).to eq 500
|
25
|
+
expect(last_response.header).not_to be_blank
|
26
|
+
expect(last_response.header['Content-Length']).to eq last_response.body.bytesize.to_s
|
27
|
+
expect(last_response.body).not_to be_blank
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module OmniAuthTwitterHelper
|
2
|
+
def create_request_env(request_token, request_secret)
|
3
|
+
{
|
4
|
+
'rack.input' => StringIO.new(""),
|
5
|
+
'rack.session' => { "session_id" => "123456",
|
6
|
+
"callback_path" => "/",
|
7
|
+
"omniauth.params" => {},
|
8
|
+
"omniauth.origin" => "http://example.com/authentication",
|
9
|
+
"oauth" => { "twitter" => { "callback_confirmed" => true,
|
10
|
+
"request_token" => request_token,
|
11
|
+
"request_secret" => request_secret } } },
|
12
|
+
'rack.url_scheme' => "http",
|
13
|
+
"GATEWAY_INTERFACE" => "CGI/1.1",
|
14
|
+
"PATH_INFO" => "/users/auth/twitter",
|
15
|
+
"QUERY_STRING" => "",
|
16
|
+
"REMOTE_ADDR" => "127.0.0.1",
|
17
|
+
"REMOTE_HOST" => "localhost.localdomain",
|
18
|
+
"REQUEST_METHOD" => "GET",
|
19
|
+
"REQUEST_URI" => "http://example.com/users/auth/twitter",
|
20
|
+
"SERVER_NAME" => "example.com",
|
21
|
+
"SERVER_PORT" => "80",
|
22
|
+
"SERVER_PROTOCOL" => "HTTP/1.1",
|
23
|
+
"HTTP_HOST" => "example.com",
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module TableHelper
|
2
|
+
def remove_dynamically_defined_all_method
|
3
|
+
klasses = [Twimock::Database::Table]
|
4
|
+
klasses.each do |klass|
|
5
|
+
remove_dynamically_defined_class_method(klass)
|
6
|
+
remove_dynamically_defined_instance_method(klass)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
# テストで動的に定義したクラスメソッドを削除
|
11
|
+
def remove_dynamically_defined_class_method(klass)
|
12
|
+
klass.methods.each do |method_name|
|
13
|
+
if method_name.to_s =~ /^find_by_/ || method_name.to_s =~ /^find_all_by_/
|
14
|
+
klass.class_eval do
|
15
|
+
class_variable_set(:@@target_method_name, method_name)
|
16
|
+
class << self
|
17
|
+
remove_method class_variable_get(:@@target_method_name)
|
18
|
+
end
|
19
|
+
remove_class_variable(:@@target_method_name)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# テストで動的に定義したインスタンスメソッドを削除
|
26
|
+
def remove_dynamically_defined_instance_method(klass)
|
27
|
+
klass.column_names.each do |column_name|
|
28
|
+
getter = column_name
|
29
|
+
if klass.instance_methods.include?(getter)
|
30
|
+
klass.class_eval { remove_method getter }
|
31
|
+
end
|
32
|
+
|
33
|
+
setter = (column_name.to_s + "=").to_sym
|
34
|
+
if klass.instance_methods.include?(setter)
|
35
|
+
klass.class_eval { remove_method setter }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Tableクラスでテストするために、一時的にDB Tableを作成する
|
41
|
+
def create_tables_table_for_test
|
42
|
+
db = Twimock::Database.new
|
43
|
+
db.connection.execute <<-SQL
|
44
|
+
CREATE TABLE TABLES (
|
45
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
46
|
+
text TEXT NOT NULL,
|
47
|
+
active BOOLEAN,
|
48
|
+
number INTEGER NOT NULL,
|
49
|
+
created_at DATETIME NOT NULL
|
50
|
+
);
|
51
|
+
SQL
|
52
|
+
db.disconnect!
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Twimock::AccessToken do
|
4
|
+
include TableHelper
|
5
|
+
|
6
|
+
let(:db_name) { ".test" }
|
7
|
+
let(:table_name) { :access_tokens }
|
8
|
+
let(:column_names) { [ :id, :string, :secret, :application_id, :user_id, :created_at ] }
|
9
|
+
|
10
|
+
let(:id) { 1 }
|
11
|
+
let(:string) { "test_token" }
|
12
|
+
let(:secret) { "test_token_secret" }
|
13
|
+
let(:application_id) { 1 }
|
14
|
+
let(:user_id) { 1 }
|
15
|
+
let(:created_at) { Time.now }
|
16
|
+
let(:options) { { id: id,
|
17
|
+
string: string,
|
18
|
+
secret: secret,
|
19
|
+
application_id: application_id,
|
20
|
+
user_id: user_id,
|
21
|
+
created_at: created_at } }
|
22
|
+
|
23
|
+
after { remove_dynamically_defined_all_method }
|
24
|
+
|
25
|
+
describe '::TABLE_NAME' do
|
26
|
+
subject { Twimock::AccessToken::TABLE_NAME }
|
27
|
+
it { is_expected.to eq table_name }
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '::COLUMN_NAMES' do
|
31
|
+
subject { Twimock::AccessToken::COLUMN_NAMES }
|
32
|
+
it { is_expected.to eq column_names }
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#initialize' do
|
36
|
+
context 'without option' do
|
37
|
+
subject { Twimock::AccessToken.new }
|
38
|
+
it { is_expected.to be_kind_of Twimock::AccessToken }
|
39
|
+
|
40
|
+
describe '.id' do
|
41
|
+
subject { Twimock::AccessToken.new.id }
|
42
|
+
it { is_expected.to be_nil }
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '.string' do
|
46
|
+
subject { Twimock::AccessToken.new.string }
|
47
|
+
it { is_expected.to be_kind_of String }
|
48
|
+
|
49
|
+
describe '.size' do
|
50
|
+
subject { Twimock::AccessToken.new.string.size }
|
51
|
+
it { is_expected.to eq 50 }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '.secret' do
|
56
|
+
subject { Twimock::AccessToken.new.secret }
|
57
|
+
it { is_expected.to be_kind_of String }
|
58
|
+
|
59
|
+
describe '.size' do
|
60
|
+
subject { Twimock::AccessToken.new.secret.size }
|
61
|
+
it { is_expected.to eq 45 }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '.user_id' do
|
66
|
+
subject { Twimock::AccessToken.new.user_id }
|
67
|
+
it { is_expected.to be_nil }
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '.application_id' do
|
71
|
+
subject { Twimock::AccessToken.new.application_id }
|
72
|
+
it { is_expected.to be_nil }
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '.created_at' do
|
76
|
+
subject { Twimock::AccessToken.new.created_at }
|
77
|
+
it { is_expected.to be_nil }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'with id option but it is not integer' do
|
82
|
+
before { @opts = { id: "test_id" } }
|
83
|
+
subject { Twimock::AccessToken.new(@opts) }
|
84
|
+
it { is_expected.to be_kind_of Twimock::AccessToken }
|
85
|
+
|
86
|
+
describe '.id' do
|
87
|
+
subject { Twimock::AccessToken.new(@opts).id }
|
88
|
+
it { is_expected.to be_nil }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'with user_id option but it is not integer' do
|
93
|
+
before { @opts = { user_id: "test_id" } }
|
94
|
+
subject { Twimock::AccessToken.new(@opts) }
|
95
|
+
it { is_expected.to be_kind_of Twimock::AccessToken }
|
96
|
+
|
97
|
+
describe '.user_id' do
|
98
|
+
subject { Twimock::AccessToken.new(@opts).user_id }
|
99
|
+
it { is_expected.to be_nil }
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'with application_id option but it is not integer' do
|
104
|
+
before { @opts = { application_id: "test_id" } }
|
105
|
+
subject { Twimock::AccessToken.new(@opts) }
|
106
|
+
it { is_expected.to be_kind_of Twimock::AccessToken }
|
107
|
+
|
108
|
+
describe '.application_id' do
|
109
|
+
subject { Twimock::AccessToken.new(@opts).application_id }
|
110
|
+
it { is_expected.to be_nil }
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
context 'with all options' do
|
115
|
+
subject { Twimock::AccessToken.new(options) }
|
116
|
+
it { is_expected.to be_kind_of Twimock::AccessToken }
|
117
|
+
|
118
|
+
context 'then attributes' do
|
119
|
+
it 'should set specified value by option' do
|
120
|
+
column_names.each do |column_name|
|
121
|
+
value = Twimock::AccessToken.new(options).send(column_name)
|
122
|
+
expect(value).to eq options[column_name]
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rack/test'
|
3
|
+
|
4
|
+
describe Twimock::API::Account::VerifyCredentials do
|
5
|
+
include TestApplicationHelper
|
6
|
+
include Rack::Test::Methods
|
7
|
+
|
8
|
+
let(:method) { 'GET' }
|
9
|
+
let(:path) { '/1.1/account/verify_credentials.json' }
|
10
|
+
let(:authorization_regexp) { Regexp.new('OAuth oauth_consumer_key=\"(.*)\", oauth_nonce=\"(.*)\", oauth_signature=\"(.*)\", oauth_signature_method=\"(.*)\", oauth_timestamp=\"(.*)\", oauth_token=\"(.*)\", oauth_version=\"(.*)\".*') }
|
11
|
+
|
12
|
+
let(:oauth_consumer_key) { Twimock::Application.new.api_key }
|
13
|
+
let(:oauth_nonce) { "Tc400qacfXAoixQ5Tk9yeFjdBBrDb7U3Sdgs7WA8cM" }
|
14
|
+
let(:oauth_signature) { "I7LRwjN%2FRvqp53kia2fGCg%2FrBHo%3D" }
|
15
|
+
let(:oauth_signature_method) { "HMAC-SHA1" }
|
16
|
+
let(:oauth_timestamp) { "1422273906" }
|
17
|
+
let(:oauth_token) { Twimock::AccessToken.string }
|
18
|
+
let(:oauth_version) { "1.0" }
|
19
|
+
let(:authorization_header) { [ "OAuth oauth_consumer_key=\"#{oauth_consumer_key}\", oauth_nonce=\"#{oauth_nonce}\", oauth_signature=\"#{oauth_signature}\", oauth_signature_method=\"#{oauth_signature_method}\", oauth_timestamp=\"#{oauth_timestamp}\", oauth_token=\"#{oauth_token}\", oauth_version=\"#{oauth_version}\"" ] }
|
20
|
+
|
21
|
+
let(:body) { "" }
|
22
|
+
let(:header) { {} }
|
23
|
+
let(:test_app) { TestApplicationHelper::TestRackApplication.new }
|
24
|
+
let(:app) { Twimock::API::Account::VerifyCredentials.new(test_app) }
|
25
|
+
|
26
|
+
describe '::METHOD' do
|
27
|
+
subject { Twimock::API::Account::VerifyCredentials::METHOD }
|
28
|
+
it { is_expected.to eq method }
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '::PATH' do
|
32
|
+
subject { Twimock::API::Account::VerifyCredentials::PATH }
|
33
|
+
it { is_expected.to eq path }
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '::AUTHORIZATION_REGEXP' do
|
37
|
+
subject { Twimock::API::Account::VerifyCredentials::AUTHORIZATION_REGEXP }
|
38
|
+
it { is_expected.to eq authorization_regexp }
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "GET '/1.1/account/verify_credentials.json'" do
|
42
|
+
context 'with authorization header' do
|
43
|
+
let(:db_name) { ".test" }
|
44
|
+
let(:database) { Twimock::Database.new }
|
45
|
+
|
46
|
+
before { stub_const("Twimock::Database::DEFAULT_DB_NAME", db_name) }
|
47
|
+
after { database.drop }
|
48
|
+
|
49
|
+
context 'that is correct' do
|
50
|
+
let(:header) { { "authorization" => authorization_header } }
|
51
|
+
let(:oauth_consumer_key) { @application.api_key }
|
52
|
+
let(:oauth_token) { @access_token.string }
|
53
|
+
|
54
|
+
before do
|
55
|
+
@application = Twimock::Application.new
|
56
|
+
@application.save!
|
57
|
+
@user = Twimock::User.new
|
58
|
+
@user.save!
|
59
|
+
@access_token = @user.generate_access_token(@application.id)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should return 200 OK' do
|
63
|
+
get path, body, header
|
64
|
+
|
65
|
+
expect(last_response.status).to eq 200
|
66
|
+
expect(last_response.header).not_to be_blank
|
67
|
+
expect(last_response.header['Content-Length']).to eq last_response.body.bytesize.to_s
|
68
|
+
expect(last_response.body).not_to be_blank
|
69
|
+
|
70
|
+
# bodyの検証
|
71
|
+
parsed_body = JSON.parse(last_response.body)
|
72
|
+
expect(parsed_body['id']).to eq @user.id
|
73
|
+
expect(parsed_body['id_str']).to eq @user.id.to_s
|
74
|
+
expect(parsed_body['name']).to eq @user.name
|
75
|
+
expect(parsed_body['created_at']).to eq @user.created_at.to_s
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context 'that is incorrect format' do
|
80
|
+
let(:consumer_key) { "test_consumer_key" }
|
81
|
+
before { get path, body, header }
|
82
|
+
it_behaves_like 'API 401 UnAuthorized'
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'but consumer_key is invalid' do
|
86
|
+
before { get path, body, header }
|
87
|
+
it_behaves_like 'API 401 UnAuthorized'
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'without authorization header', assert: :UnauthorizedAccountVerifyCredentials do
|
92
|
+
let(:authorization_header) { nil }
|
93
|
+
before { get path, body, header }
|
94
|
+
it_behaves_like 'API 401 UnAuthorized'
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'raise error that is not catched' do
|
98
|
+
let(:header) { { "authorization" => authorization_header } }
|
99
|
+
let(:oauth_consumer_key) { @application.api_key }
|
100
|
+
let(:oauth_token) { @access_token.string }
|
101
|
+
|
102
|
+
before do
|
103
|
+
@application = Twimock::Application.new
|
104
|
+
@application.save!
|
105
|
+
@user = Twimock::User.new
|
106
|
+
@user.save!
|
107
|
+
@access_token = @user.generate_access_token(@application.id)
|
108
|
+
allow(Twimock::User).to receive(:find_by_id) { raise }
|
109
|
+
get path, body, header
|
110
|
+
end
|
111
|
+
|
112
|
+
it_behaves_like 'API 500 InternalServerError'
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "GET '/test'" do
|
117
|
+
before { get '/test' }
|
118
|
+
it_behaves_like 'TestRackApplication 200 OK'
|
119
|
+
end
|
120
|
+
|
121
|
+
describe "POST '/1.1/account/verify_credentials.json'" do
|
122
|
+
before { post '/1.1/account/verify_credentials.json' }
|
123
|
+
it_behaves_like 'TestRackApplication 200 OK'
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Twimock::API::Application do
|
4
|
+
before do
|
5
|
+
allow_any_instance_of(Excon::Connection).to receive(:request) do
|
6
|
+
options = { status: status, headers: headers, body: body }
|
7
|
+
response = Excon::Response.new(options)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:status) { 200 }
|
12
|
+
let(:headers) { { "Content-Length" => 4, "Content-Type"=>"text/plain" } }
|
13
|
+
let(:body) { "test_body" }
|
14
|
+
|
15
|
+
let(:env) { { "rack.input" => StringIO.new(body),
|
16
|
+
"REQUEST_METHOD" => "GET",
|
17
|
+
"SERVER_NAME" => "api.twitter.com",
|
18
|
+
"SERVER_PORT" => "443",
|
19
|
+
"QUERY_STRING" => "",
|
20
|
+
"PATH_INFO" => "/",
|
21
|
+
"HTTPS" => "on" } }
|
22
|
+
|
23
|
+
describe 'call' do
|
24
|
+
subject { Twimock::API::Application.new.call(env) }
|
25
|
+
it { is_expected.to eq [ status, headers, [ body ] ] }
|
26
|
+
end
|
27
|
+
end
|