index.test.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /**
  2. * @vitest-environment node
  3. */
  4. import { describe, it, expect } from 'vitest';
  5. import { BaseOptions } from '../../src/types';
  6. import { E2ETestError } from '../../src/errors';
  7. import { DEFAULT_TIMEOUTS, SELECTOR_STRATEGIES } from '../../src/constants';
  8. describe('@d8d/e2e-test-utils 基础功能', () => {
  9. describe('类型定义', () => {
  10. it('应该正确导出 BaseOptions 类型', () => {
  11. const options: BaseOptions = { timeout: 1000 };
  12. expect(options.timeout).toBe(1000);
  13. });
  14. it('BaseOptions 应该支持可选属性', () => {
  15. const options: BaseOptions = {};
  16. expect(options.timeout).toBeUndefined();
  17. });
  18. });
  19. describe('错误类', () => {
  20. it('应该能够创建 E2ETestError 实例', () => {
  21. const error = new E2ETestError({
  22. operation: 'testOperation',
  23. target: 'testTarget',
  24. expected: 'expectedValue',
  25. actual: 'actualValue',
  26. });
  27. expect(error).toBeInstanceOf(Error);
  28. expect(error.name).toBe('E2ETestError');
  29. expect(error.context.operation).toBe('testOperation');
  30. expect(error.context.target).toBe('testTarget');
  31. });
  32. it('E2ETestError 应该包含格式化的错误消息', () => {
  33. const error = new E2ETestError({
  34. operation: 'selectOption',
  35. target: 'dropdown',
  36. expected: 'Option A',
  37. actual: 'Option B',
  38. });
  39. expect(error.message).toContain('selectOption failed');
  40. expect(error.message).toContain('dropdown');
  41. });
  42. it('E2ETestError 应该包含可用选项列表', () => {
  43. const error = new E2ETestError({
  44. operation: 'selectOption',
  45. target: 'dropdown',
  46. expected: 'Option A',
  47. actual: 'Option B',
  48. available: ['Option A', 'Option B', 'Option C'],
  49. });
  50. expect(error.message).toContain('Available: Option A, Option B, Option C');
  51. });
  52. it('E2ETestError 应该包含修复建议', () => {
  53. const error = new E2ETestError({
  54. operation: 'selectOption',
  55. target: 'dropdown',
  56. expected: 'Option A',
  57. actual: 'Option B',
  58. suggestion: '检查选项值是否正确拼写',
  59. });
  60. expect(error.message).toContain('💡 检查选项值是否正确拼写');
  61. });
  62. it('E2ETestError 应该支持自定义消息', () => {
  63. const customMessage = '自定义错误消息';
  64. const error = new E2ETestError(
  65. {
  66. operation: 'testOperation',
  67. target: 'testTarget',
  68. },
  69. customMessage
  70. );
  71. expect(error.message).toBe(customMessage);
  72. });
  73. it('E2ETestError 应该处理最小上下文', () => {
  74. const error = new E2ETestError({
  75. operation: 'clickElement',
  76. target: '[data-testid="button"]',
  77. });
  78. expect(error.message).toContain('clickElement failed');
  79. expect(error.message).toContain('Target: [data-testid="button"]');
  80. });
  81. it('E2ETestError 应该包含完整的错误上下文', () => {
  82. const error = new E2ETestError({
  83. operation: 'selectRadixOption',
  84. target: '残疾类型',
  85. expected: '视力残疾',
  86. actual: '听力残疾',
  87. available: ['视力残疾', '听力残疾', '肢体残疾'],
  88. suggestion: '确认选项值是否正确',
  89. });
  90. expect(error.message).toContain('❌ selectRadixOption failed');
  91. expect(error.message).toContain('Target: 残疾类型');
  92. expect(error.message).toContain('Expected: 视力残疾');
  93. expect(error.message).toContain('Actual: 听力残疾');
  94. expect(error.message).toContain('Available: 视力残疾, 听力残疾, 肢体残疾');
  95. expect(error.message).toContain('💡 确认选项值是否正确');
  96. });
  97. });
  98. describe('常量定义', () => {
  99. it('DEFAULT_TIMEOUTS 应该包含所有必需的超时配置', () => {
  100. expect(DEFAULT_TIMEOUTS.static).toBeDefined();
  101. expect(DEFAULT_TIMEOUTS.async).toBeDefined();
  102. expect(DEFAULT_TIMEOUTS.networkIdle).toBeDefined();
  103. expect(DEFAULT_TIMEOUTS.static).toBe(2000);
  104. expect(DEFAULT_TIMEOUTS.async).toBe(5000);
  105. expect(DEFAULT_TIMEOUTS.networkIdle).toBe(10000);
  106. });
  107. it('SELECTOR_STRATEGIES 应该包含所有策略', () => {
  108. expect(SELECTOR_STRATEGIES).toContain('data-testid');
  109. expect(SELECTOR_STRATEGIES).toContain('aria-label + role');
  110. expect(SELECTOR_STRATEGIES).toContain('text content + role');
  111. expect(SELECTOR_STRATEGIES).toHaveLength(3);
  112. });
  113. });
  114. describe('Vitest 配置验证', () => {
  115. it('当前测试应该正常运行', () => {
  116. expect(true).toBe(true);
  117. });
  118. it('Vitest 应该支持 TypeScript', () => {
  119. const value: string = 'TypeScript support verified';
  120. expect(value).toBe('TypeScript support verified');
  121. });
  122. });
  123. });