mirror of
https://github.com/gin-gonic/gin.git
synced 2026-06-26 19:38:14 +08:00
- Move MessagePack, BSON, YAML, TOML and ProtoBuf rendering and binding out of core into github.com/gin-gonic/gin/render/<format> subpackages - Add content-type registries to binding and render that each subpackage populates from init() so ShouldBind and Negotiate keep negotiating - Slim binding.Default to core types and resolve the rest via the registry - Drop the obsolete nomsgpack build tag and binding_nomsgpack.go - Cut a minimal JSON-only binary from 13MB to 6.5MB; non-core codecs now cost binary size only when their subpackage is imported BREAKING CHANGE: c.YAML, c.TOML, c.ProtoBuf, c.BSON, c.BindYAML, c.BindTOML, c.ShouldBindYAML, c.ShouldBindTOML, c.ShouldBindBodyWithYAML and c.ShouldBindBodyWithTOML are removed, along with binding.MsgPack/BSON/YAML/ TOML/ProtoBuf, the render.MsgPack/BSON/YAML/TOML/ProtoBuf types and the nomsgpack build tag. Import the matching github.com/gin-gonic/gin/render/<format> subpackage and use its Render(c, code, obj) / ShouldBind(c, &obj) helpers (or pass <format>.Binding to c.ShouldBindWith). Importing the subpackage also re-registers the content type so c.ShouldBind and c.Negotiate work as before. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
62 lines
1.6 KiB
Go
62 lines
1.6 KiB
Go
// Copyright 2025 Gin Core Team. All rights reserved.
|
|
// Use of this source code is governed by a MIT style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package yaml
|
|
|
|
import (
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/gin-gonic/gin/binding"
|
|
"github.com/gin-gonic/gin/render"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
type payload struct {
|
|
Foo string `yaml:"foo"`
|
|
Bar string `yaml:"bar" binding:"required"`
|
|
}
|
|
|
|
func TestRender(t *testing.T) {
|
|
gin.SetMode(gin.TestMode)
|
|
w := httptest.NewRecorder()
|
|
c, _ := gin.CreateTestContext(w)
|
|
|
|
Render(c, http.StatusOK, payload{Foo: "foo", Bar: "bar"})
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
assert.Equal(t, "application/yaml; charset=utf-8", w.Header().Get("Content-Type"))
|
|
assert.Contains(t, w.Body.String(), "foo: foo")
|
|
assert.Contains(t, w.Body.String(), "bar: bar")
|
|
}
|
|
|
|
func TestBinding(t *testing.T) {
|
|
req := httptest.NewRequest(http.MethodPost, "/", strings.NewReader("foo: foo\nbar: bar\n"))
|
|
var out payload
|
|
require.NoError(t, Binding.Bind(req, &out))
|
|
assert.Equal(t, "foo", out.Foo)
|
|
assert.Equal(t, "bar", out.Bar)
|
|
assert.Equal(t, "yaml", Binding.Name())
|
|
}
|
|
|
|
func TestBindingValidation(t *testing.T) {
|
|
var out payload
|
|
err := Binding.BindBody([]byte("foo: foo\n"), &out) // Bar missing
|
|
require.Error(t, err)
|
|
}
|
|
|
|
func TestRegistration(t *testing.T) {
|
|
for _, ct := range []string{MIMEYAML, MIMEYAML2} {
|
|
assert.Equal(t, Binding, binding.Default(http.MethodPost, ct), ct)
|
|
r, ok := render.Negotiate(ct, payload{Foo: "x"})
|
|
assert.True(t, ok, ct)
|
|
assert.NotNil(t, r)
|
|
}
|
|
}
|