setup-vitest.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import type { MockInstance } from 'vitest'
  2. vi.stubGlobal('MathMLElement', class MathMLElement {})
  3. expect.extend({
  4. toHaveBeenWarned(received: string) {
  5. asserted.add(received)
  6. const passed = warn.mock.calls.some(args => args[0].includes(received))
  7. if (passed) {
  8. return {
  9. pass: true,
  10. message: () => `expected "${received}" not to have been warned.`,
  11. }
  12. } else {
  13. const msgs = warn.mock.calls.map(args => args[0]).join('\n - ')
  14. return {
  15. pass: false,
  16. message: () =>
  17. `expected "${received}" to have been warned` +
  18. (msgs.length
  19. ? `.\n\nActual messages:\n\n - ${msgs}`
  20. : ` but no warning was recorded.`),
  21. }
  22. }
  23. },
  24. toHaveBeenWarnedLast(received: string) {
  25. asserted.add(received)
  26. const passed =
  27. warn.mock.calls[warn.mock.calls.length - 1][0].includes(received)
  28. if (passed) {
  29. return {
  30. pass: true,
  31. message: () => `expected "${received}" not to have been warned last.`,
  32. }
  33. } else {
  34. const msgs = warn.mock.calls.map(args => args[0]).join('\n - ')
  35. return {
  36. pass: false,
  37. message: () =>
  38. `expected "${received}" to have been warned last.\n\nActual messages:\n\n - ${msgs}`,
  39. }
  40. }
  41. },
  42. toHaveBeenWarnedTimes(received: string, n: number) {
  43. asserted.add(received)
  44. let found = 0
  45. warn.mock.calls.forEach(args => {
  46. if (args[0].includes(received)) {
  47. found++
  48. }
  49. })
  50. if (found === n) {
  51. return {
  52. pass: true,
  53. message: () => `expected "${received}" to have been warned ${n} times.`,
  54. }
  55. } else {
  56. return {
  57. pass: false,
  58. message: () =>
  59. `expected "${received}" to have been warned ${n} times but got ${found}.`,
  60. }
  61. }
  62. },
  63. })
  64. let warn: MockInstance
  65. const asserted: Set<string> = new Set()
  66. beforeEach(() => {
  67. asserted.clear()
  68. warn = vi.spyOn(console, 'warn')
  69. warn.mockImplementation(() => {})
  70. })
  71. afterEach(() => {
  72. const assertedArray = Array.from(asserted)
  73. const nonAssertedWarnings = warn.mock.calls
  74. .map(args => args[0])
  75. .filter(received => {
  76. return !assertedArray.some(assertedMsg => {
  77. return received.includes(assertedMsg)
  78. })
  79. })
  80. warn.mockRestore()
  81. if (nonAssertedWarnings.length) {
  82. throw new Error(
  83. `test case threw unexpected warnings:\n - ${nonAssertedWarnings.join(
  84. '\n - ',
  85. )}`,
  86. )
  87. }
  88. })