Skip to content

Commit 30d03eb

Browse files
authored
feat: support filter stores by kinds (#811)
* feat: support filter stores by kinds * fix unit test failures * add more unit tests * fix unit tests --------- Co-authored-by: rick <[email protected]>
1 parent b47ffd1 commit 30d03eb

File tree

16 files changed

+287
-159
lines changed

16 files changed

+287
-159
lines changed

console/atest-ui/src/components/TestSuiteCreationDialog.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ function loadStores() {
2525
'X-Auth': API.getToken()
2626
}
2727
}
28-
fetch('/api/v1/stores', requestOptions)
28+
fetch('/api/v1/stores?kind=store', requestOptions)
2929
.then(API.DefaultResponseProcess)
3030
.then(async (d) => {
3131
stores.value = d.data

console/atest-ui/src/components/TestSuiteImportDialog.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ function loadStores() {
5353
'X-Auth': API.getToken()
5454
}
5555
}
56-
fetch('/api/v1/stores', requestOptions)
56+
fetch('/api/v1/stores?kind=store', requestOptions)
5757
.then(API.DefaultResponseProcess)
5858
.then(async (d) => {
5959
stores.value = d.data

console/atest-ui/src/views/TestingPanel.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ function loadStores(lastSuitName?: string, lastCaseName?: string) {
166166
'X-Auth': API.getToken()
167167
}
168168
}
169-
fetch('/api/v1/stores', requestOptions)
169+
fetch('/api/v1/stores?kind=store', requestOptions)
170170
.then(API.DefaultResponseProcess)
171171
.then(async (d) => {
172172
stores.value = d.data

pkg/server/convert.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ func ToGRPCStore(store testing.Store) (result *Store) {
2929
Name: store.Name,
3030
Owner: store.Owner,
3131
Kind: &StoreKind{
32-
Name: store.Kind.Name,
33-
Url: store.Kind.URL,
34-
Enabled: store.Kind.Enabled,
32+
Name: store.Kind.Name,
33+
Url: store.Kind.URL,
34+
Enabled: store.Kind.Enabled,
35+
Categories: store.Kind.Categories,
36+
Link: store.Kind.Link,
3537
},
3638
Description: store.Description,
3739
Url: store.URL,
@@ -57,8 +59,10 @@ func ToNormalStore(store *Store) (result testing.Store) {
5759
}
5860
if store.Kind != nil {
5961
result.Kind = testing.StoreKind{
60-
Name: store.Kind.Name,
61-
URL: store.Kind.Url,
62+
Name: store.Kind.Name,
63+
URL: store.Kind.Url,
64+
Link: store.Kind.Link,
65+
Categories: store.Kind.Categories,
6266
}
6367
}
6468
return

pkg/server/remote_server.go

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ func NewRemoteServer(loader testing.Writer, storeWriterFactory testing.StoreWrit
122122
if secretServer == nil {
123123
secretServer = &fakeSecretServer{}
124124
}
125+
loader.WithUserConfigDir(configDir)
125126
GrpcMaxRecvMsgSize = grpcMaxRecvMsgSize
126127
return &server{
127128
loader: loader,
@@ -193,7 +194,7 @@ func resetEnv(oldEnv map[string]string) {
193194
}
194195
}
195196

196-
func (s *server) getLoaders(ctx context.Context) (loader []testing.Writer, err error) {
197+
func (s *server) getLoaders() (loader []testing.Writer, err error) {
197198
var stores []testing.Store
198199
if stores, err = testing.NewStoreFactory(s.configDir).GetStores(); err != nil {
199200
return
@@ -1169,17 +1170,28 @@ func (s *server) GetStoreKinds(context.Context, *Empty) (kinds *StoreKinds, err
11691170
kinds = &StoreKinds{}
11701171
for _, store := range stores {
11711172
kinds.Data = append(kinds.Data, &StoreKind{
1172-
Name: store.Name,
1173-
Enabled: true,
1174-
Url: store.URL,
1175-
Link: store.Link,
1176-
Params: convertStoreKindParams(store.Params),
1173+
Name: store.Name,
1174+
Enabled: true,
1175+
Url: store.URL,
1176+
Link: store.Link,
1177+
Params: convertStoreKindParams(store.Params),
1178+
Categories: store.Categories,
1179+
Dependencies: convertStoreKindDependencies(store.Dependencies),
11771180
})
11781181
}
11791182
}
11801183
return
11811184
}
11821185

1186+
func convertStoreKindDependencies(dependencies []testing.StoreKindDependency) (result []*StoreKindDependency) {
1187+
for _, dependency := range dependencies {
1188+
result = append(result, &StoreKindDependency{
1189+
Name: dependency.Name,
1190+
})
1191+
}
1192+
return
1193+
}
1194+
11831195
func convertStoreKindParams(params []testing.StoreKindParam) (result []*StoreKindParam) {
11841196
for _, param := range params {
11851197
result = append(result, &StoreKindParam{
@@ -1192,21 +1204,44 @@ func convertStoreKindParams(params []testing.StoreKindParam) (result []*StoreKin
11921204
return
11931205
}
11941206

1195-
func (s *server) GetStores(ctx context.Context, in *Empty) (reply *Stores, err error) {
1207+
func (s *server) GetStores(ctx context.Context, in *SimpleQuery) (reply *Stores, err error) {
11961208
user := oauth.GetUserFromContext(ctx)
11971209
storeFactory := testing.NewStoreFactory(s.configDir)
11981210
var stores []testing.Store
11991211
var owner string
12001212
if user != nil {
12011213
owner = user.Name
12021214
}
1215+
1216+
var kinds *StoreKinds
1217+
if kinds, err = s.GetStoreKinds(ctx, &Empty{}); err != nil {
1218+
return
1219+
}
1220+
12031221
if stores, err = storeFactory.GetStoresByOwner(owner); err == nil {
12041222
reply = &Stores{
12051223
Data: make([]*Store, 0),
12061224
}
12071225
wg := sync.WaitGroup{}
12081226
mu := sync.Mutex{}
12091227
for _, item := range stores {
1228+
skip := false
1229+
for _, kind := range kinds.Data {
1230+
if in != nil && in.Kind != "" && !slices.Contains(kind.Categories, in.Kind) {
1231+
skip = true
1232+
break
1233+
}
1234+
1235+
if item.Kind.Name == kind.Name {
1236+
item.Kind.Categories = kind.Categories
1237+
item.Kind.Link = kind.Link
1238+
break
1239+
}
1240+
}
1241+
if skip {
1242+
continue
1243+
}
1244+
12101245
wg.Add(1)
12111246
go func() {
12121247
defer wg.Done()
@@ -1231,8 +1266,10 @@ func (s *server) GetStores(ctx context.Context, in *Empty) (reply *Stores, err e
12311266
return strings.Compare(a.Name, b.Name)
12321267
})
12331268
reply.Data = append(reply.Data, &Store{
1234-
Name: "local",
1235-
Kind: &StoreKind{},
1269+
Name: "local",
1270+
Kind: &StoreKind{
1271+
Categories: []string{"store"},
1272+
},
12361273
Ready: true,
12371274
})
12381275
}
@@ -1413,7 +1450,7 @@ func (s *server) GetMenus(ctx context.Context, _ *Empty) (result *MenuList, err
14131450

14141451
result = &MenuList{}
14151452
var loaders []testing.Writer
1416-
if loaders, err = s.getLoaders(ctx); err != nil {
1453+
if loaders, err = s.getLoaders(); err != nil {
14171454
return
14181455
}
14191456

pkg/server/remote_server_test.go

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2024 API Testing Authors.
2+
Copyright 2024-2025 API Testing Authors.
33
44
Licensed under the Apache License, Version 2.0 (the "License");
55
you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@ import (
2121
"io"
2222
"net/http"
2323
"os"
24+
"path/filepath"
2425
"reflect"
2526
"sync"
2627
"sync/atomic"
@@ -871,7 +872,7 @@ func TestStoreManager(t *testing.T) {
871872
server, clean := getRemoteServerInTempDir()
872873
defer clean()
873874

874-
reply, err := server.GetStores(ctx, &Empty{})
875+
reply, err := server.GetStores(ctx, &SimpleQuery{})
875876
assert.NoError(t, err)
876877
if assert.Equal(t, 1, len(reply.Data)) {
877878
assert.Equal(t, "local", reply.Data[0].Name)
@@ -888,7 +889,7 @@ func TestStoreManager(t *testing.T) {
888889
assert.NotNil(t, reply)
889890

890891
var stores *Stores
891-
stores, err = server.GetStores(ctx, &Empty{})
892+
stores, err = server.GetStores(ctx, &SimpleQuery{})
892893
assert.NoError(t, err)
893894
assert.Equal(t, 2, len(stores.Data))
894895
})
@@ -950,10 +951,21 @@ func TestRemoteRunnerAdapter(t *testing.T) {
950951
assert.Error(t, err)
951952
}
952953

954+
//go:embed testdata/extension.yaml
955+
var extensionConfig []byte
956+
953957
func getRemoteServerInTempDir() (server RunnerServer, call func()) {
954958
dir, _ := os.MkdirTemp(os.TempDir(), "remote-server-test")
955959
call = func() { os.RemoveAll(dir) }
956960

961+
corePath := filepath.Join(dir, "data", "core")
962+
os.MkdirAll(corePath, 0755)
963+
os.WriteFile(filepath.Join(corePath, "extension.yaml"), extensionConfig, 0755)
964+
965+
themePath := filepath.Join(dir, "data", "theme")
966+
os.MkdirAll(themePath, 0755)
967+
os.WriteFile(filepath.Join(themePath, "simple.json"), []byte(simplePostman), 0755)
968+
957969
writer := atest.NewFileWriter(dir)
958970
server = NewRemoteServer(writer, newLocalloaderFromStore(), nil, nil, dir, 1024*1024*4)
959971
return
@@ -1039,3 +1051,32 @@ func (s *fakeServerStream) RecvMsg(m interface{}) error {
10391051

10401052
return nil
10411053
}
1054+
1055+
func TestGetStoreKinds(t *testing.T) {
1056+
server, clean := getRemoteServerInTempDir()
1057+
defer clean()
1058+
1059+
reply, err := server.GetStoreKinds(context.Background(), &Empty{})
1060+
assert.NoError(t, err)
1061+
1062+
assert.Equal(t, 1, len(reply.Data))
1063+
}
1064+
1065+
func TestGetThemes(t *testing.T) {
1066+
server, clean := getRemoteServerInTempDir()
1067+
defer clean()
1068+
1069+
themeServer, ok := server.(ThemeExtensionServer)
1070+
assert.True(t, ok)
1071+
1072+
reply, err := themeServer.GetThemes(context.Background(), &Empty{})
1073+
assert.NoError(t, err)
1074+
assert.Equal(t, 1, len(reply.Data))
1075+
1076+
var theme *CommonResult
1077+
theme, err = themeServer.GetTheme(context.Background(), &SimpleName{
1078+
Name: "simple",
1079+
})
1080+
assert.NoError(t, err)
1081+
assert.NotNil(t, theme)
1082+
}

0 commit comments

Comments
 (0)