gopass/tests/mount_test.go
Yolan Romailler d56639fcd7
[CLEANUP] Migration of options to more appropriate sections (#2681)
* [CLEANUP] Moving options to the correct config section

This adds an easy migration path to our config handling, which should
allow us to migrate option names around much more easily in the future.

Any system level config or env variables options are not migrated.

This also fixes a bug in our test code, where the root mount path was
not properly set in our config, because we used "path:" instead of
"path=" to set it.

Signed-off-by: Yolan Romailler <anomalroil@users.noreply.github.com>

* [DOCUMENTATION] Document legacy options and their migration path

This also makes sure that legacy options aren't used in the code anymore using the docs test and its regexp

Signed-off-by: Yolan Romailler <anomalroil@users.noreply.github.com>

* [n/a] Removing weird spaces from changelog

Signed-off-by: Yolan Romailler <anomalroil@users.noreply.github.com>

* [DOCUMENTATION] Reformatting our Markdown tables properly

Signed-off-by: Yolan Romailler <anomalroil@users.noreply.github.com>

* [TESTING] Patching a timezone bug in tests

This is a fun one where if your Timezone isn't UTC and you are past midnight but it's not past midnight UTC, the tests would fail because you're not using the right date to validate it.

Signed-off-by: Yolan Romailler <anomalroil@users.noreply.github.com>

* [n/a] Fix a typo and use the correct Env variables in the doc about the custom Env variables

Signed-off-by: Yolan Romailler <anomalroil@users.noreply.github.com>

* [BREAKING] Custom Env options moved from GOPASS_CONFIG_CONFIG_KEY_i to GOPASS_CONFIG_KEY_i

As discussed in #2617, this actually reflects the way GIT_CONFIG works.

It also fixes a potential Panic in our codebase when IsSet was called
without any Preset config on a non-existing key.

Signed-off-by: Yolan Romailler <anomalroil@users.noreply.github.com>

* [CLEANUP] Patching all of the new linter complaints

Signed-off-by: Yolan Romailler <anomalroil@users.noreply.github.com>

* [CLEANUP] Use Go1.21 everywhere

Signed-off-by: Yolan Romailler <anomalroil@users.noreply.github.com>

* [n/a] Increase our Golangci timeout

Signed-off-by: Yolan Romailler <anomalroil@users.noreply.github.com>

* [n/a] code review comment and extra regression test

Signed-off-by: Yolan Romailler <anomalroil@users.noreply.github.com>

---------

Signed-off-by: Yolan Romailler <anomalroil@users.noreply.github.com>
2023-11-03 18:40:58 +01:00

229 lines
5.2 KiB
Go

package tests
import (
"fmt"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestSingleMount(t *testing.T) {
ts := newTester(t)
defer ts.teardown()
ts.initStore()
ts.initSecrets("")
out, err := ts.run("init --store mnt/m1 --path " + ts.storeDir("m1") + " --storage=fs " + keyID)
t.Logf("Output: %s", out)
require.NoError(t, err)
out, err = ts.run("mounts")
require.NoError(t, err)
want := "gopass (" + ts.storeDir("root") + ")\n"
want += "└── mnt/\n └── m1 (" + ts.storeDir("m1") + ")"
assert.Equal(t, strings.TrimSpace(want), out)
out, err = ts.run("show mnt/m1/secret")
require.Error(t, err)
assert.Contains(t, out, "entry is not in the password store")
ts.initSecrets("mnt/m1/")
list := `
gopass
├── baz
├── fixed/
│ ├── secret
│ └── twoliner
├── foo/
│ └── bar
└── mnt/
└── m1 (%s)
├── baz
├── fixed/
│ ├── secret
│ └── twoliner
└── foo/
└── bar
`
list = fmt.Sprintf(list, ts.storeDir("m1"))
out, err = ts.run("list")
require.NoError(t, err)
assert.Equal(t, strings.TrimSpace(list), out)
}
func TestMountShadowing(t *testing.T) {
ts := newTester(t)
defer ts.teardown()
ts.initStore()
ts.initSecrets("")
// insert some secret at a place that will be shadowed by a mount
_, err := ts.runCmd([]string{ts.Binary, "insert", "mnt/m1/secret"}, []byte("moar"))
require.NoError(t, err)
out, err := ts.run("show -f mnt/m1/secret")
require.NoError(t, err)
assert.Equal(t, "moar", out)
out, err = ts.run("init --store mnt/m1 --path " + ts.storeDir("m1") + " --storage=fs " + keyID)
t.Logf("Output: %s", out)
require.NoError(t, err)
// check the mount is there
out, err = ts.run("mounts")
require.NoError(t, err)
want := "gopass (" + ts.storeDir("root") + ")\n"
want += "└── mnt/\n └── m1 (" + ts.storeDir("m1") + ")"
assert.Equal(t, strings.TrimSpace(want), out)
// check that the mount is not containing our shadowed secret
out, err = ts.run("show -f mnt/m1/secret")
require.Error(t, err)
assert.Contains(t, out, "entry is not in the password store")
// insert some secret at the place that is shadowed by the mount
_, err = ts.runCmd([]string{ts.Binary, "insert", "mnt/m1/secret"}, []byte("food"))
require.NoError(t, err)
// check that the mount is containing our new secret shadowing the old one
out, err = ts.run("show -f mnt/m1/secret")
require.NoError(t, err)
assert.Equal(t, "food", out)
// add more secrets
ts.initSecrets("mnt/m1/")
// check that the mount is listed
list := `
gopass
├── baz
├── fixed/
│ ├── secret
│ └── twoliner
├── foo/
│ └── bar
└── mnt/
└── m1 (%s)
├── baz
├── fixed/
│ ├── secret
│ └── twoliner
├── foo/
│ └── bar
└── secret
`
list = fmt.Sprintf(list, ts.storeDir("m1"))
out, err = ts.run("list")
require.NoError(t, err)
assert.Equal(t, strings.TrimSpace(list), out)
// check that unmounting works:
_, err = ts.run("mounts rm mnt/m1")
require.NoError(t, err)
list = `
gopass
├── baz
├── fixed/
│ ├── secret
│ └── twoliner
├── foo/
│ └── bar
└── mnt/
└── m1/
└── secret
`
out, err = ts.run("list")
require.NoError(t, err)
assert.Equal(t, strings.TrimSpace(list), out)
out, err = ts.run("show -o mnt/m1/secret")
require.NoError(t, err)
assert.Equal(t, "moar", out)
}
func TestMultiMount(t *testing.T) {
ts := newTester(t)
defer ts.teardown()
ts.initStore()
ts.initSecrets("")
// mount m1
out, err := ts.run("init --store mnt/m1 --path " + ts.storeDir("m1") + " --storage=fs " + keyID)
t.Logf("Output: %s", out)
require.NoError(t, err)
ts.initSecrets("mnt/m1/")
list := `
gopass
├── baz
├── fixed/
│ ├── secret
│ └── twoliner
├── foo/
│ └── bar
└── mnt/
└── m1 (%s)
├── baz
├── fixed/
│ ├── secret
│ └── twoliner
└── foo/
└── bar
`
list = fmt.Sprintf(list, ts.storeDir("m1"))
out, err = ts.run("list")
require.NoError(t, err)
assert.Equal(t, strings.TrimSpace(list), out)
// mount m2
out, err = ts.run("init --store mnt/m2 --path " + ts.storeDir("m2") + " --storage=fs " + keyID)
t.Logf("Output: %s", out)
require.NoError(t, err)
ts.initSecrets("mnt/m2/")
list = `
gopass
├── baz
├── fixed/
│ ├── secret
│ └── twoliner
├── foo/
│ └── bar
└── mnt/
├── m1 (%s)
│ ├── baz
│ ├── fixed/
│ │ ├── secret
│ │ └── twoliner
│ └── foo/
│ └── bar
└── m2 (%s)
├── baz
├── fixed/
│ ├── secret
│ └── twoliner
└── foo/
└── bar
`
list = fmt.Sprintf(list, ts.storeDir("m1"), ts.storeDir("m2"))
out, err = ts.run("list")
require.NoError(t, err)
assert.Equal(t, strings.TrimSpace(list), out)
}