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.
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