@@ -7,7 +7,9 @@ package common
77
88import (
99 "testing"
10+ "time"
1011
12+ "github.com/go-playground/validator/v10"
1113 "github.com/stretchr/testify/require"
1214)
1315
@@ -61,3 +63,141 @@ func TestValidate(t *testing.T) {
6163 })
6264 }
6365}
66+
67+ // TestValidateDuration tests the ValidateDuration function
68+ func TestValidateDuration (t * testing.T ) {
69+ validate := validator .New ()
70+ err := validate .RegisterValidation (dtoDurationTag , ValidateDuration )
71+ require .NoError (t , err )
72+
73+ tests := []struct {
74+ name string
75+ field any
76+ expectedErr bool
77+ }{
78+ {"valid - duration string without day" , "10h30m" , false },
79+ {"valid - duration string with day" , "1d" , false },
80+ {"valid - duration string with day and hour" , "1d5h" , false },
81+ {"valid - duration string with fractional days and hour" , "2.5d500ms" , false },
82+ {"valid - duration string with hour and day at last" , "30m2d" , false },
83+ {"valid - duration string with min in ms and max in h" , "30ms" , false },
84+ {"invalid - duration string with valid day and invalid minute" , "1dxxm" , true },
85+ {"invalid - duration string with invalid day and valid second" , "xxd30s" , true },
86+ }
87+
88+ for _ , tt := range tests {
89+ t .Run (tt .name , func (t * testing.T ) {
90+ err = validate .Var (tt .field , dtoDurationTag )
91+ if tt .expectedErr {
92+ require .Error (t , err )
93+ } else {
94+ require .NoError (t , err )
95+ }
96+ })
97+ }
98+ }
99+
100+ // TestValidateDuration_WithMinMax tests the ValidateDuration function with min or max defined in the edgex-dto-duration annotation tag
101+ func TestValidateDuration_WithMinMax (t * testing.T ) {
102+ validate := validator .New ()
103+ err := validate .RegisterValidation (dtoDurationTag , ValidateDuration )
104+ require .NoError (t , err )
105+
106+ tests := []struct {
107+ name string
108+ field any
109+ min string
110+ max string
111+ expectedErr bool
112+ }{
113+ {"valid - duration string exceeds min with day" , "12h30m" , "0.5d" , "" , false },
114+ {"valid - duration string exceeds min without day" , "10h30m" , "10h" , "" , false },
115+ {"valid - duration string with day exceeds min with day" , "1d" , "0.5d" , "" , false },
116+ {"valid - duration string with day and hour less than max with day" , "1d5h" , "" , "2d" , false },
117+ {"valid - duration string with fractional days and hour less than max with day" , "2.5d500ms" , "" , "3d" , false },
118+ {"invalid - duration string with day less than than min with day" , "1d5h" , "2d" , "3d" , true },
119+ {"invalid - duration string with day exceeds the max with day" , "4d6h" , "2d" , "3d" , true },
120+ {"invalid - duration string without day less than than min without day" , "5ms10us" , "6ms" , "30ms" , true },
121+ {"invalid - duration string without day exceeds the max without day" , "300ns" , "100ns" , "200ns" , true },
122+ {"invalid - duration string with invalid min" , "1d" , "xxd" , "" , true },
123+ {"invalid - duration string with invalid max" , "1d" , "" , "1dxxs" , true },
124+ }
125+
126+ for _ , tt := range tests {
127+ t .Run (tt .name , func (t * testing.T ) {
128+ tagValue := dtoDurationTag + "="
129+ if tt .min != "" {
130+ tagValue += tt .min
131+ }
132+ if tt .max != "" {
133+ tagValue += "0x2C" + tt .max
134+ }
135+ err = validate .Var (tt .field , tagValue )
136+ if tt .expectedErr {
137+ require .Error (t , err )
138+ } else {
139+ require .NoError (t , err )
140+ }
141+ })
142+ }
143+ }
144+
145+ // TestParseDurationWithDay tests the parseDurationWithDay function
146+ func TestParseDurationWithDay (t * testing.T ) {
147+ durStr1 := "10h30m"
148+ expectedDur1 , err := time .ParseDuration (durStr1 )
149+ require .NoError (t , err )
150+
151+ durStr2 := "1d"
152+ expectedDur2 , err := time .ParseDuration ("24h" )
153+ require .NoError (t , err )
154+
155+ durStr3 := "1d5h"
156+ expectedDur3 , err := time .ParseDuration ("29h" )
157+ require .NoError (t , err )
158+
159+ durStr4 := "2.5d500ms"
160+ expectedDur4 , err := time .ParseDuration ("60h500ms" )
161+ require .NoError (t , err )
162+
163+ durStr5 := "30m2d"
164+ expectedDur5 , err := time .ParseDuration ("30m48h" )
165+ require .NoError (t , err )
166+
167+ durStr6 := "30ms"
168+ expectedDur6 , err := time .ParseDuration (durStr6 )
169+ require .NoError (t , err )
170+
171+ durStr7 := "2.2d1.1d20m3h1h10m"
172+ expectedDur7 , err := time .ParseDuration ("83.2h30m" )
173+ require .NoError (t , err )
174+
175+ tests := []struct {
176+ name string
177+ durString string
178+ expectedResult bool
179+ expectedDuration time.Duration
180+ }{
181+ {"valid - duration string without day" , durStr1 , true , expectedDur1 },
182+ {"valid - duration string with day" , durStr2 , true , expectedDur2 },
183+ {"valid - duration string with day and hour" , durStr3 , true , expectedDur3 },
184+ {"valid - duration string with fractional days and hour" , durStr4 , true , expectedDur4 },
185+ {"valid - duration string with hour and day at last" , durStr5 , true , expectedDur5 },
186+ {"valid - duration string with min in ms and max in h" , durStr6 , true , expectedDur6 },
187+ {"valid - duration string with repeated day and other time units" , durStr7 , true , expectedDur7 },
188+ {"invalid - duration string with valid day and invalid minute" , "1dxxm" , false , 0 },
189+ {"invalid - duration string with invalid day and valid second" , "xxd30s" , false , 0 },
190+ {"invalid duration string" , "abc" , false , 0 },
191+ {"invalid - empty duration string" , "" , false , 0 },
192+ }
193+
194+ for _ , tt := range tests {
195+ t .Run (tt .name , func (t * testing.T ) {
196+ result , duration := parseDurationWithDay (tt .durString )
197+ require .Equal (t , tt .expectedResult , result )
198+ if tt .expectedResult {
199+ require .Equal (t , tt .expectedDuration , duration )
200+ }
201+ })
202+ }
203+ }
0 commit comments