Repository navigation
Expand file tree
/
Copy pathprovider_test.go
More file actions
134 lines (123 loc) · 4.09 KB
/
Copy pathprovider_test.go
File metadata and controls
134 lines (123 loc) · 4.09 KB
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
133
134
package testdb
import (
"context"
"errors"
"strings"
"testing"
)
// plainProvider implements Provider but not TemplateProvider, standing in
// for a database that cannot clone one database from another. It delegates
// to a mockProvider by hand so no template method gets promoted.
type plainProvider struct {
inner mockProvider
initialized bool
}
func (p *plainProvider) Initialize(ctx context.Context, cfg Config) error {
p.initialized = true
return p.inner.Initialize(ctx, cfg)
}
func (p *plainProvider) CreateDatabase(ctx context.Context, name string) error {
return p.inner.CreateDatabase(ctx, name)
}
func (p *plainProvider) DropDatabase(ctx context.Context, name string) error {
return p.inner.DropDatabase(ctx, name)
}
func (p *plainProvider) TerminateConnections(ctx context.Context, name string) error {
return p.inner.TerminateConnections(ctx, name)
}
func (p *plainProvider) BuildDSN(dbName string) (string, error) { return p.inner.BuildDSN(dbName) }
func (p *plainProvider) ResolvedAdminDSN() string { return p.inner.ResolvedAdminDSN() }
func (p *plainProvider) Cleanup(ctx context.Context) error { return p.inner.Cleanup(ctx) }
// Compile-time statements of which interfaces the test doubles satisfy.
var (
_ Provider = (*plainProvider)(nil)
_ TemplateProvider = (*mockProvider)(nil)
)
func TestNewWithTemplateNeedsTemplateProvider(t *testing.T) {
provider := &plainProvider{}
_, err := New(t, provider, nil, WithTemplate("us_region"))
if !errors.Is(err, ErrTemplatesNotSupported) {
t.Fatalf("expected ErrTemplatesNotSupported, got %v", err)
}
var testErr *Error
if !errors.As(err, &testErr) || testErr.Op != "testdb.New" {
t.Errorf("expected *Error with Op testdb.New, got %#v", err)
}
if !strings.Contains(err.Error(), "plainProvider") {
t.Errorf("error should name the provider type, got: %v", err)
}
if provider.initialized {
t.Error("New should refuse before initializing the provider")
}
}
func TestNewWithoutTemplateAcceptsPlainProvider(t *testing.T) {
provider := &plainProvider{}
db, err := New(t, provider, nil)
if err != nil {
t.Fatalf("plain provider without a template should work, got %v", err)
}
if err := db.Close(); err != nil {
t.Fatal(err)
}
}
func TestResolveAdminDSN(t *testing.T) {
const (
override = "postgres://override/db"
specific = "postgres://specific/db"
specific2 = "postgres://specific2/db"
shared = "postgres://shared/db"
generic = "postgres://generic/db"
fallback = "postgres://default/db"
)
tests := map[string]struct {
cfg Config
env map[string]string
args []string
want string
}{
"override beats everything": {
cfg: Config{AdminDSNOverride: override},
env: map[string]string{"TEST_X_URL": specific, "TEST_DATABASE_URL": shared, "DATABASE_URL": generic},
args: []string{"TEST_X_URL"},
want: override,
},
"provider variable beats the shared ones": {
env: map[string]string{"TEST_X_URL": specific, "TEST_DATABASE_URL": shared, "DATABASE_URL": generic},
args: []string{"TEST_X_URL"},
want: specific,
},
"provider variables are tried in order": {
env: map[string]string{"TEST_Y_URL": specific2, "TEST_DATABASE_URL": shared},
args: []string{"TEST_X_URL", "TEST_Y_URL"},
want: specific2,
},
"TEST_DATABASE_URL beats DATABASE_URL": {
env: map[string]string{"TEST_DATABASE_URL": shared, "DATABASE_URL": generic},
args: []string{"TEST_X_URL"},
want: shared,
},
"DATABASE_URL when nothing else": {
env: map[string]string{"DATABASE_URL": generic},
args: []string{"TEST_X_URL"},
want: generic,
},
"default when no variable is set": {
args: []string{"TEST_X_URL"},
want: fallback,
},
"no provider variables given": {
env: map[string]string{"TEST_DATABASE_URL": shared},
want: shared,
},
}
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
for _, v := range []string{"TEST_X_URL", "TEST_Y_URL", "TEST_DATABASE_URL", "DATABASE_URL"} {
t.Setenv(v, tc.env[v])
}
if got := ResolveAdminDSN(tc.cfg, fallback, tc.args...); got != tc.want {
t.Errorf("ResolveAdminDSN = %q, want %q", got, tc.want)
}
})
}
}