Soks 0.0.7 → 1.0.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.
- data/LICENSE.txt +2 -0
- data/README.txt +3 -2
- data/TODO.txt +31 -0
- data/bin/soks-create-wiki.rb +0 -1
- data/lib/authenticators.rb +30 -4
- data/lib/helpers/counter-helpers.rb +132 -0
- data/lib/helpers/default-helpers.rb +170 -169
- data/lib/helpers/mail2wiki-helper.rb +18 -22
- data/lib/helpers/maintenance-helpers.rb +149 -0
- data/lib/helpers/rss2wiki-helper.rb +7 -8
- data/lib/soks-model.rb +82 -54
- data/lib/soks-servlet.rb +126 -108
- data/lib/soks-storage.rb +74 -11
- data/lib/soks-utils.rb +77 -3
- data/lib/soks-view.rb +169 -103
- data/lib/soks.rb +5 -23
- data/templates/default/attachment/newpage.js +4 -13
- data/templates/default/attachment/print_stylesheet.css +2 -7
- data/templates/default/caches/readme.txt +1 -0
- data/templates/default/content/Api%20for%20classes%20to%20modify%20the%20wiki.textile +2 -0
- data/templates/default/content/Author.textile +4 -1
- data/templates/default/content/Automatic%20Summaries.textile +16 -53
- data/templates/default/content/Automatic%20linking%20between%20pages.textile +3 -3
- data/templates/default/content/{bug%3A%20competing%20edits.textile → Bug%3A%20Competing%20edits.textile} +9 -0
- data/templates/default/content/Bug%3A%20Does%20not%20make%20use%20of%20if%2Dmodified%2Dsince%20r.textile +2 -0
- data/templates/default/content/Bug%3A%20E%2Dmail%20addresses%20with%20hyphens%20not%20recognised.textile +17 -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 -1
- data/templates/default/content/Bug%3A%20Memory%20leak.textile +13 -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 +4 -0
- data/templates/default/content/Bug%3A%20Unanticipated%20Rollbacks.textile +2 -0
- data/templates/default/content/Bug%3A%20notextile%20does%20not%20prevent%20page%20inserts.textile +2 -0
- data/templates/default/content/Home%20Page.textile +3 -1
- data/templates/default/content/How%20to%20administrate%20this%20wiki.textile +23 -13
- data/templates/default/content/How%20to%20change%20the%20way%20this%20wiki%20looks.textile +3 -1
- data/templates/default/content/How%20to%20export%20a%20site%20from%20this%20wiki.textile +22 -0
- data/templates/default/content/How%20to%20get%20the%20latest%20Soks%20from%20cvs.textile +2 -0
- data/templates/default/content/How%20to%20hack%20soks.textile +2 -0
- data/templates/default/content/How%20to%20import%20a%20site%20from%20instiki.textile +2 -0
- data/templates/default/content/{How%20to%20import%20data%20to%20this%20wiki.textile → How%20to%20import%20data.textile} +3 -7
- data/templates/default/content/How%20to%20install%20Soks.textile +2 -0
- data/templates/default/content/How%20to%20password%20protect%20your%20wiki.textile +21 -11
- data/templates/default/content/How%20to%20report%20a%20bug.textile +2 -1
- data/templates/default/content/How%20to%20upgrade%20soks.textile +22 -0
- data/templates/default/content/How%20to%20use%20the%20keyboard%20shortcuts.textile +2 -2
- data/templates/default/content/How%20to%20use%20this%20wiki.textile +3 -1
- data/templates/default/content/List%20of%20changes.textile +84 -118
- data/templates/default/content/News%3A%20Version%201%2D0%2D0%20released.textile +19 -0
- data/templates/default/content/Pages%20to%20include%20in%20the%20distribution.textile +51 -0
- data/templates/default/content/Per%20Wiki%20Templates.textile +2 -0
- data/templates/default/content/Planned%20Features.textile +30 -9
- data/templates/default/content/README.textile +3 -2
- data/templates/default/content/RSS%20feed.textile +1 -1
- data/templates/default/content/Recent%20changes%20to%20this%20site.textile +283 -0
- data/templates/default/content/SOKS%20features.textile +3 -0
- data/templates/default/content/Site%20Index.textile +202 -0
- data/templates/default/content/Soks%20Licence.textile +2 -0
- data/templates/default/content/Tag%3A%20Include%20this%20page%20in%20the%20distribution.textile +6 -0
- data/templates/default/start.rb +67 -123
- data/templates/default/version.txt +1 -1
- data/templates/default/views/Page_edit.rhtml +7 -7
- data/templates/default/views/{Page_search_results.rhtml → Page_find.rhtml} +9 -3
- 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 +1 -1
- data/templates/default/views/Page_revision.rhtml +39 -0
- data/templates/default/views/Page_revisions.rhtml +13 -5
- data/templates/default/views/Page_rss.rhtml +8 -8
- data/templates/default/views/Page_view.rhtml +3 -3
- data/templates/default/views/UploadPage_edit.rhtml +8 -8
- data/templates/default/views/frame.rhtml +8 -8
- data/templates/default/views/messages.yaml +1 -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/stress_url_calls.rb +33 -0
- data/test/stress_urls.txt +68 -0
- data/test/test_counter-helper.rb +158 -0
- data/test/test_soks-helper-maintenance.rb +106 -0
- data/test/test_soks-helpers.rb +104 -0
- data/test/test_soks-model.rb +144 -0
- data/test/test_soks-servlet.rb +231 -0
- data/test/test_soks-storage.rb +70 -31
- data/test/test_soks-utils.rb +112 -13
- data/test/test_soks-view.rb +141 -3
- metadata +38 -27
- data/templates/default/content/A%20page%20with%20an%20umlaut%20%F6%20in%20its%20title.textile +0 -1
- data/templates/default/content/All%20News.textile +0 -26
- data/templates/default/content/Bil%20Kleb.textile +0 -1
- data/templates/default/content/Bil.textile +0 -1
- data/templates/default/content/Bill%20Wood.textile +0 -3
- data/templates/default/content/Bug%3A%20RSS%20feed%20does%20not%20validate.textile +0 -10
- data/templates/default/content/Bug%3A%20Type%20a%20title%20here.textile +0 -31
- data/templates/default/content/Instructions%20and%20Howtos.textile +0 -21
- data/templates/default/content/Latest%20News.textile +0 -26
- data/templates/default/content/New%20Recent%20Changes%20class.textile +0 -68
- data/templates/default/content/New%20page%20templates%20or%20categories%20code.textile +0 -68
- data/templates/default/content/News%3A%20Version%200%2E0%2E6%20Released.textile +0 -13
- data/templates/default/content/Recent%20Blog%20Entries.textile +0 -5
- data/templates/default/content/Recent%20Changes%20to%20This%20Site.textile +0 -286
- data/templates/default/content/Ruby.textile +0 -9
- data/templates/default/content/Skorgu.textile +0 -3
- data/templates/default/content/ctrl%2Dn.textile +0 -1
- data/templates/default/content/let%20me%20know.textile +0 -1
- data/templates/default/content/sandbox.textile +0 -20
- data/templates/default/content/tamc.textile +0 -1
- data/templates/default/content/tamc2.textile +0 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'fileutils'
|
|
3
|
+
require 'mock-objects'
|
|
4
|
+
require 'generator'
|
|
5
|
+
require 'helpers/counter-helpers'
|
|
6
|
+
|
|
7
|
+
class TestViewCountHelper < Test::Unit::TestCase
|
|
8
|
+
include TearDownableWiki
|
|
9
|
+
|
|
10
|
+
def test_notification
|
|
11
|
+
results = []
|
|
12
|
+
@wiki.watch_for(:page_viewed) { |*results| }
|
|
13
|
+
@view.render( 'test-page','view','test-viewer')
|
|
14
|
+
wait_for_queue_to_empty
|
|
15
|
+
assert_equal( :page_viewed, results[0] )
|
|
16
|
+
assert_equal( 'test-page', results[1].name )
|
|
17
|
+
assert_equal( 'view', results[2] )
|
|
18
|
+
assert_equal( 'test-viewer', results[3] )
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_total_count
|
|
22
|
+
count = ViewCountHelper.new(@wiki).counts
|
|
23
|
+
@view.render( 'test-page','view','test-viewer')
|
|
24
|
+
@view.render( 'test-page','view','test-viewer')
|
|
25
|
+
@view.render( 'test-page','view','test-viewer')
|
|
26
|
+
wait_for_queue_to_empty
|
|
27
|
+
assert_equal( 3, count.total )
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_page_count
|
|
31
|
+
count = ViewCountHelper.new(@wiki, ['view'], 'Popular Pages', :test_event, 2 ).counts
|
|
32
|
+
@wiki.revise( 'count1','1','t1')
|
|
33
|
+
@wiki.revise( 'count2','2','t2')
|
|
34
|
+
@wiki.revise( 'count3','3','t3')
|
|
35
|
+
3.times { @view.render( 'count1' ) }
|
|
36
|
+
3.times { @view.render( 'count1', 'edit' ) }
|
|
37
|
+
2.times { @view.render( 'count2' ) }
|
|
38
|
+
1.times { @view.render( 'count3' ) }
|
|
39
|
+
wait_for_queue_to_empty
|
|
40
|
+
p1,p2,p3 = @wiki.page('count1'), @wiki.page('count2'), @wiki.page('count3')
|
|
41
|
+
assert_equal( 3, count[p1.name] )
|
|
42
|
+
assert_equal( 2, count[p2.name] )
|
|
43
|
+
assert_equal( 1, count[p3.name] )
|
|
44
|
+
assert_equal( 6, count.total )
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_page_render
|
|
48
|
+
start_time = Time.now
|
|
49
|
+
test_page_count
|
|
50
|
+
@wiki.notify( :test_event )
|
|
51
|
+
wait_for_queue_to_empty
|
|
52
|
+
desired_content = "h1. Popular Pages\n\n"
|
|
53
|
+
desired_content << "Count since #{start_time}. Updated on #{@wiki.page('Popular Pages').revised_on}\n\n"
|
|
54
|
+
desired_content << "| count1 | 3 |\n"
|
|
55
|
+
desired_content << "| count2 | 2 |\n"
|
|
56
|
+
desired_content << "| 1 others | 1 |\n"
|
|
57
|
+
desired_content << "| *Total* | *6* |\n"
|
|
58
|
+
assert_equal( desired_content, @wiki.page('Popular Pages').content)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
class TestViewerCountHelper < Test::Unit::TestCase
|
|
63
|
+
include TearDownableWiki
|
|
64
|
+
|
|
65
|
+
def test_notification
|
|
66
|
+
results = []
|
|
67
|
+
@wiki.watch_for(:page_viewed) { |*results| }
|
|
68
|
+
@view.render( 'test-page','view','test-viewer')
|
|
69
|
+
wait_for_queue_to_empty
|
|
70
|
+
assert_equal( :page_viewed, results[0] )
|
|
71
|
+
assert_equal( 'test-page', results[1].name )
|
|
72
|
+
assert_equal( 'view', results[2] )
|
|
73
|
+
assert_equal( 'test-viewer', results[3] )
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def test_total_count
|
|
77
|
+
count = ViewerCountHelper.new(@wiki).counts
|
|
78
|
+
@view.render( 'test-page','view','test-viewer')
|
|
79
|
+
@view.render( 'test-page','view','test-viewer')
|
|
80
|
+
@view.render( 'test-page','view','test-viewer')
|
|
81
|
+
wait_for_queue_to_empty
|
|
82
|
+
assert_equal( 3, count.total )
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def test_viewer_count
|
|
86
|
+
count = ViewerCountHelper.new(@wiki, ['view'], 'Popular Pages', :test_event, 2 ).counts
|
|
87
|
+
@wiki.revise( 'count1','1','t1')
|
|
88
|
+
@wiki.revise( 'count2','2','t2')
|
|
89
|
+
@wiki.revise( 'count3','3','t3')
|
|
90
|
+
3.times { @view.render( 'count1', 'view', "Author1" ) }
|
|
91
|
+
3.times { @view.render( 'count1', 'edit', "Author1" ) }
|
|
92
|
+
2.times { @view.render( 'count2', 'view', "Author2" ) }
|
|
93
|
+
1.times { @view.render( 'count3', 'view', "Author3" ) }
|
|
94
|
+
wait_for_queue_to_empty
|
|
95
|
+
assert_equal( 3, count['Author1'] )
|
|
96
|
+
assert_equal( 2, count['Author2'] )
|
|
97
|
+
assert_equal( 1, count['Author3'] )
|
|
98
|
+
assert_equal( 6, count.total )
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def test_page_render
|
|
102
|
+
start_time = Time.now
|
|
103
|
+
test_viewer_count
|
|
104
|
+
@wiki.notify( :test_event )
|
|
105
|
+
wait_for_queue_to_empty
|
|
106
|
+
desired_content = "h1. Popular Pages\n\n"
|
|
107
|
+
desired_content << "Count since #{start_time}. Updated on #{@wiki.page('Popular Pages').revised_on}\n\n"
|
|
108
|
+
desired_content << "| Author1 | 3 |\n"
|
|
109
|
+
desired_content << "| Author2 | 2 |\n"
|
|
110
|
+
desired_content << "| 1 others | 1 |\n"
|
|
111
|
+
desired_content << "| *Total* | *6* |\n"
|
|
112
|
+
assert_equal( desired_content, @wiki.page('Popular Pages').content)
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class TestAuthorCountHelper < Test::Unit::TestCase
|
|
118
|
+
include TearDownableWiki
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def test_total_count
|
|
122
|
+
count = AuthorCountHelper.new(@wiki,'Principal Authors', :test_event, 2 ).counts
|
|
123
|
+
@wiki.revise( 'count1','1','t1')
|
|
124
|
+
@wiki.revise( 'count2','2','t2')
|
|
125
|
+
@wiki.revise( 'count3','3','t3')
|
|
126
|
+
wait_for_queue_to_empty
|
|
127
|
+
assert_equal( 3, count.total )
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def test_author_count
|
|
131
|
+
count = AuthorCountHelper.new(@wiki,'Principal Authors', :test_event, 2 ).counts
|
|
132
|
+
@wiki.revise( 'count1','1','t1')
|
|
133
|
+
@wiki.revise( 'count2','1','t1')
|
|
134
|
+
@wiki.revise( 'count2','2','t2')
|
|
135
|
+
@wiki.revise( 'count3','1','t1')
|
|
136
|
+
@wiki.revise( 'count3','2','t2')
|
|
137
|
+
@wiki.revise( 'count3','3','t3')
|
|
138
|
+
wait_for_queue_to_empty
|
|
139
|
+
assert_equal( 3, count['t1'] )
|
|
140
|
+
assert_equal( 2, count['t2'] )
|
|
141
|
+
assert_equal( 1, count['t3'] )
|
|
142
|
+
assert_equal( 6, count.total )
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def test_page_render
|
|
146
|
+
start_time = Time.now
|
|
147
|
+
test_author_count
|
|
148
|
+
@wiki.notify( :test_event )
|
|
149
|
+
wait_for_queue_to_empty
|
|
150
|
+
desired_content = "h1. Principal Authors\n\n"
|
|
151
|
+
desired_content << "Count since #{start_time}. Updated on #{@wiki.page('Popular Pages').revised_on}\n\n"
|
|
152
|
+
desired_content << "| t1 | 3 |\n"
|
|
153
|
+
desired_content << "| t2 | 2 |\n"
|
|
154
|
+
desired_content << "| 1 others | 1 |\n"
|
|
155
|
+
desired_content << "| *Total* | *6* |\n"
|
|
156
|
+
assert_equal( desired_content, @wiki.page('Principal Authors').content)
|
|
157
|
+
end
|
|
158
|
+
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'mock-objects'
|
|
3
|
+
require 'helpers/maintenance-helpers'
|
|
4
|
+
|
|
5
|
+
class TestDeleteOldPages < Test::Unit::TestCase
|
|
6
|
+
include TearDownableWiki
|
|
7
|
+
|
|
8
|
+
def setup
|
|
9
|
+
super
|
|
10
|
+
DeleteOldPagesHelper.new( @wiki, :an_event, 2 )
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_delete_old_pages
|
|
14
|
+
assert_equal([],files)
|
|
15
|
+
@wiki.revise( 'home page', 'hello world', 'tamc2')
|
|
16
|
+
assert_equal( true, @wiki.exists?('home page') )
|
|
17
|
+
assert_equal( false, @wiki.page('home page').deleted? )
|
|
18
|
+
assert_equal(['home%20page.textile','home%20page.yaml'],files)
|
|
19
|
+
|
|
20
|
+
@wiki.delete( 'home page', 'tamc2')
|
|
21
|
+
@wiki.notify(:an_event )
|
|
22
|
+
wait_for_queue_to_empty
|
|
23
|
+
|
|
24
|
+
# Should be too soon
|
|
25
|
+
assert_equal( false, @wiki.exists?('home page') )
|
|
26
|
+
assert_equal( true, @wiki.page('home page').deleted? )
|
|
27
|
+
assert_equal(['home%20page.textile','home%20page.yaml'],files)
|
|
28
|
+
|
|
29
|
+
sleep( 2 )
|
|
30
|
+
@wiki.notify(:an_event )
|
|
31
|
+
wait_for_queue_to_empty
|
|
32
|
+
|
|
33
|
+
# Should now have deleted
|
|
34
|
+
assert_equal( false, @wiki.exists?('home page') )
|
|
35
|
+
assert_equal( false, @wiki.page('home page').deleted? )
|
|
36
|
+
assert_equal([],files)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class TestDeleteOldRevisions < Test::Unit::TestCase
|
|
42
|
+
include TearDownableWiki
|
|
43
|
+
|
|
44
|
+
def setup
|
|
45
|
+
super
|
|
46
|
+
DeleteOldRevisionsHelper.new( @wiki, :an_event, 2, 2)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def test_delete_old_revisions
|
|
50
|
+
1.upto(5) do |i|
|
|
51
|
+
@wiki.revise('revision delete test page',"#{i}","test author")
|
|
52
|
+
end
|
|
53
|
+
page = @wiki.page('revision delete test page')
|
|
54
|
+
assert_equal(5,page.revisions.size)
|
|
55
|
+
|
|
56
|
+
@wiki.notify(:an_event )
|
|
57
|
+
wait_for_queue_to_empty
|
|
58
|
+
|
|
59
|
+
# Should be too soon
|
|
60
|
+
assert_equal(5,page.revisions.size)
|
|
61
|
+
|
|
62
|
+
sleep( 2 )
|
|
63
|
+
@wiki.notify(:an_event )
|
|
64
|
+
wait_for_queue_to_empty
|
|
65
|
+
|
|
66
|
+
# Should now have turned last 3 revisions into one
|
|
67
|
+
assert_equal(3,page.revisions.size)
|
|
68
|
+
assert_equal('Automatic Revision Remover',page.revisions.first.author)
|
|
69
|
+
assert_equal('3',page.revisions.first.content)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
class TestMergeOldRevisions < Test::Unit::TestCase
|
|
74
|
+
include TearDownableWiki
|
|
75
|
+
|
|
76
|
+
def setup
|
|
77
|
+
super
|
|
78
|
+
MergeOldRevisionsHelper.new( @wiki, :an_event, 2, 10)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def test_merge_old_revisions
|
|
82
|
+
1.upto(3) do |i|
|
|
83
|
+
@wiki.revise('revision merge test page',"#{i}","author1")
|
|
84
|
+
end
|
|
85
|
+
3.upto(5) do |i|
|
|
86
|
+
@wiki.revise('revision merge test page',"#{i}","author2")
|
|
87
|
+
end
|
|
88
|
+
page = @wiki.page('revision merge test page')
|
|
89
|
+
assert_equal(5,page.revisions.size)
|
|
90
|
+
|
|
91
|
+
@wiki.notify(:an_event )
|
|
92
|
+
wait_for_queue_to_empty
|
|
93
|
+
|
|
94
|
+
# Should be too soon
|
|
95
|
+
assert_equal(5,page.revisions.size)
|
|
96
|
+
|
|
97
|
+
sleep( 2 )
|
|
98
|
+
@wiki.notify(:an_event )
|
|
99
|
+
wait_for_queue_to_empty
|
|
100
|
+
|
|
101
|
+
# Should now have merged each author's revisions
|
|
102
|
+
assert_equal(2,page.revisions.size)
|
|
103
|
+
assert_equal('3',page.revision(0).content)
|
|
104
|
+
assert_equal('5',page.revision(1).content)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'fileutils'
|
|
3
|
+
require 'mock-objects'
|
|
4
|
+
require 'helpers/default-helpers'
|
|
5
|
+
require 'generator'
|
|
6
|
+
|
|
7
|
+
class TestRecentChanges < Test::Unit::TestCase
|
|
8
|
+
include TearDownableWiki
|
|
9
|
+
|
|
10
|
+
def test_detect_change
|
|
11
|
+
rc = AutomaticRecentChanges.new( @wiki)
|
|
12
|
+
@wiki.revise( 'testpage','B','normal person')
|
|
13
|
+
@wiki.revise( 'testpage2','A','normal person')
|
|
14
|
+
wait_for_queue_to_empty
|
|
15
|
+
assert_equal(2, rc.pages_in_summary.to_a.size)
|
|
16
|
+
assert_match( /normal person/i, rctextile )
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_merge_author_change
|
|
20
|
+
rc = AutomaticRecentChanges.new( @wiki)
|
|
21
|
+
@wiki.revise( 'testpage','B','normal person')
|
|
22
|
+
@wiki.revise( 'testpage','A','normal person')
|
|
23
|
+
wait_for_queue_to_empty
|
|
24
|
+
assert_equal(1, rc.pages_in_summary.to_a.size)
|
|
25
|
+
assert_match( /normal person/i, rctextile )
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_dont_merge_different_authors_change
|
|
29
|
+
@rc = AutomaticRecentChanges.new( @wiki)
|
|
30
|
+
@wiki.revise( 'testpage','B','p1')
|
|
31
|
+
@wiki.revise( 'testpage','A','p2')
|
|
32
|
+
wait_for_queue_to_empty
|
|
33
|
+
assert_equal(2, @rc.pages_in_summary.to_a.size)
|
|
34
|
+
assert_match( /p1/i, rctextile )
|
|
35
|
+
assert_match( /p2/i, rctextile )
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_exclude_helpers_initially
|
|
39
|
+
@wiki.revise( 'testpage','B','normal person')
|
|
40
|
+
@wiki.revise( 'testpage2','content moved from','AutomaticPageMover')
|
|
41
|
+
@wiki.revise( 'testpage2','A','normal person')
|
|
42
|
+
rc = AutomaticRecentChanges.new( @wiki)
|
|
43
|
+
assert_equal(['recent changes to this site','testpage','testpage2'],@wiki.map{|name,page| name }.sort)
|
|
44
|
+
assert_equal(2, rc.pages_in_summary.to_a.size)
|
|
45
|
+
assert_match( /normal person/i, rctextile )
|
|
46
|
+
assert_no_match( /AutomaticPageMover/i, rctextile )
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def test_exclude_helpers_later
|
|
50
|
+
rc = AutomaticRecentChanges.new( @wiki)
|
|
51
|
+
@wiki.revise( 'testpage','B','normal person')
|
|
52
|
+
@wiki.revise( 'testpage2','content moved from','AutomaticPageMover')
|
|
53
|
+
@wiki.revise( 'testpage2','A','normal person')
|
|
54
|
+
wait_for_queue_to_empty
|
|
55
|
+
assert_equal(['recent changes to this site','testpage','testpage2'],@wiki.map{|name,page| name }.sort)
|
|
56
|
+
assert_equal(2, rc.pages_in_summary.to_a.size)
|
|
57
|
+
assert_match( /normal person/i, rctextile )
|
|
58
|
+
assert_no_match( /AutomaticPageMover/i, rctextile )
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_change_in_page_capitalisation
|
|
62
|
+
rc = AutomaticRecentChanges.new( @wiki)
|
|
63
|
+
@wiki.revise( 'testpage','B','normal person')
|
|
64
|
+
wait_for_queue_to_empty
|
|
65
|
+
assert_match( /\[\[testpage\]\]/, rctextile )
|
|
66
|
+
assert_no_match( /\[\[TestPage\]\]/, rctextile )
|
|
67
|
+
@wiki.revise( 'TestPage','C','normal person')
|
|
68
|
+
wait_for_queue_to_empty
|
|
69
|
+
assert_match( /\[\[TestPage\]\]/, rctextile )
|
|
70
|
+
assert_equal( 1, count_matches( /\[\[TestPage\]\]/ ) )
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
def count_matches( regexp )
|
|
76
|
+
count = 0
|
|
77
|
+
rctextile.gsub( regexp ) { |m| count += 1 }
|
|
78
|
+
count
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def rctextile
|
|
82
|
+
@wiki.page("Recent Changes to This Site").textile
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
class TestCalendar < Test::Unit::TestCase
|
|
87
|
+
include TearDownableWiki
|
|
88
|
+
|
|
89
|
+
def setup
|
|
90
|
+
super
|
|
91
|
+
AutomaticCalendar.new( @wiki )
|
|
92
|
+
AutomaticUpdateCrossLinks.new( @wiki, @view )
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def test_2006_Mar_html
|
|
96
|
+
wait_for_queue_to_empty
|
|
97
|
+
page = @wiki.page('2006 Mar')
|
|
98
|
+
desired_html = IO.readlines('test/html/2006Mar.html')
|
|
99
|
+
actual_html = @view.redcloth( page ).split("\n").map { |l| "#{l}\n" }
|
|
100
|
+
SyncEnumerator.new(desired_html,actual_html).each do |desired,actual|
|
|
101
|
+
assert_equal( desired, actual )
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -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
|