summaryrefslogtreecommitdiff
path: root/test/wiki.test
diff options
context:
space:
mode:
authorcashmere <cashmere@autistici.org>2026-09-04 09:05:24 +0200
committercashmere <cashmere@autistici.org>2026-09-04 09:05:24 +0200
commit4f49b16079b27d7ce633619e4cddfdf2bffbc952 (patch)
treec296c1e7f3c3e2f6859c6d3a1b1b208779b89679 /test/wiki.test
downloadrelic-master.tar.gz
initial commitHEADmaster
Diffstat (limited to 'test/wiki.test')
-rw-r--r--test/wiki.test414
1 files changed, 414 insertions, 0 deletions
diff --git a/test/wiki.test b/test/wiki.test
new file mode 100644
index 0000000..e0b46a5
--- /dev/null
+++ b/test/wiki.test
@@ -0,0 +1,414 @@
+#
+# Copyright (c) 2016 D. Richard Hipp
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the Simplified BSD License (also
+# known as the "2-Clause License" or "FreeBSD License".)
+#
+# 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.
+#
+# Author contact information:
+# drh@hwaci.com
+# http://www.hwaci.com/drh/
+#
+############################################################################
+#
+# Test wiki and attachment command Support
+#
+
+test_setup
+
+# Disable backoffice for this test, otherwise its process lingers for some
+# time after the test has completed.
+# Perhaps, this should be done in test_setup and enabled explicitly only
+# when needed.
+fossil set backoffice-disable 1
+
+# Return true if two files are similar (i.e. not only compress trailing spaces
+# from a line, but remove any final LF from the file as well)
+proc similar_file {a b} {
+ set x ""
+ if {[file exists $a]} {
+ set x [read_file $a]
+ regsub -all { +\n} $x \n x
+ regsub -all {\n$} $x {} x
+ }
+ set y ""
+ if {[file exists $b]} {
+ set y [read_file $b]
+ regsub -all { +\n} $y \n y
+ regsub -all {\n$} $y {} y
+ }
+ return [expr {$x==$y}]
+}
+
+# Return the mime type in the manifest for a given wiki page
+# Defaults to "error: some text" if the manifest can't be located and
+# "text/x-fossil-wiki" (the default mimetype for rendering)
+# if the N card is omitted in the manifest.
+# Note: Makes fossil calls, so $CODE and $RESULT will be corrupted
+proc get_mime_type {name} {
+ global CODE RESULT
+ fossil http << "GET /wiki?name=$name"
+ if {$CODE != 0} {
+ return "error: /wiki?name=$name $CODE $RESULT"
+ }
+ fossil whatis --type w $name
+ if {$CODE != 0} {
+ return "error: fossil whatis --type w $name $CODE $RESULT"
+ }
+ set CODE [regexp -line {^artifact:\s*([0-9a-f]+)$} $RESULT match info]
+ if {$CODE == 0} {
+ return "error: whatis returned no info for wiki page $name"
+ }
+ fossil artifact $info
+ if {$CODE != 0} {
+ return "error: fossil artifact $info $CODE $RESULT"
+ }
+ set CODE [regexp -line {^N (.*)$} $RESULT match mimetype]
+ if {$CODE == 0} {
+ return "text/x-fossil-wiki"
+ }
+ return $mimetype
+}
+
+
+###############################################################################
+# Initially there should be no wiki entries
+fossil wiki list
+test wiki-0 {[normalize_result] eq {}}
+
+###############################################################################
+# Adding an entry should add it to the wiki list
+write_file f1 "first wiki note"
+fossil wiki create tcltest f1
+test wiki-1 {$CODE == 0}
+fossil wiki list
+test wiki-2 {[normalize_result] eq {tcltest}}
+
+###############################################################################
+# Trying to add the same entry should fail
+fossil wiki create tcltest f1 -expectError
+test wiki-3 {$CODE != 0}
+
+###############################################################################
+# exporting the wiki page should give back similar text
+fossil wiki export tcltest a1
+test wiki-4 {[similar_file f1 a1]}
+
+###############################################################################
+# commiting a change to an existing page should replace the page on export
+write_file f2 "second version of the page"
+fossil wiki commit tcltest f2
+test wiki-5 {$CODE == 0}
+fossil wiki export tcltest a2
+test wiki-6 {[similar_file f2 a2]}
+
+###############################################################################
+# But we shouldn't be able to update non-existant pages
+fossil wiki commit doesntexist f1 -expectError
+test wiki-7 {$CODE != 0}
+
+###############################################################################
+# There shouldn't be any tech notes at this point
+fossil wiki list --technote
+test wiki-8 {[normalize_result] eq {}}
+
+###############################################################################
+# Creating a tech note with a specified timestamp should add a technote
+write_file f3 "A technote"
+fossil wiki create technote f3 --technote {2016-01-01 12:34}
+test wiki-9 {$CODE == 0}
+fossil wiki list --technote
+test wiki-10 {[normalize_result] eq {2016-01-01 12:34:00}}
+fossil wiki list --technote --show-technote-ids
+set technotelist [split $RESULT "\n"]
+set veryfirsttechnoteid [lindex [split [lindex $technotelist 0]] 0]
+
+###############################################################################
+# exporting that technote should give back similar text
+fossil wiki export a3 --technote {2016-01-01 12:34:00}
+test wiki-11 {[similar_file f3 a3]}
+
+###############################################################################
+# Trying to add a technote with the same timestamp should succeed and create a
+# second tech note
+fossil wiki create 2ndnote f3 -technote {2016-01-01 12:34}
+test wiki-13 {$CODE == 0}
+fossil wiki list --technote
+set technotelist [split $RESULT "\n"]
+test wiki-13.1 {[llength $technotelist] == 2}
+
+###############################################################################
+# commiting a change to an existing technote should replace the page on export
+# (this should update the tech note from wiki-13 as that the most recently
+# updated one, that should also be the one exported by the export command)
+write_file f4 "technote 2nd variant"
+fossil wiki commit technote f4 --technote {2016-01-01 12:34}
+test wiki-14 {$CODE == 0}
+fossil wiki export a4 --technote {2016-01-01 12:34}
+test wiki-15 {[similar_file f4 a4]}
+# Also check that the tech note with the same timestamp, but modified less
+# recently still has its original text
+fossil wiki export a4.1 --technote $veryfirsttechnoteid
+test wiki-15.1 {[similar_file f3 a4.1]}
+
+###############################################################################
+# But we shouldn't be able to update non-existant pages
+fossil wiki commit doesntexist f1 -expectError
+test wiki-16 {$CODE != 0}
+
+###############################################################################
+# Check specifying tags for a technote is OK
+write_file f5 "technote with tags"
+fossil wiki create {tagged technote} f5 --technote {2016-01-02 12:34} --technote-tags {A B}
+test wiki-17 {$CODE == 0}
+write_file f5.1 "editted and tagged technote"
+fossil wiki commit {tagged technote} f5 --technote {2016-01-02 12:34} --technote-tags {C D}
+test wiki-18 {$CODE == 0}
+
+###############################################################################
+# Check specifying a bgcolor for a technote is OK
+write_file f6 "bgcolored technote"
+fossil wiki create bgcolor f6 --technote {2016-01-03 12:34} --technote-bgcolor red
+test wiki-19 {$CODE == 0}
+write_file f6.1 "editted technote with a background color"
+fossil wiki commit bgcolor f6.1 --technote {2016-01-03 12:34} --technote-bgcolor yellow
+test wiki-20 {$CODE == 0}
+
+###############################################################################
+# Test adding an attachment to both a non-existant (should fail) and existing wiki page
+write_file fa "This is a file to be attached"
+fossil attachment add doesntexist fa -expectError
+test wiki-21 {$CODE != 0}
+fossil attachment add tcltest fa
+test wiki-22 {$CODE == 0}
+
+###############################################################################
+# Test adding an attachment to both a non-existant (should fail) and existing tech note
+fossil attachment add fa --technote {2016-07-22 12:00} -expectError
+test wiki-23 {$CODE != 0}
+fossil attachment add fa --technote {2016-01-03 12:34}
+test wiki-24 {$CODE == 0}
+
+###############################################################################
+# Check that a wiki page with an attachment can be updated
+fossil wiki commit tcltest f1
+test wiki-25 {$CODE == 0}
+
+###############################################################################
+# Check that a technote with an attachment can be updated
+fossil wiki commit technote f6 --technote {2016-01-03 12:34}
+test wiki-26 {$CODE == 0}
+fossil wiki commit technote f6 --technote {2016-01-03 12:34} --technote-tags {E F}
+test wiki-27 {$CODE == 0}
+fossil wiki commit technote f6 --technote {2016-01-03 12:34} --technote-bgcolor blue
+test wiki-28 {$CODE == 0}
+
+###############################################################################
+# Check longest form of timestamp for the technote
+write_file f7 "Different timestamps"
+fossil wiki create technotenow f7 --technote {2016-01-04 12:34:56+00:00}
+test wiki-29 {$CODE == 0}
+
+###############################################################################
+# Check a technote appears on the timeline
+write_file f8 "Contents of a 'unique' tech note"
+fossil wiki create {Unique technote} f8 --technote {2016-01-05 01:02:03}
+fossil timeline
+test wiki-30 {[string match *Unique*technote* $RESULT]}
+
+###############################################################################
+# Check for a collision between an attachment and a note, this was a
+# bug that resulted from some code treating the attachment entry as if it
+# were a technote when it isn't really.
+#
+# First, wait for the top of the next second so the attachment
+# happens at a known time, then add an attachment to an existing note
+# and a new note immediately after.
+
+set t0 [clock seconds]
+while {$t0 == [clock seconds]} {
+ after 100
+}
+set t1 [clock format [clock seconds] -gmt 1 -format "%Y-%m-%d %H:%M:%S"]
+write_file f9 "Timestamp: $t1"
+fossil attachment add f9 --technote {2016-01-05 01:02:03}
+test wiki-31 {$CODE == 0}
+fossil wiki create {Attachment collision} f9 --technote now
+test wiki-32 {$CODE == 0}
+#
+# Now waste time until the next second so that the remaining tests
+# don't have to worry about a potential collision
+set t0 [clock seconds]
+while {$t0 == [clock seconds]} {
+ after 100
+}
+
+###############################################################################
+# Check a technote with no timestamp cannot be created, but that
+# "now" is a valid stamp.
+set t2 [clock format [clock seconds] -gmt 1 -format "%Y-%m-%d %H:%M:%S"]
+write_file f10 "Even unstampted notes are delivered.\nStamped $t2"
+fossil wiki create "Unstamped Note" f10 --technote -expectError
+test wiki-33 {$CODE != 0}
+fossil wiki create "Unstamped Note" f10 --technote now
+test wiki-34 {$CODE == 0}
+fossil wiki list -t
+test wiki-35 {[string match "*$t2*" $RESULT]}
+
+###############################################################################
+# Check an attachment to it in the same second works.
+write_file f11 "Time Stamp was $t2"
+fossil attachment add f11 --technote $t2
+test wiki-36 {$CODE == 0}
+fossil timeline
+test wiki-36-1 {$CODE == 0}
+fossil wiki list -t
+test wiki-36-2 {$CODE == 0}
+
+###############################################################################
+# Check that we have the expected number of tech notes on the list (and not
+# extra ones from other events (such as the attachments) - 8 tech notes
+# expected created by tests 9, 13, 17, 19, 29, 31, 32 and 34
+fossil wiki list --technote
+set technotelist [split $RESULT "\n"]
+test wiki-37 {[llength $technotelist] == 8}
+
+###############################################################################
+# Check that using the show-technote-ids shows the same tech notes in the same
+# order (with the technote id as the first word of the line)
+fossil wiki list --technote --show-technote-ids
+set technoteidlist [split $RESULT "\n"]
+test wiki-38 {[llength $technotelist] == 8}
+for {set i 0} {$i < [llength $technotelist]} {incr i} {
+ set match "???????????????????????????????????????? "
+ append match [lindex $technotelist $i]
+ test "wiki-39-$i" {[string match $match [lindex $technoteidlist $i]]}
+}
+
+###############################################################################
+# Create new tech note with a old timestamp so that it is oldest and then check that
+# the contents of the oldest tech note (by tech note id, both full and short) match up
+write_file f12 "A really old tech note"
+fossil wiki create {Old tech note} f12 --technote {2001-07-07 09:08:07}
+fossil wiki list --technote --show-technote-ids
+set technotelist [split $RESULT "\n"]
+set anoldtechnoteid [lindex [split [lindex $technotelist [llength $technotelist]-1]] 0]
+fossil wiki export a12 --technote $anoldtechnoteid
+test wiki-40 {[similar_file f12 a12]}
+
+###############################################################################
+# Also check that we can specify a prefix of the tech note id (note: with
+# 9 items in the tech note at this point there is a chance of a collision.
+# However with a 20 character prefix the chance of the collision is
+# approximately 1 in 10^22 so this test ignores that possibility.)
+fossil wiki export a12.1 --technote [string range $anoldtechnoteid 0 20]
+test wiki-41 {[similar_file f12 a12.1]}
+
+###############################################################################
+# Now we need to force a collision in the first four characters of the tech
+# note id if we don't already have one so we can check we get an error if the
+# tech note id is ambiguous
+set idcounts [dict create]
+set maxcount 0
+fossil wiki list --technote --show-technote-ids
+set technotelist [split $RESULT "\n"]
+for {set i 0} {$i < [llength $technotelist]} {incr i} {
+ set fullid [lindex $technotelist $i]
+ set id [string range $fullid 0 3]
+ dict incr idcounts $id
+ if {[dict get $idcounts $id] > $maxcount} {
+ set maxid $id
+ incr maxcount
+ }
+}
+# get i so that, as a julian date, it is in the 1800s, i.e., older than
+# any other tech note, but after 1 AD
+set i 2400000
+while {$maxcount < 2} {
+ # keep getting older
+ incr i -1
+ write_file f13 "A tech note with timestamp of jday=$i"
+ fossil wiki create "timestamp of $i" f13 --technote "$i"
+ fossil wiki list --technote --show-technote-ids
+ set technotelist [split $RESULT "\n"]
+ set oldesttechnoteid [lindex [split [lindex $technotelist [llength $technotelist]-1]] 0]
+ set id [string range $oldesttechnoteid 0 3]
+ dict incr idcounts $id
+ if {[dict get $idcounts $id] > $maxcount} {
+ set maxid $id
+ incr maxcount
+ }
+}
+# Save the duplicate id for this and later tests
+set duplicateid $maxid
+fossil wiki export a13 --technote $duplicateid -expectError
+test wiki-42 {$CODE != 0}
+
+###############################################################################
+# Check we can update technote by its id
+write_file f14 "Updated text for the really old tech note"
+fossil wiki commit {Old tech note} f14 --technote $anoldtechnoteid
+fossil wiki export a14 --technote $anoldtechnoteid
+test wiki-43 {[similar_file f14 a14]}
+
+###############################################################################
+# Check we can add attachments to a technote by its id
+fossil attachment add fa --technote $anoldtechnoteid
+test wiki-44 {$CODE == 0}
+
+###############################################################################
+# Also check that we can specify a prefix of the tech note id
+write_file f15 "Updated text for the really old tech note specified by its id"
+fossil wiki commit {Old tech note} f15 --technote [string range $anoldtechnoteid 0 20]
+fossil wiki export a15 --technote $anoldtechnoteid
+test wiki-45 {[similar_file f15 a15]}
+
+###############################################################################
+# Check we can add attachments to a technote by a prefix of its id
+fossil attachment add fa --technote [string range $anoldtechnoteid 0 20]
+test wiki-46 {$CODE == 0}
+
+###############################################################################
+# And we get an error for the ambiguous tech note id
+fossil wiki commit {Old tech note} f15 --technote $duplicateid -expectError
+test wiki-47 {$CODE != 0}
+fossil attachment add fa --technote $duplicateid -expectError
+test wiki-48 {$CODE != 0}
+
+###############################################################################
+# Check the Copland fork's default wiki mimetype is Org
+test wiki-49 {[get_mime_type tcltest] == "text/x-org"}
+
+###############################################################################
+# Check long form of the mimetypes are recorded correctly
+fossil wiki create tcltest-x-fossil f1 -mimetype text/x-fossil-wiki
+test wiki-50 {[get_mime_type tcltest-x-fossil] == "text/x-fossil-wiki"}
+fossil wiki create tcltest-x-markdown f1 -mimetype text/x-markdown
+test wiki-51 {[get_mime_type tcltest-x-markdown] == "text/x-markdown"}
+fossil wiki create tcltest-x-org f1 -mimetype text/x-org
+test wiki-51.1 {[get_mime_type tcltest-x-org] == "text/x-org"}
+fossil wiki create tcltest-plain f1 -mimetype text/plain
+test wiki-52 {[get_mime_type tcltest-plain] == "text/plain"}
+fossil wiki create tcltest-x-random f1 -mimetype text/x-random
+test wiki-53 {[get_mime_type tcltest-x-random] == "text/x-fossil-wiki"}
+
+###############################################################################
+# Check short form of the mimetypes are recorded correctly
+fossil wiki create tcltest-x-fossil-short f1 -mimetype wiki
+test wiki-54 {[get_mime_type tcltest-x-fossil-short] == "text/x-fossil-wiki"}
+fossil wiki create tcltest-x-markdown-short f1 -mimetype markdown
+test wiki-55 {[get_mime_type tcltest-x-markdown-short] == "text/x-markdown"}
+fossil wiki create tcltest-x-org-short f1 -mimetype org
+test wiki-55.1 {[get_mime_type tcltest-x-org-short] == "text/x-org"}
+fossil wiki create tcltest-plain-short f1 -mimetype plain
+test wiki-56 {[get_mime_type tcltest-plain-short] == "text/plain"}
+fossil wiki create tcltest-x-random-short f1 -mimetype random
+test wiki-57 {[get_mime_type tcltest-x-random-short] == "text/x-fossil-wiki"}
+
+
+###############################################################################
+test_cleanup