rubot-base 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.
- data/lib/rubot/base.rb +1182 -0
- data/lib/rubot/base/utils.rb +141 -0
- data/lib/rubot/mime.rb +453 -0
- data/test/rubot/base.rb +179 -0
- data/test/rubot_config.rb +15 -0
- data/test/tools.rb +12 -0
- metadata +73 -0
data/test/rubot/base.rb
ADDED
@@ -0,0 +1,179 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
$: << '../../lib'
|
3
|
+
require 'rubot/base'
|
4
|
+
require '../rubot_config'
|
5
|
+
require '../tools'
|
6
|
+
require 'test/unit'
|
7
|
+
|
8
|
+
include RubotTestTools
|
9
|
+
|
10
|
+
class BaseTest < Test::Unit::TestCase
|
11
|
+
|
12
|
+
def test_monkey_patching
|
13
|
+
assert_equal "x&y".for_url, "x%26y"
|
14
|
+
assert_equal ([1].collect_hash { {:a => :b} }), {:a => :b}
|
15
|
+
assert ([true, true ].for_all? { |x| x }), "first for_all? test should be true"
|
16
|
+
assert !([true, false].for_all? { |x| x }), "second for_all? test should be false"
|
17
|
+
assert ([true, false].exists? { |x| x }), "first exists? test should be true"
|
18
|
+
assert !([false, false].exists? { |x| x }), "second exists? test should be false"
|
19
|
+
assert_equal ({:a=>:b}).to_url_data, "a=b"
|
20
|
+
assert_equal ({'a'=>:b}).keys_to_sym, {:a=>:b}
|
21
|
+
ary = {'a'=>:b}
|
22
|
+
ary.keys_to_sym!
|
23
|
+
assert_equal ary, {:a=>:b}
|
24
|
+
assert_equal ({1=>2}.collect_hash { {:a => :b} }), {:a => :b}
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_connection
|
28
|
+
assert_raise SocketError do
|
29
|
+
tmp_server :test, :host => "does.not.exists", :username => 'x', :password => 'y'
|
30
|
+
end
|
31
|
+
assert_nothing_raised "Test wiki available?" do
|
32
|
+
tmp_server *Rubot::TESTWIKI
|
33
|
+
end
|
34
|
+
assert_raise Net::HTTPServerException do
|
35
|
+
tmp_server(*Rubot::TESTWIKI) { |server| server.request :path => 'bad.request' }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_family
|
40
|
+
Rubot.new :en, :host => 'localhost'
|
41
|
+
Rubot.new :en, :host => 'en.somewiki.tld', :wiki_family => :somewiki
|
42
|
+
assert_equal :default, Rubot.default_family
|
43
|
+
assert_equal :default, Rubot[:en].family
|
44
|
+
assert_equal :default, Rubot.new(:de, :host => 'localhost').family
|
45
|
+
assert_equal Rubot[:en], Rubot[:en, :default]
|
46
|
+
Rubot.default_family = :somewiki
|
47
|
+
assert_equal :somewiki, Rubot.default_family
|
48
|
+
assert_equal :somewiki, Rubot[:en].family
|
49
|
+
assert_equal :somewiki, Rubot.new(:de, :host => 'somewiki').family
|
50
|
+
assert_equal Rubot[:en], Rubot[:en, :somewiki]
|
51
|
+
Rubot.default_family = :default
|
52
|
+
assert_equal :default, Rubot[:de].family
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_value
|
56
|
+
assert_equal 'a string', Rubot.value('a string', :en)
|
57
|
+
assert_equal 'a string', Rubot.value({ :en => 'a string', :fr => 'another string' }, :en)
|
58
|
+
assert_equal 'a string', Rubot.value(lambda { |v| 'a string' if v == :en }, :en)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_login
|
62
|
+
assert tmp_server(*Rubot::TESTWIKI).logged_in?, "check to add :username and :password to test wiki config"
|
63
|
+
config = Rubot::TESTWIKI[1].dup
|
64
|
+
config.delete :username
|
65
|
+
assert (not tmp_server(:test, config).logged_in?), "login should fail without username."
|
66
|
+
config[:username] = "ThisUserDoesNotExist"
|
67
|
+
assert_raise(Rubot::LoginError) { tmp_server(:test, config).logged_in? }
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_check_preferences
|
71
|
+
tmp_server *Rubot::TESTWIKI do |server|
|
72
|
+
assert_equal 'en', server.preferences['wpUserLanguage']
|
73
|
+
server.preferences['wpUserLanguage'] = 'de'
|
74
|
+
assert_nothing_raised { server.check_preferences true }
|
75
|
+
assert_equal 'druckversion', server.hpricot.at('#t-print a').inner_html.downcase
|
76
|
+
server.preferences['wpUserLanguage'] = 'en'
|
77
|
+
assert_nothing_raised { server.check_preferences true }
|
78
|
+
assert_equal 'printable version', server.hpricot.at('#t-print a').inner_html.downcase
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_read_write
|
83
|
+
tmp_server *Rubot::TESTWIKI do |server|
|
84
|
+
TEST_STRINGS[0..1].each do |str|
|
85
|
+
assert_nothing_raised { server.write_page 'Read and write test', str, 'summary', true }
|
86
|
+
assert_equal str, server.read_page('Read and write test')
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_page_history
|
92
|
+
tmp_server *Rubot::TESTWIKI do |server|
|
93
|
+
1.upto(100) { |i| server.write_page 'Page with long history', "Counting upto 100: #{i}", 'summary', true }
|
94
|
+
server.write_page 'Page with long history', "That's it!", 'summary'
|
95
|
+
hist = []
|
96
|
+
assert_nothing_raised { hist = server.page_history 'Page with long history' }
|
97
|
+
assert hist.length > 90, "There should be more than 90 edits!"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_move
|
102
|
+
tmp_server *Rubot::TESTWIKI do |server|
|
103
|
+
page = "Created #{Time.now.strftime("Created %H:%M:%S")}"
|
104
|
+
server.write_page page, "to be moved", "summary", true
|
105
|
+
sleep(2)
|
106
|
+
assert_nothing_raised { server.move page, "Moved #{Time.now.strftime("Moved %H:%M:%S")}", "summary" }
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_recent_changes
|
111
|
+
tmp_server *Rubot::TESTWIKI do |server|
|
112
|
+
1.upto(50) { |i| server.write_page "Many Pages, No. #{i}", Time.now.strftime("%y/%m/%d, %H:%M:%S"), 'summary', true }
|
113
|
+
page = Time.now.strftime("Created %H:%M:%S")
|
114
|
+
server.write_page page, "to be moved", "summary", true
|
115
|
+
sleep(2)
|
116
|
+
server.move page, Time.now.strftime("Moved %H:%M:%S"), "summary"
|
117
|
+
changes = nil
|
118
|
+
assert_nothing_raised { changes = server.recent_changes }
|
119
|
+
assert_not_nil changes
|
120
|
+
[:edits, :deletes, :moves, :uploads, :protections, :user_rights].each { |key| assert_not_nil changes[key], "#{key} missing" }
|
121
|
+
assert changes[:edits].length > 30, "where are all the edits gone?"
|
122
|
+
assert changes[:moves].length > 0, "I moved a page!"
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_upload
|
127
|
+
puts "Upload test not yet written!"
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_category_pages
|
131
|
+
tmp_server *Rubot::TESTWIKI do |server|
|
132
|
+
1.upto 210 do |i|
|
133
|
+
server.write_page "In a test category #{i}", Time.now.strftime("%y/%m/%d, %H:%M:%S\n[[Category:Test]]"), 'summary'
|
134
|
+
end
|
135
|
+
pages = nil
|
136
|
+
assert_nothing_raised { pages = server.category_pages "Test" }
|
137
|
+
assert_not_nil pages
|
138
|
+
assert pages.length > 201, "where are the pages gone?"
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_namespaces
|
143
|
+
tmp_server *Rubot::TESTWIKI do |server|
|
144
|
+
[ :main, :talk,
|
145
|
+
:user, :user_talk,
|
146
|
+
:project, :project_talk,
|
147
|
+
:image, :image_talk,
|
148
|
+
:mediawiki, :mediawiki_talk,
|
149
|
+
:template, :template_talk,
|
150
|
+
:help, :help_talk,
|
151
|
+
:category, :category_talk ].each { |ns| assert_not_nil server.lns(ns), "no #{ns} namespace" }
|
152
|
+
assert_equal 0, server.namespace_index(:main)
|
153
|
+
assert_equal 1, server.namespace_index(server.lns(:talk))
|
154
|
+
assert_equal 2, server.namespace_index(2)
|
155
|
+
assert_equal 3, server.namespace_index('ns3')
|
156
|
+
assert_equal '', server.namespace(:main)
|
157
|
+
assert_equal "#{server.lns(:talk)}:", server.namespace(:talk)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_pages_in_namespace
|
162
|
+
tmp_server *Rubot::TESTWIKI do |server|
|
163
|
+
pages = nil
|
164
|
+
assert_nothing_raised { pages = server.pages_in_namespace :main }
|
165
|
+
assert_not_nil pages
|
166
|
+
assert pages.length > 0, "no pages in main namespace?"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def test_all_pages
|
171
|
+
tmp_server *Rubot::TESTWIKI do |server|
|
172
|
+
pages = nil
|
173
|
+
assert_nothing_raised { pages = server.all_pages }
|
174
|
+
assert_not_nil pages
|
175
|
+
assert pages.length > 0, "no pages in this wiki?"
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Unfortunatly a Testwiki is needed to do all the Unit Testing,
|
2
|
+
# since Rubot is not (yet) able to fake a wiki.
|
3
|
+
#
|
4
|
+
# DO NOT USE A WIKI NOT ENTIRELY DEDICADED TO TESTING!
|
5
|
+
# It is recommended to use a local wiki, since heavy
|
6
|
+
# network usages should be expected otherwise.
|
7
|
+
#
|
8
|
+
# Simply put your Wiki config in here.
|
9
|
+
|
10
|
+
module Rubot
|
11
|
+
TESTWIKI = [ :test, { :host => 'localhost',
|
12
|
+
:path => '/testwiki/index.php',
|
13
|
+
:username => 'TestBot',
|
14
|
+
:password => 'test' } ]
|
15
|
+
end
|
data/test/tools.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
module RubotTestTools
|
2
|
+
|
3
|
+
def tmp_server(*config)
|
4
|
+
server = Rubot.new *config
|
5
|
+
yield(server) if block_given?
|
6
|
+
Rubot::Server.server[server.family].delete server.iw
|
7
|
+
end
|
8
|
+
|
9
|
+
TEST_STRINGS = ["Hello from ''unit testing''!\n[[Category:Test]]\n",
|
10
|
+
"Hello from unit testing!\n[[Category:Test]]\n"]
|
11
|
+
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.4
|
3
|
+
specification_version: 1
|
4
|
+
name: rubot-base
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.0.1
|
7
|
+
date: 2008-04-07 00:00:00 +02:00
|
8
|
+
summary: Library for creating bots for MediaWiki projects (i.e. Wikipedia)
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: konstantin.mailinglists@googlemail.com
|
12
|
+
homepage:
|
13
|
+
rubyforge_project:
|
14
|
+
description: "Rubot is a library for creating bots for MediaWiki projects (i.e. Wikipedia). This gem contains the rubot base library and a collection of rubot utilities. It can be either used directly or through an adapter library (for handling monitoring, caching and so on). Status Quo: This libary is working quite smooth now but it's not as feature-rich as I want it to be. Heavy improvements to be expected."
|
15
|
+
autorequire: rubot/base
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.8.6
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Konstantin Haase
|
31
|
+
files:
|
32
|
+
- lib/rubot/base.rb
|
33
|
+
- lib/rubot/mime.rb
|
34
|
+
- lib/rubot/base/utils.rb
|
35
|
+
- test/rubot_config.rb
|
36
|
+
- test/tools.rb
|
37
|
+
- test/rubot/base.rb
|
38
|
+
test_files: []
|
39
|
+
|
40
|
+
rdoc_options:
|
41
|
+
- -S
|
42
|
+
- -N
|
43
|
+
- -w
|
44
|
+
- "2"
|
45
|
+
- -m
|
46
|
+
- rubot/base.rb
|
47
|
+
extra_rdoc_files: []
|
48
|
+
|
49
|
+
executables: []
|
50
|
+
|
51
|
+
extensions: []
|
52
|
+
|
53
|
+
requirements: []
|
54
|
+
|
55
|
+
dependencies:
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: htmlentities
|
58
|
+
version_requirement:
|
59
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 4.0.0
|
64
|
+
version:
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: hpricot
|
67
|
+
version_requirement:
|
68
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 0.5.0
|
73
|
+
version:
|