mediawiki-gateway 0.6.2 → 1.0.0.rc1
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 +4 -4
- data/COPYING +22 -0
- data/ChangeLog +16 -0
- data/README.md +80 -21
- data/Rakefile +28 -34
- data/bin/mediawiki-gateway +203 -0
- data/lib/media_wiki.rb +4 -9
- data/lib/media_wiki/exception.rb +11 -8
- data/lib/media_wiki/fake_wiki.rb +636 -0
- data/lib/media_wiki/gateway.rb +105 -940
- data/lib/media_wiki/gateway/files.rb +173 -0
- data/lib/media_wiki/gateway/pages.rb +400 -0
- data/lib/media_wiki/gateway/query.rb +98 -0
- data/lib/media_wiki/gateway/site.rb +101 -0
- data/lib/media_wiki/gateway/users.rb +182 -0
- data/lib/media_wiki/utils.rb +47 -13
- data/lib/media_wiki/version.rb +27 -0
- data/lib/mediawiki-gateway.rb +1 -0
- data/spec/{import-test-data.xml → data/import.xml} +0 -0
- data/spec/media_wiki/gateway/files_spec.rb +34 -0
- data/spec/media_wiki/gateway/pages_spec.rb +390 -0
- data/spec/media_wiki/gateway/query_spec.rb +84 -0
- data/spec/media_wiki/gateway/site_spec.rb +122 -0
- data/spec/media_wiki/gateway/users_spec.rb +171 -0
- data/spec/media_wiki/gateway_spec.rb +129 -0
- data/spec/{live_gateway_spec.rb → media_wiki/live_gateway_spec.rb} +31 -35
- data/spec/{utils_spec.rb → media_wiki/utils_spec.rb} +41 -39
- data/spec/spec_helper.rb +17 -16
- metadata +77 -135
- data/.ruby-version +0 -1
- data/.rvmrc +0 -34
- data/Gemfile +0 -19
- data/Gemfile.lock +0 -77
- data/LICENSE +0 -21
- data/config/hosts.yml +0 -17
- data/lib/media_wiki/config.rb +0 -69
- data/mediawiki-gateway.gemspec +0 -113
- data/samples/README +0 -18
- data/samples/create_page.rb +0 -13
- data/samples/delete_batch.rb +0 -14
- data/samples/download_batch.rb +0 -15
- data/samples/email_user.rb +0 -14
- data/samples/export_xml.rb +0 -14
- data/samples/get_page.rb +0 -11
- data/samples/import_xml.rb +0 -14
- data/samples/run_fake_media_wiki.rb +0 -8
- data/samples/search_content.rb +0 -12
- data/samples/semantic_query.rb +0 -17
- data/samples/upload_commons.rb +0 -45
- data/samples/upload_file.rb +0 -13
- data/spec/fake_media_wiki/api_pages.rb +0 -135
- data/spec/fake_media_wiki/app.rb +0 -360
- data/spec/fake_media_wiki/query_handling.rb +0 -136
- data/spec/gateway_spec.rb +0 -888
@@ -0,0 +1,84 @@
|
|
1
|
+
describe_fake MediaWiki::Gateway::Query do
|
2
|
+
|
3
|
+
describe "#search" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
$fake_media_wiki.reset
|
7
|
+
@gateway.create("Search Test", "Foo KEY Blah")
|
8
|
+
@gateway.create("Search Test 2", "Zomp KEY Zorg")
|
9
|
+
@gateway.create("Book:Search Test", "Bar KEY Baz")
|
10
|
+
@gateway.create("Sandbox:Search Test", "Evil KEY Evil")
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "with an empty key" do
|
14
|
+
|
15
|
+
it "should raise an error" do
|
16
|
+
lambda do
|
17
|
+
@gateway.search("")
|
18
|
+
end.should raise_error(MediaWiki::APIError)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "with a valid key and no namespaces" do
|
24
|
+
|
25
|
+
before do
|
26
|
+
@search = @gateway.search("KEY")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should list all matching pages in the main namespace" do
|
30
|
+
@search.should =~ [ "Search Test", "Search Test 2" ]
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "with a valid key and a namespace string" do
|
36
|
+
|
37
|
+
before do
|
38
|
+
@search = @gateway.search("KEY", "Book")
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should list all matching pages in the specified namespaces" do
|
42
|
+
@search.should == [ "Book:Search Test" ]
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "with a valid key and a namespace array" do
|
48
|
+
|
49
|
+
before do
|
50
|
+
@search = @gateway.search("KEY", ["Book", "Sandbox"])
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should list all matching pages in the specified namespaces" do
|
54
|
+
@search.should =~ [ "Sandbox:Search Test", "Book:Search Test" ]
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "with maximum number of results" do
|
60
|
+
|
61
|
+
before do
|
62
|
+
@search = @gateway.search("KEY", nil, 2, 1)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should return at most the maximum number of results asked" do
|
66
|
+
@search.size.should == 1
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "#semantic_query" do
|
73
|
+
|
74
|
+
before do
|
75
|
+
@response = @gateway.semantic_query('[[place::123]]', ['mainlabel=Page'])
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should return an HTML string" do
|
79
|
+
@response.should == 'Sample <B>HTML</B> content.'
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
describe_fake MediaWiki::Gateway::Site do
|
2
|
+
|
3
|
+
describe "#import" do
|
4
|
+
|
5
|
+
let(:import_file) { data('import.xml') }
|
6
|
+
|
7
|
+
describe "when not logged in" do
|
8
|
+
|
9
|
+
it "should raise an error" do
|
10
|
+
lambda do
|
11
|
+
@gateway.import(import_file)
|
12
|
+
end.should raise_error(MediaWiki::Unauthorized)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "when logged in as admin" do
|
18
|
+
|
19
|
+
def import_response
|
20
|
+
<<-XML
|
21
|
+
<api>
|
22
|
+
<import>
|
23
|
+
<page title='Main Page' ns='0' revisions='0'/>
|
24
|
+
<page title='Template:Header' ns='10' revisions='1'/>
|
25
|
+
</import>
|
26
|
+
</api>
|
27
|
+
XML
|
28
|
+
end
|
29
|
+
|
30
|
+
before do
|
31
|
+
@gateway.login("atlasmw", "wombat")
|
32
|
+
@page = @gateway.import(import_file)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should import content" do
|
36
|
+
expect(@page.to_s).to be_equivalent_to(import_response)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "#export" do
|
44
|
+
|
45
|
+
def export_response
|
46
|
+
<<-XML
|
47
|
+
<mediawiki>
|
48
|
+
<page>
|
49
|
+
<title>Main Page</title>
|
50
|
+
<id>1</id>
|
51
|
+
<revision>
|
52
|
+
<id>1</id>
|
53
|
+
<text>Content</text>
|
54
|
+
</revision>
|
55
|
+
</page>
|
56
|
+
</mediawiki>
|
57
|
+
XML
|
58
|
+
end
|
59
|
+
|
60
|
+
before do
|
61
|
+
@page = @gateway.export("Main Page")
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should return export data for the page" do
|
65
|
+
expect(@page.to_s).to be_equivalent_to(export_response)
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#siteinfo" do
|
71
|
+
|
72
|
+
before do
|
73
|
+
$fake_media_wiki.reset
|
74
|
+
@siteinfo = @gateway.siteinfo
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should get the siteinfo" do
|
78
|
+
@siteinfo.should == { 'generator' => "MediaWiki #{MediaWiki::VERSION}" }
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "#version" do
|
84
|
+
|
85
|
+
before do
|
86
|
+
$fake_media_wiki.reset
|
87
|
+
@version = @gateway.version
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should get the version" do
|
91
|
+
@version.should == MediaWiki::VERSION
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "#namespaces_by_prefix" do
|
97
|
+
|
98
|
+
before do
|
99
|
+
$fake_media_wiki.reset
|
100
|
+
@namespaces = @gateway.namespaces_by_prefix
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should list all namespaces" do
|
104
|
+
@namespaces.should == { "" => 0, "Book" => 100, "Sandbox" => 200 }
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
describe "#extensions" do
|
110
|
+
|
111
|
+
before do
|
112
|
+
$fake_media_wiki.reset
|
113
|
+
@extensions = @gateway.extensions
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should list all extensions" do
|
117
|
+
@extensions.should == { "FooExtension" => "r1", "BarExtension" => "r2", 'Semantic MediaWiki' => '1.5' }
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
@@ -0,0 +1,171 @@
|
|
1
|
+
describe_fake MediaWiki::Gateway::Users do
|
2
|
+
|
3
|
+
describe '#login' do
|
4
|
+
|
5
|
+
describe "with a valid username & password" do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@gateway.login('atlasmw', 'wombat')
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should login successfully with the default domain" do
|
12
|
+
$fake_media_wiki.logged_in('atlasmw').should == true
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "with a valid username, password and domain" do
|
18
|
+
|
19
|
+
before do
|
20
|
+
@gateway.login('ldapuser', 'ldappass', 'ldapdomain')
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should login successfully" do
|
24
|
+
$fake_media_wiki.logged_in('ldapuser').should == true
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "with an non-existent username" do
|
30
|
+
|
31
|
+
it "should raise an error" do
|
32
|
+
lambda do
|
33
|
+
@gateway.login('bogususer', 'sekrit')
|
34
|
+
end.should raise_error(MediaWiki::Unauthorized)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "with an incorrect password" do
|
40
|
+
|
41
|
+
it "should raise an error" do
|
42
|
+
lambda do
|
43
|
+
@gateway.login('atlasmw', 'sekrit')
|
44
|
+
end.should raise_error(MediaWiki::Unauthorized)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "with an incorrect domain" do
|
50
|
+
|
51
|
+
it "should raise an error" do
|
52
|
+
lambda do
|
53
|
+
@gateway.login('atlasmw', 'wombat', 'bogusdomain')
|
54
|
+
end.should raise_error(MediaWiki::Unauthorized)
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "#create_account" do
|
62
|
+
|
63
|
+
describe "when logged in as admin" do
|
64
|
+
before do
|
65
|
+
@gateway.login("atlasmw", "wombat")
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should get expected result' do
|
69
|
+
expected = <<-XML
|
70
|
+
<api>
|
71
|
+
<createaccount result='success' token='admin_token+\\' userid='4' username='FooBar'/>
|
72
|
+
</api>
|
73
|
+
XML
|
74
|
+
|
75
|
+
expect(@gateway.create_account({ 'name' => 'FooBar', 'password' => 'BarBaz' }).to_s).to be_equivalent_to(expected)
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
describe '#options' do
|
83
|
+
|
84
|
+
describe 'when logged in' do
|
85
|
+
before do
|
86
|
+
@gateway.login("atlasmw", "wombat")
|
87
|
+
end
|
88
|
+
|
89
|
+
describe 'requesting an options token' do
|
90
|
+
before do
|
91
|
+
@token = @gateway.send(:get_options_token)
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should return a token" do
|
95
|
+
@token.should_not == nil
|
96
|
+
@token.should_not == "+\\"
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'should return the expected response' do
|
102
|
+
expected = '<api options="success" />'
|
103
|
+
expect(@gateway.options({ :realname => 'Bar Baz' }).to_s).to be_equivalent_to(expected)
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "#user_rights" do
|
111
|
+
|
112
|
+
describe "when logged in as admin" do
|
113
|
+
|
114
|
+
before do
|
115
|
+
@gateway.login("atlasmw", "wombat")
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "requesting a userrights token for an existing user" do
|
119
|
+
|
120
|
+
before do
|
121
|
+
@token = @gateway.send(:get_userrights_token, 'nonadmin')
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should return a token" do
|
125
|
+
@token.should_not == nil
|
126
|
+
@token.should_not == "+\\"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "requesting a userrights token for an nonexistant user" do
|
131
|
+
|
132
|
+
it "should raise an error" do
|
133
|
+
lambda do
|
134
|
+
@gateway.send(:get_userrights_token, 'nosuchuser')
|
135
|
+
end.should raise_error(MediaWiki::APIError)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe "changing a user's groups with a valid token" do
|
140
|
+
|
141
|
+
def userrights_response
|
142
|
+
<<-XML
|
143
|
+
<api>
|
144
|
+
<userrights user="nonadmin">
|
145
|
+
<removed>
|
146
|
+
<group>oldgroup</group>
|
147
|
+
</removed>
|
148
|
+
<added>
|
149
|
+
<group>newgroup</group>
|
150
|
+
</added>
|
151
|
+
</userrights>
|
152
|
+
</api>
|
153
|
+
XML
|
154
|
+
end
|
155
|
+
|
156
|
+
before do
|
157
|
+
@token = @gateway.send(:get_userrights_token, 'nonadmin')
|
158
|
+
@result = @gateway.send(:userrights, 'nonadmin', @token, 'newgroup', 'oldgroup', 'because I can')
|
159
|
+
end
|
160
|
+
|
161
|
+
it "should return a result matching the input" do
|
162
|
+
expect(@result.to_s).to be_equivalent_to(userrights_response)
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
describe_fake MediaWiki::Gateway do
|
2
|
+
|
3
|
+
describe 'setting the User-Agent header' do
|
4
|
+
|
5
|
+
ua = described_class::USER_AGENT
|
6
|
+
|
7
|
+
def expect_user_agent(expected, actual = default = true)
|
8
|
+
options = default ? {} : { user_agent: actual }
|
9
|
+
gateway = described_class.new('test.wiki', options)
|
10
|
+
expect(gateway.headers['User-Agent']).to eq(expected)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should default to generic value' do
|
14
|
+
expect_user_agent ua
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should ignore nil value' do
|
18
|
+
expect_user_agent ua, nil
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should prepend given value' do
|
22
|
+
expect_user_agent "Foo/4.2 #{ua}", 'Foo/4.2'
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'with global default' do
|
26
|
+
|
27
|
+
before do
|
28
|
+
described_class.default_user_agent = 'Bar/2.3'
|
29
|
+
end
|
30
|
+
|
31
|
+
after do
|
32
|
+
described_class.default_user_agent = nil
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should default to global value' do
|
36
|
+
expect_user_agent "Bar/2.3 #{ua}"
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should accept nil value' do
|
40
|
+
expect_user_agent ua, nil
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should override with given value' do
|
44
|
+
expect_user_agent "Foo/4.2 #{ua}", 'Foo/4.2'
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "#get_token" do
|
52
|
+
|
53
|
+
describe "when not logged in" do
|
54
|
+
|
55
|
+
describe "requesting an edit token" do
|
56
|
+
|
57
|
+
before do
|
58
|
+
@token = @gateway.send(:get_token, 'edit', 'Main Page')
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should return a blank token" do
|
62
|
+
@token.should_not == nil
|
63
|
+
@token.should == "+\\"
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "requesting an import token" do
|
69
|
+
|
70
|
+
it "should raise an error" do
|
71
|
+
lambda do
|
72
|
+
@gateway.send(:get_token, 'import', 'Main Page')
|
73
|
+
end.should raise_error(MediaWiki::Unauthorized)
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "when logged in as admin user" do
|
81
|
+
|
82
|
+
before do
|
83
|
+
@gateway.login('atlasmw', 'wombat')
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "requesting an edit token for a single page" do
|
87
|
+
|
88
|
+
before do
|
89
|
+
@token = @gateway.send(:get_token, 'edit', 'Main Page')
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should return a token" do
|
93
|
+
@token.should_not == nil
|
94
|
+
@token.should_not == "+\\"
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "requesting an edit token for multiple pages" do
|
100
|
+
|
101
|
+
before do
|
102
|
+
@token = @gateway.send(:get_token, 'edit', "Main Page|Another Page")
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should return a token" do
|
106
|
+
@token.should_not == nil
|
107
|
+
@token.should_not == "+\\"
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "requesting an import token" do
|
113
|
+
|
114
|
+
before do
|
115
|
+
@token = @gateway.send(:get_token, 'import', 'Main Page')
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should return a token" do
|
119
|
+
@token.should_not == nil
|
120
|
+
@token.should_not == "+\\"
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|