feat: support to set the prefix of mock server (#402)

Co-authored-by: rick <linuxsuren@users.noreply.github.com>
This commit is contained in:
Rick 2024-04-28 08:30:52 +08:00 committed by GitHub
parent 72fc008ea1
commit ffac34fd9d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 20 additions and 14 deletions

View File

@ -18,13 +18,15 @@ package cmd
import ( import (
"errors" "errors"
"github.com/linuxsuren/api-testing/pkg/mock" "github.com/linuxsuren/api-testing/pkg/mock"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
type mockOption struct { type mockOption struct {
port int port int
files []string prefix string
files []string
} }
func createMockCmd() (c *cobra.Command) { func createMockCmd() (c *cobra.Command) {
@ -39,6 +41,7 @@ func createMockCmd() (c *cobra.Command) {
flags := c.Flags() flags := c.Flags()
flags.IntVarP(&opt.port, "port", "", 6060, "The mock server port") flags.IntVarP(&opt.port, "port", "", 6060, "The mock server port")
flags.StringVarP(&opt.prefix, "prefix", "", "/mock", "The mock server API prefix")
flags.StringSliceVarP(&opt.files, "files", "", nil, "The mock config files") flags.StringSliceVarP(&opt.files, "files", "", nil, "The mock config files")
return return
} }
@ -55,7 +58,7 @@ func (o *mockOption) runE(c *cobra.Command, args []string) (err error) {
server := mock.NewInMemoryServer(o.port) server := mock.NewInMemoryServer(o.port)
if err = server.Start(reader); err != nil { if err = server.Start(reader, o.prefix); err != nil {
return return
} }

View File

@ -91,6 +91,7 @@ func createServerCmd(execer fakeruntime.Execer, httpServer server.HTTPServer) (c
flags.StringVarP(&opt.clientSecret, "client-secret", "", os.Getenv("OAUTH_CLIENT_SECRET"), "ClientSecret is the application's secret") flags.StringVarP(&opt.clientSecret, "client-secret", "", os.Getenv("OAUTH_CLIENT_SECRET"), "ClientSecret is the application's secret")
flags.BoolVarP(&opt.dryRun, "dry-run", "", false, "Do not really start a gRPC server") flags.BoolVarP(&opt.dryRun, "dry-run", "", false, "Do not really start a gRPC server")
flags.StringArrayVarP(&opt.mockConfig, "mock-config", "", nil, "The mock config files") flags.StringArrayVarP(&opt.mockConfig, "mock-config", "", nil, "The mock config files")
flags.StringVarP(&opt.mockPrefix, "mock-prefix", "", "/mock", "The mock server API prefix")
// gc related flags // gc related flags
flags.IntVarP(&opt.gcPercent, "gc-percent", "", 100, "The GC percent of Go") flags.IntVarP(&opt.gcPercent, "gc-percent", "", 100, "The GC percent of Go")
@ -125,6 +126,7 @@ type serverOption struct {
oauthGroup []string oauthGroup []string
mockConfig []string mockConfig []string
mockPrefix string
gcPercent int gcPercent int
@ -297,10 +299,10 @@ func (o *serverOption) runE(cmd *cobra.Command, args []string) (err error) {
cmd.Println("currently only one mock config is supported, will take the first one") cmd.Println("currently only one mock config is supported, will take the first one")
var mockServerHandler http.Handler var mockServerHandler http.Handler
if mockServerHandler, err = mock.NewInMemoryServer(0). if mockServerHandler, err = mock.NewInMemoryServer(0).
SetupHandler(mock.NewLocalFileReader(o.mockConfig[0])); err != nil { SetupHandler(mock.NewLocalFileReader(o.mockConfig[0]), o.mockPrefix); err != nil {
return return
} }
combineHandlers.PutHandler("/mock", mockServerHandler) combineHandlers.PutHandler(o.mockPrefix, mockServerHandler)
} }
debugHandler(mux, remoteServer) debugHandler(mux, remoteServer)

View File

@ -49,7 +49,7 @@ func NewInMemoryServer(port int) DynamicServer {
} }
} }
func (s *inMemoryServer) SetupHandler(reader Reader) (handler http.Handler, err error) { func (s *inMemoryServer) SetupHandler(reader Reader, prefix string) (handler http.Handler, err error) {
var server *Server var server *Server
if server, err = reader.Parse(); err != nil { if server, err = reader.Parse(); err != nil {
return return
@ -57,7 +57,7 @@ func (s *inMemoryServer) SetupHandler(reader Reader) (handler http.Handler, err
// init the data // init the data
s.data = make(map[string][]map[string]interface{}) s.data = make(map[string][]map[string]interface{})
s.mux = mux.NewRouter().PathPrefix("/mock").Subrouter() s.mux = mux.NewRouter().PathPrefix(prefix).Subrouter()
handler = s.mux handler = s.mux
memLogger.Info("start to run all the APIs from objects") memLogger.Info("start to run all the APIs from objects")
@ -73,9 +73,9 @@ func (s *inMemoryServer) SetupHandler(reader Reader) (handler http.Handler, err
return return
} }
func (s *inMemoryServer) Start(reader Reader) (err error) { func (s *inMemoryServer) Start(reader Reader, prefix string) (err error) {
var handler http.Handler var handler http.Handler
if handler, err = s.SetupHandler(reader); err != nil { if handler, err = s.SetupHandler(reader, prefix); err != nil {
return return
} }

View File

@ -17,17 +17,18 @@ package mock
import ( import (
"bytes" "bytes"
"github.com/stretchr/testify/assert"
"io" "io"
"net/http" "net/http"
"strings" "strings"
"testing" "testing"
"github.com/stretchr/testify/assert"
) )
func TestInMemoryServer(t *testing.T) { func TestInMemoryServer(t *testing.T) {
server := NewInMemoryServer(0) server := NewInMemoryServer(0)
err := server.Start(NewLocalFileReader("data/api.yaml")) err := server.Start(NewLocalFileReader("testdata/api.yaml"), "/mock")
assert.NoError(t, err) assert.NoError(t, err)
defer func() { defer func() {
server.Stop() server.Stop()
@ -132,7 +133,7 @@ func TestInMemoryServer(t *testing.T) {
t.Run("not found config file", func(t *testing.T) { t.Run("not found config file", func(t *testing.T) {
server := NewInMemoryServer(0) server := NewInMemoryServer(0)
err := server.Start(NewLocalFileReader("fake")) err := server.Start(NewLocalFileReader("fake"), "/")
assert.Error(t, err) assert.Error(t, err)
}) })
} }

View File

@ -18,8 +18,8 @@ package mock
import "net/http" import "net/http"
type DynamicServer interface { type DynamicServer interface {
Start(reader Reader) error Start(reader Reader, prefix string) error
SetupHandler(reader Reader) (http.Handler, error) SetupHandler(reader Reader, prefix string) (http.Handler, error)
Stop() error Stop() error
GetPort() string GetPort() string
} }