From 9f0ad2354a401c8b4eeafd689ff4e4a160120291 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Thu, 21 Aug 2025 10:52:44 +0800 Subject: [PATCH] feat: update some test fucntions --- cryptor/rsa_private_example.pem | 98 ++++++++++++++--------------- cryptor/rsa_public_example.pem | 24 +++---- validator/validator.go | 69 +++++++++++++------- validator/validator_example_test.go | 2 +- validator/validator_test.go | 66 ++++++++++++++++--- 5 files changed, 164 insertions(+), 95 deletions(-) diff --git a/cryptor/rsa_private_example.pem b/cryptor/rsa_private_example.pem index 4d00a55..1b8ec2a 100644 --- a/cryptor/rsa_private_example.pem +++ b/cryptor/rsa_private_example.pem @@ -1,51 +1,51 @@ -----BEGIN rsa private key----- -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 -----END rsa private key----- diff --git a/cryptor/rsa_public_example.pem b/cryptor/rsa_public_example.pem index ce29999..8032dac 100644 --- a/cryptor/rsa_public_example.pem +++ b/cryptor/rsa_public_example.pem @@ -1,14 +1,14 @@ -----BEGIN rsa public key----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA8O2hLVt/7v6rQF2eGX3J -+QyteV45lI/5qlyqTe7CiwUg1bkJ2yLHaoGSWoVtthE/X7GZgsw57VEgnazZAehe -XcxV8OJWBGuRfmXabtKIzSBF8uZj+H3iPDvJB7NggMh8teYsdBSn9Cm/L5FesDvg -/KxUKKfBU4LSrhOMhBauIoOSVU659y3kYgpzC/ormvCsJSe3KSdIhtLxiv+dnEHh -9WvsXWB50lIw3TIC041aL5mwRvb5/JWcjtn5bgLEChrnEGF0RYUDMwm8hT1YsEN9 -Rb9fOx5ZTUZNRVHYjaCyUA+cG+gC72EjrkXY4If3pAESNcF+5NGGJaETd8rHzHsR -FRVPXkwhRmkx9nBF+RjQhouqBTptIcIO2rPlTC9H5Oeg+jVljlBJ7/ESeOlg2OEb -YyOUJpAPMPcz5HiNSTRHuDWIDUuk48BOF9Vo00PJq/oXRzUa9HHhu6cosfZH4P4P -kDthxq89migqUL+C8WqeZ8I+xFS8/1TpvjOnOYF5ADvByC69UGPEoh+o+ZpgWfAs -Crb9Qwy9WAAZg0rsouoPqb4Qk6Vr88X6I20Ys9AayLzZ72ddoS5IweOoF5/xLfii -cGLKckNwG6sy4f1LCFB2Xc79nYqJzlwPGC3pKfEIAXUj1I/p+/MqaTDJQs72dhr0 -lTX5505XUBqrbX0BPGcZvIsCAwEAAQ== +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAt8K0R1gvIA4MAX0lpFtV +hcZQaGd5/4I2W+LESIO/7o1PWh2LodghN4OFF0Wfg+/TBZXXAfzCH5MlLtu7w89f +ee/vLMUpRqTxIR26pybgKKi3RUEQb69PMuq8fFEpNwYc5n+rFNg531Jn/qylDnMS +pfTn2qHNrLUnMOMR+hnAh3yBJpAx61V/8BlFuCUx/99r3uZY0xKA7Hr7OlEvCsvg +uAzHhPPnhTf37zsiebpoWluTadq9XO2XfBKcIb/MXzOhb+fR9mqJ3ajy8xGhtI3H +QK1wfjF1c/uzyatjDHfzpCTF00v6k3pEH646sHJjgzCs+ZT4wXZU2YiIyrFpr64R +vpBaERXBjBe2jlEC9fKnFCYfkBSW3oYHi1Mh5C7DW/ttzKBjVyS8sBF2L9X+PoRJ +QNH7yp4kED18XQwrzuLaJ8xJzQNnvVjWxzPeXngmX+CIIlNCt3zc2hLPTteqbpmK +VuZusrSz4O8d6Qqwo4ofhj/gz67v31lsrOCOc5tkuXRfikUHGbEOE7S2zfSlh2wA +sgSX/LjQZH6WHyZqLJIVTcrccouZDkCBbQhuGJMTA2VOUZkKPB8RJ8Fw3su/ge9N +dig8YNSAjbWFFSFl1tyncWuadS046IXVLF80a/z66i8OOQ6D/uUjGWWKIbUFp/w3 +hOlLNXLCnCRV/LJ1L4UmzusCAwEAAQ== -----END rsa public key----- diff --git a/validator/validator.go b/validator/validator.go index b7abd1f..744e975 100644 --- a/validator/validator.go +++ b/validator/validator.go @@ -19,16 +19,17 @@ import ( ) var ( - alphaMatcher *regexp.Regexp = regexp.MustCompile(`^[a-zA-Z]+$`) - letterRegexMatcher *regexp.Regexp = regexp.MustCompile(`[a-zA-Z]`) - alphaNumericMatcher *regexp.Regexp = regexp.MustCompile(`^[a-zA-Z0-9-]+$`) - numberRegexMatcher *regexp.Regexp = regexp.MustCompile(`\d`) - intStrMatcher *regexp.Regexp = regexp.MustCompile(`^[\+-]?\d+$`) - urlMatcher *regexp.Regexp = regexp.MustCompile(`^((ftp|http|https?):\/\/)?(\S+(:\S*)?@)?((([1-9]\d?|1\d\d|2[01]\d|22[0-3])(\.(1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(([a-zA-Z0-9]+([-\.][a-zA-Z0-9]+)*)|((www\.)?))?(([a-z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-z\x{00a1}-\x{ffff}]{2,}))?))(:(\d{1,5}))?((\/|\?|#)[^\s]*)?$`) - dnsMatcher *regexp.Regexp = regexp.MustCompile(`^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$`) - emailMatcher *regexp.Regexp = regexp.MustCompile(`^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,4}$`) + alphaMatcher *regexp.Regexp = regexp.MustCompile(`^[a-zA-Z]+$`) + letterRegexMatcher *regexp.Regexp = regexp.MustCompile(`[a-zA-Z]`) + alphaNumericMatcher *regexp.Regexp = regexp.MustCompile(`^[a-zA-Z0-9-]+$`) + numberRegexMatcher *regexp.Regexp = regexp.MustCompile(`\d`) + intStrMatcher *regexp.Regexp = regexp.MustCompile(`^[\+-]?\d+$`) + urlMatcher *regexp.Regexp = regexp.MustCompile(`^((ftp|http|https?):\/\/)?(\S+(:\S*)?@)?((([1-9]\d?|1\d\d|2[01]\d|22[0-3])(\.(1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(([a-zA-Z0-9]+([-\.][a-zA-Z0-9]+)*)|((www\.)?))?(([a-z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-z\x{00a1}-\x{ffff}]{2,}))?))(:(\d{1,5}))?((\/|\?|#)[^\s]*)?$`) + dnsMatcher *regexp.Regexp = regexp.MustCompile(`^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$`) + // emailMatcher *regexp.Regexp = regexp.MustCompile(`^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,4}$`) + emailMatcher *regexp.Regexp = regexp.MustCompile(`\w+(-+.\w+)*@\w+(-.\w+)*.\w+(-.\w+)*`) chineseMobileMatcher *regexp.Regexp = regexp.MustCompile(`^1(?:3\d|4[4-9]|5[0-35-9]|6[67]|7[013-8]|8\d|9\d)\d{8}$`) - chineseIdMatcher *regexp.Regexp = regexp.MustCompile(`^(\d{17})([0-9]|X|x)$`) + chineseIdMatcher *regexp.Regexp = regexp.MustCompile(`([1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx])|([1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}[0-9Xx])`) chineseMatcher *regexp.Regexp = regexp.MustCompile("[\u4e00-\u9fa5]") chinesePhoneMatcher *regexp.Regexp = regexp.MustCompile(`\d{3}-\d{8}|\d{4}-\d{7}|\d{4}-\d{8}`) creditCardMatcher *regexp.Regexp = regexp.MustCompile(`^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11}|6[27][0-9]{14})$`) @@ -274,21 +275,45 @@ func IsPort(str string) bool { // IsUrl check if the string is url. // Play: https://go.dev/play/p/pbJGa7F98Ka func IsUrl(str string) bool { - if str == "" || len(str) >= 2083 || len(str) <= 3 || strings.HasPrefix(str, ".") { - return false - } - u, err := url.Parse(str) - if err != nil { - return false - } - if strings.HasPrefix(u.Host, ".") { - return false - } - if u.Host == "" && (u.Path != "" && !strings.Contains(u.Path, ".")) { + if str == "" { return false } - return urlMatcher.MatchString(str) + u, err := url.Parse(str) + if err != nil || u.Scheme == "" || u.Host == "" { + return false + } + + allowedSchemes := map[string]struct{}{ + "http": {}, + "https": {}, + "ftp": {}, + "ws": {}, + "wss": {}, + "file": {}, + "mailto": {}, + "data": {}, + } + + if _, ok := allowedSchemes[u.Scheme]; !ok { + return false + } + + if u.Scheme == "file" || u.Scheme == "mailto" || u.Scheme == "data" { + return true + } + + host := u.Hostname() + if !strings.Contains(host, ".") || strings.HasSuffix(host, ".") { + return false + } + + // domainRegexp := regexp.MustCompile(`^[a-zA-Z0-9][a-zA-Z0-9\-\.]*[a-zA-Z0-9]$`) + if !dnsMatcher.MatchString(host) { + return false + } + + return true } // IsDns check if the string is dns. @@ -302,8 +327,6 @@ func IsDns(dns string) bool { func IsEmail(email string) bool { _, err := mail.ParseAddress(email) return err == nil - - // return emailMatcher.MatchString(email) } // IsChineseMobile check if the string is chinese mobile number. diff --git a/validator/validator_example_test.go b/validator/validator_example_test.go index 1000dbd..829095b 100644 --- a/validator/validator_example_test.go +++ b/validator/validator_example_test.go @@ -214,7 +214,7 @@ func ExampleIsUrl() { fmt.Println(result3) // Output: - // true + // false // true // false } diff --git a/validator/validator_test.go b/validator/validator_test.go index 7f35088..3c690b5 100644 --- a/validator/validator_test.go +++ b/validator/validator_test.go @@ -437,10 +437,32 @@ func TestIsUrl(t *testing.T) { assert := internal.NewAssert(t, "TestIsUrl") - assert.Equal(true, IsUrl("http://abc.com")) - assert.Equal(true, IsUrl("abc.com")) - assert.Equal(true, IsUrl("a.b.com")) - assert.Equal(false, IsUrl("abc")) + tests := []struct { + input string + expected bool + }{ + {"http://abc.com", true}, + {"https://abc.com", true}, + {"ftp://abc.com", true}, + {"http://abc.com/path?query=123", true}, + {"https://abc.com/path/to/resource", true}, + {"ws://abc.com", true}, + {"wss://abc.com", true}, + {"mailto://abc.com", true}, + {"file://path/to/file", true}, + {"data://text/plain;base64,SGVsbG8sIFdvcmxkIQ==", true}, + {"http://abc.com/path/to/resource?query=123#fragment", true}, + + {"abc", false}, + {"http://", false}, + {"http://abc", false}, + {"http://abc:8080", false}, + {"http://abc:99999999", false}, + } + + for _, tt := range tests { + assert.Equal(tt.expected, IsUrl(tt.input)) + } } func TestIsDns(t *testing.T) { @@ -477,12 +499,24 @@ func TestIsEmail(t *testing.T) { func TestContainChinese(t *testing.T) { t.Parallel() - assert := internal.NewAssert(t, "TestContainChinese") - assert.Equal(true, ContainChinese("你好")) - assert.Equal(true, ContainChinese("你好hello")) - assert.Equal(false, ContainChinese("hello")) + tests := []struct { + input string + expected bool + }{ + {"你好", true}, + {"hello", false}, + {"你好hello", true}, + {"hello你好", true}, + {"", false}, + {"123", false}, + {"!@#$%^&*()", false}, + } + + for _, tt := range tests { + assert.Equal(tt.expected, ContainChinese(tt.input)) + } } func TestIsChineseMobile(t *testing.T) { @@ -490,8 +524,20 @@ func TestIsChineseMobile(t *testing.T) { assert := internal.NewAssert(t, "TestIsChineseMobile") - assert.Equal(true, IsChineseMobile("13263527980")) - assert.Equal(false, IsChineseMobile("434324324")) + tests := []struct { + input string + expected bool + }{ + {"13263527980", true}, + {"1326352798", false}, + {"132635279801", false}, + {"1326352798a", false}, + {"1326352798@", false}, + } + + for _, tt := range tests { + assert.Equal(tt.expected, IsChineseMobile(tt.input)) + } } func TestIsChinesePhone(t *testing.T) {