diff options
author | EuAndreh <eu@euandre.org> | 2021-06-12 17:36:05 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2021-06-12 17:38:07 -0300 |
commit | 50a7c011274359ef058d30be87b9d29ca4fd06ed (patch) | |
tree | 16fb9e60e62614a8df28e880c96e2818d9d33936 | |
parent | TODOs.md: Mark #task-a66edd2e-cec4-ef7d-5a8a-3c9013381719 as DONE (diff) | |
download | git-permalink-50a7c011274359ef058d30be87b9d29ca4fd06ed.tar.gz git-permalink-50a7c011274359ef058d30be87b9d29ca4fd06ed.tar.xz |
Add initial version of tests/cli-opts.sh tests
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 13 | ||||
-rwxr-xr-x | aux/tests-lib.sh | 93 | ||||
-rwxr-xr-x[-rw-r--r--] | tests/cli-opts.sh | 108 | ||||
-rwxr-xr-x | tests/xdg-open | 7 |
5 files changed, 217 insertions, 5 deletions
@@ -1 +1,2 @@ /public/ +/git-permalink @@ -9,7 +9,12 @@ MAILING_LIST = public-inbox manpages = \ doc/git-permalink.1 -all: +all: git-permalink + +git-permalink: src/git-permalink.sh + $(do_subst) < $? > $@-t + chmod +x $@-t + mv $@-t $@ check: sh tests/cli-opts.sh @@ -25,9 +30,7 @@ do_subst = sed \ -e 's:[@]DATE[@]:$(DATE):g' install: all - mkdir -p $(DESTDIR)$(PREFIX)/bin - $(do_subst) < src/git-permalink.sh > $(DESTDIR)$(PREFIX)/bin/$(NAME) - chmod 755 $(DESTDIR)$(PREFIX)/bin/$(NAME) + install -m 755 -D git-permalink $(DESTDIR)$(PREFIX)/bin/$(NAME) for m in $(manpages); do \ n=$${m##*.}; \ mkdir -p $(DESTDIR)$(MANPREFIX)/man$$n; \ @@ -39,7 +42,7 @@ uninstall: for m in $(manpages); do rm -f $(DESTDIR)$(MANPREFIX)/man$${m##*.}/`basename $$m`; done clean: - rm -rf public/ + rm -rf public/ git-permalink dist: sh aux/workflow/dist.sh $(DATE) $(VERSION) $(NAME) diff --git a/aux/tests-lib.sh b/aux/tests-lib.sh new file mode 100755 index 0000000..e075974 --- /dev/null +++ b/aux/tests-lib.sh @@ -0,0 +1,93 @@ +#!/bin/sh + +OUT= +ERR= +STATUS= + +assert_status() { + if [ "$STATUS" != "$1" ]; then + printf '\nERR: Bad status.\n\nexpected: %s\ngot: %s\n' \ + "$1" "$STATUS" >&2 + exit 1 + fi +} + +assert_usage() { + if ! grep -Fq 'Usage' "$1"; then + echo 'Expected to find "Usage" text, it was missing:' >&2 + cat "$1" >&2 + exit 1 + fi +} + +assert_empty_stream() { + if [ -s "$2" ]; then + printf '\nERR: Expected %s (%s) to be empty, but has content:\n%s\n' \ + "$1" "$2" "$(cat "$2")" >&2 + exit 1 + fi +} + +assert_empty_stdout() { + assert_empty_stream STDOUT "$OUT" +} + +assert_empty_stderr() { + assert_empty_stream STDERR "$ERR" +} + +assert_stream() { + if [ "$(cat "$2")" != "$3" ]; then + printf '\nERR: Bad %s (%s)\n\nexpected: %s\ngot: %s\n' \ + "$1" "$2" "$3" "$(cat "$2")" >&2 + exit 1 + fi +} + +assert_stdout() { + assert_stream STDOUT "$OUT" "$1" +} + +assert_stderr() { + assert_stream STDERR "$ERR" "$1" +} + +assert_grep_stream() { + if ! grep -qE "$3" "$2"; then + printf '\nERR: Bad %s (%s)\n\ngrepping: %s\nin:\n%s\n' \ + "$1" "$2" "$3" "$(cat "$2")" >&2 + exit 1 + fi +} + +assert_grep_stdout() { + assert_grep_stream STDOUT "$OUT" "$1" +} + +assert_grep_stderr() { + assert_grep_stream STDERR "$ERR" "$1" +} + +assert_fgrep_stream() { + if ! grep -Fq -- "$3" "$2"; then + printf '\nERR: Bad %s (%s)\n\ngrepping: %s\nin:\n%s\n' \ + "$1" "$2" "$3" "$(cat "$2")" >&2 + exit 1 + fi +} + +assert_fgrep_stdout() { + assert_fgrep_stream STDOUT "$OUT" "$1" +} + +assert_fgrep_stderr() { + assert_fgrep_stream STDERR "$ERR" "$1" +} + +testing() { + printf 'testing: %s...' "$1" >&2 +} + +test_ok() { + printf ' OK.\n' >&2 +} diff --git a/tests/cli-opts.sh b/tests/cli-opts.sh index e69de29..f1a89c3 100644..100755 --- a/tests/cli-opts.sh +++ b/tests/cli-opts.sh @@ -0,0 +1,108 @@ +#!/bin/sh +set -u + +. aux/tests-lib.sh + +export PATH="$PWD/tests:$PATH" + +test_help_flags() { + testing 'help flags' + + OUT="$(mktemp)" + ERR="$(mktemp)" + ./git-permalink -h 1>"$OUT" 2>"$ERR" + STATUS=$? + assert_status 0 + assert_empty_stderr + assert_fgrep_stdout 'Usage' + assert_fgrep_stdout 'Options' + + OUT="$(mktemp)" + ERR="$(mktemp)" + ./git-permalink --help 1>"$OUT" 2>"$ERR" + STATUS=$? + assert_status 0 + assert_empty_stderr + assert_usage "$OUT" + assert_fgrep_stdout 'Usage' + assert_fgrep_stdout 'Options' + + OUT="$(mktemp)" + ERR="$(mktemp)" + ./git-permalink --something somethign -h 1>"$OUT" 2>"$ERR" + STATUS=$? + assert_status 0 + assert_empty_stderr + assert_usage "$OUT" + assert_fgrep_stdout 'Usage' + assert_fgrep_stdout 'Options' + + OUT="$(mktemp)" + ERR="$(mktemp)" + ./git-permalink --help more things 1>"$OUT" 2>"$ERR" + STATUS=$? + assert_status 0 + assert_empty_stderr + assert_usage "$OUT" + assert_fgrep_stdout 'Usage' + assert_fgrep_stdout 'Options' + + test_ok +} + +test_version_flags() { + testing 'version flags' + REGEX='^git-permalink-[0-9\.]+ [0-9-]+$' + + OUT="$(mktemp)" + ERR="$(mktemp)" + ./git-permalink -V 1>"$OUT" 2>"$ERR" + STATUS=$? + assert_status 0 + assert_empty_stderr + assert_grep_stdout "$REGEX" + + OUT="$(mktemp)" + ERR="$(mktemp)" + ./git-permalink --version 1>"$OUT" 2>"$ERR" + STATUS=$? + assert_status 0 + assert_empty_stderr + assert_grep_stdout "$REGEX" + + OUT="$(mktemp)" + ERR="$(mktemp)" + ./git-permalink --abc xyz -V 1>"$OUT" 2>"$ERR" + STATUS=$? + assert_status 0 + assert_empty_stderr + assert_grep_stdout "$REGEX" + + OUT="$(mktemp)" + ERR="$(mktemp)" + ./git-permalink --version things again 1>"$OUT" 2>"$ERR" + STATUS=$? + assert_status 0 + assert_empty_stderr + assert_grep_stdout "$REGEX" + + test_ok +} + +test_unsupported_flags_are_treated_as_arguments() { + testing 'usupported flags are treated as arguments' + OUT="$(mktemp)" + ERR="$(mktemp)" + ./git-permalink --first-flag --second-flag 1>"$OUT" 2>"$ERR" + STATUS=$? + assert_status 0 + assert_fgrep_stdout "--first-flag" + assert_fgrep_stderr "--first-flag" + assert_fgrep_stdout "--second-flag" + assert_fgrep_stderr "--second-flag" + test_ok +} + +test_help_flags +test_version_flags +test_unsupported_flags_are_treated_as_arguments diff --git a/tests/xdg-open b/tests/xdg-open new file mode 100755 index 0000000..871c537 --- /dev/null +++ b/tests/xdg-open @@ -0,0 +1,7 @@ +#!/bin/sh +set -eu + +# This is a noop executable, to test git-permalink without interating +# with xdg-open proper. + +echo "xdg-open: $@" |