feat: add support for repo parameter in mock response body

This commit is contained in:
rick 2025-02-25 09:10:27 +08:00
parent 53acdbf8d2
commit 0122bbc6d9
No known key found for this signature in database
GPG Key ID: 260A80C757EC6783
4 changed files with 445 additions and 418 deletions

View File

@ -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,

View File

@ -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
}

View File

@ -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)
})
}

View File

@ -41,6 +41,7 @@ items:
body: |
{
"count": 1,
"repo": "{{.Param.repo}}",
"items": [{
"title": "fix: there is a bug on page {{ randEnum "one" }}",
"number": 123,