#!/bin/sh
#
#	quickie - a small fast C++ Wiki Wiki
#	Copyright (C) 2005 Peter Miller
#
#	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 2 of the License, or
#	(at your option) any later version.
#
#	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.
#
#	You should have received a copy of the GNU General Public License
#	along with this program; if not, write to the Free Software
#	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
#
# MANIFEST: Test the back reference functionality
#
here=`pwd`
test $? -eq 0 || exit 2
work=${TMP_DIR-/tmp}/$$

tear_down()
{
	cd $here
	rm -rf $work
}

pass()
{
	tear_down
	echo PASSED
	exit 0
}

fail()
{
	tear_down
	echo 'FAILED test of the back reference functionality'
	exit 1
}

no_result()
{
	tear_down
	echo 'NO RESULT for test of the back reference functionality'
	exit 2
}

trap "no_result" 1 2 3 15

bin=$here/${1-.}/bin
mkdir $work $work/var $work/etc
test $? -eq 0 || no_result
cd $work
test $? -eq 0 || no_result

#
# We can't pass options on the command line, because they could be
# abused by a remote client.  Instead, we configure things using
# environment variables.
#
QUICKIE_LOCALSTATEDIR=$work/var ; export QUICKIE_LOCALSTATEDIR
QUICKIE_SYSCONFDIR=$work/etc ; export QUICKIE_SYSCONFDIR
REMOTE_ADDR=127.0.0.1 ; export REMOTE_ADDR

cat > etc/quickie.conf << 'fubar'
show-mod-times: false
sidebar-layout: left
anonymous-user-edit: true
fubar
test $? -eq 0 || no_result

cat > var/index.wiki << 'fubar'
[file1]
[file2]
[file3]
fubar
test $? -eq 0 || no_result

cat > var/file1.wiki << 'fubar'
This is file 1.
fubar
test $? -eq 0 || no_result

cat > test.ok << 'fubar'
/file1
/file2
/file3
fubar
test $? -eq 0 || no_result

PATH_INFO=/ \
QUERY_STRING= \
SERVER_NAME=localhost \
SERVER_PORT=80 \
REQUEST_METHOD=GET \
SCRIPT_NAME=/cgi-bin/quickie \
$bin/quickie > test.out
if test $? -ne 0
then
    cat test.out
    fail
fi

diff test.ok var/index.refers_to
test $? -eq 0 || fail

#
# check the unlink_on_create file
#
cat > test.ok << 'fubar'
/index
fubar
test $? -eq 0 || no_result

diff test.ok var/file2.unlink_on_create
test $? -eq 0 || fail

#
# check the refers_to file
#
cat > test.ok << 'fubar'
/file1
/file2
/file3
fubar
test $? -eq 0 || no_result

diff test.ok var/index.refers_to
test $? -eq 0 || fail

#
# check the referred_to_by file
#
cat > test.ok << 'fubar'
/index
fubar
test $? -eq 0 || no_result

diff test.ok var/file1.referred_to_by
test $? -eq 0 || fail

diff test.ok var/file2.referred_to_by
test $? -eq 0 || fail

diff test.ok var/file2.unlink_on_create
test $? -eq 0 || fail

diff test.ok var/file3.referred_to_by
test $? -eq 0 || fail

diff test.ok var/file3.unlink_on_create
test $? -eq 0 || fail

# --------------------------------------------------------------------------
#
# Next we create the missing file, and make sure the right things
# happen: the index.html file is supposed to vanish.
#
PATH_INFO=/file2 \
QUERY_STRING='save&content=This is file number two.' \
SERVER_NAME=localhost \
SERVER_PORT=80 \
REQUEST_METHOD=GET \
SCRIPT_NAME=/cgi-bin/quickie \
$bin/quickie > test.out
if test $? -ne 0
then
    cat test.out
    fail
fi

test -f var/index.html && fail
test -f var/file1.unlink_on_create && fail

cat > test.ok << 'fubar'
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "">
<HTML><HEAD>
<TITLE>File2</TITLE>
<LINK REL="stylesheet" HREF="admin/default.css" TYPE="text/css">
</HEAD><BODY>
<TABLE>
<TR>
<TD VALIGN="TOP" CLASS="sidebar" STYLE="width: 100px">
<P CLASS="sidebar">
<A HREF="sidebar?edit" CLASS="sidebar">Edit</A> this
<A HREF="sidebar" CLASS="sidebar">sidebar</A>.
</P>
<HR/>
This wiki page is referred to by
<A HREF="index">Index</A>.
</TD>
<TD VALIGN="TOP" CLASS="content">
<H1 CLASS="content">File2</H1>
<P CLASS="content">This is file number two.
</P>
<HR CLASS="content">
<P CLASS="content"><A HREF="file2?edit" CLASS="content">Edit this page</A>.
<A HREF="file2?history" CLASS="content">Historical versions</A>.</P>
</TD>
</TR>
</TABLE>
</BODY></HTML>
fubar
test $? -eq 0 || no_result

diff test.ok var/file2.html
test $? -eq 0 || fail

#
# validate the output
#
if validate -v > /dev/null 2>&1
then
    validate var/file2.html
    test $? -eq 0 || fail
fi

# --------------------------------------------------------------------------
#
# Make sure the index.html file is recreated with the right links.
#
PATH_INFO=/ \
QUERY_STRING= \
SERVER_NAME=localhost \
SERVER_PORT=80 \
REQUEST_METHOD=GET \
SCRIPT_NAME=/cgi-bin/quickie \
$bin/quickie > test.out
if test $? -ne 0
then
    cat test.out
    fail
fi

cat > test.ok << 'fubar'
Content-Type: text/html
Content-Length: 852

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "">
<HTML><HEAD>
<TITLE>Index</TITLE>
<LINK REL="stylesheet" HREF="admin/default.css" TYPE="text/css">
</HEAD><BODY>
<TABLE>
<TR>
<TD VALIGN="TOP" CLASS="sidebar" STYLE="width: 100px">
<P CLASS="sidebar">
<A HREF="sidebar?edit" CLASS="sidebar">Edit</A> this
<A HREF="sidebar" CLASS="sidebar">sidebar</A>.
</P>
</TD>
<TD VALIGN="TOP" CLASS="content">
<H1 CLASS="content">Index</H1>
<P CLASS="content"><A
HREF="file1"
CLASS="content">file1</A>
<A
HREF="file2"
CLASS="content">file2</A>
<SPAN CLASS="content"
STYLE="text-decoration: underline">file3</SPAN><A
HREF="file3?edit"
CLASS="content">?</A>
</P>
<HR CLASS="content">
<P CLASS="content"><A HREF="index?edit" CLASS="content">Edit this page</A>.
<A HREF="index?history" CLASS="content">Historical versions</A>.</P>
</TD>
</TR>
</TABLE>
</BODY></HTML>
fubar
test $? -eq 0 || no_result

diff test.ok test.out
test $? -eq 0 || fail

#
# validate the output
#
if validate -v > /dev/null 2>&1
then
    sed '1,2d' < test.out > test.out.2
    test $? -eq 0 || no_result

    validate test.out.2
    test $? -eq 0 || fail
fi

#
# The things tested here, worked.
# No other guarantees are made.
#
pass
