1package leaf
2
3import (
4	"bytes"
5	"context"
6	"os"
7	"testing"
8
9	plain "github.com/gopasspw/gopass/internal/backend/crypto/plain"
10	"github.com/gopasspw/gopass/internal/backend/storage/fs"
11	"github.com/gopasspw/gopass/internal/out"
12	"github.com/gopasspw/gopass/pkg/ctxutil"
13	"github.com/gopasspw/gopass/pkg/gopass/secrets"
14
15	"github.com/stretchr/testify/assert"
16	"github.com/stretchr/testify/require"
17)
18
19func TestList(t *testing.T) {
20	ctx := context.Background()
21	ctx = ctxutil.WithExportKeys(ctx, false)
22
23	obuf := &bytes.Buffer{}
24	out.Stdout = obuf
25	defer func() {
26		out.Stdout = os.Stdout
27	}()
28
29	for _, tc := range []struct {
30		name string
31		prep func(s *Store) error
32		out  []string
33	}{
34		{
35			name: "Empty store",
36			prep: func(s *Store) error { return nil },
37			out:  []string{},
38		},
39		{
40			name: "Single entry",
41			prep: func(s *Store) error {
42				sec := secrets.New()
43				sec.SetPassword("bar")
44				return s.Set(ctx, "foo", sec)
45			},
46			out: []string{"foo"},
47		},
48		{
49			name: "Multi-entry-single-level",
50			prep: func(s *Store) error {
51				for _, e := range []string{"foo", "bar", "baz"} {
52					sec := secrets.New()
53					sec.SetPassword("bar")
54					if err := s.Set(ctx, e, sec); err != nil {
55						return err
56					}
57				}
58				return nil
59			},
60			out: []string{"bar", "baz", "foo"},
61		},
62		{
63			name: "Multi-entry-multi-level",
64			prep: func(s *Store) error {
65				for _, e := range []string{"foo/bar", "foo/baz", "foo/zab"} {
66					sec := secrets.New()
67					sec.SetPassword("bar")
68					if err := s.Set(ctx, e, sec); err != nil {
69						return err
70					}
71				}
72				return nil
73			},
74			out: []string{"foo/bar", "foo/baz", "foo/zab"},
75		},
76	} {
77		// common setup
78		tempdir, err := os.MkdirTemp("", "gopass-")
79		require.NoError(t, err)
80
81		s := &Store{
82			alias:   "",
83			path:    tempdir,
84			crypto:  plain.New(),
85			storage: fs.New(tempdir),
86		}
87
88		assert.NoError(t, s.saveRecipients(ctx, []string{"john.doe"}, "test"))
89
90		// prepare store
91		assert.NoError(t, tc.prep(s))
92		obuf.Reset()
93
94		// run test case
95		out, err := s.List(ctx, "")
96		require.NoError(t, err)
97		assert.Equal(t, tc.out, out)
98		obuf.Reset()
99
100		// common tear down
101		_ = os.RemoveAll(tempdir)
102	}
103}
104