gopass/tests/insert_test.go
Dominik Schulz 7281ca8ab4
[chore] Migrate to golangci-lint v2 (#3104)
* [chore] Migrate to golangci-lint v2

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [chore] Fix more lint issues

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [chore] Fix more lint issue

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [chore] Fix more lint issues

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [chore] Add more package comments.

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [chore] Fix golangci-lint config and the remaining checks

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [fix] Use Go 1.24

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [fix] Fix container builds

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* Fix more failing tests

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* Fix test failure

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* Fix another len assertion

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* Move location tests

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [fix] Fix most remaining lint issues

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [fix] Only run XDG specific tests on linux

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [fix] Attempt to address on source of flaky failures

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

---------

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>
2025-04-17 08:05:43 +02:00

232 lines
6.2 KiB
Go

package tests
import (
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestInsert(t *testing.T) {
ts := newTester(t)
defer ts.teardown()
ts.initStore()
out, err := ts.run("insert")
require.Error(t, err)
assert.Equal(t, "\nError: Usage: "+filepath.Base(ts.Binary)+" insert name\n", out)
_, err = ts.runCmd([]string{ts.Binary, "insert", "some/secret"}, []byte("moar"))
require.NoError(t, err)
_, err = ts.runCmd([]string{ts.Binary, "insert", "some/newsecret"}, []byte("and\nmoar"))
require.NoError(t, err)
t.Run("Regression test for #1573 without actual pipes", func(t *testing.T) {
out, err = ts.run("show -f some/secret")
require.NoError(t, err)
assert.Equal(t, "moar", out)
out, err = ts.run("show -f some/newsecret")
require.NoError(t, err)
assert.Equal(t, "and\nmoar", out)
out, err = ts.run("show -f some/secret")
require.NoError(t, err)
assert.Equal(t, "moar", out)
out, err = ts.run("show -f some/newsecret")
require.NoError(t, err)
assert.Equal(t, "and\nmoar", out)
})
t.Run("Regression test for #1595", func(t *testing.T) {
t.Skip("TODO")
_, err = ts.runCmd([]string{ts.Binary, "insert", "some/other"}, []byte("nope"))
require.NoError(t, err)
out, err = ts.run("insert some/other")
require.Error(t, err)
assert.Equal(t, "\nError: not overwriting your current secret\n", out)
out, err = ts.run("show -o some/other")
require.NoError(t, err)
assert.Equal(t, "nope", out)
out, err = ts.run("--yes insert some/other")
require.NoError(t, err)
assert.Equal(t, "Warning: Password is empty or all whitespace", out)
out, err = ts.run("insert -f some/other")
require.NoError(t, err)
assert.Equal(t, "Warning: Password is empty or all whitespace", out)
out, err = ts.run("show -o some/other")
require.Error(t, err)
assert.Equal(t, "\nError: empty secret\n", out)
_, err = ts.runCmd([]string{ts.Binary, "insert", "-f", "some/other"}, []byte("final"))
require.NoError(t, err)
out, err = ts.run("show -o some/other")
require.NoError(t, err)
assert.Equal(t, "final", out)
// This is arguably not a good behaviour: it should not overwrite the password when we are only working on a key:value.
out, err = ts.run("insert -f some/other test:inline")
require.NoError(t, err)
assert.Empty(t, out)
out, err = ts.run("show some/other test")
require.NoError(t, err)
assert.Equal(t, "inline", out)
out, err = ts.run("insert some/other test:inline2")
require.Error(t, err)
assert.Equal(t, "\nError: not overwriting your current secret\n", out)
out, err = ts.run("show some/other Test")
require.NoError(t, err)
assert.Equal(t, "inline", out)
out, err = ts.run("--yes insert some/other test:inline2")
require.NoError(t, err)
assert.Empty(t, out)
out, err = ts.run("show some/other Test")
require.NoError(t, err)
assert.Equal(t, "inline2", out)
})
t.Run("Regression test for #1650 with JSON", func(t *testing.T) {
json := `Password: SECRET
--
glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}`
_, err = ts.runCmd([]string{ts.Binary, "insert", "some/json"}, []byte(json))
require.NoError(t, err)
// using show -n to disable parsing
out, err = ts.run("show -f -n some/json")
require.NoError(t, err)
assert.Equal(t, json, out) //nolint:testifylint
})
t.Run("Regression test for #1600", func(t *testing.T) {
input := `test1
test2
{
"Creator": "the creator"
}`
_, err = ts.runCmd([]string{ts.Binary, "insert", "some/multilinewithbraces"}, []byte(input))
require.NoError(t, err)
// using show -n to disable parsing
out, err = ts.run("show -f -n some/multilinewithbraces")
require.NoError(t, err)
assert.Equal(t, input, out)
})
t.Run("Regression test for #1601", func(t *testing.T) {
input := `thepassword
user: a user
web: test.com
user: second user`
_, err = ts.runCmd([]string{ts.Binary, "insert", "some/multikey"}, []byte(input))
require.NoError(t, err)
// using show -n to disable parsing
out, err = ts.run("show -f -n some/multikey")
require.NoError(t, err)
assert.Equal(t, input, out)
})
t.Run("Regression test full support for #1601", func(t *testing.T) {
t.Skip("Skipping until we support actual key-valueS for KV")
input := `thepassword
user: a user
web: test.com
user: second user`
output := `thepassword
web: test.com
user: a user
user: second user`
_, err = ts.runCmd([]string{ts.Binary, "insert", "some/multikeyvalues"}, []byte(input))
require.NoError(t, err)
out, err = ts.run("show -f some/multikeyvalues")
require.NoError(t, err)
assert.Equal(t, output, out)
})
t.Run("Regression test for #1614", func(t *testing.T) {
input := `yamltest
---
user: 0123`
output := `yamltest
---
user: 83`
_, err = ts.runCmd([]string{ts.Binary, "insert", "some/yamloctal"}, []byte(input))
require.NoError(t, err)
// with parsing we have 0123 interpreted as octal for 83
out, err = ts.run("show -f some/yamloctal")
require.NoError(t, err)
assert.Equal(t, output, out)
// using show -n to disable parsing
out, err = ts.run("show -f -n some/yamloctal")
require.NoError(t, err)
assert.Equal(t, input, out)
})
t.Run("Regression test for #1594", func(t *testing.T) {
input := `somepasswd
---
Test / test.com
user:myuser
url: test.com/`
_, err = ts.runCmd([]string{ts.Binary, "insert", "some/kvwithspace"}, []byte(input))
require.NoError(t, err)
out, err = ts.run("show -f some/kvwithspace")
require.NoError(t, err)
assert.Equal(t, input, out)
out, err = ts.run("show -f some/kvwithspace url")
require.NoError(t, err)
assert.Equal(t, "test.com/", out)
out, err = ts.run("show -f some/kvwithspace user")
require.Error(t, err)
})
}