Skip to content

Commit aab128f

Browse files
committed
chore(database): add unit tests for database arg resolving and shell completion
1 parent 192b264 commit aab128f

3 files changed

Lines changed: 145 additions & 1 deletion

File tree

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package completion_test
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/UpCloudLtd/upcloud-cli/internal/completion"
8+
smock "github.com/UpCloudLtd/upcloud-cli/internal/mock"
9+
"github.com/UpCloudLtd/upcloud-go-api/v4/upcloud"
10+
"github.com/spf13/cobra"
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/mock"
13+
)
14+
15+
var mockDatabases = []upcloud.ManagedDatabase{
16+
{Title: "asd-1", UUID: "abcdef"},
17+
{Title: "asd-2", UUID: "abcghi"},
18+
{Title: "qwe-1", UUID: "jklmno"},
19+
}
20+
21+
func TestDatabase_CompleteArgument(t *testing.T) {
22+
for _, test := range []struct {
23+
name string
24+
complete string
25+
expectedMatches []string
26+
expectedDirective cobra.ShellCompDirective
27+
}{
28+
{name: "Title/UUID - no match", complete: "pqr", expectedMatches: []string(nil), expectedDirective: cobra.ShellCompDirectiveNoFileComp},
29+
{name: "UUID - single match", complete: "jkl", expectedMatches: []string{"jklmno"}, expectedDirective: cobra.ShellCompDirectiveNoFileComp},
30+
{name: "UUID - multiple matches", complete: "abc", expectedMatches: []string{"abcdef", "abcghi"}, expectedDirective: cobra.ShellCompDirectiveNoFileComp},
31+
{name: "Title - one match", complete: "qwe", expectedMatches: []string{"qwe-1"}, expectedDirective: cobra.ShellCompDirectiveNoFileComp},
32+
{name: "Title - multiple matches", complete: "asd", expectedMatches: []string{"asd-1", "asd-2"}, expectedDirective: cobra.ShellCompDirectiveNoFileComp},
33+
} {
34+
t.Run(test.name, func(t *testing.T) {
35+
mService := new(smock.Service)
36+
mService.On("GetManagedDatabases", mock.Anything).Return(mockDatabases, nil)
37+
completions, directive := completion.Database{}.CompleteArgument(mService, test.complete)
38+
assert.Equal(t, test.expectedMatches, completions)
39+
assert.Equal(t, test.expectedDirective, directive)
40+
})
41+
}
42+
}
43+
44+
func TestDatabase_CompleteArgumentServiceFail(t *testing.T) {
45+
mService := new(smock.Service)
46+
mService.On("GetManagedDatabases", mock.Anything).Return(nil, fmt.Errorf("MOCKFAIL"))
47+
completions, directive := completion.Database{}.CompleteArgument(mService, "asd")
48+
assert.Nil(t, completions)
49+
assert.Equal(t, cobra.ShellCompDirectiveDefault, directive)
50+
}

internal/mock/mock.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,11 @@ func (m *Service) GetManagedDatabase(r *request.GetManagedDatabaseRequest) (*upc
575575
}
576576

577577
func (m *Service) GetManagedDatabases(r *request.GetManagedDatabasesRequest) ([]upcloud.ManagedDatabase, error) {
578-
return nil, nil
578+
args := m.Called(r)
579+
if args[0] == nil {
580+
return nil, args.Error(1)
581+
}
582+
return args[0].([]upcloud.ManagedDatabase), args.Error(1)
579583
}
580584

581585
func (m *Service) GetManagedDatabaseConnections(r *request.GetManagedDatabaseConnectionsRequest) ([]upcloud.ManagedDatabaseConnection, error) {

internal/resolver/database_test.go

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package resolver_test
2+
3+
import (
4+
"errors"
5+
"testing"
6+
7+
smock "github.com/UpCloudLtd/upcloud-cli/internal/mock"
8+
"github.com/UpCloudLtd/upcloud-cli/internal/resolver"
9+
10+
"github.com/UpCloudLtd/upcloud-go-api/v4/upcloud"
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/mock"
13+
)
14+
15+
var mockDatabases = []upcloud.ManagedDatabase{
16+
{Title: "asd", UUID: "abcdef"},
17+
{Title: "asd", UUID: "abcghi"},
18+
{Title: "qwe", UUID: "jklmno"},
19+
}
20+
21+
func TestDatabaseResolution(t *testing.T) {
22+
t.Run("UUID", func(t *testing.T) {
23+
mService := &smock.Service{}
24+
mService.On("GetManagedDatabases", mock.Anything).Return(mockDatabases, nil)
25+
res := resolver.CachingDatabase{}
26+
argResolver, err := res.Get(mService)
27+
assert.NoError(t, err)
28+
for _, db := range mockDatabases {
29+
resolved, err := argResolver(db.UUID)
30+
assert.NoError(t, err)
31+
assert.Equal(t, db.UUID, resolved)
32+
}
33+
34+
// Make sure caching works, eg. we didn't call GetManagedDatabases more than once
35+
mService.AssertNumberOfCalls(t, "GetManagedDatabases", 1)
36+
})
37+
38+
t.Run("Title", func(t *testing.T) {
39+
mService := &smock.Service{}
40+
mService.On("GetManagedDatabases", mock.Anything).Return(mockDatabases, nil)
41+
res := resolver.CachingDatabase{}
42+
argResolver, err := res.Get(mService)
43+
assert.NoError(t, err)
44+
45+
db := mockDatabases[2]
46+
resolved, err := argResolver(db.Title)
47+
assert.NoError(t, err)
48+
assert.Equal(t, db.UUID, resolved)
49+
// Make sure caching works, eg. we didn't call GetManagedDatabases more than once
50+
mService.AssertNumberOfCalls(t, "GetManagedDatabases", 1)
51+
})
52+
53+
t.Run("Failures", func(t *testing.T) {
54+
mService := &smock.Service{}
55+
mService.On("GetManagedDatabases", mock.Anything).Return(mockDatabases, nil)
56+
57+
res := resolver.CachingDatabase{}
58+
argResolver, err := res.Get(mService)
59+
assert.NoError(t, err)
60+
var resolved string
61+
62+
// Ambigous title
63+
resolved, err = argResolver("asd")
64+
if !assert.Error(t, err) {
65+
t.FailNow()
66+
}
67+
assert.ErrorIs(t, err, resolver.AmbiguousResolutionError("asd"))
68+
assert.Equal(t, "", resolved)
69+
70+
// Not found
71+
resolved, err = argResolver("not-found")
72+
if !assert.Error(t, err) {
73+
t.FailNow()
74+
}
75+
assert.ErrorIs(t, err, resolver.NotFoundError("not-found"))
76+
assert.Equal(t, "", resolved)
77+
78+
// Make sure caching works, eg. we didn't call GetManagedDatabases more than once
79+
mService.AssertNumberOfCalls(t, "GetManagedDatabases", 1)
80+
})
81+
}
82+
83+
func TestFailingDatabaseResolution(t *testing.T) {
84+
mService := &smock.Service{}
85+
mService.On("GetManagedDatabases", mock.Anything).Return(nil, errors.New("MOCKERROR"))
86+
res := resolver.CachingDatabase{}
87+
argResolver, err := res.Get(mService)
88+
assert.EqualError(t, err, "MOCKERROR")
89+
assert.Nil(t, argResolver)
90+
}

0 commit comments

Comments
 (0)