@@ -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)