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.
Files changed (120) hide show
  1. data/LICENSE.txt +66 -0
  2. data/README.txt +64 -0
  3. data/bin/soks-create-wiki.rb +193 -0
  4. data/contrib/diff/lcs.rb +1105 -0
  5. data/contrib/diff/lcs/array.rb +21 -0
  6. data/contrib/diff/lcs/block.rb +51 -0
  7. data/contrib/diff/lcs/callbacks.rb +322 -0
  8. data/contrib/diff/lcs/change.rb +169 -0
  9. data/contrib/diff/lcs/hunk.rb +257 -0
  10. data/contrib/diff/lcs/ldiff.rb +226 -0
  11. data/contrib/diff/lcs/string.rb +19 -0
  12. data/contrib/diff_licence.txt +76 -0
  13. data/contrib/easyprompt.rb +58 -0
  14. data/contrib/easyprompt_licence.txt +504 -0
  15. data/contrib/redcloth-3.0.3.rb +1113 -0
  16. data/contrib/redcloth_license.txt +27 -0
  17. data/lib/authenticators.rb +121 -0
  18. data/lib/helpers/counter-helpers.rb +132 -0
  19. data/lib/helpers/default-helpers.rb +416 -0
  20. data/lib/helpers/mail2wiki-helper.rb +105 -0
  21. data/lib/helpers/maintenance-helpers.rb +149 -0
  22. data/lib/helpers/rss2wiki-helper.rb +47 -0
  23. data/lib/helpers/wiki2html.rb +60 -0
  24. data/lib/soks-model.rb +271 -0
  25. data/lib/soks-servlet.rb +177 -0
  26. data/lib/soks-storage.rb +187 -0
  27. data/lib/soks-upgrade-0.0.2.rb +70 -0
  28. data/lib/soks-utils.rb +327 -0
  29. data/lib/soks-view.rb +399 -0
  30. data/lib/soks.rb +27 -0
  31. data/rakefile +109 -0
  32. data/templates/default/attachment/favicon.ico +0 -0
  33. data/templates/default/attachment/logo.jpg +0 -0
  34. data/templates/default/attachment/logo.png +0 -0
  35. data/templates/default/attachment/logo.tiff +0 -0
  36. data/templates/default/attachment/newpage.js +41 -0
  37. data/templates/default/attachment/print_stylesheet.css +2 -0
  38. data/templates/default/attachment/robots.txt +6 -0
  39. data/templates/default/attachment/rss.png +0 -0
  40. data/templates/default/attachment/stylesheet.css +219 -0
  41. data/templates/default/banned_titles.txt +67 -0
  42. data/templates/default/caches/readme.txt +1 -0
  43. data/templates/default/content/Api%20for%20classes%20to%20modify%20the%20wiki.textile +30 -0
  44. data/templates/default/content/Author.textile +16 -0
  45. data/templates/default/content/Automatic%20Summaries.textile +40 -0
  46. data/templates/default/content/Automatic%20counters.textile +22 -0
  47. data/templates/default/content/Automatic%20exporters.textile +23 -0
  48. data/templates/default/content/Automatic%20importers.textile +59 -0
  49. data/templates/default/content/Automatic%20linking.textile +7 -0
  50. data/templates/default/content/Automatic%20maintenance%20helpers.textile +39 -0
  51. data/templates/default/content/Bug%3A%20Competing%20edits.textile +22 -0
  52. data/templates/default/content/Bug%3A%20Does%20not%20make%20use%20of%20if%2Dmodified%2Dsince%20r.textile +3 -0
  53. data/templates/default/content/Bug%3A%20Email%20adresses%20in%20page%20titles%20cause%20incorrec.textile +3 -0
  54. data/templates/default/content/Bug%3A%20GEM%20limits%20title%20lengths.textile +3 -0
  55. data/templates/default/content/Bug%3A%20Memory%20leak.textile +13 -0
  56. data/templates/default/content/Bug%3A%20Page%2Einserted%5Finto%20is%20never%20purged.textile +17 -0
  57. data/templates/default/content/Bug%3A%20Pages%20that%20link%20here%20may%20not%20appear%20on%20r.textile +13 -0
  58. data/templates/default/content/Bug%3A%20Textile%20mishandles%20paragraphs.textile +37 -0
  59. data/templates/default/content/Bug%3A%20Unanticipated%20Rollbacks.textile +23 -0
  60. data/templates/default/content/Bug%3A%20notextile%20does%20not%20prevent%20page%20inserts.textile +3 -0
  61. data/templates/default/content/Home%20Page.textile +22 -0
  62. data/templates/default/content/How%20to%20administrate%20this%20wiki.textile +57 -0
  63. data/templates/default/content/How%20to%20change%20the%20way%20this%20wiki%20looks.textile +32 -0
  64. data/templates/default/content/How%20to%20export%20a%20site%20from%20this%20wiki.textile +82 -0
  65. data/templates/default/content/How%20to%20get%20the%20latest%20Soks%20from%20cvs.textile +45 -0
  66. data/templates/default/content/How%20to%20hack%20soks.textile +66 -0
  67. data/templates/default/content/How%20to%20import%20a%20site%20from%20instiki.textile +15 -0
  68. data/templates/default/content/How%20to%20import%20data.textile +41 -0
  69. data/templates/default/content/How%20to%20install%20Soks.textile +33 -0
  70. data/templates/default/content/How%20to%20password%20protect%20your%20wiki.textile +53 -0
  71. data/templates/default/content/How%20to%20re%2Dbuild%20the%20page%20cache.textile +71 -0
  72. data/templates/default/content/How%20to%20report%20a%20bug.textile +9 -0
  73. data/templates/default/content/How%20to%20upgrade%20soks.textile +32 -0
  74. data/templates/default/content/How%20to%20use%20the%20Automatic%20Helper%20classes.textile +12 -0
  75. data/templates/default/content/How%20to%20use%20this%20wiki.textile +30 -0
  76. data/templates/default/content/List%20of%20changes.textile +10 -0
  77. data/templates/default/content/News%3A%20Version%201%2D0%2D0%20released.textile +19 -0
  78. data/templates/default/content/News%3A%20Version%201%2D0%2D1%20released.textile +12 -0
  79. data/templates/default/content/Pages%20to%20include%20in%20the%20distribution.textile +55 -0
  80. data/templates/default/content/Per%20Wiki%20Templates.textile +37 -0
  81. data/templates/default/content/Picture%20of%20a%20pair%20of%20soks.textile +1 -0
  82. data/templates/default/content/Planned%20Features.textile +74 -0
  83. data/templates/default/content/README.textile +64 -0
  84. data/templates/default/content/RSS%20feed.textile +9 -0
  85. data/templates/default/content/Recent%20changes%20to%20this%20site.textile +352 -0
  86. data/templates/default/content/SOKS%20features.textile +19 -0
  87. data/templates/default/content/Sidebar%20Page.textile +6 -0
  88. data/templates/default/content/Site%20Index.textile +241 -0
  89. data/templates/default/content/Soks%27s%20Licence.textile +66 -0
  90. data/templates/default/content/Tag%3A%20Include%20this%20page%20in%20the%20distribution.textile +6 -0
  91. data/templates/default/start.rb +90 -0
  92. data/templates/default/version.txt +1 -0
  93. data/templates/default/views/Page_content.rhtml +1 -0
  94. data/templates/default/views/Page_edit.rhtml +79 -0
  95. data/templates/default/views/Page_find.rhtml +35 -0
  96. data/templates/default/views/Page_linksfromrss.rhtml +24 -0
  97. data/templates/default/views/Page_listrss.rhtml +46 -0
  98. data/templates/default/views/Page_meta.rhtml +44 -0
  99. data/templates/default/views/Page_print.rhtml +6 -0
  100. data/templates/default/views/Page_revision.rhtml +39 -0
  101. data/templates/default/views/Page_revisions.rhtml +36 -0
  102. data/templates/default/views/Page_rss.rhtml +57 -0
  103. data/templates/default/views/Page_view.rhtml +8 -0
  104. data/templates/default/views/UploadPage_edit.rhtml +63 -0
  105. data/templates/default/views/frame.rhtml +63 -0
  106. data/templates/default/views/messages.yaml +7 -0
  107. data/test/html/2006Mar.html +66 -0
  108. data/test/html/poignant.html +36 -0
  109. data/test/html/poignant.textile +36 -0
  110. data/test/mock-objects.rb +69 -0
  111. data/test/test_counter-helper.rb +162 -0
  112. data/test/test_soks-helper-maintenance.rb +106 -0
  113. data/test/test_soks-helpers.rb +145 -0
  114. data/test/test_soks-model.rb +144 -0
  115. data/test/test_soks-servlet.rb +240 -0
  116. data/test/test_soks-storage.rb +108 -0
  117. data/test/test_soks-utils.rb +226 -0
  118. data/test/test_soks-view.rb +193 -0
  119. data/test/test_soks.rb +9 -0
  120. 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