Soks 0.0.7 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. data/LICENSE.txt +2 -0
  2. data/README.txt +3 -2
  3. data/TODO.txt +31 -0
  4. data/bin/soks-create-wiki.rb +0 -1
  5. data/lib/authenticators.rb +30 -4
  6. data/lib/helpers/counter-helpers.rb +132 -0
  7. data/lib/helpers/default-helpers.rb +170 -169
  8. data/lib/helpers/mail2wiki-helper.rb +18 -22
  9. data/lib/helpers/maintenance-helpers.rb +149 -0
  10. data/lib/helpers/rss2wiki-helper.rb +7 -8
  11. data/lib/soks-model.rb +82 -54
  12. data/lib/soks-servlet.rb +126 -108
  13. data/lib/soks-storage.rb +74 -11
  14. data/lib/soks-utils.rb +77 -3
  15. data/lib/soks-view.rb +169 -103
  16. data/lib/soks.rb +5 -23
  17. data/templates/default/attachment/newpage.js +4 -13
  18. data/templates/default/attachment/print_stylesheet.css +2 -7
  19. data/templates/default/caches/readme.txt +1 -0
  20. data/templates/default/content/Api%20for%20classes%20to%20modify%20the%20wiki.textile +2 -0
  21. data/templates/default/content/Author.textile +4 -1
  22. data/templates/default/content/Automatic%20Summaries.textile +16 -53
  23. data/templates/default/content/Automatic%20linking%20between%20pages.textile +3 -3
  24. data/templates/default/content/{bug%3A%20competing%20edits.textile → Bug%3A%20Competing%20edits.textile} +9 -0
  25. data/templates/default/content/Bug%3A%20Does%20not%20make%20use%20of%20if%2Dmodified%2Dsince%20r.textile +2 -0
  26. data/templates/default/content/Bug%3A%20E%2Dmail%20addresses%20with%20hyphens%20not%20recognised.textile +17 -0
  27. data/templates/default/content/Bug%3A%20Email%20adresses%20in%20page%20titles%20cause%20incorrec.textile +3 -0
  28. data/templates/default/content/Bug%3A%20GEM%20limits%20title%20lengths.textile +3 -1
  29. data/templates/default/content/Bug%3A%20Memory%20leak.textile +13 -0
  30. data/templates/default/content/Bug%3A%20Pages%20that%20link%20here%20may%20not%20appear%20on%20r.textile +13 -0
  31. data/templates/default/content/Bug%3A%20Textile%20mishandles%20paragraphs.textile +4 -0
  32. data/templates/default/content/Bug%3A%20Unanticipated%20Rollbacks.textile +2 -0
  33. data/templates/default/content/Bug%3A%20notextile%20does%20not%20prevent%20page%20inserts.textile +2 -0
  34. data/templates/default/content/Home%20Page.textile +3 -1
  35. data/templates/default/content/How%20to%20administrate%20this%20wiki.textile +23 -13
  36. data/templates/default/content/How%20to%20change%20the%20way%20this%20wiki%20looks.textile +3 -1
  37. data/templates/default/content/How%20to%20export%20a%20site%20from%20this%20wiki.textile +22 -0
  38. data/templates/default/content/How%20to%20get%20the%20latest%20Soks%20from%20cvs.textile +2 -0
  39. data/templates/default/content/How%20to%20hack%20soks.textile +2 -0
  40. data/templates/default/content/How%20to%20import%20a%20site%20from%20instiki.textile +2 -0
  41. data/templates/default/content/{How%20to%20import%20data%20to%20this%20wiki.textile → How%20to%20import%20data.textile} +3 -7
  42. data/templates/default/content/How%20to%20install%20Soks.textile +2 -0
  43. data/templates/default/content/How%20to%20password%20protect%20your%20wiki.textile +21 -11
  44. data/templates/default/content/How%20to%20report%20a%20bug.textile +2 -1
  45. data/templates/default/content/How%20to%20upgrade%20soks.textile +22 -0
  46. data/templates/default/content/How%20to%20use%20the%20keyboard%20shortcuts.textile +2 -2
  47. data/templates/default/content/How%20to%20use%20this%20wiki.textile +3 -1
  48. data/templates/default/content/List%20of%20changes.textile +84 -118
  49. data/templates/default/content/News%3A%20Version%201%2D0%2D0%20released.textile +19 -0
  50. data/templates/default/content/Pages%20to%20include%20in%20the%20distribution.textile +51 -0
  51. data/templates/default/content/Per%20Wiki%20Templates.textile +2 -0
  52. data/templates/default/content/Planned%20Features.textile +30 -9
  53. data/templates/default/content/README.textile +3 -2
  54. data/templates/default/content/RSS%20feed.textile +1 -1
  55. data/templates/default/content/Recent%20changes%20to%20this%20site.textile +283 -0
  56. data/templates/default/content/SOKS%20features.textile +3 -0
  57. data/templates/default/content/Site%20Index.textile +202 -0
  58. data/templates/default/content/Soks%20Licence.textile +2 -0
  59. data/templates/default/content/Tag%3A%20Include%20this%20page%20in%20the%20distribution.textile +6 -0
  60. data/templates/default/start.rb +67 -123
  61. data/templates/default/version.txt +1 -1
  62. data/templates/default/views/Page_edit.rhtml +7 -7
  63. data/templates/default/views/{Page_search_results.rhtml → Page_find.rhtml} +9 -3
  64. data/templates/default/views/Page_linksfromrss.rhtml +24 -0
  65. data/templates/default/views/Page_listrss.rhtml +46 -0
  66. data/templates/default/views/Page_meta.rhtml +1 -1
  67. data/templates/default/views/Page_revision.rhtml +39 -0
  68. data/templates/default/views/Page_revisions.rhtml +13 -5
  69. data/templates/default/views/Page_rss.rhtml +8 -8
  70. data/templates/default/views/Page_view.rhtml +3 -3
  71. data/templates/default/views/UploadPage_edit.rhtml +8 -8
  72. data/templates/default/views/frame.rhtml +8 -8
  73. data/templates/default/views/messages.yaml +1 -0
  74. data/test/html/2006Mar.html +66 -0
  75. data/test/html/poignant.html +36 -0
  76. data/test/html/poignant.textile +36 -0
  77. data/test/mock-objects.rb +69 -0
  78. data/test/stress_url_calls.rb +33 -0
  79. data/test/stress_urls.txt +68 -0
  80. data/test/test_counter-helper.rb +158 -0
  81. data/test/test_soks-helper-maintenance.rb +106 -0
  82. data/test/test_soks-helpers.rb +104 -0
  83. data/test/test_soks-model.rb +144 -0
  84. data/test/test_soks-servlet.rb +231 -0
  85. data/test/test_soks-storage.rb +70 -31
  86. data/test/test_soks-utils.rb +112 -13
  87. data/test/test_soks-view.rb +141 -3
  88. metadata +38 -27
  89. data/templates/default/content/A%20page%20with%20an%20umlaut%20%F6%20in%20its%20title.textile +0 -1
  90. data/templates/default/content/All%20News.textile +0 -26
  91. data/templates/default/content/Bil%20Kleb.textile +0 -1
  92. data/templates/default/content/Bil.textile +0 -1
  93. data/templates/default/content/Bill%20Wood.textile +0 -3
  94. data/templates/default/content/Bug%3A%20RSS%20feed%20does%20not%20validate.textile +0 -10
  95. data/templates/default/content/Bug%3A%20Type%20a%20title%20here.textile +0 -31
  96. data/templates/default/content/Instructions%20and%20Howtos.textile +0 -21
  97. data/templates/default/content/Latest%20News.textile +0 -26
  98. data/templates/default/content/New%20Recent%20Changes%20class.textile +0 -68
  99. data/templates/default/content/New%20page%20templates%20or%20categories%20code.textile +0 -68
  100. data/templates/default/content/News%3A%20Version%200%2E0%2E6%20Released.textile +0 -13
  101. data/templates/default/content/Recent%20Blog%20Entries.textile +0 -5
  102. data/templates/default/content/Recent%20Changes%20to%20This%20Site.textile +0 -286
  103. data/templates/default/content/Ruby.textile +0 -9
  104. data/templates/default/content/Skorgu.textile +0 -3
  105. data/templates/default/content/ctrl%2Dn.textile +0 -1
  106. data/templates/default/content/let%20me%20know.textile +0 -1
  107. data/templates/default/content/sandbox.textile +0 -20
  108. data/templates/default/content/tamc.textile +0 -1
  109. 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