package secret import ( "bytes" "errors" "fmt" "os" "testing" ) type mockProvider struct { out []byte err error } func (p mockProvider) GetSecret(_ string) ([]byte, error) { return p.out, p.err } type testProviderCase struct { Name string Key string Err error Test func([]byte) error } func testProvider(t *testing.T, p Provider, tests ...testProviderCase) { t.Helper() for _, test := range tests { if test.Name == "" { test.Name = test.Key } t.Run(test.Name, func(it *testing.T) { v, err := p.GetSecret(test.Key) if err != nil { if test.Err == nil { it.Fatalf("unexpected error %q in %T (%#+v)", err, p, p) return } else if !errors.Is(err, test.Err) { it.Fatalf("unexpected error %q, expected error %q", err, test.Err) return } return } else if test.Err != nil { it.Fatalf("expected error %q", test.Err) return } if err := test.Test(v); err != nil { it.Error(err) } }) } } func testNotEmpty(v []byte) error { if len(v) > 0 { return nil } return fmt.Errorf("expected empty, got %q", v) } func testEqual(a []byte) func([]byte) error { return func(b []byte) error { if bytes.Equal(a, b) { return nil } return fmt.Errorf("expected %q, got %q", a, b) } } func testEqualString(a string) func([]byte) error { return testEqual([]byte(a)) } func testInPipeline() bool { return os.Getenv("CI") != "" }