feat: add support for repo parameter in mock response body
This commit is contained in:
parent
53acdbf8d2
commit
0122bbc6d9
|
@ -84,6 +84,7 @@ items:
|
|||
body: |
|
||||
{
|
||||
"count": 1,
|
||||
"repo": "{{.Param.repo}}",
|
||||
"items": [{
|
||||
"title": "fix: there is a bug on page {{ randEnum "one", "two" }}",
|
||||
"number": 123,
|
||||
|
|
|
@ -101,7 +101,7 @@ func (s *inMemoryServer) Load() (err error) {
|
|||
memLogger.Info("start webhook servers", "count", len(server.Webhooks))
|
||||
for _, item := range server.Webhooks {
|
||||
if err = s.startWebhook(&item); err != nil {
|
||||
return
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -110,11 +110,12 @@ func (s *inMemoryServer) Load() (err error) {
|
|||
for _, proxy := range server.Proxies {
|
||||
memLogger.Info("start to proxy", "target", proxy.Target)
|
||||
s.mux.HandleFunc(proxy.Path, func(w http.ResponseWriter, req *http.Request) {
|
||||
api := fmt.Sprintf("%s/%s", proxy.Target, strings.TrimPrefix(req.URL.Path, s.prefix))
|
||||
api, err = render.Render("proxy api", api, s)
|
||||
apiRaw := fmt.Sprintf("%s/%s", proxy.Target, strings.TrimPrefix(req.URL.Path, s.prefix))
|
||||
var api string
|
||||
api, err = render.Render("proxy api", apiRaw, s)
|
||||
if err != nil {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
memLogger.Error(err, "failed to render proxy api")
|
||||
memLogger.Error(err, "failed to render proxy api", "api", apiRaw)
|
||||
return
|
||||
}
|
||||
memLogger.Info("redirect to", "target", api)
|
||||
|
@ -297,16 +298,24 @@ func (s *inMemoryServer) startItem(item Item) {
|
|||
headerSlices = append(headerSlices, k, v)
|
||||
}
|
||||
|
||||
adHandler := &advanceHandler{item: &item, metrics: s.metrics}
|
||||
adHandler := &advanceHandler{
|
||||
item: &item,
|
||||
metrics: s.metrics,
|
||||
mu: sync.Mutex{},
|
||||
}
|
||||
s.mux.HandleFunc(item.Request.Path, adHandler.handle).Methods(strings.Split(method, ",")...).Headers(headerSlices...)
|
||||
}
|
||||
|
||||
type advanceHandler struct {
|
||||
item *Item
|
||||
metrics RequestMetrics
|
||||
mu sync.Mutex
|
||||
}
|
||||
|
||||
func (h *advanceHandler) handle(w http.ResponseWriter, req *http.Request) {
|
||||
h.mu.Lock()
|
||||
defer h.mu.Unlock()
|
||||
|
||||
h.metrics.RecordRequest(req.URL.Path)
|
||||
memLogger.Info("receiving mock request", "name", h.item.Name, "method", req.Method, "path", req.URL.Path,
|
||||
"encoder", h.item.Response.Encoder)
|
||||
|
@ -329,7 +338,6 @@ func (h *advanceHandler) handle(w http.ResponseWriter, req *http.Request) {
|
|||
|
||||
w.Header().Set(k, hv)
|
||||
}
|
||||
w.WriteHeader(util.ZeroThenDefault(h.item.Response.StatusCode, http.StatusOK))
|
||||
|
||||
var err error
|
||||
if h.item.Response.Encoder == "base64" {
|
||||
|
@ -347,6 +355,7 @@ func (h *advanceHandler) handle(w http.ResponseWriter, req *http.Request) {
|
|||
|
||||
if err == nil {
|
||||
h.item.Response.Header[util.ContentLength] = fmt.Sprintf("%d", len(h.item.Response.BodyData))
|
||||
w.Header().Set(util.ContentLength, h.item.Response.Header[util.ContentLength])
|
||||
}
|
||||
|
||||
writeResponse(w, h.item.Response.BodyData, err)
|
||||
|
@ -429,7 +438,7 @@ func runWebhook(ctx context.Context, objCtx interface{}, wh *Webhook) (err error
|
|||
var api string
|
||||
api, err = render.Render("webhook request api", wh.Request.Path, objCtx)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("error when render api: %w", err)
|
||||
err = fmt.Errorf("error when render api: %w, template: %s", err, wh.Request.Path)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@ package mock
|
|||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
@ -142,7 +143,7 @@ func TestInMemoryServer(t *testing.T) {
|
|||
assert.NoError(t, err)
|
||||
|
||||
assert.Equal(t, http.StatusOK, resp.StatusCode)
|
||||
assert.Equal(t, "176", resp.Header.Get(util.ContentLength))
|
||||
assert.Equal(t, "194", resp.Header.Get(util.ContentLength))
|
||||
assert.Equal(t, "mock", resp.Header.Get("Server"))
|
||||
assert.NotEmpty(t, resp.Header.Get(headerMockServer))
|
||||
|
||||
|
@ -223,4 +224,19 @@ func TestInMemoryServer(t *testing.T) {
|
|||
assert.NoError(t, err)
|
||||
assert.Equal(t, http.StatusOK, resp.StatusCode)
|
||||
})
|
||||
|
||||
t.Run("go template support in response body", func(t *testing.T) {
|
||||
repoName := "myRepo"
|
||||
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/v1/repos/%s/prs", api, repoName), nil)
|
||||
assert.NoError(t, err)
|
||||
|
||||
var resp *http.Response
|
||||
req.Header.Set("name", "rick")
|
||||
resp, err = http.DefaultClient.Do(req)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, http.StatusOK, resp.StatusCode)
|
||||
|
||||
data, _ := io.ReadAll(resp.Body)
|
||||
assert.Contains(t, string(data), repoName)
|
||||
})
|
||||
}
|
||||
|
|
|
@ -41,6 +41,7 @@ items:
|
|||
body: |
|
||||
{
|
||||
"count": 1,
|
||||
"repo": "{{.Param.repo}}",
|
||||
"items": [{
|
||||
"title": "fix: there is a bug on page {{ randEnum "one" }}",
|
||||
"number": 123,
|
||||
|
|
Loading…
Reference in New Issue