Big changes to how diffs are generated
The original issue was that looking at all changes (action=rc all=1) the
resulting diff didn't always make sense if you clicked on the diff link.
It showed the difference between that revision and the current revision.
The PrintHtmlDiff sub was changed significantly to make it easier to
understand and to help fix this issue.
The drawback is that it now requires a new key in page and keep files:
lastmajorsummary. It goes with lastmajor and diff-major and records the
summary for that particular edit. As new changes will start recording
this new key, the change will slowly propagate in existing wikis.
Whenever you look at minor diffs, however, the existing summary key is
chosen. Plus, whenever you want to look at differences between
particular revisions, this is equivalent to looking at minor diffs. So
the only situation that is problematic is an edit history like the
following:
A - major change
B - major change (major diff, major summary, last major revision)
C - minor change
When looking at this page with diff=2, we want to show major diff, major
summary, last major revision. If B happened before this commit was
installed, the summary will be missing.
2015-09-06 14:32:36 +02:00
# Copyright (C) 2006– 2015 Alex Schroeder <alex@gnu.org>
2006-10-10 01:17:23 +00:00
#
2014-09-10 22:56:54 +02:00
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
2006-10-10 01:17:23 +00:00
#
2014-09-10 22:56:54 +02:00
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
2006-10-10 01:17:23 +00:00
#
2014-09-10 22:56:54 +02:00
# You should have received a copy of the GNU General Public License along with
# this program. If not, see <http://www.gnu.org/licenses/>.
2006-10-10 01:17:23 +00:00
require 't/test.pl' ;
package OddMuse ;
2014-09-10 22:56:54 +02:00
use Test::More tests = > 69 ;
2012-05-24 12:25:01 +02:00
use utf8 ; # tests contain UTF-8 characters and it matters
2006-10-10 01:17:23 +00:00
2015-09-20 11:44:37 +02:00
AppendStringToFile ( $ ConfigFile , "\$KeepDays = 14;\n" ) ;
2007-01-20 01:19:17 +00:00
# reproduce a particular bug from emacswiki.org
2007-01-20 00:51:02 +00:00
update_page ( 'SiteMap' , 'initial entry' ) ;
sleep ( 1 ) ;
update_page ( 'SiteMap' , 'last good entry was a minor edit' , '' , 1 ) ;
ok ( get_page ( 'action=browse id=SiteMap raw=2' )
=~ /(\d+) # Do not delete this line/ ,
'raw=2 returns timestamp' ) ;
$ to = $ 1 ;
ok ( $ to , 'timestamp stored' ) ;
sleep ( 1 ) ;
update_page ( 'SiteMap' , 'vandal overwrites with major edit' ) ;
update_page ( 'SiteMap' , 'gnome attemps wrong fix with minor edit' , '' , 1 ) ;
test_page ( get_page ( "action=rollback to=$to pwd=foo" ) ,
'Rolling back changes' , 'SiteMap</a> rolled back' ) ;
OpenPage ( 'SiteMap' ) ;
isnt ( $ Page { minor } , 1 , 'Rollback is a major edit' ) ;
is ( $ Page { text } , "last good entry was a minor edit\n" , 'Rollback successful' ) ;
2007-01-20 01:19:17 +00:00
# new set of tests
clear_pages ( ) ;
2015-09-20 11:44:37 +02:00
AppendStringToFile ( $ ConfigFile , "\$KeepDays = 7;\n" ) ;
2007-01-20 01:19:17 +00:00
WriteStringToFile ( $ RcFile , "1 FirstPage 1 \n" ) ;
AppendStringToFile ( $ RcFile , "2 SecondPage 1 \n" ) ;
2006-10-10 01:17:23 +00:00
# old revisions
update_page ( 'InnocentPage' , 'Innocent.' , 'good guy zero' ) ;
update_page ( 'NicePage' , 'Friendly content.' , 'good guy one' ) ;
update_page ( 'OtherPage' , 'Other cute content 1.' , 'another good guy' ) ;
update_page ( 'OtherPage' , 'Other cute content 2.' , 'another good guy' ) ;
update_page ( 'OtherPage' , 'Other cute content 3.' , 'another good guy' ) ;
# good revisions -- need a different timestamp than the old revisions!
sleep ( 1 ) ;
update_page ( 'InnocentPage' , 'Lamb.' , 'good guy zero' ) ;
update_page ( 'OtherPage' , 'Other cute content 12.' , 'another good guy' ) ;
update_page ( 'MinorPage' , 'Dumdidu' , 'tester' ) ;
# last good revision -- needs a different timestamp than the good revisions!
sleep ( 1 ) ;
update_page ( 'NicePage' , 'Nice content.' , 'good guy two' ) ;
# bad revisions -- need a different timestamp than the last good revision!
sleep ( 1 ) ;
update_page ( 'NicePage' , 'Evil content.' , 'vandal one' ) ;
update_page ( 'OtherPage' , 'Other evil content.' , 'another vandal' ) ;
update_page ( 'NicePage' , 'Bad content.' , 'vandal two' ) ;
update_page ( 'EvilPage' , 'Spam!' , 'vandal three' ) ;
2013-08-24 13:39:34 +02:00
update_page ( 'AnotherEvilPage' , 'More Minor Spam!' , 'vandal four' , 1 ) ;
update_page ( 'AnotherEvilPage' , 'Still More Minor Spam!' , 'vandal five' , 1 ) ;
2006-10-10 01:17:23 +00:00
update_page ( 'MinorPage' , 'Ramtatam' , 'testerror' , 1 ) ;
test_page ( get_page ( 'NicePage' ) , 'Bad content' ) ;
test_page ( get_page ( 'InnocentPage' ) , 'Lamb' ) ;
2015-09-02 13:41:12 +02:00
# make sure all those spammers are in the past
sleep ( 1 ) ;
2007-10-06 12:23:00 +00:00
# find the rollback link for the last good revision
2006-10-10 01:17:23 +00:00
$ to = xpath_test ( get_page ( 'action=rc all=1 pwd=foo' ) ,
2007-10-29 00:59:29 +00:00
'//strong[text()="good guy two"]/preceding-sibling::input[@type="submit"]/attribute::name' ) ;
$ to =~ /rollback-([0-9]+)/ ;
2006-10-10 01:17:23 +00:00
$ to = $ 1 ;
test_page ( get_page ( "action=rollback to=$to" ) , 'username is required' ) ;
test_page ( get_page ( "action=rollback to=$to username=me" ) , 'restricted to administrators' ) ;
test_page ( get_page ( "action=rollback to=$to pwd=foo" ) ,
'Rolling back changes' ,
'EvilPage</a> rolled back' ,
'AnotherEvilPage</a> rolled back' ,
'MinorPage</a> rolled back' ,
'NicePage</a> rolled back' ,
'OtherPage</a> rolled back' ) ;
test_page ( get_page ( 'NicePage' ) , 'Nice content' ) ;
test_page ( get_page ( 'OtherPage' ) , 'Other cute content 12' ) ;
test_page ( get_page ( 'EvilPage' ) , 'DeletedPage' ) ;
test_page ( get_page ( 'AnotherEvilPage' ) , 'DeletedPage' ) ;
test_page ( get_page ( 'InnocentPage' ) , 'Lamb' ) ;
2015-09-02 13:41:12 +02:00
# make sure $Now of Recent Changes is larger than $LastUpdate
sleep ( 1 ) ;
2007-10-06 12:23:00 +00:00
# this includes rollback info and rollback links
my $ rc = get_page ( 'action=rc all=1 showedit=1 pwd=foo from=1' ) ;
2006-10-10 01:17:23 +00:00
# check all revisions of NicePage in recent changes
xpath_test ( $ rc ,
2007-10-29 00:59:29 +00:00
'//li/span[@class="time"]/following-sibling::span[@class="new"][text()="new"]/following-sibling::input[@type="submit"][@value="rollback"]/following-sibling::a[@class="revision"][@href="http://localhost/wiki.pl?action=browse;id=NicePage;revision=1"][text()="NicePage"]/following-sibling::span[@class="dash"]/following-sibling::strong[text()="good guy one"]' ,
Big changes to how diffs are generated
The original issue was that looking at all changes (action=rc all=1) the
resulting diff didn't always make sense if you clicked on the diff link.
It showed the difference between that revision and the current revision.
The PrintHtmlDiff sub was changed significantly to make it easier to
understand and to help fix this issue.
The drawback is that it now requires a new key in page and keep files:
lastmajorsummary. It goes with lastmajor and diff-major and records the
summary for that particular edit. As new changes will start recording
this new key, the change will slowly propagate in existing wikis.
Whenever you look at minor diffs, however, the existing summary key is
chosen. Plus, whenever you want to look at differences between
particular revisions, this is equivalent to looking at minor diffs. So
the only situation that is problematic is an edit history like the
following:
A - major change
B - major change (major diff, major summary, last major revision)
C - minor change
When looking at this page with diff=2, we want to show major diff, major
summary, last major revision. If B happened before this commit was
installed, the summary will be missing.
2015-09-06 14:32:36 +02:00
'//li/span[@class="time"]/following-sibling::a[@class="diff"][@href="http://localhost/wiki.pl?action=browse;diff=2;id=NicePage;revision=2"][text()="diff"]/following-sibling::input[@type="submit"][@value="rollback"]/following-sibling::a[@class="revision"][@href="http://localhost/wiki.pl?action=browse;id=NicePage;revision=2"][text()="NicePage"]/following-sibling::span[@class="dash"]/following-sibling::strong[text()="good guy two"]' ,
'//li/span[@class="time"]/following-sibling::a[@class="diff"][@href="http://localhost/wiki.pl?action=browse;diff=2;id=NicePage;revision=3"][text()="diff"]/following-sibling::input[@type="submit"][@value="rollback"]/following-sibling::a[@class="revision"][@href="http://localhost/wiki.pl?action=browse;id=NicePage;revision=3"][text()="NicePage"]/following-sibling::span[@class="dash"]/following-sibling::strong[text()="vandal one"]' ,
'//li/span[@class="time"]/following-sibling::a[@class="diff"][@href="http://localhost/wiki.pl?action=browse;diff=2;id=NicePage;revision=4"][text()="diff"]/following-sibling::input[@type="submit"][@value="rollback"]/following-sibling::a[@class="revision"][@href="http://localhost/wiki.pl?action=browse;id=NicePage;revision=4"][text()="NicePage"]/following-sibling::span[@class="dash"]/following-sibling::strong[text()="vandal two"]' ,
# The first link to NicePage has no revision (because
2007-01-11 12:07:06 +00:00
# it is the latest version) and no rollback link (because
# the timestamp is equal to $LastUpdate)
'//li/span[@class="time"]/following-sibling::a[@class="diff"][@href="http://localhost/wiki.pl?action=browse;diff=2;id=NicePage"][text()="diff"]/following-sibling::a[@class="revision"][@href="http://localhost/wiki.pl?action=browse;id=NicePage"][text()="NicePage"]/following-sibling::span[@class="dash"]/following-sibling::strong[contains(text(),"Rollback to")]' ,
Big changes to how diffs are generated
The original issue was that looking at all changes (action=rc all=1) the
resulting diff didn't always make sense if you clicked on the diff link.
It showed the difference between that revision and the current revision.
The PrintHtmlDiff sub was changed significantly to make it easier to
understand and to help fix this issue.
The drawback is that it now requires a new key in page and keep files:
lastmajorsummary. It goes with lastmajor and diff-major and records the
summary for that particular edit. As new changes will start recording
this new key, the change will slowly propagate in existing wikis.
Whenever you look at minor diffs, however, the existing summary key is
chosen. Plus, whenever you want to look at differences between
particular revisions, this is equivalent to looking at minor diffs. So
the only situation that is problematic is an edit history like the
following:
A - major change
B - major change (major diff, major summary, last major revision)
C - minor change
When looking at this page with diff=2, we want to show major diff, major
summary, last major revision. If B happened before this commit was
installed, the summary will be missing.
2015-09-06 14:32:36 +02:00
# The second link to NicePage has a revision (because
2007-01-11 12:07:06 +00:00
# it is from an older version) and a rollback link (because
# the timestamp is smaller than $LastUpdate)
Big changes to how diffs are generated
The original issue was that looking at all changes (action=rc all=1) the
resulting diff didn't always make sense if you clicked on the diff link.
It showed the difference between that revision and the current revision.
The PrintHtmlDiff sub was changed significantly to make it easier to
understand and to help fix this issue.
The drawback is that it now requires a new key in page and keep files:
lastmajorsummary. It goes with lastmajor and diff-major and records the
summary for that particular edit. As new changes will start recording
this new key, the change will slowly propagate in existing wikis.
Whenever you look at minor diffs, however, the existing summary key is
chosen. Plus, whenever you want to look at differences between
particular revisions, this is equivalent to looking at minor diffs. So
the only situation that is problematic is an edit history like the
following:
A - major change
B - major change (major diff, major summary, last major revision)
C - minor change
When looking at this page with diff=2, we want to show major diff, major
summary, last major revision. If B happened before this commit was
installed, the summary will be missing.
2015-09-06 14:32:36 +02:00
'//li/span[@class="time"]/following-sibling::a[@class="diff"][@href="http://localhost/wiki.pl?action=browse;diff=2;id=NicePage;revision=4"][text()="diff"]/following-sibling::input[@type="submit"][@value="rollback"]/following-sibling::a[@class="revision"][@href="http://localhost/wiki.pl?action=browse;id=NicePage;revision=4"][text()="NicePage"]/following-sibling::span[@class="dash"]/following-sibling::strong[text()="vandal two"]' ,
2007-01-11 12:07:06 +00:00
# check that the minor spam is reverted with a minor rollback
2007-10-29 00:59:29 +00:00
'//li/span[@class="time"]/following-sibling::span[@class="new"][text()="new"]/following-sibling::input[@type="submit"][@value="rollback"]/following-sibling::a[@class="revision"][@href="http://localhost/wiki.pl?action=browse;id=MinorPage;revision=1"][text()="MinorPage"]/following-sibling::span[@class="dash"]/following-sibling::strong[text()="tester"]' ,
Big changes to how diffs are generated
The original issue was that looking at all changes (action=rc all=1) the
resulting diff didn't always make sense if you clicked on the diff link.
It showed the difference between that revision and the current revision.
The PrintHtmlDiff sub was changed significantly to make it easier to
understand and to help fix this issue.
The drawback is that it now requires a new key in page and keep files:
lastmajorsummary. It goes with lastmajor and diff-major and records the
summary for that particular edit. As new changes will start recording
this new key, the change will slowly propagate in existing wikis.
Whenever you look at minor diffs, however, the existing summary key is
chosen. Plus, whenever you want to look at differences between
particular revisions, this is equivalent to looking at minor diffs. So
the only situation that is problematic is an edit history like the
following:
A - major change
B - major change (major diff, major summary, last major revision)
C - minor change
When looking at this page with diff=2, we want to show major diff, major
summary, last major revision. If B happened before this commit was
installed, the summary will be missing.
2015-09-06 14:32:36 +02:00
'//li/span[@class="time"]/following-sibling::a[@class="diff"][@href="http://localhost/wiki.pl?action=browse;diff=2;id=MinorPage;revision=2"][text()="diff"]/following-sibling::input[@type="submit"][@value="rollback"]/following-sibling::a[@class="revision"][@href="http://localhost/wiki.pl?action=browse;id=MinorPage;revision=2"][text()="MinorPage"]/following-sibling::span[@class="dash"]/following-sibling::strong[text()="testerror"]/following-sibling::em[text()="(minor)"]' ,
# The first link has no revision (because it is the
2007-01-11 12:07:06 +00:00
# latest version) and no rollback link (because the
# timestamp is equal to $LastUpdate)
'//li/span[@class="time"]/following-sibling::a[@class="diff"][@href="http://localhost/wiki.pl?action=browse;diff=2;id=MinorPage"][text()="diff"]/following-sibling::a[@class="revision"][@href="http://localhost/wiki.pl?action=browse;id=MinorPage"][text()="MinorPage"]/following-sibling::span[@class="dash"]/following-sibling::strong[contains(text(),"Rollback to")]/following-sibling::em[text()="(minor)"]' ,
Big changes to how diffs are generated
The original issue was that looking at all changes (action=rc all=1) the
resulting diff didn't always make sense if you clicked on the diff link.
It showed the difference between that revision and the current revision.
The PrintHtmlDiff sub was changed significantly to make it easier to
understand and to help fix this issue.
The drawback is that it now requires a new key in page and keep files:
lastmajorsummary. It goes with lastmajor and diff-major and records the
summary for that particular edit. As new changes will start recording
this new key, the change will slowly propagate in existing wikis.
Whenever you look at minor diffs, however, the existing summary key is
chosen. Plus, whenever you want to look at differences between
particular revisions, this is equivalent to looking at minor diffs. So
the only situation that is problematic is an edit history like the
following:
A - major change
B - major change (major diff, major summary, last major revision)
C - minor change
When looking at this page with diff=2, we want to show major diff, major
summary, last major revision. If B happened before this commit was
installed, the summary will be missing.
2015-09-06 14:32:36 +02:00
# The second link has a revision (because it is from an
2007-01-11 12:07:06 +00:00
# older version) and a rollback link (because the timestamp
# is smaller than $LastUpdate)
Big changes to how diffs are generated
The original issue was that looking at all changes (action=rc all=1) the
resulting diff didn't always make sense if you clicked on the diff link.
It showed the difference between that revision and the current revision.
The PrintHtmlDiff sub was changed significantly to make it easier to
understand and to help fix this issue.
The drawback is that it now requires a new key in page and keep files:
lastmajorsummary. It goes with lastmajor and diff-major and records the
summary for that particular edit. As new changes will start recording
this new key, the change will slowly propagate in existing wikis.
Whenever you look at minor diffs, however, the existing summary key is
chosen. Plus, whenever you want to look at differences between
particular revisions, this is equivalent to looking at minor diffs. So
the only situation that is problematic is an edit history like the
following:
A - major change
B - major change (major diff, major summary, last major revision)
C - minor change
When looking at this page with diff=2, we want to show major diff, major
summary, last major revision. If B happened before this commit was
installed, the summary will be missing.
2015-09-06 14:32:36 +02:00
'//li/span[@class="time"]/following-sibling::a[@class="diff"][@href="http://localhost/wiki.pl?action=browse;diff=2;id=MinorPage;revision=2"][text()="diff"]/following-sibling::input[@type="submit"][@value="rollback"]/following-sibling::a[@class="revision"][@href="http://localhost/wiki.pl?action=browse;id=MinorPage;revision=2"][text()="MinorPage"]/following-sibling::span[@class="dash"]/following-sibling::strong[text()="testerror"]/following-sibling::em[text()="(minor)"]' ,
2007-01-11 12:07:06 +00:00
# The first page has no rollback link
'//li/span[@class="time"]/following-sibling::span[@class="new"][text()="new"]/following-sibling::a[@class="revision"][@href="http://localhost/wiki.pl?action=browse;id=FirstPage"][text()="FirstPage"]' ,
# The second page has a rollback link
2007-10-29 00:59:29 +00:00
'//li/span[@class="time"]/following-sibling::span[@class="new"][text()="new"]/following-sibling::input[@type="submit"][@value="rollback"][@name="rollback-2"]/following-sibling::a[@class="revision"][@href="http://localhost/wiki.pl?action=browse;id=SecondPage"][text()="SecondPage"]' ,
2006-10-10 01:17:23 +00:00
) ;
# test that ordinary RC doesn't show the rollback stuff
update_page ( 'Yoga' , 'Ommmm' , 'peace' ) ;
$ page = get_page ( 'action=rc raw=1' ) ;
test_page ( $ page ,
"title: NicePage\ndescription: good guy two\n" ,
"title: MinorPage\ndescription: tester\n" ,
"title: OtherPage\ndescription: another good guy\n" ,
"title: InnocentPage\ndescription: good guy zero\n" ,
"title: Yoga\ndescription: peace\n" ,
) ;
2008-09-19 23:52:00 +00:00
2006-10-10 01:17:23 +00:00
test_page_negative ( $ page ,
"rollback" ,
"Rollback" ,
"EvilPage" ,
"AnotherEvilPage" ,
) ;
2007-09-29 16:07:29 +00:00
# test url encoding
2007-10-06 12:23:00 +00:00
test_page ( update_page ( 'Schröder' , 'Alex' , 'eins' ) , 'Alex' ) ;
2014-06-22 23:11:35 +02:00
OpenPage ( 'Schröder' ) ;
$ to = $ Page { ts } ;
2007-10-06 12:23:00 +00:00
sleep ( 1 ) ;
2007-10-06 13:26:22 +00:00
test_page ( update_page ( 'HiddenEdit' , 'not to be rolled back' , 'secret' ) , 'not to be rolled back' ) ;
2007-10-06 12:23:00 +00:00
test_page ( update_page ( 'Schröder' , 'Berta' , 'zwei' ) , 'Berta' ) ;
2007-09-29 16:07:29 +00:00
xpath_test ( get_page ( 'action=history id=Schr%c3%b6der username=olaf' ) ,
2007-10-29 00:59:29 +00:00
'//input[@type="submit"][@value="rollback"][@name="rollback-' . $ to . '"]' ) ;
2007-10-06 12:23:00 +00:00
# test single page rollback
test_page ( get_page ( "action=rollback to=$to id=Schr%c3%b6der username=olaf" ) ,
'Rolling back changes' ,
'Schröder</a> rolled back' ) ;
test_page ( get_page ( 'Schr%c3%b6der' ) , 'Alex' ) ;
# make sure it is hidden from recent changes
$ page = get_page ( 'action=rc raw=1' ) ;
2007-10-06 13:26:22 +00:00
test_page ( $ page , "title: Schröder\ndescription: eins\n" ,
"title: HiddenEdit\ndescription: secret\n" ) ;
2007-10-06 12:23:00 +00:00
test_page_negative ( $ page , "title: Schröder\ndescription: zwei\n" ) ;
2007-10-06 13:26:22 +00:00
# make sure that rollback=1 shows the rollback link
test_page ( get_page ( 'action=rc raw=1 rollback=1' ) ,
"title: Schröder\ndescription: Rollback to " ,
"title: HiddenEdit\ndescription: secret\n" ) ;
# all=1 shows all links including rollbacks
2007-10-06 12:23:00 +00:00
test_page ( get_page ( 'action=rc raw=1 rollback=1 all=1' ) ,
2007-10-06 13:26:22 +00:00
"title: Schröder\ndescription: Rollback to " ,
"title: Schröder\ndescription: zwei\n" ,
"title: Schröder\ndescription: eins\n" ,
"title: HiddenEdit\ndescription: secret\n" ,
2007-10-06 12:23:00 +00:00
'link: http://localhost/wiki.pl/Schr%c3%b6der' ,
'link: http://localhost/wiki.pl\?action=browse;id=Schr%c3%b6der;revision=2' ,
'link: http://localhost/wiki.pl\?action=browse;id=Schr%c3%b6der;revision=1' ) ;
2010-04-21 20:55:31 +00:00
# Making sure no extra [[rollback]] entries show up
clear_pages ( ) ;
2015-09-20 14:03:18 +02:00
$ KeepDays = 14 ;
2015-09-20 11:44:37 +02:00
AppendStringToFile ( $ ConfigFile , "\$KeepDays = 14;\n" ) ;
2010-04-21 20:55:31 +00:00
update_page ( 'Test' , 'Hallo' ) ;
$ ts = $ Now - $ KeepDays * 86400 + 100 ;
get_page ( "action=rollback to=$ts username=Alex pwd=foo" ) ;
AppendStringToFile ( $ ConfigFile , "\$KeepDays = 7;\n" ) ;
test_page_negative ( get_page ( "action=rc raw=1" ) , '[[rollback]]' ) ;
2014-09-10 22:56:54 +02:00
# Avoid Save button for comments
AppendStringToFile ( $ ConfigFile , "\$CommentsPrefix = 'Comments on ';\n" ) ;
update_page ( 'Comments_on_Test' , 'no spam' ) ;
ok ( get_page ( 'action=browse id=Test raw=2' )
=~ /(\d+) # Do not delete this line/ ,
'raw=2 returns timestamp' ) ;
$ to = $ 1 ;
ok ( $ to , 'timestamp stored' ) ;
sleep ( 1 ) ;
get_page ( 'title=Comments_on_Test aftertext=http://spam/amoxil/' ) ;
test_page ( get_page ( 'Comments_on_Test' ) , 'spam' ) ;
# rollback without password
$ page = get_page ( "action=rollback id=Comments_on_Test to=$to username=Alex" ) ;
test_page ( $ page , 'Rolling back changes' ) ;
test_page_negative ( $ page , 'Add your comment here' , 'Save' ) ;