summaryrefslogtreecommitdiff
path: root/test/th1-hooks.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/th1-hooks.test
downloadrelic-master.tar.gz
initial commitHEADmaster
Diffstat (limited to 'test/th1-hooks.test')
-rw-r--r--test/th1-hooks.test237
1 files changed, 237 insertions, 0 deletions
diff --git a/test/th1-hooks.test b/test/th1-hooks.test
new file mode 100644
index 0000000..f317981
--- /dev/null
+++ b/test/th1-hooks.test
@@ -0,0 +1,237 @@
+#
+# Copyright (c) 2011 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/
+#
+############################################################################
+#
+# TH1 Hooks
+#
+
+fossil test-th-eval "hasfeature th1Hooks"
+
+if {[normalize_result] ne "1"} {
+ puts "Fossil was not compiled with TH1 hooks support."
+ test_cleanup_then_return
+}
+
+###############################################################################
+
+test_setup
+
+###############################################################################
+
+write_file f1 "f1"; fossil add f1; fossil commit -m "c1"
+
+###############################################################################
+
+set env(TH1_ENABLE_HOOKS) 1; # TH1 hooks must be enabled for this test.
+
+###############################################################################
+
+set testTh1Setup {
+ proc initialize_hook_log {} {
+ if {![info exists ::hook_log]} {
+ set ::hook_log ""
+ }
+ }
+
+ proc append_hook_log { args } {
+ initialize_hook_log
+ if {[string length $::hook_log] > 0} {
+ set ::hook_log "$::hook_log "
+ }
+ for {set i 0} {$i < [llength $args]} {set i [expr {$i + 1}]} {
+ set ::hook_log $::hook_log[lindex $args $i]
+ }
+ }
+
+ proc emit_hook_log {} {
+ initialize_hook_log
+ html "\n<h1><b>$::hook_log</b></h1>\n"
+ }
+
+ proc command_hook {} {
+ append_hook_log command_hook " " $::cmd_name
+ if {$::cmd_name eq "test1"} {
+ puts [repository]; continue
+ } elseif {$::cmd_name eq "test2"} {
+ error "unsupported command"
+ } elseif {$::cmd_name eq "test3"} {
+ emit_hook_log
+ break "TH_BREAK return code"
+ } elseif {$::cmd_name eq "test4"} {
+ emit_hook_log
+ return -code 5 "TH_RETURN return code"
+ } elseif {$::cmd_name eq "timeline"} {
+ set length [llength $::cmd_args]
+ set length [expr {$length - 1}]
+ if {[lindex $::cmd_args $length] eq "custom"} {
+ append_hook_log "CUSTOM TIMELINE"
+ emit_hook_log
+ return "custom timeline"
+ } elseif {[lindex $::cmd_args $length] eq "custom2"} {
+ emit_hook_log
+ puts "+++ some stuff here +++"
+ continue "custom2 timeline"
+ } elseif {[lindex $::cmd_args $length] eq "custom3"} {
+ emit_hook_log
+ return -code 5 "TH_RETURN return code"
+ } elseif {[lindex $::cmd_args $length] eq "now"} {
+ emit_hook_log
+ return "now timeline"
+ } else {
+ emit_hook_log
+ error "unsupported timeline"
+ }
+ }
+ }
+
+ proc command_notify {} {
+ append_hook_log command_notify " " $::cmd_name
+ emit_hook_log
+ }
+
+ proc webpage_hook {} {
+ append_hook_log webpage_hook " " $::web_name
+ if {$::web_name eq "test1"} {
+ puts [repository]; continue
+ }
+ }
+
+ proc webpage_notify {} {
+ append_hook_log webpage_notify " " $::web_name
+ emit_hook_log
+ }
+}
+
+###############################################################################
+
+set data [fossil info]
+regexp -line -- {^repository: (.*)$} $data dummy repository
+
+if {[string length $repository] == 0 || ![file exists $repository]} {
+ error "unable to locate repository"
+}
+
+set dataFileName [file join $::testdir th1-hooks-input.txt]
+
+###############################################################################
+
+set savedTh1Setup [fossil settings th1-setup]
+fossil settings th1-setup $testTh1Setup
+
+###############################################################################
+
+fossil timeline custom -expectError; # NOTE: Bad "WHEN" argument.
+test th1-cmd-hooks-1a {[normalize_result] eq \
+{<h1><b>command_hook timeline CUSTOM TIMELINE</b></h1>
+unknown check-in or invalid date: custom}}
+
+###############################################################################
+
+fossil timeline custom2; # NOTE: Bad "WHEN" argument.
+test th1-cmd-hooks-1b {[normalize_result] eq \
+{<h1><b>command_hook timeline</b></h1>
++++ some stuff here +++
+<h1><b>command_hook timeline command_notify timeline</b></h1>}}
+
+###############################################################################
+
+fossil timeline custom3 -expectError; # NOTE: Bad "WHEN" argument.
+
+test th1-cmd-hooks-1c {[normalize_result] eq \
+{<h1><b>command_hook timeline</b></h1>
+unknown check-in or invalid date: custom3}}
+
+###############################################################################
+
+fossil timeline
+test th1-cmd-hooks-2a {[first_data_line] eq \
+ {<h1><b>command_hook timeline</b></h1>}}
+
+test th1-cmd-hooks-2b {[second_data_line] eq {ERROR: unsupported timeline}}
+
+###############################################################################
+
+fossil timeline -n -1 now
+test th1-cmd-hooks-3a {[first_data_line] eq \
+ {<h1><b>command_hook timeline</b></h1>}}
+
+test th1-cmd-hooks-3b \
+ {[regexp -- {=== \d{4}-\d{2}-\d{2} ===} [second_data_line]]}
+
+test th1-cmd-hooks-3c \
+ {[regexp -- {--- line limit \(\d+\) reached ---} [third_to_last_data_line]]}
+
+test th1-cmd-hooks-3d {[last_data_line] eq \
+ {<h1><b>command_hook timeline command_notify timeline</b></h1>}}
+
+###############################################################################
+
+fossil test1
+test th1-custom-cmd-1a {[next_to_last_data_line] eq $repository}
+
+test th1-custom-cmd-1b {[last_data_line] eq \
+ {<h1><b>command_hook test1 command_notify test1</b></h1>}}
+
+###############################################################################
+
+fossil test2
+test th1-custom-cmd-2a {[first_data_line] eq {ERROR: unsupported command}}
+
+###############################################################################
+
+fossil test3
+test th1-custom-cmd-3a {[string trim $RESULT] eq \
+ {<h1><b>command_hook test3</b></h1>}}
+
+###############################################################################
+
+fossil test4 -expectError
+
+test th1-custom-cmd-4a {[first_data_line] eq \
+ {<h1><b>command_hook test4</b></h1>}}
+
+test th1-custom-cmd-4b {[regexp -- \
+ {: unknown command: test4$} [second_data_line]]}
+
+test th1-custom-cmd-4d {[regexp -- \
+ {: use "help" for more information$} [third_data_line]]}
+
+###############################################################################
+
+set RESULT [test_fossil_http $repository $dataFileName /timeline]
+
+test th1-web-hooks-1a {[regexp \
+ {<title>Unnamed Fossil Project: Timeline</title>} $RESULT]}
+
+test th1-web-hooks-1b {[regexp [appendArgs \
+ {<h1><b>command_hook http webpage_hook timeline} " " \
+ {webpage_notify timeline</b></h1>}] $RESULT]}
+
+###############################################################################
+
+set RESULT [test_fossil_http $repository $dataFileName /test1]
+test th1-custom-web-1a {[next_to_last_data_line] eq $repository}
+
+test th1-custom-web-1b {[last_data_line] eq \
+ {<h1><b>command_hook http webpage_hook test1 webpage_notify test1</b></h1>}}
+
+###############################################################################
+
+fossil settings th1-setup $savedTh1Setup
+
+###############################################################################
+
+test_cleanup