|
1 | 1 | import { expect, test } from 'vitest'; |
2 | | -import { parseWorkBookId } from '$lib/utils/workbook'; |
| 2 | +import { parseWorkBookId, parseWorkBookUrlSlug } from '$lib/utils/workbook'; |
3 | 3 |
|
4 | 4 | type TestCase = { |
5 | 5 | slug: string; |
6 | | - expected: number | null; |
| 6 | + expected: number | string | null; |
7 | 7 | }; |
8 | 8 |
|
9 | 9 | type TestCases = TestCase[]; |
@@ -90,3 +90,47 @@ describe('Workbook', () => { |
90 | 90 | } |
91 | 91 | }); |
92 | 92 | }); |
| 93 | + |
| 94 | +describe('parse workbook URL slug', () => { |
| 95 | + describe('when valid URL slugs are given', () => { |
| 96 | + const testCases = [ |
| 97 | + { slug: 'a', expected: 'a' }, |
| 98 | + { slug: 'a'.repeat(30), expected: 'a'.repeat(30) }, |
| 99 | + { slug: 'bfs', expected: 'bfs' }, |
| 100 | + { slug: 'union-find', expected: 'union-find' }, |
| 101 | + { slug: '2-sat', expected: '2-sat' }, |
| 102 | + ]; |
| 103 | + |
| 104 | + runTests('parseWorkBookUrlSlug', testCases, ({ slug, expected }: TestCase) => { |
| 105 | + expect(parseWorkBookUrlSlug(slug)).toBe(expected); |
| 106 | + }); |
| 107 | + }); |
| 108 | + |
| 109 | + describe('when invalid URL slugs are given', () => { |
| 110 | + const testCases = [ |
| 111 | + { slug: '', expected: null }, |
| 112 | + { slug: ' ', expected: null }, |
| 113 | + { slug: 'bfs dfs', expected: null }, |
| 114 | + { slug: 'invalid@slug', expected: null }, |
| 115 | + { slug: 'invalid#slug', expected: null }, |
| 116 | + { slug: 'invalid/slug', expected: null }, |
| 117 | + { slug: 'UPPERCASE', expected: null }, |
| 118 | + { slug: 'slug_with_underscore', expected: null }, |
| 119 | + { slug: '-invalid-start', expected: null }, |
| 120 | + { slug: 'invalid-end-', expected: null }, |
| 121 | + { slug: 'double--dash', expected: null }, |
| 122 | + ]; |
| 123 | + |
| 124 | + runTests('parseWorkBookUrlSlug', testCases, ({ slug, expected }: TestCase) => { |
| 125 | + expect(parseWorkBookUrlSlug(slug)).toBe(expected); |
| 126 | + }); |
| 127 | + }); |
| 128 | + |
| 129 | + function runTests( |
| 130 | + testName: string, |
| 131 | + testCases: TestCases, |
| 132 | + testFunction: (testCase: TestCase) => void, |
| 133 | + ) { |
| 134 | + test.each(testCases)(`${testName}(slug: $slug)`, testFunction); |
| 135 | + } |
| 136 | +}); |
0 commit comments