$ git clone -q https://github.com/biox/pa.git
$ cd pa
$ ls -1 -p
LICENSE
README
contrib/
pa
test
$ nl -b a -s ' ' -w 3 test
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
#!/bin/sh
#
# test - a pa test script

failures=0
fail() {
    printf "%s\n" "$*"
    failures=$((failures + 1))
}

export PA_DIR=/tmp/pa-test

# clean up previous run
# (the previous state is left around
# intentionally, in case the dev
# wants to poke around)
# that's why we don't clean up on exit
rm -rf /tmp/pa-test

# pa welcomes you
./pa | grep -q "a simple password manager" ||
    fail "pa should print a welcome message"

# generate pa dirs/identityfile/recipientfile
./pa list

# pa auto-generated files are correct
test -s "$PA_DIR/identities" ||
    fail "an identities file should exist"

test -s "$PA_DIR/recipients" ||
    fail "a recipients file should exist"

test -d "$PA_DIR/passwords/.git" ||
    fail "git dir should exist"
# TODO: ensure git author/email are set correctly, etc

# pa add
printf 'y' | ./pa add test 2>&1 >/dev/null ||
    fail "pa add should be capable of adding a test password"

test "$(printf y | ./pa add nested/password 2>&1)" = "\
generate a password? [y/N]: y
saved 'nested/password' to the store." ||
    fail "pa add should say it stored nested/password"

test -s "$PA_DIR/passwords/nested/password.age" ||
    fail "pa add should create an encrypted password file"

# pa list
./pa list | grep -q test ||
    fail "pa list should list the test password"

test "$(./pa list)" = "nested/password
test" ||
    fail "pa list output should match example"

# ensure git commits are working
git -C "$PA_DIR/passwords" log | grep -q "add 'nested/password'" ||
    fail "git log should have line: add 'nested/password'"

# print info & exit w/ correct status
printf "\ntotal failures: %d\n" "$failures"
test "$failures" -eq 0