Skip to content

Commit 1effaa1

Browse files
committed
chore: opt 🚛
1 parent 6874925 commit 1effaa1

File tree

11 files changed

+97
-1344
lines changed

11 files changed

+97
-1344
lines changed

packages/hooks/src/useDebounceFn/__tests__/index.spec.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { sleep } from 'test-utils/sleep'
22
import useDebounceFn from '..'
3+
import renderHook from 'test-utils/renderHook'
34

45
let count = 0
56
const debounceFn = (gap: number) => {
@@ -8,7 +9,7 @@ const debounceFn = (gap: number) => {
89

910
describe('useDebounceFn', () => {
1011
it('run, cancel and flush should work', async () => {
11-
const { run, cancel, flush } = useDebounceFn(debounceFn, { wait: 200 })
12+
const [{ run, cancel, flush }] = renderHook(() => useDebounceFn(debounceFn, { wait: 100 }))
1213
run(2)
1314
run(2)
1415
run(2)
@@ -39,7 +40,7 @@ describe('useDebounceFn', () => {
3940
it('should support leading option', async () => {
4041
let value = 0
4142
const fn = (v: number) => { value += v }
42-
const { run } = useDebounceFn(fn, { wait: 100, leading: true, trailing: false })
43+
const [{ run }] = renderHook(() => useDebounceFn(fn, { wait: 100, leading: true, trailing: false }))
4344
run(1)
4445
expect(value).toBe(1)
4546
run(1)
@@ -53,7 +54,7 @@ describe('useDebounceFn', () => {
5354
it('should support trailing option', async () => {
5455
let value = 0
5556
const fn = (v: number) => { value += v }
56-
const { run } = useDebounceFn(fn, { wait: 100, leading: false, trailing: true })
57+
const [{ run }] = renderHook(() => useDebounceFn(fn, { wait: 100, leading: false, trailing: true }))
5758
run(1)
5859
run(2)
5960
run(3)
@@ -65,7 +66,7 @@ describe('useDebounceFn', () => {
6566
it('should support maxWait option', async () => {
6667
let value = 0
6768
const fn = (v: number) => { value += v }
68-
const { run } = useDebounceFn(fn, { wait: 100, maxWait: 200 })
69+
const [{ run }] = renderHook(() => useDebounceFn(fn, { wait: 100, maxWait: 200 }))
6970
run(1)
7071
setTimeout(() => run(2), 50)
7172
setTimeout(() => run(3), 120)
@@ -76,7 +77,7 @@ describe('useDebounceFn', () => {
7677
it('should update options dynamically', async () => {
7778
let value = 0
7879
const fn = (v: number) => { value += v }
79-
const { run, updateOptions } = useDebounceFn(fn, { wait: 200 })
80+
const [{ run, updateOptions }] = renderHook(() => useDebounceFn(fn, { wait: 200 }))
8081
run(1)
8182
await sleep(100)
8283
updateOptions({ wait: 50 })

packages/hooks/src/useDebounceFn/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import debounce from 'lodash-es/debounce'
2-
import { onUnmounted, Ref, ref, watch } from 'vue'
2+
import { onScopeDispose, Ref, ref, watch } from 'vue'
33

44
export interface DebounceOptions {
55
/**
@@ -51,10 +51,12 @@ function useDebounceFn<T extends noop>(fn: T, options?: DebounceOptions) {
5151
);
5252

5353

54-
onUnmounted(() => {
54+
onScopeDispose(() => {
5555
debouncedRef.value?.cancel();
5656
});
5757

58+
59+
5860
return {
5961
/**
6062
* Invode and pass parameters to fn.

packages/hooks/src/useEventListener/__tests__/index.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ describe('useEventListener', () => {
1717
const onClick = () => {
1818
state++
1919
}
20-
useEventListener('click', onClick, { target: () => container })
20+
renderHook(() => useEventListener('click', onClick, { target: () => container }))
2121

2222
document.body.click()
2323
expect(state).toEqual(0)
@@ -32,7 +32,7 @@ describe('useEventListener', () => {
3232
const onResize = () => {
3333
called = true
3434
}
35-
useEventListener('resize', onResize, { target: window })
35+
renderHook(() => useEventListener('resize', onResize, { target: window }))
3636
window.dispatchEvent(new Event('resize'))
3737
expect(called).toBe(true)
3838
})
@@ -42,7 +42,7 @@ describe('useEventListener', () => {
4242
const onKeyDown = (e: KeyboardEvent) => {
4343
key = e.key
4444
}
45-
useEventListener('keydown', onKeyDown, { target: document })
45+
renderHook(() => useEventListener('keydown', onKeyDown, { target: document }))
4646
const event = new KeyboardEvent('keydown', { key: 'a' })
4747
document.dispatchEvent(event)
4848
expect(key).toBe('a')
@@ -57,7 +57,7 @@ describe('useEventListener', () => {
5757
triggered = true
5858
}
5959
}
60-
useEventListener('click', onClick, { target: () => container, once: true })
60+
renderHook(() => useEventListener('click', onClick, { target: () => container, once: true }))
6161
container.click()
6262
container.click()
6363
expect(count).toBe(1)
@@ -68,7 +68,7 @@ describe('useEventListener', () => {
6868
const onWheel = () => {
6969
called = true
7070
}
71-
useEventListener('wheel', onWheel, { target: () => container, passive: true })
71+
renderHook(() => useEventListener('wheel', onWheel, { target: () => container, passive: true }))
7272
const event = new Event('wheel')
7373
container.dispatchEvent(event)
7474
expect(called).toBe(true)
@@ -78,7 +78,7 @@ describe('useEventListener', () => {
7878
const phase: string[] = []
7979
const onCapture = () => phase.push('capture')
8080
const onBubble = () => phase.push('bubble')
81-
useEventListener('click', onCapture, { target: () => container, capture: true })
81+
renderHook(() => useEventListener('click', onCapture, { target: () => container, capture: true }))
8282
container.addEventListener('click', onBubble)
8383
container.click()
8484
expect(phase[0]).toBe('capture')
Lines changed: 79 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,96 @@
1+
import { ref, defineComponent } from 'vue'
12
import { mount } from '@vue/test-utils'
2-
import { ref } from 'vue'
33
import useFavicon from '..'
4-
import Test from './Test.vue'
54

65
const DEFAULT_FAVICON_URL =
76
'https://raw.githubusercontent.com/InhiblabCore/vue-hooks-plus/master/packages/hooks/docs/public/logo.svg'
87
const GOOGLE_FAVICON_URL = 'https://www.google.com/favicon.ico'
98

10-
describe('useFavicon', () => {
11-
const url = ref<string | undefined>(DEFAULT_FAVICON_URL)
12-
useFavicon(url)
13-
it('default be DEFAULT_FAVICON_URL', () => {
14-
expect(url.value).toBe(DEFAULT_FAVICON_URL)
15-
})
16-
17-
it('should work', async () => {
18-
url.value = GOOGLE_FAVICON_URL
19-
expect(url.value).toBe(GOOGLE_FAVICON_URL)
20-
21-
const wrapper = mount(Test)
9+
function getFaviconHref() {
10+
const link = document.head.querySelector('link[rel*="icon"]') as HTMLLinkElement | null
11+
return link?.href || ''
12+
}
2213

23-
const currentFaviconURL = wrapper.find('span')
14+
describe('useFavicon', () => {
15+
let originalFavicon: string | null = null
2416

25-
const toggleToGoogleBtn = wrapper.find('.button1')
26-
const toggleToAHooksBtn = wrapper.find('.button2')
17+
beforeEach(() => {
18+
const link = document.head.querySelector('link[rel="icon"]') as HTMLLinkElement | null
19+
originalFavicon = link?.href || null
20+
})
2721

28-
expect(currentFaviconURL.text()).toBe(DEFAULT_FAVICON_URL)
22+
afterEach(() => {
23+
// 恢复原始 favicon
24+
let link = document.head.querySelector('link[rel="icon"]') as HTMLLinkElement | null
25+
if (!link && originalFavicon) {
26+
link = document.createElement('link')
27+
link.rel = 'icon'
28+
document.head.appendChild(link)
29+
}
30+
if (link && originalFavicon) {
31+
link.href = originalFavicon
32+
} else if (link) {
33+
link.parentNode?.removeChild(link)
34+
}
35+
})
2936

30-
await toggleToGoogleBtn?.trigger('click')
31-
expect(currentFaviconURL.text()).toBe(GOOGLE_FAVICON_URL)
37+
it('should set favicon to the provided URL', async () => {
38+
const url = ref(DEFAULT_FAVICON_URL)
39+
mount(defineComponent({
40+
setup() {
41+
useFavicon(url)
42+
return () => null
43+
}
44+
}))
45+
await Promise.resolve().then()
46+
expect(getFaviconHref()).toBe(DEFAULT_FAVICON_URL)
47+
})
3248

33-
await toggleToAHooksBtn?.trigger('click')
34-
expect(currentFaviconURL.text()).toBe(DEFAULT_FAVICON_URL)
49+
it('should update favicon when URL changes', async () => {
50+
const url = ref(DEFAULT_FAVICON_URL)
51+
const wrapper = mount(defineComponent({
52+
setup() {
53+
useFavicon(url)
54+
return () => null
55+
}
56+
}))
57+
await Promise.resolve().then()
58+
expect(getFaviconHref()).toBe(DEFAULT_FAVICON_URL)
59+
url.value = GOOGLE_FAVICON_URL
60+
await wrapper.vm.$nextTick()
61+
await Promise.resolve().then()
62+
expect(getFaviconHref()).toBe(GOOGLE_FAVICON_URL)
3563
})
3664

37-
it('support undefined', () => {
65+
it('should remove favicon when URL is undefined', async () => {
66+
const url = ref<string | undefined>(DEFAULT_FAVICON_URL)
67+
const wrapper = mount(defineComponent({
68+
setup() {
69+
useFavicon(url)
70+
return () => null
71+
}
72+
}))
73+
await Promise.resolve().then()
74+
expect(getFaviconHref()).toBe(DEFAULT_FAVICON_URL)
3875
url.value = undefined
39-
expect(url.value).toBeUndefined
76+
await wrapper.vm.$nextTick()
77+
await Promise.resolve().then()
78+
const link = document.head.querySelector('link[rel="icon"]')
79+
expect(link).toBeNull()
80+
})
81+
82+
it('should restore previous favicon on unmount', async () => {
83+
const url = ref(GOOGLE_FAVICON_URL)
84+
const wrapper = mount(defineComponent({
85+
setup() {
86+
useFavicon(url)
87+
return () => null
88+
}
89+
}))
90+
await Promise.resolve().then()
91+
expect(getFaviconHref()).toBe(GOOGLE_FAVICON_URL)
92+
wrapper.unmount()
93+
await Promise.resolve().then()
94+
expect(getFaviconHref()).toBe(GOOGLE_FAVICON_URL)
4095
})
4196
})

packages/sponsor/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"name": "@vue-hooks-plus/sponsor",
33
"version": "1.0.0",
4+
"private": true,
45
"description": "Vue hooks plus sponsor",
56
"files": [
67
"dist",

0 commit comments

Comments
 (0)