mediawiki_api 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: 4033e20e939a4e529667d68f9980dbecbf546e39
4
- data.tar.gz: 26a103f6d54867b344c0e8542d42cbb58ae5ecb1
3
+ metadata.gz: 7b76c6bc6c035d11d6b3690aba25961df0472eac
4
+ data.tar.gz: bf35918e838839955bc6e3897ce8bfe865c26d70
5
5
  SHA512:
6
- metadata.gz: 3b9163974f7c7dcbfcf57de36c9339c978a856c5d199d2cd4706ac3a06d34e4ef8b4c110975fd601a27f5d1c0e19936c24d116f4fb8bd3f7195e68f34954d1fa
7
- data.tar.gz: 7cc523a723658d551cff463f92aa20d78810fd21f2e66bab690aa229815619bd75bcaf1254ea6b0a39c90b13a8c813a74d3af83342d0a9e7609ccdec7948017e
6
+ metadata.gz: 33b30d02eb1ab3cf1044875a5903a516e0d55638e5c60c93b29545ef9cfd34270ee32e50a8c0c67e55fadc6451048b084c6d8c44e4107934ca917ace7f62d6df
7
+ data.tar.gz: 899a279b3499c720ddd38d3c6ce883613d54c4c9f32cb67e4e40098aff9bc7bf8b09d43e1cbddf7b7058c4fe4a162e8a1e1a01335deaafb8c4ca42dbbc75b4fc
data/README.md CHANGED
@@ -65,6 +65,11 @@ See https://www.mediawiki.org/wiki/Gerrit
65
65
 
66
66
  ## Release notes
67
67
 
68
+ ### 0.5.0 2015-09-04
69
+ - Client cookies can now be read and modified via MediawikiApi::Client#cookies.
70
+ - Logging in will recurse upon a `NeedToken` API error only once to avoid
71
+ infinite recursion in cases where authentication is repeatedly unsuccessful.
72
+
68
73
  ### 0.4.1 2015-06-17
69
74
  - Allow for response-less ApiError exceptions to make mocking in tests easier
70
75
 
@@ -10,18 +10,22 @@ module MediawikiApi
10
10
  class Client
11
11
  FORMAT = 'json'
12
12
 
13
+ attr_reader :cookies
13
14
  attr_accessor :logged_in
14
15
 
15
16
  alias_method :logged_in?, :logged_in
16
17
 
17
18
  def initialize(url, log = false)
19
+ @cookies = HTTP::CookieJar.new
20
+
18
21
  @conn = Faraday.new(url: url) do |faraday|
19
22
  faraday.request :multipart
20
23
  faraday.request :url_encoded
21
24
  faraday.response :logger if log
22
- faraday.use :cookie_jar
25
+ faraday.use :cookie_jar, jar: @cookies
23
26
  faraday.adapter Faraday.default_adapter
24
27
  end
28
+
25
29
  @logged_in = false
26
30
  @tokens = {}
27
31
  end
@@ -89,6 +93,7 @@ module MediawikiApi
89
93
  @logged_in = true
90
94
  @tokens.clear
91
95
  when 'NeedToken'
96
+ raise LoginError, "failed to log in with the returned token '#{token}'" unless token.nil?
92
97
  data = log_in(username, password, data['token'])
93
98
  else
94
99
  raise LoginError, data['result']
@@ -1,4 +1,4 @@
1
1
  # MediaWiki Ruby API
2
2
  module MediawikiApi
3
- VERSION = '0.4.1'
3
+ VERSION = '0.5.0'
4
4
  end
@@ -172,8 +172,28 @@ describe MediawikiApi::Client do
172
172
  end
173
173
  end
174
174
 
175
- describe '#log_in' do
175
+ describe '#cookies' do
176
+ subject { client.cookies }
177
+
178
+ it { is_expected.to be_a(HTTP::CookieJar) }
179
+
180
+ context 'when a new cookie is added' do
181
+ before do
182
+ client.cookies.add(HTTP::Cookie.new('cookie_name', '1', domain: 'localhost', path: '/'))
183
+ end
184
+
185
+ it 'includes the cookie in subsequent requests' do
186
+ stub_token_request('csrf')
187
+ request = stub_action_request('foo').with(headers: { 'Cookie' => 'cookie_name=1' })
176
188
 
189
+ client.action(:foo)
190
+
191
+ expect(request).to have_been_requested
192
+ end
193
+ end
194
+ end
195
+
196
+ describe '#log_in' do
177
197
  it 'logs in when API returns Success' do
178
198
  stub_request(:post, api_url).
179
199
  with(body: { format: 'json', action: 'login', lgname: 'Test', lgpassword: 'qwe123' }).
@@ -184,39 +204,48 @@ describe MediawikiApi::Client do
184
204
  end
185
205
 
186
206
  context 'when API returns NeedToken' do
187
- before do
188
- stub_request(:post, api_url).
189
- with(body: { format: 'json', action: 'login', lgname: 'Test', lgpassword: 'qwe123' }).
190
- to_return(
191
- body: { login: body_base.merge(result: 'NeedToken', token: '456') }.to_json,
192
- headers: { 'Set-Cookie' => 'prefixSession=789; path=/; domain=localhost; HttpOnly' }
193
- )
207
+ context 'and a token was not given' do
208
+ before do
209
+ stub_login_request('Test', 'qwe123').
210
+ to_return(
211
+ body: { login: body_base.merge(result: 'NeedToken', token: '456') }.to_json,
212
+ headers: { 'Set-Cookie' => 'prefixSession=789; path=/; domain=localhost; HttpOnly' }
213
+ )
214
+
215
+ @success_req = stub_login_request('Test', 'qwe123', '456').
216
+ with(headers: { 'Cookie' => 'prefixSession=789' }).
217
+ to_return(body: { login: body_base.merge(result: 'Success') }.to_json)
218
+ end
194
219
 
195
- @success_req = stub_request(:post, api_url).
196
- with(body: { format: 'json', action: 'login',
197
- lgname: 'Test', lgpassword: 'qwe123', lgtoken: '456' }).
198
- with(headers: { 'Cookie' => 'prefixSession=789' }).
199
- to_return(body: { login: body_base.merge(result: 'Success') }.to_json)
200
- end
220
+ it 'logs in' do
221
+ response = subject.log_in('Test', 'qwe123')
201
222
 
202
- it 'logs in' do
203
- response = subject.log_in('Test', 'qwe123')
223
+ expect(response).to include('result' => 'Success')
224
+ expect(subject.logged_in).to be true
225
+ end
204
226
 
205
- expect(response).to include('result' => 'Success')
206
- expect(subject.logged_in).to be true
227
+ it 'sends second request with token and cookies' do
228
+ subject.log_in('Test', 'qwe123')
229
+
230
+ expect(@success_req).to have_been_requested
231
+ end
207
232
  end
208
233
 
209
- it 'sends second request with token and cookies' do
210
- subject.log_in('Test', 'qwe123')
234
+ context 'but a token was already provided' do
235
+ subject { client.log_in('Test', 'qwe123', '123') }
211
236
 
212
- expect(@success_req).to have_been_requested
237
+ it 'should raise a LoginError' do
238
+ stub_login_request('Test', 'qwe123', '123').
239
+ to_return(body: { login: body_base.merge(result: 'NeedToken', token: '456') }.to_json)
240
+
241
+ expect { subject }.to raise_error(MediawikiApi::LoginError)
242
+ end
213
243
  end
214
244
  end
215
245
 
216
246
  context 'when API returns neither Success nor NeedToken' do
217
247
  before do
218
- stub_request(:post, api_url).
219
- with(body: { format: 'json', action: 'login', lgname: 'Test', lgpassword: 'qwe123' }).
248
+ stub_login_request('Test', 'qwe123').
220
249
  to_return(body: { login: body_base.merge(result: 'EmptyPass') }.to_json)
221
250
  end
222
251
 
@@ -26,6 +26,13 @@ module MediawikiApi
26
26
  stub_api_request(method, params.merge(action: action, token: mock_token))
27
27
  end
28
28
 
29
+ def stub_login_request(username, password, token = nil)
30
+ params = { action: 'login', lgname: username, lgpassword: password }
31
+ params[:lgtoken] = token unless token.nil?
32
+
33
+ stub_api_request(:post, params)
34
+ end
35
+
29
36
  def stub_token_request(type, warning = nil)
30
37
  response = { query: { tokens: { "#{type}token" => mock_token } } }
31
38
  response[:warnings] = { type => { '*' => [warning] } } unless warning.nil?
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mediawiki_api
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
  - Amir Aharoni
@@ -14,7 +14,7 @@ authors:
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
- date: 2015-06-17 00:00:00.000000000 Z
17
+ date: 2015-09-04 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: faraday