-
Notifications
You must be signed in to change notification settings - Fork 280
Expand file tree
/
Copy pathclient.test.ts
More file actions
119 lines (98 loc) · 4.15 KB
/
client.test.ts
File metadata and controls
119 lines (98 loc) · 4.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
import { describe, expect, it, vi, beforeEach } from 'vitest'
import * as client from '../src/client'
import type { Fetch } from '../src/types'
import { version } from '../src/version'
describe('Client', () => {
const mockFetch = vi.fn() as unknown as Fetch
const mockResponse = {
ok: true,
json: vi.fn(),
text: vi.fn(),
body: { getReader: vi.fn() },
status: 200,
}
beforeEach(() => {
vi.restoreAllMocks()
mockFetch.mockReset()
mockResponse.ok = true
mockResponse.status = 200
mockResponse.text.mockReset()
mockResponse.json.mockReset()
mockResponse.body.getReader.mockReset()
mockFetch.mockResolvedValue(mockResponse as unknown as Response)
})
describe('get', () => {
it('calls fetch with correct URL', async () => {
await client.get(mockFetch, 'http://example.com')
expect(mockFetch).toHaveBeenCalledWith('http://example.com', undefined)
})
it('appends query params', async () => {
await client.get(mockFetch, 'http://example.com', { a: '1', b: '2' })
expect(mockFetch).toHaveBeenCalledWith('http://example.com?a=1&b=2', undefined)
})
})
describe('postWithProgress', () => {
let mockReader: any
let onProgress: ReturnType<typeof vi.fn>
beforeEach(() => {
onProgress = vi.fn()
mockReader = { read: vi.fn() }
mockResponse.body.getReader.mockReturnValue(mockReader)
})
it('sends POST with JSON', async () => {
const body = { key: 'value' }
mockReader.read
.mockResolvedValueOnce({ done: false, value: new TextEncoder().encode('{"ok":true}') }) // valid JSON
.mockResolvedValueOnce({ done: true, value: undefined })
const result = await client.postWithProgress(mockFetch, 'http://example.com', body)
expect(result).toEqual({ ok: true })
expect(mockFetch).toHaveBeenCalledWith('http://example.com', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'User-Agent': `foundry-local-js-sdk/${version}`,
},
body: JSON.stringify(body),
})
})
it('reports progress if onProgress is given', async () => {
const mockOnProgress = vi.fn()
const progress1 = new TextEncoder().encode('Progress: 50%')
const progress2 = new TextEncoder().encode('Progress: 100%')
const finalJson1 = new TextEncoder().encode('{"done"')
const finalJson2 = new TextEncoder().encode(':true}')
mockReader.read
.mockResolvedValueOnce({ done: false, value: progress1 })
.mockResolvedValueOnce({ done: false, value: progress2 })
.mockResolvedValueOnce({ done: false, value: finalJson1 })
.mockResolvedValueOnce({ done: false, value: finalJson2 })
.mockResolvedValueOnce({ done: true, value: undefined })
const result = await client.postWithProgress(mockFetch, 'http://example.com', {}, mockOnProgress)
expect(mockOnProgress).toHaveBeenCalledWith(50)
expect(mockOnProgress).toHaveBeenCalledWith(100)
expect(result).toEqual({ done: true })
})
it('parses final JSON response', async () => {
const jsonChunk = new TextEncoder().encode('{"message":"ok"}')
mockReader.read
.mockResolvedValueOnce({ done: false, value: jsonChunk })
.mockResolvedValueOnce({ done: true, value: undefined })
const result = await client.postWithProgress(mockFetch, 'http://example.com')
expect(result).toEqual({ message: 'ok' })
})
it('throws on invalid JSON', async () => {
mockReader.read
.mockResolvedValueOnce({ done: false, value: new TextEncoder().encode('{invalid') })
.mockResolvedValueOnce({ done: true, value: undefined })
await expect(client.postWithProgress(mockFetch, 'http://example.com')).rejects.toThrow(
/Error parsing JSON response/,
)
})
it('throws if no JSON is received', async () => {
mockReader.read.mockResolvedValueOnce({ done: true, value: undefined })
await expect(client.postWithProgress(mockFetch, 'http://example.com')).rejects.toThrow('No JSON data received!')
})
})
})