Skip to content

Commit b5c7d0f

Browse files
committed
Move mocks to testutil
1 parent 0dafadb commit b5c7d0f

File tree

4 files changed

+112
-117
lines changed

4 files changed

+112
-117
lines changed

api/api_test.go

Lines changed: 3 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,11 @@ package api_test
22

33
import (
44
"bytes"
5-
"context"
65
"encoding/json"
7-
"errors"
86
"fmt"
97
"io"
108
"net/http"
119
"net/http/httptest"
12-
"net/url"
13-
"os"
14-
"strings"
1510
"testing"
1611

1712
"github.com/stretchr/testify/require"
@@ -21,69 +16,9 @@ import (
2116
"github.com/coder/code-marketplace/api"
2217
"github.com/coder/code-marketplace/api/httpapi"
2318
"github.com/coder/code-marketplace/database"
24-
"github.com/coder/code-marketplace/storage"
19+
"github.com/coder/code-marketplace/testutil"
2520
)
2621

27-
type fakeStorage struct{}
28-
29-
func (s *fakeStorage) AddExtension(ctx context.Context, manifest *storage.VSIXManifest, vsix []byte) (string, error) {
30-
return "", errors.New("not implemented")
31-
}
32-
33-
func (s *fakeStorage) RemoveExtension(ctx context.Context, publisher, extension, version string) error {
34-
return errors.New("not implemented")
35-
}
36-
37-
func (s *fakeStorage) FileServer() http.Handler {
38-
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
39-
if r.URL.Path == "/nonexistent" {
40-
http.Error(rw, "not found", http.StatusNotFound)
41-
} else {
42-
_, _ = rw.Write([]byte("foobar"))
43-
}
44-
})
45-
}
46-
47-
func (s *fakeStorage) Manifest(ctx context.Context, publisher, extension, version string) (*storage.VSIXManifest, error) {
48-
return nil, errors.New("not implemented")
49-
}
50-
51-
func (s *fakeStorage) Versions(ctx context.Context, publisher, name string) ([]string, error) {
52-
return nil, errors.New("not implemented")
53-
}
54-
55-
func (s *fakeStorage) WalkExtensions(ctx context.Context, fn func(manifest *storage.VSIXManifest, versions []string) error) error {
56-
return errors.New("not implemented")
57-
}
58-
59-
type fakeDB struct {
60-
exts []*database.Extension
61-
}
62-
63-
func (db *fakeDB) GetExtensionAssetPath(ctx context.Context, asset *database.Asset, baseURL url.URL) (string, error) {
64-
if asset.Publisher == "error" {
65-
return "", errors.New("fake error")
66-
}
67-
if asset.Publisher == "notexist" {
68-
return "", os.ErrNotExist
69-
}
70-
assetPath := "foo"
71-
if asset.Type == storage.VSIXAssetType {
72-
assetPath = "extension.vsix"
73-
}
74-
return strings.Join([]string{baseURL.Path, "files", asset.Publisher, asset.Extension, asset.Version, assetPath}, "/"), nil
75-
}
76-
77-
func (db *fakeDB) GetExtensions(ctx context.Context, filter database.Filter, flags database.Flag, baseURL url.URL) ([]*database.Extension, int, error) {
78-
if flags&database.Unpublished != 0 {
79-
return nil, 0, errors.New("fake error")
80-
}
81-
if len(filter.Criteria) == 0 {
82-
return nil, 0, nil
83-
}
84-
return db.exts, len(db.exts), nil
85-
}
86-
8722
func TestAPI(t *testing.T) {
8823
t.Parallel()
8924

@@ -291,8 +226,8 @@ func TestAPI(t *testing.T) {
291226

292227
logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true}).Leveled(slog.LevelDebug)
293228
apiServer := api.New(&api.Options{
294-
Database: &fakeDB{exts: exts},
295-
Storage: &fakeStorage{},
229+
Database: testutil.NewMockDB(exts),
230+
Storage: testutil.NewMockStorage(),
296231
Logger: logger,
297232
})
298233

database/database_test.go

Lines changed: 2 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -2,65 +2,18 @@ package database_test
22

33
import (
44
"context"
5-
"errors"
65
"fmt"
7-
"net/http"
86
"net/url"
9-
"os"
107
"testing"
118

129
"github.com/stretchr/testify/require"
1310

1411
"cdr.dev/slog"
1512
"cdr.dev/slog/sloggers/slogtest"
1613
"github.com/coder/code-marketplace/database"
17-
"github.com/coder/code-marketplace/storage"
1814
"github.com/coder/code-marketplace/testutil"
1915
)
2016

21-
type memoryStorage struct{}
22-
23-
func (s *memoryStorage) AddExtension(ctx context.Context, manifest *storage.VSIXManifest, vsix []byte) (string, error) {
24-
return "", errors.New("not implemented")
25-
}
26-
27-
func (s *memoryStorage) RemoveExtension(ctx context.Context, publisher, extension, version string) error {
28-
return errors.New("not implemented")
29-
}
30-
31-
func (s *memoryStorage) FileServer() http.Handler {
32-
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
33-
http.Error(rw, "not implemented", http.StatusNotImplemented)
34-
})
35-
}
36-
37-
func (s *memoryStorage) Versions(ctx context.Context, publisher, name string) ([]string, error) {
38-
return nil, errors.New("not implemented")
39-
}
40-
41-
func (s *memoryStorage) Manifest(ctx context.Context, publisher, extension, version string) (*storage.VSIXManifest, error) {
42-
for _, ext := range testutil.Extensions {
43-
if ext.Publisher == publisher && ext.Name == extension {
44-
for _, ver := range ext.Versions {
45-
if ver == version {
46-
return testutil.ConvertExtensionToManifest(ext, ver), nil
47-
}
48-
}
49-
break
50-
}
51-
}
52-
return nil, os.ErrNotExist
53-
}
54-
55-
func (s *memoryStorage) WalkExtensions(ctx context.Context, fn func(manifest *storage.VSIXManifest, versions []string) error) error {
56-
for _, ext := range testutil.Extensions {
57-
if err := fn(testutil.ConvertExtensionToManifest(ext, ext.Versions[0]), ext.Versions); err != nil {
58-
return nil
59-
}
60-
}
61-
return nil
62-
}
63-
6417
func TestGetExtensionAssetPath(t *testing.T) {
6518
t.Parallel()
6619

@@ -70,7 +23,7 @@ func TestGetExtensionAssetPath(t *testing.T) {
7023

7124
logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true}).Leveled(slog.LevelDebug)
7225
db := database.NoDB{
73-
Storage: &memoryStorage{},
26+
Storage: testutil.NewMockStorage(),
7427
Logger: logger,
7528
}
7629

@@ -566,7 +519,7 @@ func TestGetExtensions(t *testing.T) {
566519
t.Run(c.Name, func(t *testing.T) {
567520
t.Parallel()
568521
db := database.NoDB{
569-
Storage: &memoryStorage{},
522+
Storage: testutil.NewMockStorage(),
570523
Logger: slogtest.Make(t, &slogtest.Options{IgnoreErrors: true}).Leveled(slog.LevelDebug),
571524
}
572525
baseURL, err := url.Parse(base)

testutil/mockdb.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package testutil
2+
3+
import (
4+
"context"
5+
"errors"
6+
"net/url"
7+
"os"
8+
"strings"
9+
10+
"github.com/coder/code-marketplace/database"
11+
"github.com/coder/code-marketplace/storage"
12+
)
13+
14+
// MockDB implements database.Database for tests.
15+
type MockDB struct {
16+
exts []*database.Extension
17+
}
18+
19+
func NewMockDB(exts []*database.Extension) *MockDB {
20+
return &MockDB{exts: exts}
21+
}
22+
23+
func (db *MockDB) GetExtensionAssetPath(ctx context.Context, asset *database.Asset, baseURL url.URL) (string, error) {
24+
if asset.Publisher == "error" {
25+
return "", errors.New("fake error")
26+
}
27+
if asset.Publisher == "notexist" {
28+
return "", os.ErrNotExist
29+
}
30+
assetPath := "foo"
31+
if asset.Type == storage.VSIXAssetType {
32+
assetPath = "extension.vsix"
33+
}
34+
return strings.Join([]string{baseURL.Path, "files", asset.Publisher, asset.Extension, asset.Version, assetPath}, "/"), nil
35+
}
36+
37+
func (db *MockDB) GetExtensions(ctx context.Context, filter database.Filter, flags database.Flag, baseURL url.URL) ([]*database.Extension, int, error) {
38+
if flags&database.Unpublished != 0 {
39+
return nil, 0, errors.New("fake error")
40+
}
41+
if len(filter.Criteria) == 0 {
42+
return nil, 0, nil
43+
}
44+
return db.exts, len(db.exts), nil
45+
}

testutil/mockstorage.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package testutil
2+
3+
import (
4+
"context"
5+
"errors"
6+
"net/http"
7+
"os"
8+
9+
"github.com/coder/code-marketplace/storage"
10+
)
11+
12+
// MockStorage implements storage.Storage for tests.
13+
type MockStorage struct{}
14+
15+
func NewMockStorage() *MockStorage {
16+
return &MockStorage{}
17+
}
18+
19+
func (s *MockStorage) AddExtension(ctx context.Context, manifest *storage.VSIXManifest, vsix []byte) (string, error) {
20+
return "", errors.New("not implemented")
21+
}
22+
23+
func (s *MockStorage) FileServer() http.Handler {
24+
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
25+
if r.URL.Path == "/nonexistent" {
26+
http.Error(rw, "not found", http.StatusNotFound)
27+
} else {
28+
_, _ = rw.Write([]byte("foobar"))
29+
}
30+
})
31+
}
32+
33+
func (s *MockStorage) Manifest(ctx context.Context, publisher, name, version string) (*storage.VSIXManifest, error) {
34+
for _, ext := range Extensions {
35+
if ext.Publisher == publisher && ext.Name == name {
36+
for _, ver := range ext.Versions {
37+
if ver == version {
38+
return ConvertExtensionToManifest(ext, ver), nil
39+
}
40+
}
41+
break
42+
}
43+
}
44+
return nil, os.ErrNotExist
45+
}
46+
47+
func (s *MockStorage) RemoveExtension(ctx context.Context, publisher, name, version string) error {
48+
return errors.New("not implemented")
49+
}
50+
51+
func (s *MockStorage) WalkExtensions(ctx context.Context, fn func(manifest *storage.VSIXManifest, versions []string) error) error {
52+
for _, ext := range Extensions {
53+
if err := fn(ConvertExtensionToManifest(ext, ext.Versions[0]), ext.Versions); err != nil {
54+
return nil
55+
}
56+
}
57+
return nil
58+
}
59+
60+
func (s *MockStorage) Versions(ctx context.Context, publisher, name string) ([]string, error) {
61+
return nil, errors.New("not implemented")
62+
}

0 commit comments

Comments
 (0)