153 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package core
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"reflect"
 | 
						|
	"testing"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/stretchr/testify/assert"
 | 
						|
)
 | 
						|
 | 
						|
type DefaultStructure struct {
 | 
						|
	EmptyField string `json:"empty_field" default:"empty_string"`
 | 
						|
	Field      string `json:"field" default:"string"`
 | 
						|
}
 | 
						|
 | 
						|
type DefaultRequest struct {
 | 
						|
	Field                  int                `json:"field" default:"100"`
 | 
						|
	EmptyField             int                `json:"empty_field" default:"14"`
 | 
						|
	Structure              DefaultStructure   `json:"structure"`
 | 
						|
	Slice                  []DefaultStructure `json:"slice"`
 | 
						|
	OptionalStructure      *DefaultStructure  `json:"optional_structure"`
 | 
						|
	EmptyOptionalStructure *DefaultStructure  `json:"empty_optional_structure"`
 | 
						|
}
 | 
						|
 | 
						|
func TestDefaultValues(t *testing.T) {
 | 
						|
	req := &DefaultRequest{
 | 
						|
		Field: 50,
 | 
						|
		Structure: DefaultStructure{
 | 
						|
			Field: "something",
 | 
						|
		},
 | 
						|
		Slice: []DefaultStructure{
 | 
						|
			{
 | 
						|
				Field: "something",
 | 
						|
			},
 | 
						|
			{
 | 
						|
				Field: "something",
 | 
						|
			},
 | 
						|
		},
 | 
						|
		OptionalStructure: &DefaultStructure{
 | 
						|
			Field: "something",
 | 
						|
		},
 | 
						|
	}
 | 
						|
	err := getDefaultValues(reflect.ValueOf(req))
 | 
						|
	assert.Nil(t, err)
 | 
						|
 | 
						|
	assert.Equal(t, 50, req.Field)
 | 
						|
	assert.Equal(t, 14, req.EmptyField)
 | 
						|
	assert.Equal(t, "something", req.Structure.Field)
 | 
						|
	assert.Equal(t, "empty_string", req.Structure.EmptyField)
 | 
						|
	assert.Equal(t, "something", req.Slice[0].Field)
 | 
						|
	assert.Equal(t, "something", req.Slice[1].Field)
 | 
						|
	assert.Equal(t, "empty_string", req.Slice[1].EmptyField)
 | 
						|
	assert.Equal(t, "empty_string", req.Slice[1].EmptyField)
 | 
						|
	assert.Equal(t, "something", req.OptionalStructure.Field)
 | 
						|
	assert.Equal(t, "empty_string", req.OptionalStructure.EmptyField)
 | 
						|
	assert.Equal(t, (*DefaultStructure)(nil), req.EmptyOptionalStructure)
 | 
						|
}
 | 
						|
 | 
						|
func TestTimeFormat(t *testing.T) {
 | 
						|
	t.Run("Time Format Marshalling", func(t *testing.T) {
 | 
						|
		tests := []struct {
 | 
						|
			ft           *TimeFormat
 | 
						|
			layout       string
 | 
						|
			expectedJSON string
 | 
						|
			diff         time.Duration
 | 
						|
		}{
 | 
						|
			{
 | 
						|
				ft:           NewTimeFormat(time.Date(2024, 4, 30, 15, 42, 12, 55, time.FixedZone("Test Zone", 0)), ShortDateLayout),
 | 
						|
				layout:       ShortDateLayout,
 | 
						|
				expectedJSON: `"2024-04-30"`,
 | 
						|
				diff:         time.Hour * 24,
 | 
						|
			},
 | 
						|
			{
 | 
						|
				ft:           NewTimeFormat(time.Date(2024, 4, 30, 0, 0, 0, 0, time.FixedZone("Test Zone", 0)), ShortDateLayout),
 | 
						|
				layout:       ShortDateLayout,
 | 
						|
				expectedJSON: `"2024-04-30"`,
 | 
						|
				diff:         time.Hour * 24,
 | 
						|
			},
 | 
						|
			{
 | 
						|
				ft:           NewTimeFormat(time.Time{}, ShortDateLayout),
 | 
						|
				layout:       ShortDateLayout,
 | 
						|
				expectedJSON: `"0001-01-01"`,
 | 
						|
				diff:         time.Hour * 24,
 | 
						|
			},
 | 
						|
			{
 | 
						|
				ft:           nil,
 | 
						|
				layout:       ShortDateLayout,
 | 
						|
				expectedJSON: `null`,
 | 
						|
				diff:         time.Hour * 24,
 | 
						|
			},
 | 
						|
		}
 | 
						|
 | 
						|
		for _, tc := range tests {
 | 
						|
			marshaled, err := json.Marshal(tc.ft)
 | 
						|
			assert.Equal(t, nil, err)
 | 
						|
			assert.Equal(t, tc.expectedJSON, string(marshaled))
 | 
						|
 | 
						|
			unmarshaled := newTimeLayout(tc.layout)
 | 
						|
			err = json.Unmarshal(marshaled, unmarshaled)
 | 
						|
			assert.Equal(t, nil, err)
 | 
						|
 | 
						|
			if tc.ft != nil {
 | 
						|
				diffedTime := tc.ft.Add(-tc.diff)
 | 
						|
				assert.Equal(t, true, diffedTime.Before(unmarshaled.Time) || diffedTime.Equal(unmarshaled.Time))
 | 
						|
				assert.Equal(t, true, tc.ft.After(unmarshaled.Time) || tc.ft.Equal(unmarshaled.Time))
 | 
						|
			}
 | 
						|
		}
 | 
						|
	})
 | 
						|
 | 
						|
	t.Run("Time Format in structure Marshalling", func(t *testing.T) {
 | 
						|
		type test struct {
 | 
						|
			Date *TimeFormat `json:"date"`
 | 
						|
		}
 | 
						|
 | 
						|
		tests := []struct {
 | 
						|
			structure    *test
 | 
						|
			layout       string
 | 
						|
			expectedJSON string
 | 
						|
			diff         time.Duration
 | 
						|
		}{
 | 
						|
			{
 | 
						|
				structure:    &test{Date: NewTimeFormat(time.Date(2024, 4, 30, 5, 4, 7, 20, time.FixedZone("Test Zone", 0)), ShortDateLayout)},
 | 
						|
				layout:       ShortDateLayout,
 | 
						|
				expectedJSON: `{"date":"2024-04-30"}`,
 | 
						|
				diff:         time.Hour * 24,
 | 
						|
			},
 | 
						|
			{
 | 
						|
				structure:    &test{Date: nil},
 | 
						|
				layout:       ShortDateLayout,
 | 
						|
				expectedJSON: `{"date":null}`,
 | 
						|
				diff:         time.Hour * 24,
 | 
						|
			},
 | 
						|
		}
 | 
						|
 | 
						|
		for _, tc := range tests {
 | 
						|
			marshaled, err := json.Marshal(tc.structure)
 | 
						|
			assert.Equal(t, nil, err)
 | 
						|
			assert.Equal(t, tc.expectedJSON, string(marshaled))
 | 
						|
 | 
						|
			unmarshaled := &test{Date: newTimeLayout(tc.layout)}
 | 
						|
			err = json.Unmarshal(marshaled, unmarshaled)
 | 
						|
			assert.Equal(t, nil, err)
 | 
						|
 | 
						|
			if tc.structure != nil && tc.structure.Date != nil {
 | 
						|
				diffedTime := tc.structure.Date.Add(-tc.diff)
 | 
						|
				assert.Equal(t, true, diffedTime.Before(unmarshaled.Date.Time) || diffedTime.Equal(unmarshaled.Date.Time))
 | 
						|
				assert.Equal(t, true, tc.structure.Date.After(unmarshaled.Date.Time) || tc.structure.Date.Equal(unmarshaled.Date.Time))
 | 
						|
			}
 | 
						|
		}
 | 
						|
	})
 | 
						|
}
 |