support importing feidee mymoney web export data

This commit is contained in:
MaysWind
2024-09-12 00:00:22 +08:00
parent 5a31118c96
commit d15a862e5b
16 changed files with 547 additions and 5 deletions
+2 -1
View File
@@ -136,7 +136,8 @@ func ParseFromLongDateTime(t string, utcOffset int16) (time.Time, error) {
}
// ParseFromLongDateTimeWithoutSecond parses a formatted string in long date time format (no second)
func ParseFromLongDateTimeWithoutSecond(t string, timezone *time.Location) (time.Time, error) {
func ParseFromLongDateTimeWithoutSecond(t string, utcOffset int16) (time.Time, error) {
timezone := time.FixedZone("Timezone", int(utcOffset)*60)
return time.ParseInLocation(longDateTimeWithoutSecondFormat, t, timezone)
}
+1 -1
View File
@@ -133,7 +133,7 @@ func TestParseFromLongDateTime(t *testing.T) {
func TestParseFromLongDateTimeWithoutSecond(t *testing.T) {
expectedValue := int64(1691947440)
actualTime, err := ParseFromLongDateTimeWithoutSecond("2023-08-13 17:24", time.UTC)
actualTime, err := ParseFromLongDateTimeWithoutSecond("2023-08-13 17:24", 0)
assert.Equal(t, nil, err)
actualValue := actualTime.Unix()
+21 -3
View File
@@ -3,9 +3,12 @@ package utils
import "regexp"
var (
usernamePattern = regexp.MustCompile("^(?i)[a-z0-9_-]+$")
emailPattern = regexp.MustCompile("^(?i)(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$")
hexRGBColorPattern = regexp.MustCompile("^(?i)([0-9a-f]{6}|[0-9a-f]{3})$")
usernamePattern = regexp.MustCompile("^(?i)[a-z0-9_-]+$")
emailPattern = regexp.MustCompile("^(?i)(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$")
hexRGBColorPattern = regexp.MustCompile("^(?i)([0-9a-f]{6}|[0-9a-f]{3})$")
longDateTimePattern = regexp.MustCompile("^([1-9][0-9]{3})-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[01]) ([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$")
longDateTimeWithoutSecondPattern = regexp.MustCompile("^([1-9][0-9]{3})-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[01]) ([0-1][0-9]|2[0-3]):([0-5][0-9])$")
longDatePattern = regexp.MustCompile("^([1-9][0-9]{3})-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[01])$")
)
// IsValidUsername reports whether username is valid
@@ -22,3 +25,18 @@ func IsValidEmail(email string) bool {
func IsValidHexRGBColor(color string) bool {
return hexRGBColorPattern.MatchString(color)
}
// IsValidLongDateTimeFormat reports whether long date time is valid format
func IsValidLongDateTimeFormat(datetime string) bool {
return longDateTimePattern.MatchString(datetime)
}
// IsValidLongDateTimeWithoutSecondFormat reports long date time without seconds is valid format
func IsValidLongDateTimeWithoutSecondFormat(datetime string) bool {
return longDateTimeWithoutSecondPattern.MatchString(datetime)
}
// IsValidLongDateFormat reports long date is valid format
func IsValidLongDateFormat(date string) bool {
return longDatePattern.MatchString(date)
}
+117
View File
@@ -112,3 +112,120 @@ func TestIsValidHexRGBColor_InvalidHexRGBColor(t *testing.T) {
actualValue = IsValidHexRGBColor(color)
assert.Equal(t, expectedValue, actualValue)
}
func TestIsValidLongDateTimeFormat_ValidLongDateTimeFormat(t *testing.T) {
datetime := "2024-09-01 12:34:56"
expectedValue := true
actualValue := IsValidLongDateTimeFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
datetime = "2024-10-01 00:00:00"
expectedValue = true
actualValue = IsValidLongDateTimeFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
datetime = "9999-12-31 23:59:59"
expectedValue = true
actualValue = IsValidLongDateTimeFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
}
func TestIsValidLongDateTimeFormat_InvalidLongDateTimeFormat(t *testing.T) {
datetime := "2024-09-01"
expectedValue := false
actualValue := IsValidLongDateTimeFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
datetime = "2024-09-01 12"
expectedValue = false
actualValue = IsValidLongDateTimeFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
datetime = "2024-09-01 12:34"
expectedValue = false
actualValue = IsValidLongDateTimeFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
}
func TestIsValidLongDateTimeWithoutSecondFormat_ValidLongDateTimeWithoutSecondFormat(t *testing.T) {
datetime := "2024-09-01 12:34"
expectedValue := true
actualValue := IsValidLongDateTimeWithoutSecondFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
datetime = "2024-10-01 00:00"
expectedValue = true
actualValue = IsValidLongDateTimeWithoutSecondFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
datetime = "9999-12-31 23:59"
expectedValue = true
actualValue = IsValidLongDateTimeWithoutSecondFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
}
func TestIsValidLongDateTimeWithoutSecondFormat_InvalidLongDateTimeWithoutSecondFormat(t *testing.T) {
datetime := "2024-09-01"
expectedValue := false
actualValue := IsValidLongDateTimeWithoutSecondFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
datetime = "2024-09-01 12"
expectedValue = false
actualValue = IsValidLongDateTimeWithoutSecondFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
datetime = "2024-09-01 12:34:56"
expectedValue = false
actualValue = IsValidLongDateTimeWithoutSecondFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
}
func TestIsValidLongDateFormat_ValidLongDateFormat(t *testing.T) {
datetime := "2024-09-01"
expectedValue := true
actualValue := IsValidLongDateFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
datetime = "9999-12-31"
expectedValue = true
actualValue = IsValidLongDateFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
}
func TestIsValidLongDateFormat_InvalidLongDateFormat(t *testing.T) {
datetime := "24-09-01"
expectedValue := false
actualValue := IsValidLongDateFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
datetime = "2024-9-1"
expectedValue = false
actualValue = IsValidLongDateFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
datetime = "2024-09-1"
expectedValue = false
actualValue = IsValidLongDateFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
datetime = "2024-9-01"
expectedValue = false
actualValue = IsValidLongDateFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
datetime = "2024-09-01 12"
expectedValue = false
actualValue = IsValidLongDateFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
datetime = "2024-09-01 12:34"
expectedValue = false
actualValue = IsValidLongDateFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
datetime = "2024-09-01 12:34:56"
expectedValue = false
actualValue = IsValidLongDateFormat(datetime)
assert.Equal(t, expectedValue, actualValue)
}