summaryrefslogtreecommitdiff
path: root/llama.cpp/tools/server/webui/tests/stories/MarkdownContent.stories.svelte
diff options
context:
space:
mode:
authorMitja Felicijan <mitja.felicijan@gmail.com>2026-02-12 20:57:17 +0100
committerMitja Felicijan <mitja.felicijan@gmail.com>2026-02-12 20:57:17 +0100
commitb333b06772c89d96aacb5490d6a219fba7c09cc6 (patch)
tree211df60083a5946baa2ed61d33d8121b7e251b06 /llama.cpp/tools/server/webui/tests/stories/MarkdownContent.stories.svelte
downloadllmnpc-b333b06772c89d96aacb5490d6a219fba7c09cc6.tar.gz
Engage!
Diffstat (limited to 'llama.cpp/tools/server/webui/tests/stories/MarkdownContent.stories.svelte')
-rw-r--r--llama.cpp/tools/server/webui/tests/stories/MarkdownContent.stories.svelte130
1 files changed, 130 insertions, 0 deletions
diff --git a/llama.cpp/tools/server/webui/tests/stories/MarkdownContent.stories.svelte b/llama.cpp/tools/server/webui/tests/stories/MarkdownContent.stories.svelte
new file mode 100644
index 0000000..90aa90b
--- /dev/null
+++ b/llama.cpp/tools/server/webui/tests/stories/MarkdownContent.stories.svelte
@@ -0,0 +1,130 @@
+<script module lang="ts">
+ import { defineMeta } from '@storybook/addon-svelte-csf';
+ import { expect } from 'storybook/test';
+ import { MarkdownContent } from '$lib/components/app';
+ import { AI_TUTORIAL_MD } from './fixtures/ai-tutorial.js';
+ import { API_DOCS_MD } from './fixtures/api-docs.js';
+ import { BLOG_POST_MD } from './fixtures/blog-post.js';
+ import { DATA_ANALYSIS_MD } from './fixtures/data-analysis.js';
+ import { README_MD } from './fixtures/readme.js';
+ import { MATH_FORMULAS_MD } from './fixtures/math-formulas.js';
+ import { EMPTY_MD } from './fixtures/empty.js';
+
+ const { Story } = defineMeta({
+ title: 'Components/MarkdownContent',
+ component: MarkdownContent,
+ parameters: {
+ layout: 'centered'
+ }
+ });
+</script>
+
+<Story name="Empty" args={{ content: EMPTY_MD, class: 'max-w-[56rem] w-[calc(100vw-2rem)]' }} />
+
+<Story
+ name="AI Tutorial"
+ args={{ content: AI_TUTORIAL_MD, class: 'max-w-[56rem] w-[calc(100vw-2rem)]' }}
+/>
+
+<Story
+ name="API Documentation"
+ args={{ content: API_DOCS_MD, class: 'max-w-[56rem] w-[calc(100vw-2rem)]' }}
+/>
+
+<Story
+ name="Technical Blog"
+ args={{ content: BLOG_POST_MD, class: 'max-w-[56rem] w-[calc(100vw-2rem)]' }}
+/>
+
+<Story
+ name="Data Analysis"
+ args={{ content: DATA_ANALYSIS_MD, class: 'max-w-[56rem] w-[calc(100vw-2rem)]' }}
+/>
+
+<Story
+ name="README file"
+ args={{ content: README_MD, class: 'max-w-[56rem] w-[calc(100vw-2rem)]' }}
+/>
+
+<Story
+ name="Math Formulas"
+ args={{ content: MATH_FORMULAS_MD, class: 'max-w-[56rem] w-[calc(100vw-2rem)]' }}
+/>
+
+<Story
+ name="URL Links"
+ args={{
+ content: `# URL Links Test
+
+Here are some example URLs that should open in new tabs:
+
+- [Hugging Face Homepage](https://huggingface.co)
+- [GitHub Repository](https://github.com/ggml-org/llama.cpp)
+- [OpenAI Website](https://openai.com)
+- [Google Search](https://www.google.com)
+
+You can also test inline links like https://example.com or https://docs.python.org.
+
+All links should have \`target="_blank"\` and \`rel="noopener noreferrer"\` attributes for security.`,
+ class: 'max-w-[56rem] w-[calc(100vw-2rem)]'
+ }}
+ play={async ({ canvasElement }) => {
+ // Wait for component to render
+ await new Promise((resolve) => setTimeout(resolve, 100));
+
+ // Find all links in the rendered content
+ const links = canvasElement.querySelectorAll('a[href]');
+
+ // Test that we have the expected number of links
+ expect(links.length).toBeGreaterThan(0);
+
+ // Test each link for proper attributes
+ links.forEach((link) => {
+ const href = link.getAttribute('href');
+
+ // Test that external links have proper security attributes
+ if (href && (href.startsWith('http://') || href.startsWith('https://'))) {
+ expect(link.getAttribute('target')).toBe('_blank');
+ expect(link.getAttribute('rel')).toBe('noopener noreferrer');
+ }
+ });
+
+ // Test specific links exist
+ const hugginFaceLink = Array.from(links).find(
+ (link) => link.getAttribute('href') === 'https://huggingface.co'
+ );
+ expect(hugginFaceLink).toBeTruthy();
+ expect(hugginFaceLink?.textContent).toBe('Hugging Face Homepage');
+
+ const githubLink = Array.from(links).find(
+ (link) => link.getAttribute('href') === 'https://github.com/ggml-org/llama.cpp'
+ );
+ expect(githubLink).toBeTruthy();
+ expect(githubLink?.textContent).toBe('GitHub Repository');
+
+ const openaiLink = Array.from(links).find(
+ (link) => link.getAttribute('href') === 'https://openai.com'
+ );
+ expect(openaiLink).toBeTruthy();
+ expect(openaiLink?.textContent).toBe('OpenAI Website');
+
+ const googleLink = Array.from(links).find(
+ (link) => link.getAttribute('href') === 'https://www.google.com'
+ );
+ expect(googleLink).toBeTruthy();
+ expect(googleLink?.textContent).toBe('Google Search');
+
+ // Test inline links (auto-linked URLs)
+ const exampleLink = Array.from(links).find(
+ (link) => link.getAttribute('href') === 'https://example.com'
+ );
+ expect(exampleLink).toBeTruthy();
+
+ const pythonDocsLink = Array.from(links).find(
+ (link) => link.getAttribute('href') === 'https://docs.python.org'
+ );
+ expect(pythonDocsLink).toBeTruthy();
+
+ console.log(`✅ URL Links test passed - Found ${links.length} links with proper attributes`);
+ }}
+/>