summaryrefslogtreecommitdiff
path: root/secrets/test/local.sh
blob: e8d174b2d79edc793e40e67f4105025db7a30b92 (plain)
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/bin/bash
# Tests for put-local and get-local commands

this_dir="$(cd "$(dirname "$0")" && pwd)"
source "${this_dir}/common.sh"

test_put_local_and_get_local() {
    local target_dir="${TEST_DIR}/secrets"
    szecret create-local "test-store" "${target_dir}"

    local secret_value="local-secret-value-456"
    local encrypted_file="${target_dir}/secret.age"

    echo "${secret_value}" | szecret put-local "${encrypted_file}"

    assert_file_exists "${encrypted_file}" "encrypted file"

    local retrieved
    retrieved="$(szecret get-local "${encrypted_file}")"
    assert_equals "${secret_value}" "${retrieved}" "local secret value"
    pass "put-local and get-local"
}

test_put_local_no_metadata_fails() {
    local target_dir="${TEST_DIR}/no-metadata"
    mkdir -p "${target_dir}"

    assert_failure bash -c "echo 'value' | szecret put-local '${target_dir}/secret.age'"
    pass "put-local fails without metadata"
}

test_get_local_no_metadata_fails() {
    local target_dir="${TEST_DIR}/no-metadata-get"
    mkdir -p "${target_dir}"
    touch "${target_dir}/fake.age"

    assert_failure szecret get-local "${target_dir}/fake.age"
    pass "get-local fails without metadata"
}

test_get_local_legacy_syntax_warns() {
    local target_dir="${TEST_DIR}/legacy-test"
    szecret create-local "legacy-store" "${target_dir}"

    local secret_value="legacy-value"
    echo "${secret_value}" | szecret put-local "${target_dir}/secret.age"

    # Use legacy 2-arg syntax - should warn even with metadata present
    local stderr_output
    stderr_output="$(szecret get-local "legacy-store" "${target_dir}/secret.age" 2>&1 >/dev/null)"

    assert_contains "${stderr_output}" "WARN" "deprecation warning"
    assert_contains "${stderr_output}" "deprecated" "deprecation message"

    # Should still work despite warning
    local retrieved
    retrieved="$(szecret get-local "legacy-store" "${target_dir}/secret.age" 2>/dev/null)"
    assert_equals "${secret_value}" "${retrieved}" "legacy syntax result"
    pass "get-local legacy syntax warns but works"
}

test_get_local_nonexistent_file_fails() {
    local target_dir="${TEST_DIR}/nonexistent-file"
    szecret create-local "file-test-store" "${target_dir}"

    assert_failure szecret get-local "${target_dir}/nonexistent.age"
    pass "get-local fails for nonexistent file"
}

test_put_local_requires_arg() {
    assert_failure szecret put-local
    pass "put-local requires file path"
}

test_get_local_requires_arg() {
    assert_failure szecret get-local
    pass "get-local requires file path"
}

test_put_local_pubkey_mismatch_fails() {
    local target_dir="${TEST_DIR}/pubkey-mismatch-put"
    szecret create-local "mismatch-put-store" "${target_dir}"

    # Corrupt the pubkey in metadata
    sed -i.bak 's/pubkey=.*/pubkey=age1invalid000000000000000000000000000000000000000000000000000/' "${target_dir}/.szecret"

    # Should fail on put-local
    assert_failure bash -c "echo 'value' | szecret put-local '${target_dir}/secret.age'"
    pass "put-local fails on pubkey mismatch"
}

test_get_local_pubkey_mismatch_fails() {
    local target_dir="${TEST_DIR}/pubkey-mismatch-get"
    szecret create-local "mismatch-get-store" "${target_dir}"

    # Encrypt a secret first
    echo "secret-value" | szecret put-local "${target_dir}/secret.age"

    # Corrupt the pubkey in metadata
    sed -i.bak 's/pubkey=.*/pubkey=age1invalid000000000000000000000000000000000000000000000000000/' "${target_dir}/.szecret"

    # Should fail on get-local (new syntax)
    assert_failure szecret get-local "${target_dir}/secret.age"
    pass "get-local fails on pubkey mismatch"
}

test_invalid_metadata_fails() {
    local target_dir="${TEST_DIR}/invalid-metadata"
    mkdir -p "${target_dir}"

    # Create invalid metadata (old format without pubkey)
    echo "just-store-name" > "${target_dir}/.szecret"
    touch "${target_dir}/secret.age"

    assert_failure szecret get-local "${target_dir}/secret.age"
    pass "invalid metadata format fails"
}

run_tests() {
    test_put_local_and_get_local
    test_put_local_no_metadata_fails
    test_get_local_no_metadata_fails
    test_get_local_legacy_syntax_warns
    test_get_local_nonexistent_file_fails
    test_put_local_requires_arg
    test_get_local_requires_arg
    test_put_local_pubkey_mismatch_fails
    test_get_local_pubkey_mismatch_fails
    test_invalid_metadata_fails
}

[[ "${BASH_SOURCE[0]}" == "${0}" ]] && run_tests