Skip to content

Commit a10290f

Browse files
authored
Merge pull request #672 from nextcloud-libraries/test/request-token
test: Add missing tests for request token
2 parents 9a04ee4 + 72c7072 commit a10290f

2 files changed

Lines changed: 34 additions & 11 deletions

File tree

lib/requesttoken.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ const observers: CsrfTokenObserver[] = []
1919
export function getRequestToken(): string | null {
2020
if (token === undefined) {
2121
// Only on first load, try to get token from document
22-
const tokenElement = document?.getElementsByTagName('head')[0]
23-
token = tokenElement ? tokenElement.getAttribute('data-requesttoken') : null
22+
token = document.head.dataset.requesttoken ?? null
2423
}
2524
return token
2625
}
@@ -42,7 +41,7 @@ subscribe('csrf-token-update', (e: unknown) => {
4241
try {
4342
observer(token!)
4443
} catch (e) {
45-
console.error('error updating CSRF token observer', e)
44+
console.error('Error updating CSRF token observer', e)
4645
}
4746
})
4847
})

test/request-token.test.ts

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,36 @@
55
import { emit } from '@nextcloud/event-bus'
66
import { beforeEach, describe, expect, test, vi } from 'vitest'
77

8-
import { getRequestToken, onRequestTokenUpdate } from '../lib/index'
9-
108
describe('request token', () => {
119
beforeEach(() => {
12-
emit('csrf-token-update', {
13-
token: undefined,
14-
})
10+
vi.resetModules()
11+
vi.resetAllMocks()
12+
delete document.head.dataset.requesttoken
1513
})
1614

17-
test('updates token via event', () => {
15+
test('return null if no token found', async () => {
16+
const { getRequestToken } = await import('../lib')
1817
expect(getRequestToken()).toBe(null)
1918
})
2019

21-
test('find correct value', () => {
20+
test('read initial token', async () => {
21+
document.head.dataset.requesttoken = 'random-token'
22+
const { getRequestToken } = await import('../lib')
23+
expect(getRequestToken()).toBe('random-token')
24+
})
25+
26+
test('can update token by event', async () => {
27+
const { getRequestToken } = await import('../lib')
28+
2229
emit('csrf-token-update', {
2330
token: 'token123',
2431
})
2532

2633
expect(getRequestToken()).toBe('token123')
2734
})
2835

29-
test('request token observer is called', () => {
36+
test('request token observer is called', async () => {
37+
const { onRequestTokenUpdate } = await import('../lib')
3038
const observer = vi.fn(() => { })
3139

3240
onRequestTokenUpdate(observer)
@@ -36,4 +44,20 @@ describe('request token', () => {
3644

3745
expect(observer.mock.calls.length).toBe(1)
3846
})
47+
48+
test('handle exception in observer', async () => {
49+
const spy = vi.spyOn(window.console, 'error')
50+
const { onRequestTokenUpdate } = await import('../lib')
51+
const observer = vi.fn(() => { throw new Error('!Error!') })
52+
// silence the console
53+
spy.mockImplementationOnce(() => {})
54+
55+
onRequestTokenUpdate(observer)
56+
emit('csrf-token-update', {
57+
token: 'token123',
58+
})
59+
60+
expect(observer.mock.calls.length).toBe(1)
61+
expect(spy).toHaveBeenCalledOnce()
62+
})
3963
})

0 commit comments

Comments
 (0)