Skip to content

Commit

Permalink
[CLOUDTRUST-2314] Date validation enhancement
Browse files Browse the repository at this point in the history
  • Loading branch information
fperot74 committed Feb 28, 2020
1 parent bb889ca commit b9f14ad
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 5 deletions.
33 changes: 28 additions & 5 deletions validation/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ type Validator interface {
ValidateParameterRegExp(prmName string, value *string, regExp string, mandatory bool) Validator
ValidateParameterPhoneNumber(prmName string, value *string, mandatory bool) Validator
ValidateParameterDate(prmName string, value *string, dateLayout string, mandatory bool) Validator
ValidateParameterDateMultipleLayout(prmName string, value *string, dateLayout []string, mandatory bool) Validator
ValidateParameterDateAfter(prmName string, value *string, dateLayout string, reference time.Time, mandatory bool) Validator
ValidateParameterDateBefore(prmName string, value *string, dateLayout string, reference time.Time, mandatory bool) Validator
ValidateParameterDateBetween(prmName string, value *string, dateLayout string, refAfter time.Time, refBetween time.Time, mandatory bool) Validator
Expand Down Expand Up @@ -87,28 +88,32 @@ func (v *successValidator) ValidateParameterPhoneNumber(prmName string, value *s
}

func (v *successValidator) ValidateParameterDate(prmName string, value *string, dateLayout string, mandatory bool) Validator {
return v.validateParameterDate(prmName, value, []string{dateLayout}, nil, nil, mandatory)
}

func (v *successValidator) ValidateParameterDateMultipleLayout(prmName string, value *string, dateLayout []string, mandatory bool) Validator {
return v.validateParameterDate(prmName, value, dateLayout, nil, nil, mandatory)
}

func (v *successValidator) ValidateParameterDateAfter(prmName string, value *string, dateLayout string, reference time.Time, mandatory bool) Validator {
return v.validateParameterDate(prmName, value, dateLayout, &reference, nil, mandatory)
return v.validateParameterDate(prmName, value, []string{dateLayout}, &reference, nil, mandatory)
}

func (v *successValidator) ValidateParameterDateBefore(prmName string, value *string, dateLayout string, reference time.Time, mandatory bool) Validator {
return v.validateParameterDate(prmName, value, dateLayout, nil, &reference, mandatory)
return v.validateParameterDate(prmName, value, []string{dateLayout}, nil, &reference, mandatory)
}

func (v *successValidator) ValidateParameterDateBetween(prmName string, value *string, dateLayout string, refAfter, refBefore time.Time, mandatory bool) Validator {
return v.validateParameterDate(prmName, value, dateLayout, &refAfter, &refBefore, mandatory)
return v.validateParameterDate(prmName, value, []string{dateLayout}, &refAfter, &refBefore, mandatory)
}

func (v *successValidator) validateParameterDate(prmName string, value *string, dateLayout string, referenceAfter, referenceBefore *time.Time, mandatory bool) Validator {
func (v *successValidator) validateParameterDate(prmName string, value *string, dateLayout []string, referenceAfter, referenceBefore *time.Time, mandatory bool) Validator {
if value == nil {
if mandatory {
return &failedValidator{err: cerrors.CreateMissingParameterError(prmName)}
}
} else {
var date, err = time.Parse(dateLayout, *value)
var date, err = v.parseDate(dateLayout, *value)
if err != nil {
return &failedValidator{err: cerrors.CreateBadRequestError(cerrors.MsgErrInvalidParam + "." + prmName)}
}
Expand All @@ -122,6 +127,20 @@ func (v *successValidator) validateParameterDate(prmName string, value *string,
return v
}

func (v *successValidator) parseDate(dateLayouts []string, value string) (time.Time, error) {
var resError error
for _, layout := range dateLayouts {
var date, err = time.Parse(layout, value)
if err == nil {
return date, err
}
if resError == nil {
resError = err
}
}
return time.Time{}, resError
}

func (v *successValidator) Status() error {
return nil
}
Expand All @@ -146,6 +165,10 @@ func (v *failedValidator) ValidateParameterDate(_ string, _ *string, _ string, _
return v
}

func (v *failedValidator) ValidateParameterDateMultipleLayout(prmName string, value *string, dateLayout []string, mandatory bool) Validator {
return v
}

func (v *failedValidator) ValidateParameterDateAfter(_ string, _ *string, _ string, _ time.Time, _ bool) Validator {
return v
}
Expand Down
9 changes: 9 additions & 0 deletions validation/validator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,9 @@ func TestValidateParameterPhoneNumber(t *testing.T) {

func TestValidateParameterDate(t *testing.T) {
var dateLayout = "02.01.2006"
var multipleLayouts = []string{dateLayout, "2006/01/02"}
var invalidDate = "57.13.2017"
var alternateFormatDate = "2020/04/12"
var summer = "21.06.2020"
var easter, _ = time.Parse(dateLayout, "12.04.2020")
var halloween, _ = time.Parse(dateLayout, "31.10.2020")
Expand All @@ -148,6 +150,10 @@ func TestValidateParameterDate(t *testing.T) {
t.Run("Invalid date", func(t *testing.T) {
assert.NotNil(t, NewParameterValidator().ValidateParameterDate("param", &invalidDate, dateLayout, true).Status())
})
t.Run("Multiple layouts", func(t *testing.T) {
assert.NotNil(t, NewParameterValidator().ValidateParameterDate("param", &alternateFormatDate, dateLayout, true).Status())
assert.Nil(t, NewParameterValidator().ValidateParameterDateMultipleLayout("param", &alternateFormatDate, multipleLayouts, true).Status())
})
t.Run("After", func(t *testing.T) {
assert.Nil(t, NewParameterValidator().ValidateParameterDateAfter("param", &summer, dateLayout, easter, true).Status())
})
Expand All @@ -169,6 +175,9 @@ func TestValidateParameterDate(t *testing.T) {
t.Run("Valid check after failed validation-Date", func(t *testing.T) {
assert.NotNil(t, failingValidator().ValidateParameterDate("param", nil, dateLayout, false).Status())
})
t.Run("Valid check after failed validation-DateMultipleLayout", func(t *testing.T) {
assert.NotNil(t, failingValidator().ValidateParameterDateMultipleLayout("param", nil, multipleLayouts, false).Status())
})
t.Run("Valid check after failed validation-After", func(t *testing.T) {
assert.NotNil(t, failingValidator().ValidateParameterDateAfter("param", nil, dateLayout, easter, false).Status())
})
Expand Down

0 comments on commit b9f14ad

Please sign in to comment.