git.iko.soy/typeable/credit-card
on master help sign in
Merge pull request #1 from typeable/change-cvc-validation

fix cvc validation

commit36b89164936b869a99b4bb694aa995ee8471e694 authorNikolay <nikolayr2001@gmail.com> dateFri 8 Jul 2022, 14:02 (4 years ago) parenta505cb688df5ae
3 files changed+31−2
.gitignore+3 spec/CreditCardSpec.hs+27 src/Data/CreditCard.hs+1−2
.gitignorenew file+3
@@ -0,0 +1,3 @@
1+.stack-work
2+.hie-yaml
3+stack.yaml.lock
spec/CreditCardSpec.hs+27
@@ -72,6 +72,29 @@ wrongNumbers =
7272 , "353011133330000"
7373 , "3566002028360505" ]
7474
75+correctCvc :: [Text]
76+correctCvc =
77+ [ "311"
78+ , "3211"
79+ , "9999"
80+ , "0000"
81+ , "000"
82+ , "1234"
83+ , "111"
84+ ]
85+
86+wrongCvc :: [Text]
87+wrongCvc =
88+ [ "31111"
89+ , "a31"
90+ , "zzz"
91+ , "00O"
92+ , "000O"
93+ , "OOO"
94+ , "11111"
95+ , "11"
96+ ]
97+
7598checkNumbers :: [Text] -> CreditCardType -> Spec
7699checkNumbers ns t = describe (show t) $ do
77100 for_ ns $ \n -> it (T.unpack n) $ do
@@ -94,3 +117,7 @@ spec = describe "Credit card number validation" $ do
94117 (parseExpirationDate . formatExpiryDate) d == Just d
95118 prop "JSON instances isomorphism" $ \(cc :: CreditCard) ->
96119 (decode . encode) cc == Just cc
120+ it "Wrong CVC" $ for_ wrongCvc $ \cvc -> do
121+ parseCreditCardSecurity cvc `shouldBe` Nothing
122+ it "Correct CVC" $ for_ correctCvc $ \cvc -> do
123+ parseCreditCardSecurity cvc `shouldBe` Just (CreditCardSecurity cvc)
src/Data/CreditCard.hs+1−2
@@ -54,7 +54,6 @@ import Control.Lens hiding (elements)
5454import Control.Monad (guard)
5555import Data.Aeson as Aeson
5656import Data.Aeson.Inflections (defaultFieldLabelModifier)
57−import Data.Aeson.Types (withText)
5857import Data.Char (isDigit)
5958import Data.Digit
6059import Data.Either (isRight)
@@ -245,7 +244,7 @@ parseCreditCardSecurity txt
245244 | otherwise = Nothing
246245 where
247246 isValid = and
248− [ T.length txt == 3
247+ [ (3, 4) `inRange` T.length txt
249248 , T.all isDigit txt ]
250249
251250data CreditCard = CreditCard