From 835d757aa7e9adcbd69fb41c2d4d3fee84556c64 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Thu, 1 May 2025 12:28:16 +0200 Subject: [PATCH 1/5] test license --- .../src/__tests__/License.test.ts | 57 +++++++++++++++++++ .../src/lib/components/License.svelte | 2 +- 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 packages/ui-components/src/__tests__/License.test.ts diff --git a/packages/ui-components/src/__tests__/License.test.ts b/packages/ui-components/src/__tests__/License.test.ts new file mode 100644 index 0000000000..913230249d --- /dev/null +++ b/packages/ui-components/src/__tests__/License.test.ts @@ -0,0 +1,57 @@ +import { render, screen, waitFor } from '@testing-library/svelte'; +import { beforeEach, expect, describe, vi, afterEach } from 'vitest'; +import License from '../lib/components/License.svelte'; + +// Mock the global fetch function +const mockFetch = vi.fn(); +vi.stubGlobal('fetch', mockFetch); + +vi.mock('svelte-markdown', async () => { + const MockMarkdown = (await import('../lib/__mocks__/MockComponent.svelte')).default; + return { default: MockMarkdown }; +}); + +describe('License', () => { + const mockMarkdownContent = 'This is license text.'; + const expectedUrl = + 'https://raw.githubusercontent.com/rainlanguage/decentralicense/refs/heads/master/README.md'; + + beforeEach(() => { + mockFetch.mockReset(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + it('fetches and renders markdown content on mount', async () => { + mockFetch.mockResolvedValue({ + ok: true, + text: async () => mockMarkdownContent + }); + + render(License); + + await waitFor(() => { + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(mockFetch).toHaveBeenCalledWith(expectedUrl); + }); + + await waitFor(() => { + expect(screen.getByTestId('mock-component').getAttribute('source')).toBe(mockMarkdownContent); + }); + }); + + it('handles fetch network error gracefully', async () => { + mockFetch.mockRejectedValue(new Error('Network error')); + + const { container } = render(License); + + await waitFor(() => { + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(mockFetch).toHaveBeenCalledWith(expectedUrl); + }); + + expect(container.textContent).toBe(''); + }); +}); diff --git a/packages/ui-components/src/lib/components/License.svelte b/packages/ui-components/src/lib/components/License.svelte index 85ef2e65a4..a6ebdf06de 100644 --- a/packages/ui-components/src/lib/components/License.svelte +++ b/packages/ui-components/src/lib/components/License.svelte @@ -14,7 +14,7 @@ source = await response.text(); } } catch { - source = ''; + source = 'Failed to fetch license'; } }); From 40a5df43faf6b5cadf384de3ba0b099d1567b8a2 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Thu, 1 May 2025 12:38:10 +0200 Subject: [PATCH 2/5] Test License --- packages/ui-components/src/__tests__/License.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/ui-components/src/__tests__/License.test.ts b/packages/ui-components/src/__tests__/License.test.ts index 913230249d..6497255976 100644 --- a/packages/ui-components/src/__tests__/License.test.ts +++ b/packages/ui-components/src/__tests__/License.test.ts @@ -52,6 +52,8 @@ describe('License', () => { expect(mockFetch).toHaveBeenCalledWith(expectedUrl); }); - expect(container.textContent).toBe(''); + await waitFor(() => { + expect(screen.getByTestId('mock-component').getAttribute('source')).toBe('Failed to fetch license'); + }); }); }); From 2beb8d999af72026384fbc7665e5927b583eee40 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Fri, 2 May 2025 12:10:37 +0200 Subject: [PATCH 3/5] format --- packages/ui-components/src/__tests__/License.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/ui-components/src/__tests__/License.test.ts b/packages/ui-components/src/__tests__/License.test.ts index 6497255976..e798481027 100644 --- a/packages/ui-components/src/__tests__/License.test.ts +++ b/packages/ui-components/src/__tests__/License.test.ts @@ -53,7 +53,9 @@ describe('License', () => { }); await waitFor(() => { - expect(screen.getByTestId('mock-component').getAttribute('source')).toBe('Failed to fetch license'); + expect(screen.getByTestId('mock-component').getAttribute('source')).toBe( + 'Failed to fetch license' + ); }); }); }); From 20bf70388001302dd550ba919573f43f0385bc8c Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Fri, 2 May 2025 12:24:05 +0200 Subject: [PATCH 4/5] test license --- packages/ui-components/src/__tests__/License.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui-components/src/__tests__/License.test.ts b/packages/ui-components/src/__tests__/License.test.ts index e798481027..b55d803716 100644 --- a/packages/ui-components/src/__tests__/License.test.ts +++ b/packages/ui-components/src/__tests__/License.test.ts @@ -45,7 +45,7 @@ describe('License', () => { it('handles fetch network error gracefully', async () => { mockFetch.mockRejectedValue(new Error('Network error')); - const { container } = render(License); + render(License); await waitFor(() => { expect(mockFetch).toHaveBeenCalledTimes(1); From 158ffd4e800244423be75394c730873a7ed0aaaa Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Wed, 7 May 2025 20:07:25 +0200 Subject: [PATCH 5/5] ai comments --- .../src/__tests__/License.test.ts | 31 ++++++++++++++++--- .../src/lib/components/License.svelte | 9 +++--- packages/ui-components/src/lib/consts.ts | 2 ++ 3 files changed, 33 insertions(+), 9 deletions(-) create mode 100644 packages/ui-components/src/lib/consts.ts diff --git a/packages/ui-components/src/__tests__/License.test.ts b/packages/ui-components/src/__tests__/License.test.ts index b55d803716..07b9a750d4 100644 --- a/packages/ui-components/src/__tests__/License.test.ts +++ b/packages/ui-components/src/__tests__/License.test.ts @@ -1,9 +1,11 @@ import { render, screen, waitFor } from '@testing-library/svelte'; import { beforeEach, expect, describe, vi, afterEach } from 'vitest'; import License from '../lib/components/License.svelte'; +import { LICENSE_URL } from '../lib/consts'; // Mock the global fetch function const mockFetch = vi.fn(); + vi.stubGlobal('fetch', mockFetch); vi.mock('svelte-markdown', async () => { @@ -13,8 +15,6 @@ vi.mock('svelte-markdown', async () => { describe('License', () => { const mockMarkdownContent = 'This is license text.'; - const expectedUrl = - 'https://raw.githubusercontent.com/rainlanguage/decentralicense/refs/heads/master/README.md'; beforeEach(() => { mockFetch.mockReset(); @@ -34,7 +34,7 @@ describe('License', () => { await waitFor(() => { expect(mockFetch).toHaveBeenCalledTimes(1); - expect(mockFetch).toHaveBeenCalledWith(expectedUrl); + expect(mockFetch).toHaveBeenCalledWith(LICENSE_URL); }); await waitFor(() => { @@ -49,12 +49,33 @@ describe('License', () => { await waitFor(() => { expect(mockFetch).toHaveBeenCalledTimes(1); - expect(mockFetch).toHaveBeenCalledWith(expectedUrl); + expect(mockFetch).toHaveBeenCalledWith(LICENSE_URL); + }); + + await waitFor(() => { + expect(screen.getByTestId('mock-component').getAttribute('source')).toBe( + 'Failed to fetch license.' + ); + }); + }); + + it('handles non-OK HTTP responses gracefully', async () => { + mockFetch.mockResolvedValue({ + ok: false, + status: 404, + statusText: 'Not Found' + }); + + render(License); + + await waitFor(() => { + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(mockFetch).toHaveBeenCalledWith(LICENSE_URL); }); await waitFor(() => { expect(screen.getByTestId('mock-component').getAttribute('source')).toBe( - 'Failed to fetch license' + 'Failed to fetch license: HTTP 404' ); }); }); diff --git a/packages/ui-components/src/lib/components/License.svelte b/packages/ui-components/src/lib/components/License.svelte index a6ebdf06de..417672ae94 100644 --- a/packages/ui-components/src/lib/components/License.svelte +++ b/packages/ui-components/src/lib/components/License.svelte @@ -2,19 +2,20 @@ import { Heading, Text, BlockQuote } from '@rainlanguage/ui-components'; import Markdown from 'svelte-markdown'; import { onMount } from 'svelte'; + import { LICENSE_URL } from '../consts'; let source = ''; onMount(async () => { try { - const response = await fetch( - 'https://raw.githubusercontent.com/rainlanguage/decentralicense/refs/heads/master/README.md' - ); + const response = await fetch(LICENSE_URL); if (response.ok) { source = await response.text(); + } else { + source = `Failed to fetch license: HTTP ${response.status}`; } } catch { - source = 'Failed to fetch license'; + source = 'Failed to fetch license.'; } }); diff --git a/packages/ui-components/src/lib/consts.ts b/packages/ui-components/src/lib/consts.ts new file mode 100644 index 0000000000..670260033f --- /dev/null +++ b/packages/ui-components/src/lib/consts.ts @@ -0,0 +1,2 @@ +export const LICENSE_URL = + 'https://raw.githubusercontent.com/rainlanguage/decentralicense/refs/heads/master/README.md';