twimock 0.0.1
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 +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
@@ -0,0 +1,184 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rack/test'
|
3
|
+
|
4
|
+
describe Twimock::API::Intent::Sessions do
|
5
|
+
include TestApplicationHelper
|
6
|
+
include APISpecHelper
|
7
|
+
include Rack::Test::Methods
|
8
|
+
|
9
|
+
let(:method) { 'POST' }
|
10
|
+
let(:path) { '/intent/sessions' }
|
11
|
+
let(:body) { "" }
|
12
|
+
let(:header) { {} }
|
13
|
+
let(:test_app) { TestApplicationHelper::TestRackApplication.new }
|
14
|
+
let(:app) { Twimock::API::Intent::Sessions.new(test_app) }
|
15
|
+
|
16
|
+
def query_string_to_hash(query_string)
|
17
|
+
ary = URI::decode_www_form(query_string)
|
18
|
+
hash = Hash[ary]
|
19
|
+
Hashie::Mash.new(hash)
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '::METHOD' do
|
23
|
+
subject { Twimock::API::Intent::Sessions::METHOD }
|
24
|
+
it { is_expected.to eq method }
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '::PATH' do
|
28
|
+
subject { Twimock::API::Intent::Sessions::PATH }
|
29
|
+
it { is_expected.to eq path }
|
30
|
+
end
|
31
|
+
|
32
|
+
shared_examples 'API 302 InvalidInputData' do
|
33
|
+
it 'should return 302 Redirected /oauth/authenticate' do
|
34
|
+
expect(last_response.status).to eq 302
|
35
|
+
expect(last_response.header).not_to be_blank
|
36
|
+
expect(last_response.header['Content-Length']).to eq last_response.body.bytesize.to_s
|
37
|
+
expect(last_response.header['Content-Type']).to eq "application/json; charset=utf-8"
|
38
|
+
expect(last_response.header['Location']).not_to be_blank
|
39
|
+
location = URI.parse(last_response.header['Location'])
|
40
|
+
query = query_string_to_hash(location.query)
|
41
|
+
expect(location.path).to eq "/oauth/authenticate"
|
42
|
+
expect(query).to be_has_key "oauth_token"
|
43
|
+
expect(query["oauth_token"]).to eq @body[:oauth_token]
|
44
|
+
expect(last_response.body).not_to be_blank
|
45
|
+
parsed_body = JSON.parse(last_response.body)
|
46
|
+
expect(parsed_body["error"]["code"]).to match /^Invalid.*/
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
shared_examples 'API 302 Redircted Callback URL' do
|
51
|
+
it 'should return 302 Redirected callback url' do
|
52
|
+
post path, @body, header
|
53
|
+
|
54
|
+
expect(last_response.status).to eq 302
|
55
|
+
expect(last_response.header).not_to be_blank
|
56
|
+
expect(last_response.header['Content-Length']).to eq last_response.body.bytesize.to_s
|
57
|
+
query_string = "oauth_token=#{@request_token.string}&oauth_verifier=#{@request_token.verifier}"
|
58
|
+
location = Twimock::Config.callback_url + "?" + query_string
|
59
|
+
expect(last_response.header['Location']).to eq location
|
60
|
+
expect(last_response.body).to be_blank
|
61
|
+
user_id = Twimock::RequestToken.find_by_string(@body[:oauth_token]).user_id
|
62
|
+
expect(user_id).to eq @user.id
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "POST '/oauth/request_token'" do
|
67
|
+
before { stub_const("Twimock::Database::DEFAULT_DB_NAME", db_name) }
|
68
|
+
after { database.drop }
|
69
|
+
|
70
|
+
let(:db_name) { ".test" }
|
71
|
+
let(:database) { Twimock::Database.new }
|
72
|
+
|
73
|
+
context 'without oauth token' do
|
74
|
+
before { post path, body, header }
|
75
|
+
it_behaves_like 'API 401 UnAuthorized'
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'with invalid oauth token' do
|
79
|
+
before do
|
80
|
+
request_token = Twimock::RequestToken.new
|
81
|
+
@body = { 'session[username_or_email]' => "testuser",
|
82
|
+
'session[password]' => "testpass",
|
83
|
+
oauth_token: request_token.string }
|
84
|
+
post path, @body, header
|
85
|
+
end
|
86
|
+
it_behaves_like 'API 401 UnAuthorized'
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'with only valid oauth token' do
|
90
|
+
before do
|
91
|
+
application = Twimock::Application.new
|
92
|
+
application.save!
|
93
|
+
request_token = Twimock::RequestToken.new(application_id: application.id)
|
94
|
+
request_token.save!
|
95
|
+
@body = { oauth_token: request_token.string }
|
96
|
+
post path, @body, header
|
97
|
+
end
|
98
|
+
it_behaves_like 'API 302 InvalidInputData'
|
99
|
+
end
|
100
|
+
|
101
|
+
context 'with only valid oauth token and invalid username' do
|
102
|
+
before do
|
103
|
+
application = Twimock::Application.new
|
104
|
+
application.save!
|
105
|
+
request_token = Twimock::RequestToken.new(application_id: application.id)
|
106
|
+
request_token.save!
|
107
|
+
user = Twimock::User.new(name: "testuser")
|
108
|
+
user.save!
|
109
|
+
@body = { 'session[username_or_email]' => "invalidusername",
|
110
|
+
oauth_token: request_token.string }
|
111
|
+
post path, @body, header
|
112
|
+
end
|
113
|
+
it_behaves_like 'API 302 InvalidInputData'
|
114
|
+
end
|
115
|
+
|
116
|
+
context 'with valid oauth token and username and invalid password' do
|
117
|
+
before do
|
118
|
+
application = Twimock::Application.new
|
119
|
+
application.save!
|
120
|
+
request_token = Twimock::RequestToken.new(application_id: application.id)
|
121
|
+
request_token.save!
|
122
|
+
user = Twimock::User.new(password: "testpass")
|
123
|
+
user.save!
|
124
|
+
@body = { 'session[username_or_email]' => user.twitter_id,
|
125
|
+
'session[password]' => "invalidpassword",
|
126
|
+
oauth_token: request_token.string }
|
127
|
+
post path, @body, header
|
128
|
+
end
|
129
|
+
it_behaves_like 'API 302 InvalidInputData'
|
130
|
+
end
|
131
|
+
|
132
|
+
context 'with valid oauth token and username and password' do
|
133
|
+
before do
|
134
|
+
application = Twimock::Application.new
|
135
|
+
application.save!
|
136
|
+
@request_token = Twimock::RequestToken.new(application_id: application.id)
|
137
|
+
@request_token.save!
|
138
|
+
@user = Twimock::User.new
|
139
|
+
@user.save!
|
140
|
+
@body = { 'session[username_or_email]' => @user.twitter_id,
|
141
|
+
'session[password]' => @user.password,
|
142
|
+
oauth_token: @request_token.string }
|
143
|
+
post path, @body, header
|
144
|
+
end
|
145
|
+
it_behaves_like 'API 302 Redircted Callback URL'
|
146
|
+
end
|
147
|
+
|
148
|
+
context 'with valid oauth token and email and password' do
|
149
|
+
before do
|
150
|
+
application = Twimock::Application.new
|
151
|
+
application.save!
|
152
|
+
@request_token = Twimock::RequestToken.new(application_id: application.id)
|
153
|
+
@request_token.save!
|
154
|
+
@user = Twimock::User.new
|
155
|
+
@user.save!
|
156
|
+
@body = { 'session[username_or_email]' => @user.email,
|
157
|
+
'session[password]' => @user.password,
|
158
|
+
oauth_token: @request_token.string }
|
159
|
+
post path, @body, header
|
160
|
+
end
|
161
|
+
it_behaves_like 'API 302 Redircted Callback URL'
|
162
|
+
end
|
163
|
+
|
164
|
+
context 'raise error that is not catched' do
|
165
|
+
before do
|
166
|
+
allow_any_instance_of(Twimock::API::Intent::Sessions).to receive(:query_string_to_hash) do
|
167
|
+
lambda { raise }
|
168
|
+
end
|
169
|
+
post path, @body, header
|
170
|
+
end
|
171
|
+
it_behaves_like 'API 500 InternalServerError'
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
describe "GET '/intent/sessions'" do
|
176
|
+
before { get '/intent/sessions' }
|
177
|
+
it_behaves_like 'TestRackApplication 200 OK'
|
178
|
+
end
|
179
|
+
|
180
|
+
describe "POST '/oauth/sessions'" do
|
181
|
+
before { post '/oauth/sessions' }
|
182
|
+
it_behaves_like 'TestRackApplication 200 OK'
|
183
|
+
end
|
184
|
+
end
|
@@ -0,0 +1,185 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rack/test'
|
3
|
+
|
4
|
+
describe Twimock::API::OAuth::AccessToken do
|
5
|
+
include TestApplicationHelper
|
6
|
+
include Rack::Test::Methods
|
7
|
+
|
8
|
+
let(:method) { 'POST' }
|
9
|
+
let(:path) { '/oauth/access_token' }
|
10
|
+
let(:authorization_regexp) { Regexp.new('OAuth oauth_body_hash=\"(.*)\", oauth_consumer_key=\"(.*)\", oauth_nonce=\"(.*)\", oauth_signature=\"(.*)\", oauth_signature_method=\"(.*)\", oauth_timestamp=\"(.*)\", oauth_token=\"(.*)\", oauth_verifier=\"(.*)\", oauth_version=\"(.*)\"') }
|
11
|
+
let(:body) { "" }
|
12
|
+
let(:header) { {} }
|
13
|
+
let(:test_app) { TestApplicationHelper::TestRackApplication.new }
|
14
|
+
let(:app) { Twimock::API::OAuth::AccessToken.new(test_app) }
|
15
|
+
|
16
|
+
def create_authorization_header(consumer_key, token)
|
17
|
+
params = {
|
18
|
+
body_hash: "2jmj7l5rSw0yVb%2FvlWAYkK%2FYBwk%3D",
|
19
|
+
consumer_key: consumer_key,
|
20
|
+
nonce: "IowIhqA1ckGHxbDL3pRVU3Td7BHfo2CWx7a6BArMveE",
|
21
|
+
signature: "FfuyevfGWuVC5ZBUta0J4TmFFfQ%3D",
|
22
|
+
signature_method: "HMAC-SHA1",
|
23
|
+
timestamp: "1422273884",
|
24
|
+
token: token,
|
25
|
+
verifier: "Mk8kPU3Del5IrhQuxdYAVVJIAHeetQ4M",
|
26
|
+
version: "1.0" }
|
27
|
+
string = params.inject([]){|a, (k,v)| a << "oauth_#{k}=\"#{v}\"" }.join(", ")
|
28
|
+
[ "OAuth #{string}" ]
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '::METHOD' do
|
32
|
+
subject { Twimock::API::OAuth::AccessToken::METHOD }
|
33
|
+
it { is_expected.to eq method }
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '::PATH' do
|
37
|
+
subject { Twimock::API::OAuth::AccessToken::PATH }
|
38
|
+
it { is_expected.to eq path }
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '::AUTHORIZATION_REGEXP' do
|
42
|
+
subject { Twimock::API::OAuth::AccessToken::AUTHORIZATION_REGEXP }
|
43
|
+
it { is_expected.to eq authorization_regexp }
|
44
|
+
end
|
45
|
+
|
46
|
+
shared_examples "Get Access Token" do
|
47
|
+
it 'should return 200 Created' do
|
48
|
+
post path, body, header
|
49
|
+
|
50
|
+
expect(last_response.status).to eq 200
|
51
|
+
expect(last_response.header).not_to be_blank
|
52
|
+
expect(last_response.header['Content-Length']).to eq last_response.body.bytesize.to_s
|
53
|
+
expect(last_response.body).not_to be_blank
|
54
|
+
|
55
|
+
index = last_response.body =~ /^oauth_token=(.*)&oauth_token_secret=(.*)&user_id=(.*)&screen_name=(.*)$/
|
56
|
+
expect(index).to eq 0
|
57
|
+
oauth_token = $1
|
58
|
+
oauth_token_secret = $2
|
59
|
+
user_id = $3.to_i
|
60
|
+
screen_name = $4
|
61
|
+
|
62
|
+
access_token = Twimock::AccessToken.find_by_string(oauth_token)
|
63
|
+
expect(access_token).not_to be_nil
|
64
|
+
expect(access_token.secret).to eq oauth_token_secret
|
65
|
+
expect(access_token.user_id).to eq user_id
|
66
|
+
user = Twimock::User.find_by_id(user_id)
|
67
|
+
expect(user).not_to be_nil
|
68
|
+
expect(user.twitter_id).to eq screen_name
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "POST '/oauth/access_token'" do
|
73
|
+
context 'with authorization header' do
|
74
|
+
before { stub_const("Twimock::Database::DEFAULT_DB_NAME", db_name) }
|
75
|
+
after { database.drop }
|
76
|
+
|
77
|
+
let(:db_name) { ".test" }
|
78
|
+
let(:database) { Twimock::Database.new }
|
79
|
+
|
80
|
+
let(:header) { { "authorization" => @authorization } }
|
81
|
+
|
82
|
+
context 'that is correct' do
|
83
|
+
before do
|
84
|
+
app = Twimock::Application.new
|
85
|
+
app.save!
|
86
|
+
user = Twimock::User.new
|
87
|
+
user.save!
|
88
|
+
request_token = Twimock::RequestToken.new(application_id: app.id, user_id: user.id)
|
89
|
+
request_token.save!
|
90
|
+
@authorization = create_authorization_header(app.api_key, request_token.string)
|
91
|
+
end
|
92
|
+
it_behaves_like "Get Access Token"
|
93
|
+
|
94
|
+
context 'authorization header is string' do
|
95
|
+
before do
|
96
|
+
app = Twimock::Application.new
|
97
|
+
app.save!
|
98
|
+
user = Twimock::User.new
|
99
|
+
user.save!
|
100
|
+
request_token = Twimock::RequestToken.new(application_id: app.id, user_id: user.id)
|
101
|
+
request_token.save!
|
102
|
+
@authorization = create_authorization_header(app.api_key, request_token.string).first
|
103
|
+
end
|
104
|
+
it_behaves_like "Get Access Token"
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'raise error that is not catched' do
|
108
|
+
before do
|
109
|
+
allow(Twimock::RequestToken).to receive(:find_by_string){ raise }
|
110
|
+
post path, body, header
|
111
|
+
end
|
112
|
+
it_behaves_like 'API 500 InternalServerError'
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context 'that is incorrect format' do
|
117
|
+
before do
|
118
|
+
@authorization = ["OAuth consumer_key=\"test_consumer_key\, oauth_token=\"test_token\""]
|
119
|
+
post path, body, header
|
120
|
+
end
|
121
|
+
it_behaves_like "API 401 UnAuthorized"
|
122
|
+
end
|
123
|
+
|
124
|
+
context 'but consumer_key is invalid' do
|
125
|
+
before do
|
126
|
+
app = Twimock::Application.new
|
127
|
+
request_token = Twimock::RequestToken.new(application_id: app.id)
|
128
|
+
@authorization = create_authorization_header(app.api_key, request_token.string)
|
129
|
+
post path, body, header
|
130
|
+
end
|
131
|
+
it_behaves_like "API 401 UnAuthorized"
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'but oauth_token is invalid' do
|
135
|
+
before do
|
136
|
+
app = Twimock::Application.new
|
137
|
+
app.save!
|
138
|
+
request_token = Twimock::RequestToken.new(application_id: app.id)
|
139
|
+
@authorization = create_authorization_header(app.api_key, request_token.string)
|
140
|
+
post path, body, header
|
141
|
+
end
|
142
|
+
it_behaves_like "API 401 UnAuthorized"
|
143
|
+
end
|
144
|
+
|
145
|
+
context 'but oauth_token does not belong to user' do
|
146
|
+
before do
|
147
|
+
app = Twimock::Application.new
|
148
|
+
app.save!
|
149
|
+
request_token = Twimock::RequestToken.new(application_id: app.id)
|
150
|
+
request_token.save!
|
151
|
+
@authorization = create_authorization_header(app.api_key, request_token.string)
|
152
|
+
post path, body, header
|
153
|
+
end
|
154
|
+
it_behaves_like "API 401 UnAuthorized"
|
155
|
+
end
|
156
|
+
|
157
|
+
context 'but oauth_token does not belong to application' do
|
158
|
+
before do
|
159
|
+
app = Twimock::Application.new
|
160
|
+
app.save!
|
161
|
+
request_token = Twimock::RequestToken.new(application_id: app.id)
|
162
|
+
request_token.save!
|
163
|
+
@authorization = create_authorization_header(app.api_key, request_token.string)
|
164
|
+
post path, body, header
|
165
|
+
end
|
166
|
+
it_behaves_like "API 401 UnAuthorized"
|
167
|
+
end
|
168
|
+
|
169
|
+
context 'without authorization header' do
|
170
|
+
before { post path, body, header }
|
171
|
+
it_behaves_like "API 401 UnAuthorized"
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
describe "GET '/test'" do
|
177
|
+
before { post '/test' }
|
178
|
+
it_behaves_like 'TestRackApplication 200 OK'
|
179
|
+
end
|
180
|
+
|
181
|
+
describe "GET '/oauth/access_token'" do
|
182
|
+
before { get '/oauth/access_token' }
|
183
|
+
it_behaves_like 'TestRackApplication 200 OK'
|
184
|
+
end
|
185
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rack/test'
|
3
|
+
|
4
|
+
describe Twimock::API::OAuth::Authenticate do
|
5
|
+
include TestApplicationHelper
|
6
|
+
include APISpecHelper
|
7
|
+
include Rack::Test::Methods
|
8
|
+
|
9
|
+
let(:method) { 'GET' }
|
10
|
+
let(:path) { '/oauth/authenticate' }
|
11
|
+
let(:body) { "" }
|
12
|
+
let(:header) { {} }
|
13
|
+
let(:test_app) { TestApplicationHelper::TestRackApplication.new }
|
14
|
+
let(:app) { Twimock::API::OAuth::Authenticate.new(test_app) }
|
15
|
+
|
16
|
+
describe '::METHOD' do
|
17
|
+
subject { Twimock::API::OAuth::Authenticate::METHOD }
|
18
|
+
it { is_expected.to eq method }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '::PATH' do
|
22
|
+
subject { Twimock::API::OAuth::Authenticate::PATH }
|
23
|
+
it { is_expected.to eq path }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "GET '/oauth/authenticate'" do
|
27
|
+
before { stub_const("Twimock::Database::DEFAULT_DB_NAME", db_name) }
|
28
|
+
after { database.drop }
|
29
|
+
|
30
|
+
let(:db_name) { ".test" }
|
31
|
+
let(:database) { Twimock::Database.new }
|
32
|
+
|
33
|
+
context 'without oauth token' do
|
34
|
+
before { get path, body, header }
|
35
|
+
it_behaves_like 'API 401 UnAuthorized'
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'with invalid oauth token' do
|
39
|
+
before do
|
40
|
+
request_token = Twimock::RequestToken.new
|
41
|
+
query_string = "request_token=#{request_token.string}"
|
42
|
+
get path + "?" + query_string , body, header
|
43
|
+
end
|
44
|
+
it_behaves_like 'API 401 UnAuthorized'
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'with valid oauth token' do
|
48
|
+
before do
|
49
|
+
application = Twimock::Application.new
|
50
|
+
application.save!
|
51
|
+
@request_token = Twimock::RequestToken.new(application_id: application.id)
|
52
|
+
@request_token.save!
|
53
|
+
@path = path + "?oauth_token=#{@request_token.string}"
|
54
|
+
get @path, body, header
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should return 200 OK' do
|
58
|
+
view = Twimock::API::OAuth::Authenticate.view(@request_token.string)
|
59
|
+
expect(last_response.status).to eq 200
|
60
|
+
expect(last_response.header).not_to be_blank
|
61
|
+
expect(last_response.header['Content-Length']).to eq last_response.body.bytesize.to_s
|
62
|
+
expect(last_response.body).to eq view
|
63
|
+
expect(last_response.body).to be_include(@request_token.string)
|
64
|
+
expect(last_response.body).to be_include(Twimock::API::Intent::Sessions::PATH)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'raise error that is not catched' do
|
69
|
+
before do
|
70
|
+
allow(Twimock::API::OAuth::Authenticate).to receive(:view){ raise }
|
71
|
+
application = Twimock::Application.new
|
72
|
+
application.save!
|
73
|
+
@request_token = Twimock::RequestToken.new(application_id: application.id)
|
74
|
+
@request_token.save!
|
75
|
+
@path = path + "?oauth_token=#{@request_token.string}"
|
76
|
+
get @path, body, header
|
77
|
+
end
|
78
|
+
it_behaves_like 'API 500 InternalServerError'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "GET '/test'" do
|
83
|
+
before { get '/test' }
|
84
|
+
it_behaves_like 'TestRackApplication 200 OK'
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "POST '/oauth/authenticate'" do
|
88
|
+
before { post '/oauth/authenticate' }
|
89
|
+
it_behaves_like 'TestRackApplication 200 OK'
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "GET '/oauth/authentication'" do
|
93
|
+
before { get '/oauth/authentication' }
|
94
|
+
it_behaves_like 'TestRackApplication 200 OK'
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rack/test'
|
3
|
+
|
4
|
+
describe Twimock::API::OAuth::RequestToken do
|
5
|
+
include TestApplicationHelper
|
6
|
+
include Rack::Test::Methods
|
7
|
+
|
8
|
+
let(:method) { 'POST' }
|
9
|
+
let(:path) { '/oauth/request_token' }
|
10
|
+
let(:authorization_regexp) { Regexp.new('OAuth oauth_callback=\"(.*)\", oauth_consumer_key=\"(.*)\", oauth_nonce=\"(.*)\", oauth_signature=\"(.*)\", oauth_signature_method=\"(.*)\", oauth_timestamp=\"(.*)\", oauth_version=\"(.*)\".*') }
|
11
|
+
let(:body) { "" }
|
12
|
+
let(:header) { {} }
|
13
|
+
let(:test_app) { TestApplicationHelper::TestRackApplication.new }
|
14
|
+
let(:app) { Twimock::API::OAuth::RequestToken.new(test_app) }
|
15
|
+
|
16
|
+
describe '::METHOD' do
|
17
|
+
subject { Twimock::API::OAuth::RequestToken::METHOD }
|
18
|
+
it { is_expected.to eq method }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '::PATH' do
|
22
|
+
subject { Twimock::API::OAuth::RequestToken::PATH }
|
23
|
+
it { is_expected.to eq path }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '::AUTHORIZATION_REGEXP' do
|
27
|
+
subject { Twimock::API::OAuth::RequestToken::AUTHORIZATION_REGEXP }
|
28
|
+
it { is_expected.to eq authorization_regexp }
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "POST '/oauth/request_token'" do
|
32
|
+
context 'with authorization header' do
|
33
|
+
before { stub_const("Twimock::Database::DEFAULT_DB_NAME", db_name) }
|
34
|
+
after { database.drop }
|
35
|
+
|
36
|
+
let(:db_name) { ".test" }
|
37
|
+
let(:database) { Twimock::Database.new }
|
38
|
+
|
39
|
+
let(:header) { { "authorization" => @authorization } }
|
40
|
+
|
41
|
+
context 'that is correct' do
|
42
|
+
before do
|
43
|
+
app = Twimock::Application.new
|
44
|
+
app.save!
|
45
|
+
@authorization = ["OAuth oauth_callback=\"http%3A%2F%2Fhiddeste.local.jp%3A3456%2Fusers%2Fauth%2Ftwitter%2Fcallback\", oauth_consumer_key=\"#{app.api_key}\", oauth_nonce=\"gop2czKq1IebHEvEIo2qE64Hwp5SRWxLgilYAKqrWE\", oauth_signature=\"FVn4chN1TbLPDDsLb%2FqG%2FU99biA%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1422273831\", oauth_version=\"1.0\""]
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should return 200 OK' do
|
49
|
+
post path, body, header
|
50
|
+
expect(last_response.status).to eq 200
|
51
|
+
expect(last_response.header).not_to be_blank
|
52
|
+
expect(last_response.header['Content-Length']).to eq last_response.body.bytesize.to_s
|
53
|
+
expect(last_response.body).not_to be_blank
|
54
|
+
|
55
|
+
index = last_response.body =~ /^oauth_token=(.*)&oauth_token_secret=(.*)&oauth_callback_confirmed=(.*)$/
|
56
|
+
expect(index).to eq 0
|
57
|
+
oauth_token = $1
|
58
|
+
oauth_secret = $2
|
59
|
+
oauth_callback_confirmed = $3
|
60
|
+
|
61
|
+
token = Twimock::RequestToken.find_by_string(oauth_token)
|
62
|
+
expect(token).not_to be_nil
|
63
|
+
expect(token.secret).to eq oauth_secret
|
64
|
+
expect(oauth_callback_confirmed).to eq true.to_s
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'that is incorrect format' do
|
69
|
+
before do
|
70
|
+
@authorization = ["OAuth consumer_key=\"test_consumer_key\""]
|
71
|
+
post path, body, header
|
72
|
+
end
|
73
|
+
it_behaves_like "API 401 UnAuthorized"
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'but consumer_key is invalid' do
|
77
|
+
before do
|
78
|
+
app = Twimock::Application.new
|
79
|
+
@authorization = ["OAuth oauth_callback=\"http%3A%2F%2Fhiddeste.local.jp%3A3456%2Fusers%2Fauth%2Ftwitter%2Fcallback\", oauth_consumer_key=\"#{app.api_key}\", oauth_nonce=\"gop2czKq1IebHEvEIo2qE64Hwp5SRWxLgilYAKqrWE\", oauth_signature=\"FVn4chN1TbLPDDsLb%2FqG%2FU99biA%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1422273831\", oauth_version=\"1.0\""]
|
80
|
+
post path, body, header
|
81
|
+
end
|
82
|
+
it_behaves_like "API 401 UnAuthorized"
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'raise error that is not catched' do
|
86
|
+
before do
|
87
|
+
allow(Twimock::Application).to receive(:find_by_api_key){ raise }
|
88
|
+
app = Twimock::Application.new
|
89
|
+
app.save!
|
90
|
+
@authorization = ["OAuth oauth_callback=\"http%3A%2F%2Fhiddeste.local.jp%3A3456%2Fusers%2Fauth%2Ftwitter%2Fcallback\", oauth_consumer_key=\"#{app.api_key}\", oauth_nonce=\"gop2czKq1IebHEvEIo2qE64Hwp5SRWxLgilYAKqrWE\", oauth_signature=\"FVn4chN1TbLPDDsLb%2FqG%2FU99biA%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1422273831\", oauth_version=\"1.0\""]
|
91
|
+
post path, body, header
|
92
|
+
end
|
93
|
+
it_behaves_like 'API 500 InternalServerError'
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'without authorization header'do
|
97
|
+
before { post path, body, header }
|
98
|
+
it_behaves_like "API 401 UnAuthorized"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
describe "POST '/test'" do
|
105
|
+
it 'should return 200 OK' do
|
106
|
+
post '/test'
|
107
|
+
|
108
|
+
expect(last_response.status).to eq 200
|
109
|
+
expect(last_response.header).to be_blank
|
110
|
+
expect(last_response.body).to be_blank
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe "GET '/oauth/request_token'" do
|
115
|
+
it 'should return 200 OK' do
|
116
|
+
get '/oauth/request_token'
|
117
|
+
|
118
|
+
expect(last_response.status).to eq 200
|
119
|
+
expect(last_response.header).to be_blank
|
120
|
+
expect(last_response.body).to be_blank
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Twimock::API do
|
4
|
+
let(:hostname) { "api.twitter.com" }
|
5
|
+
let(:port) { 443 }
|
6
|
+
let(:middlewares) { [ Twimock::API::OAuth::AccessToken,
|
7
|
+
Twimock::API::OAuth::RequestToken,
|
8
|
+
Twimock::API::Account::VerifyCredentials ] }
|
9
|
+
|
10
|
+
|
11
|
+
describe '::HOSTNAME' do
|
12
|
+
subject { Twimock::API::HOSTNAME }
|
13
|
+
it { is_expected.to eq hostname }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '::PORT' do
|
17
|
+
subject { Twimock::API::PORT }
|
18
|
+
it { is_expected.to eq port }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '::MIDDLEWARES' do
|
22
|
+
subject { Twimock::API::MIDDLEWARES }
|
23
|
+
it { is_expected.to eq middlewares }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '.on?' do
|
27
|
+
context 'when api mock is on' do
|
28
|
+
before { expect(ShamRack).to receive(:application_for).with(hostname, port) { Object.new } }
|
29
|
+
subject { Twimock::API.on? }
|
30
|
+
it { is_expected.to eq true }
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when api mock is off' do
|
34
|
+
before { expect(ShamRack).to receive(:application_for).with(hostname, port) { nil } }
|
35
|
+
subject { Twimock::API.on? }
|
36
|
+
it { is_expected.to eq false }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '.on' do
|
41
|
+
context 'when api mock is on' do
|
42
|
+
before do
|
43
|
+
expect(Twimock::API).to receive(:on?) { false }
|
44
|
+
expect(ShamRack).to receive(:at)
|
45
|
+
end
|
46
|
+
subject { Twimock::API.on }
|
47
|
+
it { is_expected.to eq true }
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'when api mock is off' do
|
51
|
+
before do
|
52
|
+
expect(Twimock::API).to receive(:on?) { true }
|
53
|
+
end
|
54
|
+
subject { Twimock::API.on }
|
55
|
+
it { is_expected.to eq true }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '.off' do
|
60
|
+
before { expect(ShamRack).to receive(:unmount_all) }
|
61
|
+
subject { Twimock::API.off }
|
62
|
+
it { is_expected.to eq true }
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '.app' do
|
66
|
+
subject { Twimock::API.app }
|
67
|
+
it { is_expected.to be_instance_of middlewares.last }
|
68
|
+
|
69
|
+
it 'should have middlewares and application as instance variable "app"' do
|
70
|
+
mid3 = Twimock::API.app
|
71
|
+
mid2 = mid3.instance_variable_get(:@app)
|
72
|
+
mid1 = mid2.instance_variable_get(:@app)
|
73
|
+
app = mid1.instance_variable_get(:@app)
|
74
|
+
|
75
|
+
expect(app.class).to eq Twimock::API::Application
|
76
|
+
expect(middlewares).to be_include mid1.class
|
77
|
+
expect(middlewares).to be_include mid2.class
|
78
|
+
expect(middlewares).to be_include mid3.class
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|