X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FEmailAddress.hs;h=88feafd59fb10f115578858e6a70f2fc9411d77b;hb=d9cf306292f2bfaa00b4773737b67de7f4ecf983;hp=c20aa3069324fc7e0eab6d2857c54729b0c47bec;hpb=a5e228280dfbdbd8f2b1f271adb362fee1a43de4;p=email-validator.git diff --git a/src/EmailAddress.hs b/src/EmailAddress.hs index c20aa30..88feafd 100644 --- a/src/EmailAddress.hs +++ b/src/EmailAddress.hs @@ -3,6 +3,7 @@ where import qualified Data.ByteString as BS import qualified Data.ByteString.UTF8 as BSU +import Text.Email.Validate (isValid) import Test.HUnit (assertEqual) import Test.Framework (Test, testGroup) import Test.Framework.Providers.HUnit (testCase) @@ -28,7 +29,10 @@ parts address = where break_func = (== '@') (before, rest) = BSU.break break_func address - after = BS.tail rest + after = + if rest == BS.empty + then BS.empty + else BS.tail rest -- | Check that the lengths of the local/domain parts are within spec. @@ -52,6 +56,16 @@ validate_regex address = matches = match regex address [] +-- | Validate the syntax of an email address by checking its length +-- and validating it against either a simple regex or RFC5322, +-- depending on the --rfc5322 flag. +validate_syntax :: Bool -> Address -> Bool +validate_syntax rfc5322 address = + (validate_length address) && + if rfc5322 + then isValid address + else validate_regex address + -- HUnit tests good_addresses :: [Address] @@ -67,12 +81,18 @@ good_addresses = bad_addresses :: [Address] bad_addresses = map BSU.fromString [ - "bad%char@domain.com", - "bad^char@domain.com", - "badunderscore@dom_ain.com", +-- Bad, but not caught by email-validate-1.0.0. +-- "badunderscore@dom_ain.com", "(fail)@domain.com", "no spaces@domain.com", - ".beginswith@a-dot.com" ] + ".beginswith@a-dot.com", + "a", + "a.com", + "@b.com", + "b@", + (replicate 65 'a') ++ "@" ++ "domain.com", + "abcdefg@" ++ (replicate 253 'a') ++ ".com", + (replicate 100 'a') ++ "@" ++ (replicate 300 'a') ++ ".com" ] unsupported_addresses :: [Address] unsupported_addresses = @@ -91,7 +111,9 @@ unsupported_addresses = "ok|char@domain.com", "ok}char@domain.com", "ok~char@domain.com", - "tom.phillips@[127.0.0.1]" ] + "tom.phillips@[127.0.0.1]", + "bad%char@domain.com", + "bad^char@domain.com" ] test_good_addresses :: Test test_good_addresses = @@ -100,7 +122,16 @@ test_good_addresses = where desc = "Good addresses are accepted." expected = True - actual = and (map validate_regex good_addresses) + actual = all (validate_syntax False) good_addresses + +test_good_addresses_rfc :: Test +test_good_addresses_rfc = + testCase desc $ + assertEqual desc expected actual + where + desc = "Good addresses are accepted with --rfc5322." + expected = True + actual = all (validate_syntax True) good_addresses test_bad_addresses :: Test test_bad_addresses = @@ -109,7 +140,16 @@ test_bad_addresses = where desc = "Bad addresses are not accepted." expected = True - actual = and (map (not . validate_regex) bad_addresses) + actual = all (not . (validate_syntax False)) bad_addresses + +test_bad_addresses_rfc :: Test +test_bad_addresses_rfc = + testCase desc $ + assertEqual desc expected actual + where + desc = "Bad addresses are not accepted with --rfc5322." + expected = True + actual = all (not . (validate_syntax True)) bad_addresses test_unsupported_addresses :: Test test_unsupported_addresses = @@ -118,12 +158,23 @@ test_unsupported_addresses = where desc = "Unsupported addresses are not accepted." expected = True - actual = and (map (not . validate_regex) unsupported_addresses) + actual = all (not . (validate_syntax False)) unsupported_addresses +test_unsupported_addresses_rfc :: Test +test_unsupported_addresses_rfc = + testCase desc $ + assertEqual desc expected actual + where + desc = "Unsupported addresses are accepted with --rfc5322." + expected = True + actual = all (validate_syntax True) unsupported_addresses email_address_tests :: Test email_address_tests = testGroup "EmailAddress Tests" [ test_good_addresses, + test_good_addresses_rfc, test_bad_addresses, - test_unsupported_addresses ] + test_bad_addresses_rfc, + test_unsupported_addresses, + test_unsupported_addresses_rfc ]