|
1 | 1 | import path from 'node:path' |
2 | | -import { describe, expect, onTestFinished, test } from 'vitest' |
| 2 | +import { describe, expect, onTestFinished, test, vi } from 'vitest' |
3 | 3 | import { build } from '../../build' |
4 | 4 | import type { Plugin } from '../../plugin' |
5 | 5 | import { resolveConfig } from '../../config' |
6 | 6 | import { createServer } from '../../server' |
7 | 7 | import { preview } from '../../preview' |
8 | 8 | import { promiseWithResolvers } from '../../../shared/utils' |
| 9 | +import { type Logger, createLogger } from '../../logger' |
9 | 10 |
|
10 | 11 | const resolveConfigWithPlugin = ( |
11 | 12 | plugin: Plugin, |
@@ -33,12 +34,16 @@ const resolveEntryPlugin: Plugin = { |
33 | 34 | }, |
34 | 35 | } |
35 | 36 |
|
36 | | -const createServerWithPlugin = async (plugin: Plugin) => { |
| 37 | +const createServerWithPlugin = async ( |
| 38 | + plugin: Plugin, |
| 39 | + customLogger?: Logger, |
| 40 | +) => { |
37 | 41 | const server = await createServer({ |
38 | 42 | configFile: false, |
39 | 43 | root: import.meta.dirname, |
40 | 44 | plugins: [plugin, resolveEntryPlugin], |
41 | 45 | logLevel: 'error', |
| 46 | + customLogger, |
42 | 47 | server: { |
43 | 48 | middlewareMode: true, |
44 | 49 | ws: false, |
@@ -346,3 +351,98 @@ describe('supports plugin context', () => { |
346 | 351 | await server.close() |
347 | 352 | }) |
348 | 353 | }) |
| 354 | + |
| 355 | +describe('watcher add/unlink error handling', () => { |
| 356 | + test("'add' event logs error when watchChange throws", async () => { |
| 357 | + const { promise, resolve } = promiseWithResolvers<void>() |
| 358 | + const error = new Error('async watchChange error') |
| 359 | + |
| 360 | + const logError = vi.fn() |
| 361 | + const logger = createLogger('error') |
| 362 | + logger.error = (...args) => { |
| 363 | + logError(...args) |
| 364 | + resolve() |
| 365 | + } |
| 366 | + |
| 367 | + const server = await createServerWithPlugin( |
| 368 | + { |
| 369 | + name: 'test', |
| 370 | + watchChange() { |
| 371 | + return Promise.reject(error) |
| 372 | + }, |
| 373 | + }, |
| 374 | + logger, |
| 375 | + ) |
| 376 | + |
| 377 | + server.watcher.emit( |
| 378 | + 'add', |
| 379 | + path.resolve(import.meta.dirname, 'some-file.js'), |
| 380 | + ) |
| 381 | + |
| 382 | + await promise |
| 383 | + expect(logError).toHaveBeenCalled() |
| 384 | + expect(logError).toHaveBeenCalledWith(error) |
| 385 | + }) |
| 386 | + |
| 387 | + test("'change' event logs error when watchChange throws", async () => { |
| 388 | + const { promise, resolve } = promiseWithResolvers<void>() |
| 389 | + const error = new Error('async watchChange error') |
| 390 | + |
| 391 | + const logError = vi.fn() |
| 392 | + const logger = createLogger('error') |
| 393 | + logger.error = (...args) => { |
| 394 | + logError(...args) |
| 395 | + resolve() |
| 396 | + } |
| 397 | + |
| 398 | + const server = await createServerWithPlugin( |
| 399 | + { |
| 400 | + name: 'test', |
| 401 | + watchChange() { |
| 402 | + return Promise.reject(error) |
| 403 | + }, |
| 404 | + }, |
| 405 | + logger, |
| 406 | + ) |
| 407 | + |
| 408 | + server.watcher.emit( |
| 409 | + 'change', |
| 410 | + path.resolve(import.meta.dirname, 'some-file.js'), |
| 411 | + ) |
| 412 | + |
| 413 | + await promise |
| 414 | + expect(logError).toHaveBeenCalled() |
| 415 | + expect(logError).toHaveBeenCalledWith(error) |
| 416 | + }) |
| 417 | + |
| 418 | + test("'unlink' event logs error when watchChange throws", async () => { |
| 419 | + const { promise, resolve } = promiseWithResolvers<void>() |
| 420 | + const error = new Error('async watchChange error') |
| 421 | + |
| 422 | + const logError = vi.fn() |
| 423 | + const logger = createLogger('error') |
| 424 | + logger.error = (...args) => { |
| 425 | + logError(...args) |
| 426 | + resolve() |
| 427 | + } |
| 428 | + |
| 429 | + const server = await createServerWithPlugin( |
| 430 | + { |
| 431 | + name: 'test', |
| 432 | + watchChange() { |
| 433 | + return Promise.reject(error) |
| 434 | + }, |
| 435 | + }, |
| 436 | + logger, |
| 437 | + ) |
| 438 | + |
| 439 | + server.watcher.emit( |
| 440 | + 'unlink', |
| 441 | + path.resolve(import.meta.dirname, 'some-file.js'), |
| 442 | + ) |
| 443 | + |
| 444 | + await promise |
| 445 | + expect(logError).toHaveBeenCalled() |
| 446 | + expect(logError).toHaveBeenCalledWith(error) |
| 447 | + }) |
| 448 | +}) |
0 commit comments