diff --git a/.forgejo/workflows/test.yml b/.forgejo/workflows/test.yml index a0eb9c7..658c579 100644 --- a/.forgejo/workflows/test.yml +++ b/.forgejo/workflows/test.yml @@ -7,17 +7,17 @@ on: jobs: test: - runs-on: docker-bookworm + runs-on: docker-global-bookworm container: - image: 'code.forgejo.org/oci/node:20-bookworm' + image: 'code.forgejo.org/oci/node:22-bookworm' steps: - uses: https://code.forgejo.org/actions/checkout@v4 - uses: https://code.forgejo.org/actions/setup-go@v5 with: go-version-file: "go.mod" - name: golangci-lint - uses: https://github.com/golangci/golangci-lint-action@v6 + uses: https://github.com/golangci/golangci-lint-action@v8 with: - version: v1.61.0 # renovate: datasource=go depName=golangci-lint packageName=github.com/golangci/golangci-lint/cmd/golangci-lint + version: v2.1.6 # renovate: datasource=go depName=golangci-lint packageName=github.com/golangci/golangci-lint/cmd/golangci-lint - name: test run: go test -v ./... diff --git a/.golangci.yaml b/.golangci.yaml new file mode 100644 index 0000000..558581f --- /dev/null +++ b/.golangci.yaml @@ -0,0 +1,41 @@ +version: "2" +linters: + default: none + enable: + - bidichk + - dupl + - errcheck + - forbidigo + - gocritic + - govet + - ineffassign + - nakedret + - nolintlint + - revive + - staticcheck + - testifylint + - unconvert + - unparam + - unused + - wastedassign + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - gofmt + - gofumpt + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ diff --git a/binding.go b/binding.go index 2083fdd..44b07f3 100644 --- a/binding.go +++ b/binding.go @@ -464,22 +464,22 @@ VALIDATE_RULES: break VALIDATE_RULES } case strings.HasPrefix(rule, "MinSize("): - min, _ := strconv.Atoi(rule[8 : len(rule)-1]) - if str, ok := fieldValue.(string); ok && utf8.RuneCountInString(str) < min { + minSize, _ := strconv.Atoi(rule[8 : len(rule)-1]) + if str, ok := fieldValue.(string); ok && utf8.RuneCountInString(str) < minSize { errors.Add([]string{field.Name}, ERR_MIN_SIZE, "MinSize") break VALIDATE_RULES } - if fieldVal.Kind() == reflect.Slice && fieldVal.Len() < min { + if fieldVal.Kind() == reflect.Slice && fieldVal.Len() < minSize { errors.Add([]string{field.Name}, ERR_MIN_SIZE, "MinSize") break VALIDATE_RULES } case strings.HasPrefix(rule, "MaxSize("): - max, _ := strconv.Atoi(rule[8 : len(rule)-1]) - if str, ok := fieldValue.(string); ok && utf8.RuneCountInString(str) > max { + maxSize, _ := strconv.Atoi(rule[8 : len(rule)-1]) + if str, ok := fieldValue.(string); ok && utf8.RuneCountInString(str) > maxSize { errors.Add([]string{field.Name}, ERR_MAX_SIZE, "MaxSize") break VALIDATE_RULES } - if fieldVal.Kind() == reflect.Slice && fieldVal.Len() > max { + if fieldVal.Kind() == reflect.Slice && fieldVal.Len() > maxSize { errors.Add([]string{field.Name}, ERR_MAX_SIZE, "MaxSize") break VALIDATE_RULES } diff --git a/errorhandler_test.go b/errorhandler_test.go index e77f3ac..58b8abd 100755 --- a/errorhandler_test.go +++ b/errorhandler_test.go @@ -138,12 +138,12 @@ func performErrorTest(t *testing.T, testCase errorTestCase) { errorHandler(testCase.errors, resp) - assert.EqualValues(t, testCase.expected.statusCode, resp.Code) - assert.EqualValues(t, testCase.expected.contentType, resp.Header().Get("Content-Type")) + assert.Equal(t, testCase.expected.statusCode, resp.Code) + assert.Equal(t, testCase.expected.contentType, resp.Header().Get("Content-Type")) actualBody, err := io.ReadAll(resp.Body) require.NoError(t, err) - assert.EqualValues(t, testCase.expected.body, string(actualBody)) + assert.Equal(t, testCase.expected.body, string(actualBody)) } type ( diff --git a/errors_test.go b/errors_test.go index 4deae44..05c7c35 100755 --- a/errors_test.go +++ b/errors_test.go @@ -35,11 +35,11 @@ func Test_ErrorsAdd(t *testing.T) { actual.Add(expected[0].FieldNames, expected[0].Classification, expected[0].Message) assert.Len(t, actual, 1) - assert.EqualValues(t, fmt.Sprintf("%#v", expected), fmt.Sprintf("%#v", actual)) + assert.Equal(t, fmt.Sprintf("%#v", expected), fmt.Sprintf("%#v", actual)) } func Test_ErrorsLen(t *testing.T) { - assert.EqualValues(t, len(errorsTestSet), errorsTestSet.Len()) + assert.Equal(t, len(errorsTestSet), errorsTestSet.Len()) } func Test_ErrorsHas(t *testing.T) { @@ -57,11 +57,11 @@ func Test_ErrorGetters(t *testing.T) { fieldsActual := err.Fields() assert.Len(t, fieldsActual, 2) - assert.EqualValues(t, "field1", fieldsActual[0]) - assert.EqualValues(t, "field2", fieldsActual[1]) + assert.Equal(t, "field1", fieldsActual[0]) + assert.Equal(t, "field2", fieldsActual[1]) - assert.EqualValues(t, "ErrorClass", err.Kind()) - assert.EqualValues(t, "The message", err.Error()) + assert.Equal(t, "ErrorClass", err.Kind()) + assert.Equal(t, "The message", err.Error()) } var errorsTestSet = Errors{ diff --git a/file_test.go b/file_test.go index 8c9cd0e..dc1512b 100755 --- a/file_test.go +++ b/file_test.go @@ -117,8 +117,8 @@ func assertFileAsExpected(t *testing.T, actual *multipart.FileHeader, expected * return } - assert.EqualValues(t, expected.fileName, actual.Filename) - assert.EqualValues(t, expected.data, unpackFileHeaderData(actual)) + assert.Equal(t, expected.fileName, actual.Filename) + assert.Equal(t, expected.data, unpackFileHeaderData(actual)) } func buildRequestWithFile(testCase fileTestCase) *http.Request { diff --git a/form_test.go b/form_test.go index 41c40d8..c3a858d 100755 --- a/form_test.go +++ b/form_test.go @@ -206,8 +206,8 @@ func performFormTest(t *testing.T, binder handlerFunc, testCase formTestCase) { } expString := fmt.Sprintf("%+v", testCase.expected) actString := fmt.Sprintf("%+v", actual) - if actString != expString && !(testCase.deepEqual && reflect.DeepEqual(testCase.expected, actual)) { - assert.EqualValues(t, expString, actString) + if actString != expString && (!testCase.deepEqual || !reflect.DeepEqual(testCase.expected, actual)) { + assert.Equal(t, expString, actString) } } @@ -217,7 +217,7 @@ func performFormTest(t *testing.T, binder handlerFunc, testCase formTestCase) { m.Post(testRoute, func(_ http.ResponseWriter, req *http.Request) { var actual Post errs := binder(req, &actual) - assert.EqualValues(t, p.Title, actual.Title) + assert.Equal(t, p.Title, actual.Title) formTestHandler(actual, errs) }) } else { @@ -238,7 +238,7 @@ func performFormTest(t *testing.T, binder handlerFunc, testCase formTestCase) { m.Post(testRoute, func(_ http.ResponseWriter, req *http.Request) { var actual BlogPost errs := binder(req, &actual) - assert.EqualValues(t, p.Title, actual.Title) + assert.Equal(t, p.Title, actual.Title) formTestHandler(actual, errs) }) } else { @@ -323,7 +323,7 @@ func Test_Default(t *testing.T) { m.Get("/", func(_ http.ResponseWriter, req *http.Request) { var f defaultForm Bind(req, &f) - assert.EqualValues(t, "hello world", f.Default) + assert.Equal(t, "hello world", f.Default) }) resp := httptest.NewRecorder() req, err := http.NewRequest("GET", "/", nil) diff --git a/go.mod b/go.mod index 51d2f2d..4539944 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,12 @@ module code.forgejo.org/go-chi/binding -go 1.23 +go 1.24 + +toolchain go1.24.3 require ( - github.com/go-chi/chi/v5 v5.1.0 - github.com/stretchr/testify v1.9.0 + github.com/go-chi/chi/v5 v5.2.1 + github.com/stretchr/testify v1.10.0 ) require ( diff --git a/go.sum b/go.sum index c4d1e3e..969f913 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,11 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= -github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8= +github.com/go-chi/chi/v5 v5.2.1/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/json_test.go b/json_test.go index 23ffbaa..0b30fa2 100755 --- a/json_test.go +++ b/json_test.go @@ -146,7 +146,7 @@ func performJSONTest(t *testing.T, binder handlerFunc, testCase jsonTestCase) { case "JSON": if testCase.shouldSucceedOnJSON { assert.Empty(t, errs, errs) - assert.EqualValues(t, fmt.Sprintf("%+v", testCase.expected), fmt.Sprintf("%+v", actual)) + assert.Equal(t, fmt.Sprintf("%+v", testCase.expected), fmt.Sprintf("%+v", actual)) } else { assert.NotEmpty(t, errs) } @@ -155,7 +155,7 @@ func performJSONTest(t *testing.T, binder handlerFunc, testCase jsonTestCase) { assert.Empty(t, errs, errs) } else { assert.NotEmpty(t, errs) - assert.EqualValues(t, fmt.Sprintf("%+v", testCase.expected), fmt.Sprintf("%+v", actual)) + assert.Equal(t, fmt.Sprintf("%+v", testCase.expected), fmt.Sprintf("%+v", actual)) } } } @@ -167,7 +167,7 @@ func performJSONTest(t *testing.T, binder handlerFunc, testCase jsonTestCase) { var actual []Post errs := binder(req, &actual) for i, a := range actual { - assert.EqualValues(t, p[i].Title, a.Title) + assert.Equal(t, p[i].Title, a.Title) jsonTestHandler(a, errs) } }) @@ -184,7 +184,7 @@ func performJSONTest(t *testing.T, binder handlerFunc, testCase jsonTestCase) { m.Post(testRoute, func(_ http.ResponseWriter, req *http.Request) { var actual Post errs := binder(req, &actual) - assert.EqualValues(t, p.Title, actual.Title) + assert.Equal(t, p.Title, actual.Title) jsonTestHandler(actual, errs) }) } else { @@ -200,7 +200,7 @@ func performJSONTest(t *testing.T, binder handlerFunc, testCase jsonTestCase) { m.Post(testRoute, func(_ http.ResponseWriter, req *http.Request) { var actual BlogPost errs := binder(req, &actual) - assert.EqualValues(t, p.Title, actual.Title) + assert.Equal(t, p.Title, actual.Title) jsonTestHandler(actual, errs) }) } else { @@ -215,7 +215,7 @@ func performJSONTest(t *testing.T, binder handlerFunc, testCase jsonTestCase) { m.Post(testRoute, func(_ http.ResponseWriter, req *http.Request) { var actual Group errs := binder(req, &actual) - assert.EqualValues(t, p.Name, actual.Name) + assert.Equal(t, p.Name, actual.Name) jsonTestHandler(actual, errs) }) } else { @@ -250,7 +250,7 @@ func performJSONTest(t *testing.T, binder handlerFunc, testCase jsonTestCase) { if testCase.shouldSucceedOnJSON && httpRecorder.Code != http.StatusOK && !testCase.shouldFailOnBind { - assert.EqualValues(t, http.StatusOK, httpRecorder.Code) + assert.Equal(t, http.StatusOK, httpRecorder.Code) } } }) diff --git a/misc_test.go b/misc_test.go index bddc210..c905197 100755 --- a/misc_test.go +++ b/misc_test.go @@ -63,7 +63,7 @@ func Test_SetWithProperType(t *testing.T) { m.Post(testRoute, func(_ http.ResponseWriter, req *http.Request) { var actual Everything errs := Form(req, &actual) - assert.EqualValues(t, fmt.Sprintf("%+v", expectedOutputs[key]), fmt.Sprintf("%+v", actual)) + assert.Equal(t, fmt.Sprintf("%+v", expectedOutputs[key]), fmt.Sprintf("%+v", actual)) if key == "errorful" { assert.Len(t, errs, 10) } else { diff --git a/multipart_test.go b/multipart_test.go index 19ca01c..f9bfb93 100755 --- a/multipart_test.go +++ b/multipart_test.go @@ -90,7 +90,7 @@ func performMultipartFormTest(t *testing.T, binder handlerFunc, testCase multipa } else if !testCase.shouldSucceed { assert.NotEmpty(t, errs) } - assert.EqualValues(t, fmt.Sprintf("%+v", testCase.inputAndExpected), fmt.Sprintf("%+v", actual)) + assert.Equal(t, fmt.Sprintf("%+v", testCase.inputAndExpected), fmt.Sprintf("%+v", actual)) }) multipartPayload, mpWriter := makeMultipartPayload(testCase) diff --git a/validate_test.go b/validate_test.go index 660bc20..453b55f 100755 --- a/validate_test.go +++ b/validate_test.go @@ -586,7 +586,7 @@ func performValidationTest(t *testing.T, testCase validationTestCase) { m.Post(testRoute, func(_ http.ResponseWriter, req *http.Request) { actual := Validate(req, testCase.data) - assert.EqualValues(t, fmt.Sprintf("%+v", testCase.expectedErrors), fmt.Sprintf("%+v", actual), testCase.description) + assert.Equal(t, fmt.Sprintf("%+v", testCase.expectedErrors), fmt.Sprintf("%+v", actual), testCase.description) }) req, err := http.NewRequest("POST", testRoute, nil)