Skip to content

Commit 72dcd72

Browse files
committed
Write testcode
1 parent 1b5e51c commit 72dcd72

File tree

4 files changed

+532
-0
lines changed

4 files changed

+532
-0
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { expect, test } from 'bun:test'
2+
import * as indexModule from '../index'
3+
4+
test('index.ts exports', () => {
5+
expect({ ...indexModule }).toEqual({
6+
devupApi: expect.any(Function),
7+
default: expect.any(Function),
8+
})
9+
})
Lines changed: 286 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,286 @@
1+
import { beforeEach, expect, mock, spyOn, test } from 'bun:test'
2+
import { join } from 'node:path'
3+
import type { DevupApiOptions } from '@devup-api/core'
4+
import * as generator from '@devup-api/generator'
5+
import * as utils from '@devup-api/utils'
6+
import { devupApiWebpackPlugin } from '@devup-api/webpack-plugin'
7+
import type { NextConfig } from 'next'
8+
import { devupApi } from '../plugin'
9+
10+
let mockCreateTmpDir: ReturnType<typeof spyOn>
11+
let mockReadOpenapi: ReturnType<typeof spyOn>
12+
let mockWriteInterface: ReturnType<typeof spyOn>
13+
let mockCreateTmpDirAsync: ReturnType<typeof spyOn>
14+
let mockReadOpenapiAsync: ReturnType<typeof spyOn>
15+
let mockWriteInterfaceAsync: ReturnType<typeof spyOn>
16+
let mockCreateUrlMap: ReturnType<typeof spyOn>
17+
let mockGenerateInterface: ReturnType<typeof spyOn>
18+
19+
const mockSchema = {
20+
openapi: '3.1.0',
21+
paths: {
22+
'/users': {
23+
get: {
24+
operationId: 'getUsers',
25+
responses: {
26+
'200': {
27+
content: {
28+
'application/json': {
29+
schema: {
30+
type: 'array',
31+
items: { type: 'string' },
32+
},
33+
},
34+
},
35+
},
36+
},
37+
},
38+
},
39+
},
40+
} as const
41+
42+
const mockUrlMap = {
43+
getUsers: {
44+
method: 'GET' as const,
45+
url: '/users',
46+
},
47+
'/users': {
48+
method: 'GET' as const,
49+
url: '/users',
50+
},
51+
}
52+
53+
const mockInterfaceContent = 'export interface Test {}'
54+
55+
beforeEach(() => {
56+
mockCreateTmpDir = spyOn(utils, 'createTmpDir').mockReturnValue('df')
57+
mockReadOpenapi = spyOn(utils, 'readOpenapi').mockReturnValue(
58+
mockSchema as never,
59+
)
60+
mockWriteInterface = spyOn(utils, 'writeInterface').mockImplementation(
61+
() => {},
62+
)
63+
mockCreateTmpDirAsync = spyOn(utils, 'createTmpDirAsync').mockResolvedValue(
64+
'df',
65+
)
66+
mockReadOpenapiAsync = spyOn(utils, 'readOpenapiAsync').mockResolvedValue(
67+
mockSchema as never,
68+
)
69+
mockWriteInterfaceAsync = spyOn(
70+
utils,
71+
'writeInterfaceAsync',
72+
).mockResolvedValue(undefined)
73+
mockCreateUrlMap = spyOn(generator, 'createUrlMap').mockReturnValue(
74+
mockUrlMap as never,
75+
)
76+
mockGenerateInterface = spyOn(generator, 'generateInterface').mockReturnValue(
77+
mockInterfaceContent,
78+
)
79+
mockCreateTmpDir.mockClear()
80+
mockReadOpenapi.mockClear()
81+
mockWriteInterface.mockClear()
82+
mockCreateTmpDirAsync.mockClear()
83+
mockReadOpenapiAsync.mockClear()
84+
mockWriteInterfaceAsync.mockClear()
85+
mockCreateUrlMap.mockClear()
86+
mockGenerateInterface.mockClear()
87+
})
88+
89+
test.each([
90+
[{}, undefined],
91+
[{ env: {} }, undefined],
92+
[{}, { tempDir: 'custom-dir' }],
93+
[{ env: {} }, { openapiFile: 'custom-openapi.json' }],
94+
] as const)('devupApi handles turbo mode: config=%s, options=%s', (config: NextConfig, options:
95+
| DevupApiOptions
96+
| undefined) => {
97+
const originalEnv = process.env.TURBOPACK
98+
process.env.TURBOPACK = '1'
99+
100+
try {
101+
const result = devupApi(config, options)
102+
103+
expect(mockCreateTmpDir).toHaveBeenCalledWith(options?.tempDir)
104+
expect(mockReadOpenapi).toHaveBeenCalledWith(options?.openapiFile)
105+
expect(mockGenerateInterface).toHaveBeenCalledWith(
106+
mockSchema,
107+
options || {},
108+
)
109+
expect(mockWriteInterface).toHaveBeenCalledWith(
110+
join('df', 'api.d.ts'),
111+
mockInterfaceContent,
112+
)
113+
expect(mockCreateUrlMap).toHaveBeenCalledWith(mockSchema, options || {})
114+
expect(result.env).toEqual({
115+
DEVUP_API_URL_MAP: JSON.stringify(mockUrlMap),
116+
})
117+
expect(result).toBe(config)
118+
} finally {
119+
process.env.TURBOPACK = originalEnv
120+
}
121+
})
122+
123+
test('devupApi handles turbo mode with existing env', () => {
124+
const originalEnv = process.env.TURBOPACK
125+
process.env.TURBOPACK = '1'
126+
127+
try {
128+
const config: NextConfig = {
129+
env: {
130+
EXISTING_VAR: 'value',
131+
},
132+
}
133+
const result = devupApi(config)
134+
135+
expect(result.env).toEqual({
136+
EXISTING_VAR: 'value',
137+
DEVUP_API_URL_MAP: JSON.stringify(mockUrlMap),
138+
})
139+
} finally {
140+
process.env.TURBOPACK = originalEnv
141+
}
142+
})
143+
144+
test('devupApi handles turbo mode with TURBOPACK=auto', () => {
145+
const originalEnv = process.env.TURBOPACK
146+
process.env.TURBOPACK = 'auto'
147+
148+
try {
149+
const config: NextConfig = {}
150+
const result = devupApi(config)
151+
152+
expect(mockCreateTmpDir).toHaveBeenCalled()
153+
expect(result.env).toEqual({
154+
DEVUP_API_URL_MAP: JSON.stringify(mockUrlMap),
155+
})
156+
} finally {
157+
process.env.TURBOPACK = originalEnv
158+
}
159+
})
160+
161+
test.each([
162+
[{}, undefined],
163+
[{ webpack: undefined }, undefined],
164+
[{}, { tempDir: 'custom-dir' }],
165+
[{ webpack: undefined }, { openapiFile: 'custom-openapi.json' }],
166+
] as const)('devupApi handles webpack mode: config=%s, options=%s', (config: NextConfig, options:
167+
| DevupApiOptions
168+
| undefined) => {
169+
const originalEnv = process.env.TURBOPACK
170+
delete process.env.TURBOPACK
171+
172+
try {
173+
const result = devupApi(config, options)
174+
175+
expect(result.webpack).toBeDefined()
176+
expect(typeof result.webpack).toBe('function')
177+
expect(result).toBe(config)
178+
} finally {
179+
process.env.TURBOPACK = originalEnv
180+
}
181+
})
182+
183+
test('devupApi handles webpack mode with existing webpack function', () => {
184+
const originalEnv = process.env.TURBOPACK
185+
delete process.env.TURBOPACK
186+
187+
try {
188+
const existingWebpack = mock(() => ({}))
189+
const config: NextConfig = {
190+
webpack: existingWebpack as never,
191+
}
192+
const result = devupApi(config)
193+
194+
expect(result.webpack).toBeDefined()
195+
expect(typeof result.webpack).toBe('function')
196+
expect(result.webpack).not.toBe(existingWebpack)
197+
} finally {
198+
process.env.TURBOPACK = originalEnv
199+
}
200+
})
201+
202+
test('devupApi webpack function adds plugin to config', () => {
203+
const originalEnv = process.env.TURBOPACK
204+
delete process.env.TURBOPACK
205+
206+
try {
207+
const config: NextConfig = {}
208+
const result = devupApi(config)
209+
210+
const webpackConfig = {
211+
plugins: [],
212+
}
213+
const webpackOptions = {}
214+
const webpackResult = result.webpack?.(
215+
webpackConfig as never,
216+
webpackOptions as never,
217+
)
218+
219+
expect(webpackConfig.plugins).toHaveLength(1)
220+
expect(webpackConfig.plugins[0]).toBeInstanceOf(devupApiWebpackPlugin)
221+
expect(webpackResult).toBe(webpackConfig)
222+
} finally {
223+
process.env.TURBOPACK = originalEnv
224+
}
225+
})
226+
227+
test('devupApi webpack function calls existing webpack function', () => {
228+
const originalEnv = process.env.TURBOPACK
229+
delete process.env.TURBOPACK
230+
231+
try {
232+
const existingWebpack = mock(() => ({ modified: true }))
233+
const config: NextConfig = {
234+
webpack: existingWebpack as never,
235+
}
236+
const result = devupApi(config)
237+
238+
const webpackConfig = {
239+
plugins: [],
240+
}
241+
const webpackOptions = {}
242+
const webpackResult = result.webpack?.(
243+
webpackConfig as never,
244+
webpackOptions as never,
245+
)
246+
247+
expect(existingWebpack).toHaveBeenCalledWith(webpackConfig, webpackOptions)
248+
expect(webpackResult).toEqual({ modified: true })
249+
} finally {
250+
process.env.TURBOPACK = originalEnv
251+
}
252+
})
253+
254+
test('devupApi handles null urlMap in turbo mode', () => {
255+
const originalEnv = process.env.TURBOPACK
256+
process.env.TURBOPACK = '1'
257+
mockCreateUrlMap.mockReturnValueOnce(null as never)
258+
259+
try {
260+
const config: NextConfig = {}
261+
const result = devupApi(config)
262+
263+
expect(result.env).toEqual({
264+
DEVUP_API_URL_MAP: JSON.stringify(null),
265+
})
266+
} finally {
267+
process.env.TURBOPACK = originalEnv
268+
}
269+
})
270+
271+
test('devupApi handles undefined urlMap in turbo mode', () => {
272+
const originalEnv = process.env.TURBOPACK
273+
process.env.TURBOPACK = '1'
274+
mockCreateUrlMap.mockReturnValueOnce(undefined as never)
275+
276+
try {
277+
const config: NextConfig = {}
278+
const result = devupApi(config)
279+
280+
expect(result.env).toEqual({
281+
DEVUP_API_URL_MAP: JSON.stringify(undefined),
282+
})
283+
} finally {
284+
process.env.TURBOPACK = originalEnv
285+
}
286+
})
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { expect, test } from 'bun:test'
2+
import * as indexModule from '../index'
3+
4+
test('index.ts exports', () => {
5+
expect({ ...indexModule }).toEqual({
6+
devupApiRsbuildPlugin: expect.any(Function),
7+
default: expect.any(Function),
8+
})
9+
})

0 commit comments

Comments
 (0)