gf-Soks 1.0.4
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/LICENSE.txt +66 -0
- data/README.txt +64 -0
- data/bin/soks-create-wiki.rb +193 -0
- data/contrib/diff/lcs.rb +1105 -0
- data/contrib/diff/lcs/array.rb +21 -0
- data/contrib/diff/lcs/block.rb +51 -0
- data/contrib/diff/lcs/callbacks.rb +322 -0
- data/contrib/diff/lcs/change.rb +169 -0
- data/contrib/diff/lcs/hunk.rb +257 -0
- data/contrib/diff/lcs/ldiff.rb +226 -0
- data/contrib/diff/lcs/string.rb +19 -0
- data/contrib/diff_licence.txt +76 -0
- data/contrib/easyprompt.rb +58 -0
- data/contrib/easyprompt_licence.txt +504 -0
- data/contrib/redcloth-3.0.3.rb +1113 -0
- data/contrib/redcloth_license.txt +27 -0
- data/lib/authenticators.rb +121 -0
- data/lib/helpers/counter-helpers.rb +132 -0
- data/lib/helpers/default-helpers.rb +416 -0
- data/lib/helpers/mail2wiki-helper.rb +105 -0
- data/lib/helpers/maintenance-helpers.rb +149 -0
- data/lib/helpers/rss2wiki-helper.rb +47 -0
- data/lib/helpers/wiki2html.rb +60 -0
- data/lib/soks-model.rb +271 -0
- data/lib/soks-servlet.rb +177 -0
- data/lib/soks-storage.rb +187 -0
- data/lib/soks-upgrade-0.0.2.rb +70 -0
- data/lib/soks-utils.rb +327 -0
- data/lib/soks-view.rb +399 -0
- data/lib/soks.rb +27 -0
- data/rakefile +109 -0
- data/templates/default/attachment/favicon.ico +0 -0
- data/templates/default/attachment/logo.jpg +0 -0
- data/templates/default/attachment/logo.png +0 -0
- data/templates/default/attachment/logo.tiff +0 -0
- data/templates/default/attachment/newpage.js +41 -0
- data/templates/default/attachment/print_stylesheet.css +2 -0
- data/templates/default/attachment/robots.txt +6 -0
- data/templates/default/attachment/rss.png +0 -0
- data/templates/default/attachment/stylesheet.css +219 -0
- data/templates/default/banned_titles.txt +67 -0
- data/templates/default/caches/readme.txt +1 -0
- data/templates/default/content/Api%20for%20classes%20to%20modify%20the%20wiki.textile +30 -0
- data/templates/default/content/Author.textile +16 -0
- data/templates/default/content/Automatic%20Summaries.textile +40 -0
- data/templates/default/content/Automatic%20counters.textile +22 -0
- data/templates/default/content/Automatic%20exporters.textile +23 -0
- data/templates/default/content/Automatic%20importers.textile +59 -0
- data/templates/default/content/Automatic%20linking.textile +7 -0
- data/templates/default/content/Automatic%20maintenance%20helpers.textile +39 -0
- data/templates/default/content/Bug%3A%20Competing%20edits.textile +22 -0
- data/templates/default/content/Bug%3A%20Does%20not%20make%20use%20of%20if%2Dmodified%2Dsince%20r.textile +3 -0
- data/templates/default/content/Bug%3A%20Email%20adresses%20in%20page%20titles%20cause%20incorrec.textile +3 -0
- data/templates/default/content/Bug%3A%20GEM%20limits%20title%20lengths.textile +3 -0
- data/templates/default/content/Bug%3A%20Memory%20leak.textile +13 -0
- data/templates/default/content/Bug%3A%20Page%2Einserted%5Finto%20is%20never%20purged.textile +17 -0
- data/templates/default/content/Bug%3A%20Pages%20that%20link%20here%20may%20not%20appear%20on%20r.textile +13 -0
- data/templates/default/content/Bug%3A%20Textile%20mishandles%20paragraphs.textile +37 -0
- data/templates/default/content/Bug%3A%20Unanticipated%20Rollbacks.textile +23 -0
- data/templates/default/content/Bug%3A%20notextile%20does%20not%20prevent%20page%20inserts.textile +3 -0
- data/templates/default/content/Home%20Page.textile +22 -0
- data/templates/default/content/How%20to%20administrate%20this%20wiki.textile +57 -0
- data/templates/default/content/How%20to%20change%20the%20way%20this%20wiki%20looks.textile +32 -0
- data/templates/default/content/How%20to%20export%20a%20site%20from%20this%20wiki.textile +82 -0
- data/templates/default/content/How%20to%20get%20the%20latest%20Soks%20from%20cvs.textile +45 -0
- data/templates/default/content/How%20to%20hack%20soks.textile +66 -0
- data/templates/default/content/How%20to%20import%20a%20site%20from%20instiki.textile +15 -0
- data/templates/default/content/How%20to%20import%20data.textile +41 -0
- data/templates/default/content/How%20to%20install%20Soks.textile +33 -0
- data/templates/default/content/How%20to%20password%20protect%20your%20wiki.textile +53 -0
- data/templates/default/content/How%20to%20re%2Dbuild%20the%20page%20cache.textile +71 -0
- data/templates/default/content/How%20to%20report%20a%20bug.textile +9 -0
- data/templates/default/content/How%20to%20upgrade%20soks.textile +32 -0
- data/templates/default/content/How%20to%20use%20the%20Automatic%20Helper%20classes.textile +12 -0
- data/templates/default/content/How%20to%20use%20this%20wiki.textile +30 -0
- data/templates/default/content/List%20of%20changes.textile +10 -0
- data/templates/default/content/News%3A%20Version%201%2D0%2D0%20released.textile +19 -0
- data/templates/default/content/News%3A%20Version%201%2D0%2D1%20released.textile +12 -0
- data/templates/default/content/Pages%20to%20include%20in%20the%20distribution.textile +55 -0
- data/templates/default/content/Per%20Wiki%20Templates.textile +37 -0
- data/templates/default/content/Picture%20of%20a%20pair%20of%20soks.textile +1 -0
- data/templates/default/content/Planned%20Features.textile +74 -0
- data/templates/default/content/README.textile +64 -0
- data/templates/default/content/RSS%20feed.textile +9 -0
- data/templates/default/content/Recent%20changes%20to%20this%20site.textile +352 -0
- data/templates/default/content/SOKS%20features.textile +19 -0
- data/templates/default/content/Sidebar%20Page.textile +6 -0
- data/templates/default/content/Site%20Index.textile +241 -0
- data/templates/default/content/Soks%27s%20Licence.textile +66 -0
- data/templates/default/content/Tag%3A%20Include%20this%20page%20in%20the%20distribution.textile +6 -0
- data/templates/default/start.rb +90 -0
- data/templates/default/version.txt +1 -0
- data/templates/default/views/Page_content.rhtml +1 -0
- data/templates/default/views/Page_edit.rhtml +79 -0
- data/templates/default/views/Page_find.rhtml +35 -0
- data/templates/default/views/Page_linksfromrss.rhtml +24 -0
- data/templates/default/views/Page_listrss.rhtml +46 -0
- data/templates/default/views/Page_meta.rhtml +44 -0
- data/templates/default/views/Page_print.rhtml +6 -0
- data/templates/default/views/Page_revision.rhtml +39 -0
- data/templates/default/views/Page_revisions.rhtml +36 -0
- data/templates/default/views/Page_rss.rhtml +57 -0
- data/templates/default/views/Page_view.rhtml +8 -0
- data/templates/default/views/UploadPage_edit.rhtml +63 -0
- data/templates/default/views/frame.rhtml +63 -0
- data/templates/default/views/messages.yaml +7 -0
- data/test/html/2006Mar.html +66 -0
- data/test/html/poignant.html +36 -0
- data/test/html/poignant.textile +36 -0
- data/test/mock-objects.rb +69 -0
- data/test/test_counter-helper.rb +162 -0
- data/test/test_soks-helper-maintenance.rb +106 -0
- data/test/test_soks-helpers.rb +145 -0
- data/test/test_soks-model.rb +144 -0
- data/test/test_soks-servlet.rb +240 -0
- data/test/test_soks-storage.rb +108 -0
- data/test/test_soks-utils.rb +226 -0
- data/test/test_soks-view.rb +193 -0
- data/test/test_soks.rb +9 -0
- metadata +182 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'mock-objects'
|
|
3
|
+
require 'soks-model'
|
|
4
|
+
|
|
5
|
+
class TestRevision < Test::Unit::TestCase
|
|
6
|
+
include TearDownableWiki
|
|
7
|
+
|
|
8
|
+
def test_content
|
|
9
|
+
page = Page.new('test page')
|
|
10
|
+
page.revise('1','new author' )
|
|
11
|
+
revision = page.revisions.last
|
|
12
|
+
page.revise('2','new author' )
|
|
13
|
+
page.revise('3','new author' )
|
|
14
|
+
assert_equal('1', revision.content )
|
|
15
|
+
assert_equal('', revision.previous_content )
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_revision_after
|
|
19
|
+
1.upto(5) { |i| @wiki.revise 'revision test', "#{i}", 'tamc2' }
|
|
20
|
+
page = @wiki.page 'revision test'
|
|
21
|
+
assert_equal( page.revision(1), page.revision(0).following_revision)
|
|
22
|
+
assert_equal( page.revision(2), page.revision(1).following_revision )
|
|
23
|
+
assert_equal( nil, page.revision(4).following_revision )
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_revision_before
|
|
27
|
+
1.upto(5) { |i| @wiki.revise 'revision test', "#{i}", 'tamc2' }
|
|
28
|
+
page = @wiki.page 'revision test'
|
|
29
|
+
assert_equal( page.revision(0), page.revision(1).previous_revision)
|
|
30
|
+
assert_equal( page.revision(1), page.revision(2).previous_revision )
|
|
31
|
+
assert_equal( nil, page.revision(0).previous_revision )
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
class TestPage < Test::Unit::TestCase
|
|
36
|
+
include TearDownableWiki
|
|
37
|
+
|
|
38
|
+
def test_empty
|
|
39
|
+
page = Page.empty('test page')
|
|
40
|
+
assert_equal( 'test page', page.name )
|
|
41
|
+
assert_equal( true, page.empty? )
|
|
42
|
+
assert_equal( false, page.deleted? )
|
|
43
|
+
assert_equal( "[[Create test page => /edit/test page ]]", page.textile )
|
|
44
|
+
assert_equal( "Type what you want here and click save", page.content )
|
|
45
|
+
assert_equal( 'NoOne', page.author )
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_new
|
|
49
|
+
page = Page.new('test page')
|
|
50
|
+
assert_equal( 'test page', page.name )
|
|
51
|
+
assert_equal( true, page.empty? )
|
|
52
|
+
assert_equal( false, page.deleted? )
|
|
53
|
+
assert_equal( "[[Create test page => /edit/test page ]]", page.textile )
|
|
54
|
+
assert_equal( '', page.content )
|
|
55
|
+
#assert_equal( '', page.author )
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_revision
|
|
59
|
+
page = Page.new('test page')
|
|
60
|
+
page.revise('new content','new author' )
|
|
61
|
+
assert_equal( 'test page', page.name )
|
|
62
|
+
assert_equal( false, page.empty? )
|
|
63
|
+
assert_equal( false, page.deleted? )
|
|
64
|
+
assert_equal( "new content", page.textile )
|
|
65
|
+
assert_equal( 'new content', page.content )
|
|
66
|
+
assert_equal( 'new author', page.author )
|
|
67
|
+
assert_equal( [[['+',0,'new content']]], page.changes )
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def test_rollback
|
|
71
|
+
page = Page.new('test page')
|
|
72
|
+
page.revise('1','new author' )
|
|
73
|
+
page.revise('2','new author' )
|
|
74
|
+
page.revise('3','new author' )
|
|
75
|
+
assert_equal( 3, page.revisions.size )
|
|
76
|
+
assert_equal( '3', page.content )
|
|
77
|
+
page.rollback( 0, 'rollbacker' )
|
|
78
|
+
assert_equal( 4, page.revisions.size )
|
|
79
|
+
assert_equal( '1', page.content )
|
|
80
|
+
assert_equal( 'rollbacker', page.author )
|
|
81
|
+
assert_equal( [[['-',0,'3'],['+',0,'1']]], page.changes )
|
|
82
|
+
page.rollback( -1, 'rollbacker' )
|
|
83
|
+
assert_equal( 5, page.revisions.size )
|
|
84
|
+
assert_equal( 'page deleted', page.content )
|
|
85
|
+
assert_equal( true, page.deleted? )
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
class TestWiki < Test::Unit::TestCase
|
|
90
|
+
include TearDownableWiki
|
|
91
|
+
|
|
92
|
+
def test_change_page_caps()
|
|
93
|
+
assert_equal([], files )
|
|
94
|
+
@wiki.revise( 'home page', 'hello world', 'tamc2' )
|
|
95
|
+
assert_equal( true, @wiki.exists?('home page') )
|
|
96
|
+
assert_equal(['home%20page.textile','home%20page.yaml'],files)
|
|
97
|
+
@wiki.revise( 'Home Page', 'hello world', 'tamc2' )
|
|
98
|
+
assert_equal( true, @wiki.exists?('home page') )
|
|
99
|
+
assert_equal(['Home%20Page.textile','Home%20Page.yaml'],files)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def test_page_delete_by_revising
|
|
103
|
+
assert_equal([],files)
|
|
104
|
+
@wiki.revise( 'home page', 'hello world', 'tamc2')
|
|
105
|
+
assert_equal( true, @wiki.exists?('home page') )
|
|
106
|
+
assert_equal( false, @wiki.page('home page').deleted? )
|
|
107
|
+
assert_equal(['home%20page.textile','home%20page.yaml'],files)
|
|
108
|
+
@wiki.revise( 'home page', $MESSAGES[:page_deleted], 'tamc2')
|
|
109
|
+
assert_equal( false, @wiki.exists?('home page') )
|
|
110
|
+
assert_equal( true, @wiki.page('home page').deleted? )
|
|
111
|
+
assert_equal(['home%20page.textile','home%20page.yaml'],files)
|
|
112
|
+
assert_equal( $MESSAGES[:page_deleted], @wiki.page('home page').content )
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def test_page_delete_by_method
|
|
117
|
+
assert_equal([],files)
|
|
118
|
+
@wiki.revise( 'home page', 'hello world', 'tamc2')
|
|
119
|
+
assert_equal( true, @wiki.exists?('home page') )
|
|
120
|
+
assert_equal( false, @wiki.page('home page').deleted? )
|
|
121
|
+
assert_equal(['home%20page.textile','home%20page.yaml'],files)
|
|
122
|
+
@wiki.delete( 'home page', 'tamc2')
|
|
123
|
+
assert_equal( false, @wiki.exists?('home page') )
|
|
124
|
+
assert_equal( true, @wiki.page('home page').deleted? )
|
|
125
|
+
assert_equal(['home%20page.textile','home%20page.yaml'],files)
|
|
126
|
+
assert_equal( $MESSAGES[:page_deleted], @wiki.page('home page').content )
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def test_page_delete_permanently
|
|
130
|
+
assert_equal([],files)
|
|
131
|
+
@wiki.revise( 'home page', 'hello world', 'tamc2')
|
|
132
|
+
assert_equal( true, @wiki.exists?('home page') )
|
|
133
|
+
assert_equal( false, @wiki.page('home page').deleted? )
|
|
134
|
+
assert_equal(['home%20page.textile','home%20page.yaml'],files)
|
|
135
|
+
|
|
136
|
+
assert_raise( RuntimeError ) { @wiki.wipe_from_disk( 'Home Page' ) }
|
|
137
|
+
|
|
138
|
+
@wiki.delete( 'Home Page', 'tamc2' )
|
|
139
|
+
@wiki.wipe_from_disk( 'Home Page' )
|
|
140
|
+
assert_equal( false, @wiki.exists?('home page') )
|
|
141
|
+
assert_equal( false, @wiki.page('home page').deleted? )
|
|
142
|
+
assert_equal([],files)
|
|
143
|
+
end
|
|
144
|
+
end
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'fileutils'
|
|
3
|
+
require 'mock-objects'
|
|
4
|
+
|
|
5
|
+
class MockFileData
|
|
6
|
+
|
|
7
|
+
attr_accessor :filename, :list
|
|
8
|
+
|
|
9
|
+
def initialize( filename = 'test file.txt', list = ['0123456789'])
|
|
10
|
+
@filename, @list = filename, list
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class WEBrick::HTTPServlet::FileHandler
|
|
15
|
+
|
|
16
|
+
def service( request, response )
|
|
17
|
+
response.body = "File #{request.script_name.downcase} #{request.path_info}"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class MockRequest < Hash
|
|
23
|
+
|
|
24
|
+
def path_info
|
|
25
|
+
return path
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def method_missing( method, *args )
|
|
29
|
+
if method.to_s[-1,1] == '=' && args.length == 1
|
|
30
|
+
self[method.to_s[0...-1].to_sym] = args.first
|
|
31
|
+
else
|
|
32
|
+
self[method]
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
class MockResponse < Hash
|
|
39
|
+
|
|
40
|
+
def set_redirect( type, destination )
|
|
41
|
+
self[:redirect_type] = type
|
|
42
|
+
self[:redirect_destination] = destination
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def method_missing( method, *args )
|
|
46
|
+
if method.to_s[-1,1] == '=' && args.length == 1
|
|
47
|
+
self[method.to_s[0...-1].to_sym] = args.first
|
|
48
|
+
else
|
|
49
|
+
self[method]
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
class MockServer
|
|
55
|
+
|
|
56
|
+
def config
|
|
57
|
+
{:Logger => 'a' }
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
class TestWikiServlet < Test::Unit::TestCase
|
|
63
|
+
include TearDownableWiki
|
|
64
|
+
|
|
65
|
+
def setup
|
|
66
|
+
super
|
|
67
|
+
@servlet = WikiServlet.new( MockServer.new, ServletSettings.new(@wiki,@view) )
|
|
68
|
+
@servlet.settings.static_file_directories['Attachment'] = "#{folder}/attachment"
|
|
69
|
+
@servlet.settings.upload_directory = 'Attachment'
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def test_static_files
|
|
73
|
+
@servlet.service( re = MockRequest[ :path => '/favicon.ico' ], rp = MockResponse.new )
|
|
74
|
+
assert_equal( nil, rp[:redirect_destination] )
|
|
75
|
+
assert_equal( "File attachment /favicon.ico", rp[:body])
|
|
76
|
+
@servlet.service( re = MockRequest[ :path => '/robots.txt' ], rp = MockResponse.new )
|
|
77
|
+
assert_equal( nil, rp[:redirect_destination] )
|
|
78
|
+
assert_equal( "File attachment /robots.txt", rp[:body])
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def test_standard_attachment
|
|
82
|
+
@servlet.service( re = MockRequest[ :path => '/attachment/logo.jpg' ], rp = MockResponse.new )
|
|
83
|
+
assert_equal( nil, rp[:redirect_destination] )
|
|
84
|
+
assert_equal( "File attachment /attachment/logo.jpg", rp[:body])
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def test_second_attachment
|
|
88
|
+
@servlet.settings.static_file_directories['Www'] = '/var/www'
|
|
89
|
+
test_standard_attachment
|
|
90
|
+
@servlet.service( re = MockRequest[ :path => '/www/logo.jpg' ], rp = MockResponse.new )
|
|
91
|
+
assert_equal( nil, rp[:redirect_destination] )
|
|
92
|
+
assert_equal( "File www /www/logo.jpg", rp[:body])
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def test_redirect_to_home_page
|
|
96
|
+
@servlet.service( re = MockRequest[ :path => '/' ], rp = MockResponse.new )
|
|
97
|
+
assert_equal( 'http://testsite.com/view/HomePage', rp[:redirect_destination])
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def test_redirect_to_view
|
|
101
|
+
@servlet.service( re = MockRequest[ :path => '/randompage' ], rp = MockResponse.new )
|
|
102
|
+
assert_equal( 'http://testsite.com/view/randompage', rp[:redirect_destination])
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def test_missing_view
|
|
106
|
+
assert_raise(WEBrick::HTTPStatus::NotFound) { @servlet.service( re = MockRequest[ :path => '/missing/randompage', :user => 'test user' ], rp = MockResponse.new ) }
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def test_view_page
|
|
110
|
+
@wiki.revise('test view','hello world','tamc2')
|
|
111
|
+
assert_equal('hello world', @wiki.page('test view').content )
|
|
112
|
+
@servlet.service( re = MockRequest[ :path => '/view/test view', :user => 'test user', :query => {} ], rp = MockResponse.new )
|
|
113
|
+
assert_equal( nil, rp[:redirect_destination] )
|
|
114
|
+
assert_match( /<p>hello world<\/p>/, rp[:body])
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def test_name_to_url_conversion
|
|
118
|
+
@wiki.revise('page!','exclamation','one')
|
|
119
|
+
@wiki.revise('page?','question','one')
|
|
120
|
+
@servlet.service( re = MockRequest[ :path => '/view/Page', :user => 'test user', :query => {} ], rp = MockResponse.new )
|
|
121
|
+
assert_match( /<p>exclamation<\/p>/, rp[:body])
|
|
122
|
+
@servlet.service( re = MockRequest[ :path => '/view/Page-2', :user => 'test user', :query => {} ], rp = MockResponse.new )
|
|
123
|
+
assert_match( /<p>question<\/p>/, rp[:body])
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def test_create_page
|
|
127
|
+
@servlet.service( re = MockRequest[ :path => '/save/test save', :user => 'test user', :query => { 'content' => 'hello world', 'newtitle' => 'test save' } ], rp = MockResponse.new )
|
|
128
|
+
assert_equal( 'http://testsite.com/view/TestSave', rp[:redirect_destination] )
|
|
129
|
+
page = @wiki.page('test save')
|
|
130
|
+
assert_equal( 'test user', page.author )
|
|
131
|
+
assert_equal( 'hello world', page.content )
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def test_revise_page
|
|
135
|
+
@wiki.revise('test save','stuff','someone')
|
|
136
|
+
@servlet.service( re = MockRequest[ :path => '/save/TestSave', :user => 'test user', :query => { 'content' => 'hello world', 'newtitle' => 'test save' } ], rp = MockResponse.new )
|
|
137
|
+
assert_equal( 'http://testsite.com/view/TestSave', rp[:redirect_destination] )
|
|
138
|
+
page = @wiki.page('test save')
|
|
139
|
+
assert_equal( 'test save',page.name )
|
|
140
|
+
assert_equal( 'test user', page.author )
|
|
141
|
+
assert_equal( 'hello world', page.content )
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def test_revise_prefix_page
|
|
145
|
+
@servlet.service( re = MockRequest[ :path => '/save/test save', :user => 'test user', :query => { 'content' => 'hello world', 'titleprefix' => 'test ', 'newtitle' => 'save' } ], rp = MockResponse.new )
|
|
146
|
+
assert_equal( 'http://testsite.com/view/TestSave', rp[:redirect_destination] )
|
|
147
|
+
page = @wiki.page('test save')
|
|
148
|
+
assert_equal( 'test user', page.author )
|
|
149
|
+
assert_equal( 'hello world', page.content )
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def test_revise_change_capitalisation_on_page
|
|
153
|
+
@servlet.service( re = MockRequest[ :path => '/edit/test caps', :user => 'test user', :query => {} ], rp = MockResponse.new )
|
|
154
|
+
@servlet.service( re = MockRequest[ :path => '/save/TestCaps', :user => 'test user', :query => { 'content' => 'hello world', 'newtitle' => 'test caps' } ], rp = MockResponse.new )
|
|
155
|
+
assert_equal( 'http://testsite.com/view/TestCaps', rp[:redirect_destination] )
|
|
156
|
+
assert_equal('test caps', @wiki.page('test caps').name )
|
|
157
|
+
@servlet.service( re = MockRequest[ :path => '/save/TestCaps', :user => 'test user', :query => { 'content' => 'hello world', 'newtitle' => 'Test Caps' } ], rp = MockResponse.new )
|
|
158
|
+
assert_equal( 'http://testsite.com/view/TestCaps', rp[:redirect_destination] )
|
|
159
|
+
assert_equal('Test Caps', @wiki.page('test caps').name )
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def test_revise_and_move_page
|
|
163
|
+
@wiki.revise('test view','hello world','tamc2')
|
|
164
|
+
assert_equal('hello world', @wiki.page('test view').content )
|
|
165
|
+
@servlet.service( re = MockRequest[ :path => '/save/test view', :user => 'test user', :query => { 'content' => 'hello world', 'newtitle' => 'test save' } ], rp = MockResponse.new )
|
|
166
|
+
assert_equal( 'http://testsite.com/view/TestSave', rp[:redirect_destination] )
|
|
167
|
+
newpage = @wiki.page('test save')
|
|
168
|
+
assert_equal( 'test user', newpage.author )
|
|
169
|
+
assert_equal( 'hello world', newpage.content )
|
|
170
|
+
oldpage = @wiki.page('test view')
|
|
171
|
+
assert_equal( 'test user', oldpage.author )
|
|
172
|
+
assert_equal( 'content moved to [[test save]]', oldpage.content )
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def test_revise_and_dont_move_template_page
|
|
176
|
+
@wiki.revise('test type a title here','hello world','tamc2')
|
|
177
|
+
@servlet.service( re = MockRequest[ :path => '/save/test type a title here', :user => 'test user', :query => { 'content' => 'hello world', 'newtitle' => 'test save' } ], rp = MockResponse.new )
|
|
178
|
+
assert_equal( 'http://testsite.com/view/TestSave', rp[:redirect_destination] )
|
|
179
|
+
newpage = @wiki.page('test save')
|
|
180
|
+
assert_equal( 'test user', newpage.author )
|
|
181
|
+
assert_equal( 'hello world', newpage.content )
|
|
182
|
+
oldpage = @wiki.page('test type a title here')
|
|
183
|
+
assert_equal( 'tamc2', oldpage.author )
|
|
184
|
+
assert_equal( 'hello world', oldpage.content )
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def test_delete_page
|
|
188
|
+
@wiki.revise('test delete','hello world','tamc2')
|
|
189
|
+
page = @wiki.page('test delete')
|
|
190
|
+
assert_equal('hello world', page.content )
|
|
191
|
+
assert_equal( false, page.deleted? )
|
|
192
|
+
@servlet.service( re = MockRequest[ :path => '/delete/test delete', :user => 'test user', :query => {} ], rp = MockResponse.new )
|
|
193
|
+
assert_equal( 'http://testsite.com/view/TestDelete', rp[:redirect_destination] )
|
|
194
|
+
assert_equal( 'test user', page.author )
|
|
195
|
+
assert_equal('page deleted', page.content )
|
|
196
|
+
assert_equal( true, page.deleted? )
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def test_rollback_page
|
|
200
|
+
0.upto(5) { |i| @wiki.revise('rollback test', i.to_s, 'test') }
|
|
201
|
+
assert_equal( '5', @wiki.page('rollback test').textile )
|
|
202
|
+
assert_equal( 'test', @wiki.page('rollback test').author )
|
|
203
|
+
@servlet.service( re = MockRequest[ :path => '/rollback/rollback test', :user => 'rollbacker', :query => { 'revision' => 3 } ], rp = MockResponse.new )
|
|
204
|
+
assert_equal( 'http://testsite.com/view/RollbackTest', rp[:redirect_destination] )
|
|
205
|
+
assert_equal( '3', @wiki.page('rollback test').textile )
|
|
206
|
+
assert_equal( 'rollbacker', @wiki.page('rollback test').author )
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def test_upload
|
|
210
|
+
filedata = MockFileData.new
|
|
211
|
+
@servlet.service( re = MockRequest[ :path => '/upload/upload test', :user => 'uploader', :query => { 'file' => filedata, 'titleprefix' => 'upload ', 'newtitle' => 'test'} ], rp = MockResponse.new )
|
|
212
|
+
assert_equal( 'http://testsite.com/view/UploadTest', rp[:redirect_destination] )
|
|
213
|
+
page = @wiki.page('upload test')
|
|
214
|
+
assert_equal( 'uploader', page.author )
|
|
215
|
+
assert_equal( '/Attachment/testfile.txt', page.content )
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def test_upload_clean_up_names
|
|
219
|
+
filedata = MockFileData.new 'C:/Documents and Settings/AB/Desktop/bil_kleb1.jpg'
|
|
220
|
+
@servlet.service( re = MockRequest[ :path => '/upload/upload test' , :user => 'uploader', :query => { 'file' => filedata, 'titleprefix' => 'upload ', 'newtitle' => 'test'} ], rp = MockResponse.new )
|
|
221
|
+
assert_equal( 'http://testsite.com/view/UploadTest', rp[:redirect_destination] )
|
|
222
|
+
page = @wiki.page('upload test')
|
|
223
|
+
assert_equal( 'uploader', page.author )
|
|
224
|
+
assert_equal( '/Attachment/bil_kleb1.jpg', page.content )
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def test_move_upload
|
|
228
|
+
test_upload
|
|
229
|
+
filedata = MockFileData.new
|
|
230
|
+
@servlet.service( re = MockRequest[ :path => '/upload/upload test', :user => 'uploader2', :query => { 'file' => filedata, 'titleprefix' => 'upload ', 'newtitle' => 'second test'} ], rp = MockResponse.new )
|
|
231
|
+
assert_equal( 'http://testsite.com/view/UploadSecondTest', rp[:redirect_destination] )
|
|
232
|
+
newpage = @wiki.page('upload second test')
|
|
233
|
+
assert_equal( 'uploader2', newpage.author )
|
|
234
|
+
assert_equal( '/Attachment/testfile1.txt', newpage.content )
|
|
235
|
+
oldpage = @wiki.page('upload test')
|
|
236
|
+
assert_equal( 'uploader2', oldpage.author )
|
|
237
|
+
assert_equal( 'content moved to [[upload second test]]', oldpage.content )
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'fileutils'
|
|
3
|
+
require 'mock-objects'
|
|
4
|
+
require 'soks-storage'
|
|
5
|
+
|
|
6
|
+
module TestMod
|
|
7
|
+
class TestClass
|
|
8
|
+
def initialize(stuff)
|
|
9
|
+
@stuff = stuff
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class TestWikiCacheStore < Test::Unit::TestCase
|
|
15
|
+
include WikiCacheStore
|
|
16
|
+
include TearDownableWiki
|
|
17
|
+
|
|
18
|
+
def setup
|
|
19
|
+
@cache_folder = folder
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_no_cache
|
|
23
|
+
@cache_folder = nil
|
|
24
|
+
save_cache( :test, "test class" )
|
|
25
|
+
assert_equal( [], files )
|
|
26
|
+
assert_equal( nil, load_cache( :test ) )
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def test_cache
|
|
30
|
+
save_cache( :test, "test class" )
|
|
31
|
+
assert_equal( ['test.marshal'], files )
|
|
32
|
+
assert_equal( "test class", load_cache( :test ) )
|
|
33
|
+
assert_equal( [], files ) # Caches deleted on load
|
|
34
|
+
assert_equal( nil, load_cache( :test ) )
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
class TestWikiFlatFileStore < Test::Unit::TestCase
|
|
39
|
+
include TearDownableWiki
|
|
40
|
+
|
|
41
|
+
def test_rename_if_not_url_encoded
|
|
42
|
+
create_file 'a handy file.textile', 'hello world'
|
|
43
|
+
assert_equal( ['a handy file.textile'], files )
|
|
44
|
+
@wiki.move_files_if_names_are_not_url_encoded
|
|
45
|
+
assert_equal( ['a%20handy%20file.textile'], files )
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_remove_unwanted_characters
|
|
49
|
+
create_file 'a&b.textile', 'hello world'
|
|
50
|
+
assert_equal( ['a&b.textile'], files )
|
|
51
|
+
@wiki.move_files_if_names_are_not_url_encoded
|
|
52
|
+
assert_equal( ['a%26b.textile'], files )
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def test_avoid_overwriting_on_rename
|
|
56
|
+
create_file 'a&b.textile', 'hello world'
|
|
57
|
+
create_file 'a%26b.textile', 'hello world'
|
|
58
|
+
assert_equal( ['a%26b.textile','a&b.textile'], files )
|
|
59
|
+
@wiki.move_files_if_names_are_not_url_encoded
|
|
60
|
+
assert_equal( ['a%26b.textile','a%26b1.textile'], files )
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def test_rename_on_caps_change
|
|
64
|
+
create_file 'Hello%20World.textile', 'hello world'
|
|
65
|
+
create_file 'Hello%20World.yaml', 'hello world'
|
|
66
|
+
assert_equal( ['Hello%20World.textile', 'Hello%20World.yaml'], files)
|
|
67
|
+
@wiki.move_files_for_page( 'Hello World', 'hello world' )
|
|
68
|
+
assert_equal( ['hello%20world.textile','hello%20world.yaml'], files)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def test_delete_files_for_page
|
|
72
|
+
create_file 'Hello%20World.textile', 'hello world'
|
|
73
|
+
create_file 'Hello%20World.yaml', 'hello world'
|
|
74
|
+
assert_equal( ['Hello%20World.textile', 'Hello%20World.yaml'], files)
|
|
75
|
+
@wiki.delete_files_for_page( 'Hello World')
|
|
76
|
+
assert_equal( [], files)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def test_write_all_revisions
|
|
80
|
+
1.upto(5) do |i|
|
|
81
|
+
@wiki.revise('test page',"#{i}","test author")
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
page = @wiki.page('test page')
|
|
85
|
+
assert_equal( 5, page.revisions.size )
|
|
86
|
+
|
|
87
|
+
revisions = @wiki.load_revisions( page )
|
|
88
|
+
assert_equal( 5, revisions.size )
|
|
89
|
+
|
|
90
|
+
page.revisions = [ [0,[[[0,'+','5']]],'test author',Time.now] ]
|
|
91
|
+
assert_equal( 1, page.revisions.size )
|
|
92
|
+
@wiki.revise('test page','extra revision', 'second author')
|
|
93
|
+
assert_equal( 2, page.revisions.size )
|
|
94
|
+
assert_equal( 5, @wiki.load_revisions( page ).size )
|
|
95
|
+
|
|
96
|
+
@wiki.save_all_revisions( page )
|
|
97
|
+
revisions = @wiki.load_revisions( page )
|
|
98
|
+
assert_equal( 2, revisions.size )
|
|
99
|
+
assert_equal( 'second author', revisions[1].author )
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
private
|
|
103
|
+
|
|
104
|
+
def create_file( name, content )
|
|
105
|
+
File.open( File.join( folder, name ), 'w') { |f| f.puts content }
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end
|