#!/usr/bin/env bash

test_description='library interface'

. lib/test-lib.sh

################################################################

test_begin_subtest "create db"
python3 - <<EOF 2>&1 | sed "s|$IMPASS_DB|IMPASS_DB|" >OUTPUT
import os
from stat import *
import impass
db = impass.Database("$IMPASS_DB")
print(db)
print(db.version)
db.add('foo@bar')
print('foo@bar' in db)
db.save('$IMPASS_KEYID')
mode = os.stat("$IMPASS_DB")[ST_MODE]
print(mode&(S_IRWXU + S_IRWXG + S_IRWXO) == (S_IRUSR | S_IWUSR) + 0 + 0)
EOF
cat <<EOF >EXPECTED
<impass.Database "IMPASS_DB">
1
True
True
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "decrypt db"
python3 - <<EOF 2>&1 | sed "s|$IMPASS_DB|IMPASS_DB|" >OUTPUT
import impass
db = impass.Database("$IMPASS_DB", '$IMPASS_KEYID')
print(db)
print(db.version)
print('foo@bar' in db)
EOF
cat <<EOF >EXPECTED
<impass.Database "IMPASS_DB">
1
True
EOF
test_expect_equal_file OUTPUT EXPECTED

# change permission to make sure permissions are preserved after
# re-writes
chmod 610 "$IMPASS_DB"

test_begin_subtest "add second entry"
python3 - <<EOF 2>&1 | sed "s|$IMPASS_DB|IMPASS_DB|" >OUTPUT
import os
from stat import *
import impass
db = impass.Database("$IMPASS_DB", '$IMPASS_KEYID')
db.add('aaaa')
print('aaaa' in db)
for e in sorted(db):
  print(e)
db.save()
mode = os.stat("$IMPASS_DB")[ST_MODE]
print(mode&(S_IRWXU + S_IRWXG + S_IRWXO) == int('610',8))
EOF
cat <<EOF >EXPECTED
True
aaaa
foo@bar
True
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "replace entry"
python3 - <<EOF 2>&1 | sed "s|$IMPASS_DB|IMPASS_DB|" >OUTPUT
import impass
db = impass.Database("$IMPASS_DB", '$IMPASS_KEYID')
p1 = db['aaaa']['password']
db.replace("aaaa")
print('aaaa' in db)
p2 = db['aaaa']['password']
print(p1 == p2)
db.save()
EOF
cat <<EOF >EXPECTED
True
False
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "update entry"
python3 - <<EOF 2>&1 | sed "s|$IMPASS_DB|IMPASS_DB|" >OUTPUT
import impass
db = impass.Database("$IMPASS_DB", '$IMPASS_KEYID')
p1 = db['aaaa']['password']
db.update('aaaa', 'bbbb')
print('aaaa' in db)
print('bbbb' in db)
p2 = db['bbbb']['password']
print(p1 == p2)
db.save()
EOF
cat <<EOF >EXPECTED
False
True
True
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "remove entry"
python3 - <<EOF 2>&1 | sed "s|$IMPASS_DB|IMPASS_DB|" >OUTPUT
import impass
db = impass.Database("$IMPASS_DB", '$IMPASS_KEYID')
print('foo@bar' in db)
db.remove('foo@bar')
print('foo@bar' in db)
db.save()
EOF
python3 - <<EOF 2>&1 | sed "s|$IMPASS_DB|IMPASS_DB|" >>OUTPUT
import impass
db = impass.Database("$IMPASS_DB", '$IMPASS_KEYID')
for e in db:
  print(e)
EOF
cat <<EOF >EXPECTED
True
False
bbbb
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "add accented context"
python3 - <<EOF 2>&1 | sed "s|$IMPASS_DB|IMPASS_DB|" >OUTPUT
import impass
db = impass.Database("$IMPASS_DB", '$IMPASS_KEYID')
db.add('això')
print('això' in db)
for e in sorted(db):
  print(e)
db.save()
EOF
cat <<EOF >EXPECTED
True
això
bbbb
EOF
test_expect_equal_file OUTPUT EXPECTED

################################################################

test_done
