From b07073b882479c16d8ba6661aa7ea6af063ac2be Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Mon, 16 Jul 2018 13:14:38 -0600 Subject: [PATCH] review: tests --- .../graph/common/scalars/cursor.spec.ts | 136 ++++++++++++++++++ .../server/graph/common/scalars/cursor.ts | 4 + .../server/types/{express.d.ts => express.ts} | 0 3 files changed, 140 insertions(+) create mode 100644 src/core/server/graph/common/scalars/cursor.spec.ts rename src/core/server/types/{express.d.ts => express.ts} (100%) diff --git a/src/core/server/graph/common/scalars/cursor.spec.ts b/src/core/server/graph/common/scalars/cursor.spec.ts new file mode 100644 index 000000000..6d3b807f2 --- /dev/null +++ b/src/core/server/graph/common/scalars/cursor.spec.ts @@ -0,0 +1,136 @@ +import { Kind } from "graphql"; +import { DateTime } from "luxon"; + +import Cursor from "./cursor"; + +describe("parseLiteral", () => { + it("parses a date from a string", () => { + expect( + Cursor.parseLiteral({ + kind: Kind.STRING, + value: "2018-07-16T18:34:26.744Z", + }) + ).toBeInstanceOf(Date); + + expect( + Cursor.parseLiteral({ + kind: Kind.STRING, + value: "this-should-fail", + }) + ).toEqual(null); + + expect( + Cursor.parseLiteral({ + kind: Kind.STRING, + value: "", + }) + ).toEqual(null); + }); + + it("parses a number from a string", () => { + expect( + Cursor.parseLiteral({ + kind: Kind.STRING, + value: "20", + }) + ).toEqual(20); + + expect( + Cursor.parseLiteral({ + kind: Kind.STRING, + value: "0", + }) + ).toEqual(0); + + expect( + Cursor.parseLiteral({ + kind: Kind.STRING, + value: "null", + }) + ).toEqual(null); + + expect( + Cursor.parseLiteral({ + kind: Kind.STRING, + value: "0", + }) + ).toEqual(0); + }); + + it("parses a number from a number", () => { + expect( + Cursor.parseLiteral({ + kind: Kind.INT, + value: "20", + }) + ).toEqual(20); + + expect( + Cursor.parseLiteral({ + kind: Kind.INT, + value: "0", + }) + ).toEqual(0); + + expect( + Cursor.parseLiteral({ + kind: Kind.INT, + value: "", + }) + ).toEqual(null); + }); + + it("does not parse unknown kinds", () => { + expect( + Cursor.parseLiteral({ + kind: Kind.FLOAT, + value: "0.0", + }) + ).toEqual(null); + }); +}); + +describe("serialize", () => { + it("renders native dates correctly", () => { + const date = new Date(); + const expected = date.toISOString(); + expect(Cursor.serialize(date)).toEqual(expected); + + expect(Cursor.serialize({})).toEqual(null); + }); + + it("renders luxon dates correctly", () => { + const date = DateTime.fromJSDate(new Date()); + const expected = date.toISO(); + expect(Cursor.serialize(date)).toEqual(expected); + }); + + it("renders numbers correctly", () => { + let value = 50; + let expected = "50"; + expect(Cursor.serialize(value)).toEqual(expected); + + value = 0; + expected = "0"; + expect(Cursor.serialize(value)).toEqual(expected); + + expect(Cursor.serialize(null)).toEqual(null); + }); +}); + +describe("parseValue", () => { + it("parses the string value of a Date", () => { + const date = new Date(); + const expected = date.toISOString(); + expect(Cursor.parseValue(expected)).toBeInstanceOf(Date); + }); + + it("parses the string value of a number", () => { + expect(Cursor.parseValue("0")).toEqual(0); + }); + + it("handles invalid properties", () => { + expect(Cursor.parseValue(null)).toEqual(null); + expect(Cursor.parseValue(2)).toEqual(null); + }); +}); diff --git a/src/core/server/graph/common/scalars/cursor.ts b/src/core/server/graph/common/scalars/cursor.ts index 23649e10b..e4aeaab74 100644 --- a/src/core/server/graph/common/scalars/cursor.ts +++ b/src/core/server/graph/common/scalars/cursor.ts @@ -1,11 +1,15 @@ import { GraphQLScalarType } from "graphql"; import { Kind } from "graphql/language"; import { DateTime } from "luxon"; + import { Cursor } from "talk-server/models/connection"; function parseIntegerCursor(value: string): number | null { try { const cursor = parseInt(value, 10); + if (isNaN(cursor)) { + return null; + } return cursor; } catch (err) { diff --git a/src/core/server/types/express.d.ts b/src/core/server/types/express.ts similarity index 100% rename from src/core/server/types/express.d.ts rename to src/core/server/types/express.ts