From 208faee4601f6dab84b13faf56429ef5e953c687 Mon Sep 17 00:00:00 2001 From: Alexander Cerutti Date: Tue, 21 Sep 2021 00:02:03 +0200 Subject: [PATCH] Added setExpirationDate implementation along with tests --- spec/PKPass.ts | 37 +++++++++++++++++++++++++++++++++++++ src/PKPass.ts | 15 +++++++++++---- src/pass.ts | 16 +--------------- src/processDate.ts | 17 +++++++++++++++++ 4 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 src/processDate.ts diff --git a/spec/PKPass.ts b/spec/PKPass.ts index 797b62d..86e8588 100644 --- a/spec/PKPass.ts +++ b/spec/PKPass.ts @@ -126,5 +126,42 @@ describe("PKPass", () => { expect(pass.props["nfc"]).toBeUndefined(); }); + + describe("setExpirationDate", () => { + it("Won't apply changes without a valid argument", () => { + const pass = new PKPass({}, {}); + + // @ts-expect-error + pass.setExpirationDate(); + expect(pass.props["expirationDate"]).toBe(undefined); + + // @ts-expect-error + pass.setExpirationDate(42); + expect(pass.props["expirationDate"]).toBe(undefined); + }); + + it("expects a Date object as the only argument", () => { + const pass = new PKPass({}, {}); + + pass.setExpirationDate(new Date(2020, 6, 1, 0, 0, 0, 0)); + // Month starts from 0 in Date Object when used this way, therefore + // we expect one month more + expect(pass.props["expirationDate"]).toBe( + "2020-07-01T00:00:00Z", + ); + }); + + it("An invalid date, will not apply changes", () => { + const pass = new PKPass({}, {}); + + // @ts-expect-error + pass.setExpirationDate("32/18/228317"); + expect(pass.props["expirationDate"]).toBe(undefined); + + // @ts-expect-error + pass.setExpirationDate("32/18/228317"); + expect(pass.props["expirationDate"]).toBe(undefined); + }); + }); }); }); diff --git a/src/PKPass.ts b/src/PKPass.ts index f1147d4..3581186 100644 --- a/src/PKPass.ts +++ b/src/PKPass.ts @@ -256,10 +256,17 @@ export default class PKPass extends Bundle { * @returns */ - setExpiration(date: Date | null): this { - /** - * @TODO implement - */ + setExpirationDate(date: Date | null): this { + if (date === null) { + delete this[propsSymbol]["expirationDate"]; + return this; + } + + const parsedDate = processDate("expirationDate", date); + + if (parsedDate) { + this[propsSymbol]["expirationDate"] = parsedDate; + } return this; } diff --git a/src/pass.ts b/src/pass.ts index 43409cd..553631f 100644 --- a/src/pass.ts +++ b/src/pass.ts @@ -16,6 +16,7 @@ import { getAllFilesWithName, } from "./utils"; import * as Signature from "./signature"; +import { processDate } from "./processDate"; const barcodeDebug = debug("passkit:barcode"); const genericDebug = debug("passkit:generic"); @@ -687,18 +688,3 @@ function getValidInArray( Object.keys(current).length && Schemas.isValid(current, schemaName), ); } - -function processDate(key: string, date: Date): string | null { - if (!(date instanceof Date)) { - return null; - } - - const dateParse = dateToW3CString(date); - - if (!dateParse) { - genericDebug(formatMessage(DEBUG.DATE_FORMAT_UNMATCH, key)); - return null; - } - - return dateParse; -} diff --git a/src/processDate.ts b/src/processDate.ts new file mode 100644 index 0000000..6000436 --- /dev/null +++ b/src/processDate.ts @@ -0,0 +1,17 @@ +import { dateToW3CString } from "./utils"; +import formatMessage, { ERROR, DEBUG } from "./messages"; + +export function processDate(key: string, date: Date): string | null { + if (!(date instanceof Date)) { + return null; + } + + const dateParse = dateToW3CString(date); + + if (!dateParse) { + console.warn(formatMessage(DEBUG.DATE_FORMAT_UNMATCH, key)); + return null; + } + + return dateParse; +}