From 7bb15126b63841739e9a4b3e7257abbefcb65f28 Mon Sep 17 00:00:00 2001 From: Alex Mickelson Date: Wed, 21 Aug 2024 15:04:28 -0600 Subject: [PATCH] more tests --- nextjs/src/models/local/IModuleItem.ts | 4 +++ .../src/models/local/page/localCoursePage.ts | 7 ++++ nextjs/src/models/local/page/pageMarkdown.ts | 32 +++++++++++++++++++ .../local/tests/markdown/pageMarkdown.test.ts | 19 +++++++++++ 4 files changed, 62 insertions(+) create mode 100644 nextjs/src/models/local/IModuleItem.ts create mode 100644 nextjs/src/models/local/page/localCoursePage.ts create mode 100644 nextjs/src/models/local/page/pageMarkdown.ts create mode 100644 nextjs/src/models/local/tests/markdown/pageMarkdown.test.ts diff --git a/nextjs/src/models/local/IModuleItem.ts b/nextjs/src/models/local/IModuleItem.ts new file mode 100644 index 0000000..43d40f1 --- /dev/null +++ b/nextjs/src/models/local/IModuleItem.ts @@ -0,0 +1,4 @@ +export interface IModuleItem { + name: string; + dueAt: string; +} diff --git a/nextjs/src/models/local/page/localCoursePage.ts b/nextjs/src/models/local/page/localCoursePage.ts new file mode 100644 index 0000000..ead366e --- /dev/null +++ b/nextjs/src/models/local/page/localCoursePage.ts @@ -0,0 +1,7 @@ +import { IModuleItem } from "../IModuleItem"; + +export interface LocalCoursePage extends IModuleItem { + name: string; + text: string; + dueAt: string; +} diff --git a/nextjs/src/models/local/page/pageMarkdown.ts b/nextjs/src/models/local/page/pageMarkdown.ts new file mode 100644 index 0000000..c7858e5 --- /dev/null +++ b/nextjs/src/models/local/page/pageMarkdown.ts @@ -0,0 +1,32 @@ +import { extractLabelValue } from "../assignmnet/utils/markdownUtils"; +import { LocalCoursePage } from "./localCoursePage"; + +export const pageMarkdown = { + toMarkdown: (page: LocalCoursePage) => { + const printableDueDate = new Date(page.dueAt) + .toISOString() + .replace("\u202F", " "); + const settingsMarkdown = `Name: ${page.name}\nDueDateForOrdering: ${printableDueDate}\n---\n`; + return settingsMarkdown + page.text; + }, + + parseMarkdown: (pageMarkdown: string) => { + const rawSettings = pageMarkdown.split("---")[0]; + const name = extractLabelValue(rawSettings, "Name"); + const rawDate = extractLabelValue(rawSettings, "DueDateForOrdering"); + + const parsedDate = new Date(rawDate); + if (isNaN(parsedDate.getTime())) { + throw new Error(`could not parse due date: ${rawDate}`); + } + + const text = pageMarkdown.split("---\n")[1]; + + const page: LocalCoursePage = { + name, + dueAt: parsedDate.toISOString(), + text, + }; + return page; + }, +}; diff --git a/nextjs/src/models/local/tests/markdown/pageMarkdown.test.ts b/nextjs/src/models/local/tests/markdown/pageMarkdown.test.ts new file mode 100644 index 0000000..f904e88 --- /dev/null +++ b/nextjs/src/models/local/tests/markdown/pageMarkdown.test.ts @@ -0,0 +1,19 @@ +import { describe, it, expect } from "vitest"; +import { LocalCoursePage } from "../../page/localCoursePage"; +import { pageMarkdown } from "../../page/pageMarkdown"; + +describe("PageMarkdownTests", () => { + it("can parse page", () => { + const page: LocalCoursePage = { + name: "test title", + text: "test text content", + dueAt: new Date().toISOString(), + }; + + const pageMarkdownString = pageMarkdown.toMarkdown(page); + + const parsedPage = pageMarkdown.parseMarkdown(pageMarkdownString); + + expect(parsedPage).toEqual(page); + }); +});