test: add more tests for parse functions

+1 -1
lib/utils.ts
··· 358 358 return html.trim(); 359 359 } 360 360 361 - function renderListItem({ 361 + export function renderListItem({ 362 362 item, 363 363 did, 364 364 }: {
+189
tests/parse-blocks.test.ts
··· 1 + import { expect, test } from "vitest"; 2 + import { parseBlocks } from "../lib/utils"; 3 + 4 + test("should correctly parse an h1 block to an h2 tag", () => { 5 + const html = parseBlocks({ 6 + block: { 7 + $type: "pub.leaflet.pages.linearDocument#block", 8 + block: { 9 + $type: "pub.leaflet.blocks.header", 10 + level: 1, 11 + facets: [], 12 + plaintext: "heading 1", 13 + }, 14 + }, 15 + did: "did:plc:qttsv4e7pu2jl3ilanfgc3zn", 16 + }); 17 + 18 + expect(html).toMatchInlineSnapshot(`"<h2>heading 1</h2>"`); 19 + }); 20 + 21 + test("should correctly parse an h2 block to an h3 tag", () => { 22 + const html = parseBlocks({ 23 + block: { 24 + $type: "pub.leaflet.pages.linearDocument#block", 25 + block: { 26 + $type: "pub.leaflet.blocks.header", 27 + level: 2, 28 + facets: [], 29 + plaintext: "heading 2", 30 + }, 31 + }, 32 + did: "did:plc:qttsv4e7pu2jl3ilanfgc3zn", 33 + }); 34 + 35 + expect(html).toMatchInlineSnapshot(`"<h3>heading 2</h3>"`); 36 + }); 37 + 38 + test("should correctly parse an h3 block to an h4 tag", () => { 39 + const html = parseBlocks({ 40 + block: { 41 + $type: "pub.leaflet.pages.linearDocument#block", 42 + block: { 43 + $type: "pub.leaflet.blocks.header", 44 + level: 3, 45 + facets: [], 46 + plaintext: "heading 3", 47 + }, 48 + }, 49 + did: "did:plc:qttsv4e7pu2jl3ilanfgc3zn", 50 + }); 51 + 52 + expect(html).toMatchInlineSnapshot(`"<h4>heading 3</h4>"`); 53 + }); 54 + 55 + test("should correctly parse a block with no level to an h6 tag", () => { 56 + const html = parseBlocks({ 57 + block: { 58 + $type: "pub.leaflet.pages.linearDocument#block", 59 + block: { 60 + $type: "pub.leaflet.blocks.header", 61 + facets: [], 62 + plaintext: "heading 6", 63 + }, 64 + }, 65 + did: "did:plc:qttsv4e7pu2jl3ilanfgc3zn", 66 + }); 67 + 68 + expect(html).toMatchInlineSnapshot(`"<h6>heading 6</h6>"`); 69 + }); 70 + 71 + test("should correctly parse an unordered list block", () => { 72 + const html = parseBlocks({ 73 + block: { 74 + $type: "pub.leaflet.pages.linearDocument#block", 75 + block: { 76 + $type: "pub.leaflet.blocks.unorderedList", 77 + children: [ 78 + { 79 + $type: "pub.leaflet.blocks.unorderedList#listItem", 80 + content: { 81 + $type: "pub.leaflet.blocks.text", 82 + facets: [ 83 + { 84 + index: { 85 + byteEnd: 18, 86 + byteStart: 0, 87 + }, 88 + features: [ 89 + { 90 + uri: "https://pdsls.dev/", 91 + $type: "pub.leaflet.richtext.facet#link", 92 + }, 93 + ], 94 + }, 95 + { 96 + index: { 97 + byteEnd: 28, 98 + byteStart: 22, 99 + }, 100 + features: [ 101 + { 102 + uri: "https://bsky.app/profile/juli.ee", 103 + $type: "pub.leaflet.richtext.facet#link", 104 + }, 105 + ], 106 + }, 107 + ], 108 + plaintext: "https://pdsls.dev/ by Juliet", 109 + }, 110 + children: [], 111 + }, 112 + { 113 + $type: "pub.leaflet.blocks.unorderedList#listItem", 114 + content: { 115 + $type: "pub.leaflet.blocks.text", 116 + facets: [ 117 + { 118 + index: { 119 + byteEnd: 34, 120 + byteStart: 0, 121 + }, 122 + features: [ 123 + { 124 + uri: "https://github.com/mary-ext/atcute", 125 + $type: "pub.leaflet.richtext.facet#link", 126 + }, 127 + ], 128 + }, 129 + { 130 + index: { 131 + byteEnd: 42, 132 + byteStart: 38, 133 + }, 134 + features: [ 135 + { 136 + uri: "https://bsky.app/profile/mary.my.id", 137 + $type: "pub.leaflet.richtext.facet#link", 138 + }, 139 + ], 140 + }, 141 + ], 142 + plaintext: "https://github.com/mary-ext/atcute by mary", 143 + }, 144 + children: [], 145 + }, 146 + { 147 + $type: "pub.leaflet.blocks.unorderedList#listItem", 148 + content: { 149 + $type: "pub.leaflet.blocks.text", 150 + facets: [ 151 + { 152 + index: { 153 + byteEnd: 27, 154 + byteStart: 0, 155 + }, 156 + features: [ 157 + { 158 + uri: "https://www.microcosm.blue/", 159 + $type: "pub.leaflet.richtext.facet#link", 160 + }, 161 + ], 162 + }, 163 + { 164 + index: { 165 + byteEnd: 35, 166 + byteStart: 31, 167 + }, 168 + features: [ 169 + { 170 + uri: "https://bsky.app/profile/bad-example.com", 171 + $type: "pub.leaflet.richtext.facet#link", 172 + }, 173 + ], 174 + }, 175 + ], 176 + plaintext: "https://www.microcosm.blue/ by phil", 177 + }, 178 + children: [], 179 + }, 180 + ], 181 + }, 182 + }, 183 + did: "did:plc:qttsv4e7pu2jl3ilanfgc3zn", 184 + }); 185 + 186 + expect(html).toMatchInlineSnapshot( 187 + `"<ul><li><p><a href="https://pdsls.dev/" target="_blank" rel="noopener noreferrer">https://pdsls.dev/</a> by <a href="https://bsky.app/profile/juli.ee" target="_blank" rel="noopener noreferrer">Juliet</a></p></li><li><p><a href="https://github.com/mary-ext/atcute" target="_blank" rel="noopener noreferrer">https://github.com/mary-ext/atcute</a> by <a href="https://bsky.app/profile/mary.my.id" target="_blank" rel="noopener noreferrer">mary</a></p></li><li><p><a href="https://www.microcosm.blue/" target="_blank" rel="noopener noreferrer">https://www.microcosm.blue/</a> by <a href="https://bsky.app/profile/bad-example.com" target="_blank" rel="noopener noreferrer">phil</a></p></li></ul>"`, 188 + ); 189 + });
+114 -114
tests/parse-text-blocks.test.ts
··· 1 - import { describe, expect, test } from "vitest"; 1 + import { expect, test } from "vitest"; 2 2 import { parseTextBlock } from "../lib/utils"; 3 3 4 - describe("text block parsing", () => { 5 - test("should correctly parse a text block without facets", () => { 6 - const html = parseTextBlock({ 7 - $type: "pub.leaflet.blocks.text", 8 - facets: [], 9 - plaintext: "just plaintext no facets", 10 - }); 4 + test("should correctly parse a text block without facets", () => { 5 + const html = parseTextBlock({ 6 + $type: "pub.leaflet.blocks.text", 7 + facets: [], 8 + plaintext: "just plaintext no facets", 9 + }); 11 10 12 - expect(html).toMatchInlineSnapshot(`"<p>just plaintext no facets</p>"`); 13 - }); 11 + expect(html).toMatchInlineSnapshot(`"<p>just plaintext no facets</p>"`); 12 + }); 14 13 15 - test("should correctly parse a text block with bolded text", () => { 16 - const html = parseTextBlock({ 17 - $type: "pub.leaflet.blocks.text", 18 - facets: [ 19 - { 20 - index: { 21 - byteEnd: 11, 22 - byteStart: 0, 14 + test("should correctly parse a text block with bolded text", () => { 15 + const html = parseTextBlock({ 16 + $type: "pub.leaflet.blocks.text", 17 + facets: [ 18 + { 19 + index: { 20 + byteEnd: 11, 21 + byteStart: 0, 22 + }, 23 + features: [ 24 + { 25 + $type: "pub.leaflet.richtext.facet#bold", 23 26 }, 24 - features: [ 25 - { 26 - $type: "pub.leaflet.richtext.facet#bold", 27 - }, 28 - ], 29 - }, 30 - ], 31 - plaintext: "bolded text with some plaintext", 32 - }); 33 - 34 - expect(html).toMatchInlineSnapshot( 35 - `"<p><b>bolded text</b> with some plaintext</p>"`, 36 - ); 27 + ], 28 + }, 29 + ], 30 + plaintext: "bolded text with some plaintext", 37 31 }); 38 32 39 - test("should correctly parse a text block with an inline link", () => { 40 - const html = parseTextBlock({ 41 - $type: "pub.leaflet.blocks.text", 42 - facets: [ 43 - { 44 - index: { 45 - byteEnd: 27, 46 - byteStart: 0, 33 + expect(html).toMatchInlineSnapshot( 34 + `"<p><b>bolded text</b> with some plaintext</p>"`, 35 + ); 36 + }); 37 + 38 + test("should correctly parse a text block with an inline link", () => { 39 + const html = parseTextBlock({ 40 + $type: "pub.leaflet.blocks.text", 41 + facets: [ 42 + { 43 + index: { 44 + byteEnd: 27, 45 + byteStart: 0, 46 + }, 47 + features: [ 48 + { 49 + uri: "https://blacksky.community/", 50 + $type: "pub.leaflet.richtext.facet#link", 47 51 }, 48 - features: [ 49 - { 50 - uri: "https://blacksky.community/", 51 - $type: "pub.leaflet.richtext.facet#link", 52 - }, 53 - ], 54 - }, 55 - ], 56 - plaintext: "https://blacksky.community/", 57 - }); 58 - 59 - expect(html).toMatchInlineSnapshot( 60 - `"<p><a href="https://blacksky.community/" target="_blank" rel="noopener noreferrer">https://blacksky.community/</a></p>"`, 61 - ); 52 + ], 53 + }, 54 + ], 55 + plaintext: "https://blacksky.community/", 62 56 }); 63 57 64 - test("should correctly parse a text block with strikethrough text", () => { 65 - const html = parseTextBlock({ 66 - $type: "pub.leaflet.blocks.text", 67 - facets: [ 68 - { 69 - index: { 70 - byteEnd: 13, 71 - byteStart: 0, 72 - }, 73 - features: [ 74 - { 75 - $type: "pub.leaflet.richtext.facet#strikethrough", 76 - }, 77 - ], 58 + expect(html).toMatchInlineSnapshot( 59 + `"<p><a href="https://blacksky.community/" target="_blank" rel="noopener noreferrer">https://blacksky.community/</a></p>"`, 60 + ); 61 + }); 62 + 63 + test("should correctly parse a text block with strikethrough text", () => { 64 + const html = parseTextBlock({ 65 + $type: "pub.leaflet.blocks.text", 66 + facets: [ 67 + { 68 + index: { 69 + byteEnd: 13, 70 + byteStart: 0, 78 71 }, 79 - ], 80 - plaintext: "strikethrough text with some plaintext", 81 - }); 82 - 83 - expect(html).toMatchInlineSnapshot( 84 - `"<p><s>strikethrough</s> text with some plaintext</p>"`, 85 - ); 72 + features: [ 73 + { 74 + $type: "pub.leaflet.richtext.facet#strikethrough", 75 + }, 76 + ], 77 + }, 78 + ], 79 + plaintext: "strikethrough text with some plaintext", 86 80 }); 87 81 88 - test("should correctly parse a text block with underlined text", () => { 89 - const html = parseTextBlock({ 90 - $type: "pub.leaflet.blocks.text", 91 - facets: [ 92 - { 93 - index: { 94 - byteEnd: 10, 95 - byteStart: 0, 96 - }, 97 - features: [ 98 - { 99 - $type: "pub.leaflet.richtext.facet#underline", 100 - }, 101 - ], 102 - }, 103 - ], 104 - plaintext: "underlined text with some plaintext", 105 - }); 82 + expect(html).toMatchInlineSnapshot( 83 + `"<p><s>strikethrough</s> text with some plaintext</p>"`, 84 + ); 85 + }); 106 86 107 - expect(html).toMatchInlineSnapshot( 108 - `"<p><span style="text-decoration:underline;">underlined</span> text with some plaintext</p>"`, 109 - ); 87 + test("should correctly parse a text block with underlined text", () => { 88 + const html = parseTextBlock({ 89 + $type: "pub.leaflet.blocks.text", 90 + facets: [ 91 + { 92 + index: { 93 + byteEnd: 10, 94 + byteStart: 0, 95 + }, 96 + features: [ 97 + { 98 + $type: "pub.leaflet.richtext.facet#underline", 99 + }, 100 + ], 101 + }, 102 + ], 103 + plaintext: "underlined text with some plaintext", 110 104 }); 111 105 112 - test("should correctly parse a text block with italicized text", () => { 113 - const html = parseTextBlock({ 114 - $type: "pub.leaflet.blocks.text", 115 - facets: [ 116 - { 117 - index: { 118 - byteEnd: 10, 119 - byteStart: 0, 106 + expect(html).toMatchInlineSnapshot( 107 + `"<p><span style="text-decoration:underline;">underlined</span> text with some plaintext</p>"`, 108 + ); 109 + }); 110 + 111 + test("should correctly parse a text block with italicized text", () => { 112 + const html = parseTextBlock({ 113 + $type: "pub.leaflet.blocks.text", 114 + facets: [ 115 + { 116 + index: { 117 + byteEnd: 10, 118 + byteStart: 0, 119 + }, 120 + features: [ 121 + { 122 + $type: "pub.leaflet.richtext.facet#italic", 120 123 }, 121 - features: [ 122 - { 123 - $type: "pub.leaflet.richtext.facet#italic", 124 - }, 125 - ], 126 - }, 127 - ], 128 - plaintext: "italicized text with some plaintext", 129 - }); 130 - 131 - expect(html).toMatchInlineSnapshot(`"<p><i>italicized</i> text with some plaintext</p>"`); 124 + ], 125 + }, 126 + ], 127 + plaintext: "italicized text with some plaintext", 132 128 }); 129 + 130 + expect(html).toMatchInlineSnapshot( 131 + `"<p><i>italicized</i> text with some plaintext</p>"`, 132 + ); 133 133 });