From 5ee0b7a368a6dea01d8d83c56d3e5d727d7d7dfa Mon Sep 17 00:00:00 2001
From: Danis Kirasirov <dbgbbu@gmail.com>
Date: Mon, 7 Apr 2025 17:27:00 +0300
Subject: [PATCH] add tests

---
 pkg/schema/field/number_test.go | 83 +++++++++++++++++++++++++++------
 pkg/schema/field/string_test.go | 71 +++++++++++++++++++++++-----
 2 files changed, 129 insertions(+), 25 deletions(-)

diff --git a/pkg/schema/field/number_test.go b/pkg/schema/field/number_test.go
index 43da0842..ec1f3219 100644
--- a/pkg/schema/field/number_test.go
+++ b/pkg/schema/field/number_test.go
@@ -5,8 +5,11 @@ import (
 	"math"
 	"reflect"
 	"testing"
+	"time"
 
 	"git.perx.ru/perxis/perxis-go/pkg/errors"
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
 )
 
 type CustomInt int
@@ -106,26 +109,80 @@ func TestNumberField_DecodeNonStrict(t *testing.T) {
 		field   *Field
 		data    interface{}
 		want    interface{}
-		wantErr bool
+		wantErr string
 	}{
-		{"Nil data", Number(NumberFormatInt), nil, nil, false},
-		{"Correct int", Number(NumberFormatInt), int64(2), int64(2), false},
-		{"Correct float", Number(NumberFormatFloat), 2.2, 2.2, false},
-		{"String as float", Number(NumberFormatFloat), "2.2", 2.2, false},
-		{"String as int", Number(NumberFormatInt), "2", int64(2), false},
-		{"Incorrect data", Number(NumberFormatInt), "invalid", nil, true},
-		{"Incorrect data type", Number(NumberFormatInt), []byte("invalid"), nil, true},
+		{
+			name:  "Nil data",
+			field: Number(NumberFormatInt),
+			data:  nil,
+			want:  nil,
+		},
+		{
+			name:  "Correct int",
+			field: Number(NumberFormatInt),
+			data:  int64(2),
+			want:  int64(2),
+		},
+		{
+			name:  "Correct float",
+			field: Number(NumberFormatFloat),
+			data:  2.2,
+			want:  2.2,
+		},
+		{
+			name:  "String as float",
+			field: Number(NumberFormatFloat),
+			data:  "2.2",
+			want:  2.2,
+		},
+		{
+			name:  "String as int",
+			field: Number(NumberFormatInt),
+			data:  "2",
+			want:  int64(2),
+		},
+		{
+			name:    "String incorrect",
+			field:   Number(NumberFormatInt),
+			data:    "string",
+			wantErr: "error convert \"string\" to number",
+		},
+		{
+			name:    "Bool",
+			field:   Number(NumberFormatInt),
+			data:    true,
+			wantErr: "decode error: error convert \"%!s(bool=true)\" to number",
+		},
+		{
+			name:    "Time",
+			field:   Number(NumberFormatInt),
+			data:    time.Date(2023, 10, 1, 12, 0, 0, 0, time.UTC),
+			wantErr: "error convert \"2023-10-01 12:00:00 +0000 UTC\" to number",
+		},
+		{
+			name:    "Array",
+			field:   Number(NumberFormatInt),
+			data:    []interface{}{1, "2", nil},
+			wantErr: "error convert \"[%!s(int=1) 2 <nil>]\" to number",
+		},
+		{
+			name:    "Object",
+			field:   Number(NumberFormatInt),
+			data:    map[string]any{"key": "value"},
+			wantErr: "error convert \"map[key:value]\" to number",
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			got, err := Decode(context.Background(), tt.field, tt.data, NonStrictMode())
-			if (err != nil) != tt.wantErr {
-				t.Errorf("Decode() error = %v, wantErr %v", err, tt.wantErr)
+			if tt.wantErr != "" {
+				require.Error(t, err)
+				assert.ErrorContains(t, err, tt.wantErr)
 				return
 			}
-			if !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("Decode() got = %v, want %v", got, tt.want)
-			}
+
+			require.NoError(t, err)
+			assert.Equal(t, tt.want, got)
 		})
 	}
 }
diff --git a/pkg/schema/field/string_test.go b/pkg/schema/field/string_test.go
index 2a1f7be6..a47dc5ce 100644
--- a/pkg/schema/field/string_test.go
+++ b/pkg/schema/field/string_test.go
@@ -6,6 +6,10 @@ import (
 	"reflect"
 	"strconv"
 	"testing"
+	"time"
+
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
 )
 
 type customString string
@@ -42,25 +46,68 @@ func TestStringField_DecodeNonStrict(t *testing.T) {
 		field   *Field
 		data    interface{}
 		want    interface{}
-		wantErr bool
+		wantErr string
 	}{
-		{"Correct", String(), "string", "string", false},
-		{"Nil", String(), nil, nil, false},
-		{"Int", String(), 42, "42", false},
-		{"Float", String(), 3.14, "3.14", false},
-		{"Bool", String(), true, "true", false},
-		{"Array", String(), []interface{}{1, "2"}, "1 2", false},
+		{
+			name:  "Correct",
+			field: String(),
+			data:  "string",
+			want:  "string",
+		},
+		{
+			name:  "Nil",
+			field: String(),
+			data:  nil,
+			want:  nil,
+		},
+		{
+			name:  "Int",
+			field: String(),
+			data:  int64(42),
+			want:  "42",
+		},
+		{
+			name:  "Float",
+			field: String(),
+			data:  3.14,
+			want:  "3.14",
+		},
+		{
+			name:  "Bool",
+			field: String(),
+			data:  true,
+			want:  "true",
+		},
+		{
+			name:  "Time",
+			field: String(),
+			data:  time.Date(2023, 10, 1, 12, 0, 0, 0, time.UTC),
+			want:  "2023-10-01 12:00:00 +0000 UTC",
+		},
+		{
+			name:  "Array",
+			field: String(),
+			data:  []interface{}{1, "2", nil},
+			want:  "1 2 <nil>",
+		},
+		{
+			name:  "Object",
+			field: String(),
+			data:  map[string]any{"key": "value"},
+			want:  "map[key:value]",
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			got, err := Decode(context.Background(), tt.field, tt.data, NonStrictMode())
-			if (err != nil) != tt.wantErr {
-				t.Errorf("Decode() error = %v, wantErr %v", err, tt.wantErr)
+			if tt.wantErr != "" {
+				require.Error(t, err)
+				assert.ErrorContains(t, err, tt.wantErr)
 				return
 			}
-			if !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("Decode() got = %v, want %v", got, tt.want)
-			}
+
+			require.NoError(t, err)
+			assert.Equal(t, tt.want, got)
 		})
 	}
 }
-- 
GitLab