Skip to content

Commit ae46238

Browse files
committed
chore: add tests
1 parent d8dd0db commit ae46238

File tree

1 file changed

+166
-0
lines changed

1 file changed

+166
-0
lines changed
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
import { beforeEach, describe, expect, it } from 'vitest'
2+
3+
describe('useBookmarks', () => {
4+
beforeEach(() => {
5+
localStorage.clear()
6+
const { clearBookmarks } = useBookmarks()
7+
clearBookmarks()
8+
})
9+
10+
describe('initial state', () => {
11+
it('should start with empty bookmarks', () => {
12+
const { bookmarks, hasBookmarks, bookmarkCount } = useBookmarks()
13+
14+
expect(bookmarks.value).toEqual([])
15+
expect(hasBookmarks.value).toBe(false)
16+
expect(bookmarkCount.value).toBe(0)
17+
})
18+
})
19+
20+
describe('addBookmark', () => {
21+
it('should add a bookmark', () => {
22+
const { bookmarks, addBookmark, isBookmarked, hasBookmarks, bookmarkCount } = useBookmarks()
23+
24+
addBookmark('vue')
25+
26+
expect(isBookmarked('vue')).toBe(true)
27+
expect(hasBookmarks.value).toBe(true)
28+
expect(bookmarkCount.value).toBe(1)
29+
expect(bookmarks.value[0]!.packageName).toBe('vue')
30+
})
31+
32+
it('should not add duplicate bookmarks', () => {
33+
const { bookmarks, addBookmark } = useBookmarks()
34+
35+
addBookmark('vue')
36+
addBookmark('vue')
37+
38+
expect(bookmarks.value).toHaveLength(1)
39+
})
40+
41+
it('should prepend new bookmarks (most recent first)', () => {
42+
const { bookmarks, addBookmark } = useBookmarks()
43+
44+
addBookmark('vue')
45+
addBookmark('react')
46+
addBookmark('angular')
47+
48+
expect(bookmarks.value[0]!.packageName).toBe('angular')
49+
expect(bookmarks.value[1]!.packageName).toBe('react')
50+
expect(bookmarks.value[2]!.packageName).toBe('vue')
51+
})
52+
53+
it('should handle scoped packages', () => {
54+
const { addBookmark, isBookmarked } = useBookmarks()
55+
56+
addBookmark('@nuxt/kit')
57+
58+
expect(isBookmarked('@nuxt/kit')).toBe(true)
59+
})
60+
61+
it('should store addedAt timestamp', () => {
62+
const { bookmarks, addBookmark } = useBookmarks()
63+
const before = Date.now()
64+
65+
addBookmark('vue')
66+
67+
const after = Date.now()
68+
expect(bookmarks.value[0]!.addedAt).toBeGreaterThanOrEqual(before)
69+
expect(bookmarks.value[0]!.addedAt).toBeLessThanOrEqual(after)
70+
})
71+
})
72+
73+
describe('removeBookmark', () => {
74+
it('should remove a bookmark', () => {
75+
const { addBookmark, removeBookmark, isBookmarked, bookmarkCount } = useBookmarks()
76+
77+
addBookmark('vue')
78+
addBookmark('react')
79+
removeBookmark('vue')
80+
81+
expect(isBookmarked('vue')).toBe(false)
82+
expect(isBookmarked('react')).toBe(true)
83+
expect(bookmarkCount.value).toBe(1)
84+
})
85+
86+
it('should handle removing non-existent bookmark', () => {
87+
const { bookmarks, addBookmark, removeBookmark } = useBookmarks()
88+
89+
addBookmark('vue')
90+
removeBookmark('react')
91+
92+
expect(bookmarks.value).toHaveLength(1)
93+
})
94+
})
95+
96+
describe('toggleBookmark', () => {
97+
it('should toggle bookmark status', () => {
98+
const { toggleBookmark, isBookmarked } = useBookmarks()
99+
100+
expect(isBookmarked('vue')).toBe(false)
101+
toggleBookmark('vue')
102+
expect(isBookmarked('vue')).toBe(true)
103+
toggleBookmark('vue')
104+
expect(isBookmarked('vue')).toBe(false)
105+
toggleBookmark('vue')
106+
expect(isBookmarked('vue')).toBe(true)
107+
})
108+
})
109+
110+
describe('clearBookmarks', () => {
111+
it('should remove all bookmarks', () => {
112+
const { addBookmark, clearBookmarks, hasBookmarks, bookmarkCount } = useBookmarks()
113+
114+
addBookmark('vue')
115+
addBookmark('react')
116+
addBookmark('angular')
117+
118+
expect(bookmarkCount.value).toBe(3)
119+
120+
clearBookmarks()
121+
122+
expect(hasBookmarks.value).toBe(false)
123+
expect(bookmarkCount.value).toBe(0)
124+
})
125+
126+
it('should handle clearing empty bookmarks', () => {
127+
const { clearBookmarks, hasBookmarks } = useBookmarks()
128+
129+
clearBookmarks()
130+
131+
expect(hasBookmarks.value).toBe(false)
132+
})
133+
})
134+
135+
describe('useIsBookmarked', () => {
136+
it('should return reactive computed', () => {
137+
const { useIsBookmarked, toggleBookmark } = useBookmarks()
138+
const isVueBookmarked = useIsBookmarked('vue')
139+
140+
expect(isVueBookmarked.value).toBe(false)
141+
142+
toggleBookmark('vue')
143+
expect(isVueBookmarked.value).toBe(true)
144+
145+
toggleBookmark('vue')
146+
expect(isVueBookmarked.value).toBe(false)
147+
})
148+
149+
it('should work with ref parameter', () => {
150+
const { useIsBookmarked, addBookmark } = useBookmarks()
151+
const packageName = ref('vue')
152+
const isBookmarked = useIsBookmarked(packageName)
153+
154+
expect(isBookmarked.value).toBe(false)
155+
156+
addBookmark('vue')
157+
expect(isBookmarked.value).toBe(true)
158+
159+
packageName.value = 'react'
160+
expect(isBookmarked.value).toBe(false)
161+
162+
addBookmark('react')
163+
expect(isBookmarked.value).toBe(true)
164+
})
165+
})
166+
})

0 commit comments

Comments
 (0)