card-validator
Version:
A library for validating credit card fields
118 lines (110 loc) • 3.94 kB
text/typescript
import { parseDate, MonthAndYear } from "../../lib/parse-date";
describe("parse-date", () => {
describe.each([
[
"with empty month and empty year",
[
["", { month: "", year: "" }],
[" ", { month: "", year: "" }],
["/", { month: "", year: "" }],
],
],
[
"with deliminators",
[
["12 21", { month: "12", year: "21" }],
["12 / 21", { month: "12", year: "21" }],
["12/21", { month: "12", year: "21" }],
["2020-10", { month: "10", year: "2020" }],
],
],
[
'when the datestrings starts with "0"',
[
["0", { month: "0", year: "" }],
["01", { month: "01", year: "" }],
["052", { month: "05", year: "2" }],
["0529", { month: "05", year: "29" }],
["052900", { month: "05", year: "2900" }],
],
],
[
'when the datestrings starts with "2-9"',
[
["2", { month: "2", year: "" }],
["31", { month: "3", year: "1" }],
["452", { month: "4", year: "52" }],
["8529", { month: "8", year: "529" }],
["952900", { month: "9", year: "52900" }],
],
],
[
"when the datestring starts with 13-19",
[
["13", { month: "1", year: "3" }],
["145", { month: "1", year: "45" }],
["1580", { month: "1", year: "580" }],
["16701", { month: "1", year: "6701" }],
["17701", { month: "1", year: "7701" }],
["18701", { month: "1", year: "8701" }],
["19701", { month: "1", year: "9701" }],
],
],
[
"when the datestring has exactly 5 characters",
[
["52019", { month: "5", year: "2019" }],
["39876", { month: "3", year: "9876" }],
],
],
[
"when the datestring is greater than 5 characters",
[
["122039", { month: "12", year: "2039" }],
["108760", { month: "10", year: "8760" }],
["1187601234", { month: "11", year: "87601234" }],
["520190", { month: "5", year: "20190" }],
["398760", { month: "3", year: "98760" }],
],
],
] as Array<[string, Array<[string, MonthAndYear]>]>)(
"%s",
(description, tests) => {
it.each(tests)("parses %s to be %p", (parseMe, meta) => {
expect(parseDate(parseMe)).toEqual(meta);
});
},
);
describe("datestrings starting with 10-12", () => {
let savedDateObject: DateConstructor;
beforeEach(() => {
savedDateObject = Date;
/*
* because there's some internal logic to whether or not an
* expiration date is potentially valid, we must freeze time at
* the year 2019 for these tests to keep working once the year is
* over
* */
const fixedDate = new Date(2019, 9);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
window.Date = jest.fn().mockImplementation(() => fixedDate) as any;
});
afterEach(() => {
window.Date = savedDateObject;
});
it("parses month with 2 digits when it starts with 1 and the remaining year is not potentially valid", () => {
expect(parseDate("100")).toEqual({ month: "10", year: "0" });
expect(parseDate("104")).toEqual({ month: "10", year: "4" });
expect(parseDate("109")).toEqual({ month: "10", year: "9" });
expect(parseDate("110")).toEqual({ month: "11", year: "0" });
expect(parseDate("115")).toEqual({ month: "11", year: "5" });
expect(parseDate("118")).toEqual({ month: "11", year: "8" });
});
it("parses month with 1 digit when it starts with 1 and the remaining year is potentially valid", () => {
expect(parseDate("119")).toEqual({ month: "1", year: "19" });
expect(parseDate("120")).toEqual({ month: "1", year: "20" });
expect(parseDate("125")).toEqual({ month: "1", year: "25" });
expect(parseDate("129")).toEqual({ month: "1", year: "29" });
});
});
});