import { assert, layer } from "@effect/vitest";
import { Effect } from "effect";
import { RenderService, RenderServiceLive } from "~/features/render/lib/service";
layer(RenderServiceLive)("render", (it) => {
it.effect("markdown to html with GFM features", () =>
Effect.gen(function* () {
const render = yield* RenderService;
const result = yield* render.toHtml("# Hello\n\n**bold** and `code`");
assert.include(result.html, "
");
assert.include(result.html, "bold");
assert.include(result.html, "code");
}),
);
it.effect("markdown with YAML frontmatter extracts metadata", () =>
Effect.gen(function* () {
const render = yield* RenderService;
const result = yield* render.toHtml(
"---\ntitle: My Note\ntags: [foo, bar]\n---\n\n# Content",
);
assert.isOk(result.frontmatter);
assert.strictEqual((result.frontmatter as any).title, "My Note");
assert.include(result.html, "Content
");
}),
);
it.effect("markdown with wikilinks", () =>
Effect.gen(function* () {
const render = yield* RenderService;
const result = yield* render.toHtml("See [[Other Note]] for details.");
assert.include(result.html, "Other Note");
}),
);
it.effect("markdown with code block gets expressive code treatment", () =>
Effect.gen(function* () {
const render = yield* RenderService;
const result = yield* render.toHtml("```ts\nconst x = 1;\n```");
assert.include(result.html, "const x = 1");
}),
);
it.effect("mdx with Callout component", () =>
Effect.gen(function* () {
const render = yield* RenderService;
const result = yield* render.toMdx(
'Be careful',
);
assert.include(result.html, "Heads up");
assert.include(result.html, "Be careful");
}),
);
it.effect("mdx with EmbeddedHtml component", () =>
Effect.gen(function* () {
const render = yield* RenderService;
const result = yield* render.toMdx('');
assert.include(result.html, "raw");
}),
);
it.effect("malformed mdx returns RenderError", () =>
Effect.gen(function* () {
const render = yield* RenderService;
const result = yield* Effect.exit(render.toMdx("{invalid mdx syntax <<<"));
assert.strictEqual(result._tag, "Failure");
}),
);
});