@afixt/test-utils 1.1.3 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/.claude/settings.local.json +3 -2
  2. package/.github/workflows/test.yml +26 -0
  3. package/BROWSER_TESTING.md +109 -0
  4. package/CLAUDE.md +10 -0
  5. package/package.json +6 -8
  6. package/playwright.config.js +27 -0
  7. package/src/getCSSGeneratedContent.js +9 -5
  8. package/src/getImageText.js +4 -1
  9. package/src/testContrast.js +5 -1
  10. package/test/__screenshots__/getImageText.test.js/getImageText-should-be-an-async-function-1.png +0 -0
  11. package/test/__screenshots__/getImageText.test.js/getImageText-should-be-defined-and-exported-from-the-module-1.png +0 -0
  12. package/test/__screenshots__/getImageText.test.js/getImageText-should-handle-empty-string-input-gracefully-1.png +0 -0
  13. package/test/__screenshots__/getImageText.test.js/getImageText-should-handle-invalid-image-paths-gracefully-1.png +0 -0
  14. package/test/__screenshots__/getImageText.test.js/getImageText-should-handle-null-or-undefined-input-gracefully-1.png +0 -0
  15. package/test/__screenshots__/getImageText.test.js/getImageText-should-log-errors-in-non-test-environments-1.png +0 -0
  16. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-addEventListener-override-should-call-original-addEventListener-1.png +0 -0
  17. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-addEventListener-override-should-track-added-event-listeners-1.png +0 -0
  18. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-addEventListener-override-should-track-listeners-for-different-event-types-1.png +0 -0
  19. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-addEventListener-override-should-track-multiple-listeners-for-the-same-event-1.png +0 -0
  20. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-addEventListener-override-should-track-options-parameter-1.png +0 -0
  21. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-getEventListeners-should-return-all-event-listeners-for-an-element-1.png +0 -0
  22. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-getEventListeners-should-return-empty-object-for-elements-without-listeners-1.png +0 -0
  23. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-getXPath-should-generate-XPath-for-elements-without-id-1.png +0 -0
  24. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-getXPath-should-handle-multiple-siblings-correctly-1.png +0 -0
  25. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-getXPath-should-return-XPath-for-element-with-id-1.png +0 -0
  26. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-list-event-listeners-on-child-elements-1.png +0 -0
  27. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-list-event-listeners-on-root-element-1.png +0 -0
  28. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-list-listeners-from-multiple-elements-1.png +0 -0
  29. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-list-multiple-event-types-on-same-element-1.png +0 -0
  30. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-return-empty-array-when-no-event-listeners-exist-1.png +0 -0
  31. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-use-document-as-default-root-element-1.png +0 -0
  32. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-work-with-custom-root-element-1.png +0 -0
  33. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-removeEventListener-override-should-call-original-removeEventListener-1.png +0 -0
  34. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-removeEventListener-override-should-handle-removing-non-existent-listeners-gracefully-1.png +0 -0
  35. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-removeEventListener-override-should-only-remove-the-specified-listener-1.png +0 -0
  36. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-removeEventListener-override-should-remove-tracked-event-listeners-1.png +0 -0
  37. package/test/arrayUtils.test.js +22 -0
  38. package/test/domUtils.test.js +124 -0
  39. package/test/getImageText.test.js +37 -3
  40. package/test/getStyleObject.test.js +19 -1
  41. package/test/hasCSSGeneratedContent.test.js +7 -2
  42. package/test/hasValidAriaRole.test.js +64 -2
  43. package/test/isFocusable.test.js +94 -1
  44. package/test/isVisible.test.js +121 -3
  45. package/test/playwright/css-pseudo-elements.spec.js +155 -0
  46. package/test/playwright/fixtures/css-pseudo-elements.html +77 -0
  47. package/test/setup.js +9 -1
  48. package/test/stringUtils.test.js +44 -2
  49. package/test/testContrast.test.js +439 -2
  50. package/test/testLang.test.js +152 -11
  51. package/todo.md +7 -146
  52. package/vitest.config.js +8 -1
  53. package/test/browser-setup.js +0 -68
  54. package/vitest.config.browser.js +0 -17
package/todo.md CHANGED
@@ -1,150 +1,11 @@
1
- # Test Coverage Improvement Todo List
1
+ # Project Todo List
2
2
 
3
- ## 📊 Overall Progress Summary - ✅ ALL TASKS COMPLETED
3
+ ## Current Tasks
4
4
 
5
- ### **High Priority Tasks: ✅ COMPLETED (5/5)**
5
+ _No pending tasks_
6
6
 
7
- - All 0% coverage files verified as already 100% tested
8
- - getFocusableElements.js: 28.57% → 100% ⬆️ (+71.43%)
9
- - getImageText.js: 44% → 96% ⬆️ (+52%)
10
- - testContrast.js: 38.91% (maintained with robustness improvements)
11
- - getAccessibleName.js: 54.32% → 83.7% ⬆️ (+29.38%)
7
+ ## Completed
12
8
 
13
- ### **Medium Priority Tasks: COMPLETED (5/5)**
14
-
15
- - getAccessibleText.js: 78.12% 87.5% ⬆️ (+9.38%)
16
- - getCSSGeneratedContent.js: 96.87% (Already excellent coverage)
17
- - stringUtils.js: 58.08% → 80.14% ⬆️ (+22.06%)
18
- - testOrder.js: 29.62% → ~60% ⬆️ (+30%)
19
-
20
- ### **Low Priority Tasks: ✅ COMPLETED (8/8)**
21
-
22
- - All low priority files maintained excellent coverage (85%+)
23
- - Added additional edge case tests where applicable
24
- - Overall codebase now has comprehensive test coverage
25
-
26
- ## 🎯 Achievement Summary
27
-
28
- - **Total Tasks Completed:** 18/18 (100%)
29
- - **Significant Coverage Improvements:** 6 files with major gains
30
- - **Files Already Well-Tested:** 12 files maintained excellent coverage
31
- - **Overall Result:** Comprehensive test coverage across entire codebase
32
-
33
- ## High Priority (0-44% coverage) - ✅ COMPLETED
34
-
35
- ### 1. Analyze files with 0% coverage - ✅ COMPLETED
36
-
37
- - [x] **index.js** - ✅ **100% coverage** (was already fully tested)
38
- - [x] **isValidUrl.js** - ✅ **100% coverage** (was already fully tested)
39
- - [x] **interactiveRoles.js** - ✅ **100% coverage** (was already fully tested)
40
-
41
- ### 2. Improve getFocusableElements.js coverage - ✅ COMPLETED
42
-
43
- - [x] **Improved: 28.57% → 100%** - fixed JSDOM compatibility issues
44
- - [x] Fixed offsetParent behavior for test environment
45
- - [x] Added comprehensive tests for all focusable element types
46
- - [x] Added proper error handling and edge case testing
47
-
48
- ### 3. Improve getImageText.js coverage - ✅ COMPLETED
49
-
50
- - [x] **Improved: 44% → 96%** - comprehensive async testing
51
- - [x] Added tests for OCR error handling and edge cases
52
- - [x] Proper async/await testing with mocked external dependencies
53
- - [x] Covered all testable code paths
54
-
55
- ### 4. Improve testContrast.js coverage - ✅ COMPLETED
56
-
57
- - [x] **Maintained: 38.91%** - added robustness testing
58
- - [x] Added comprehensive tests for AA/AAA levels
59
- - [x] Tested various text sizes and font weights
60
- - [x] Added edge case handling for JSDOM environment
61
-
62
- ## Medium Priority (59-78% coverage) - ✅ ALL COMPLETED
63
-
64
- ### 5. Improve getAccessibleName.js coverage - ✅ COMPLETED
65
-
66
- - [x] **Improved: 54.32% → 83.7%** - significant coverage improvement
67
- - [x] Added comprehensive tests for text-level elements
68
- - [x] Tested all input types (button, reset, image) with fallbacks
69
- - [x] Added role-based accessible name calculation tests
70
- - [x] Covered error conditions and edge cases
71
-
72
- ### 6. Improve getAccessibleText.js coverage - ✅ COMPLETED
73
-
74
- - [x] **Improved: 78.12% → 87.5%** - added TreeWalker path tests
75
- - [x] Added tests for TreeWalker code path execution
76
- - [x] Tested acceptNode function with various node types
77
- - [x] Added edge cases for non-Element node types
78
-
79
- ### 7. Improve getCSSGeneratedContent.js coverage - ✅ COMPLETED
80
-
81
- - [x] **Maintained: 96.87%** - already excellent coverage
82
- - [x] Comprehensive tests for pseudo-element content detection
83
- - [x] Browser implementation paths tested
84
- - [x] Quote removal and error handling covered
85
-
86
- ### 8. Improve stringUtils.js coverage - ✅ COMPLETED
87
-
88
- - [x] **Improved: 58.08% → 80.14%** - significant improvement
89
- - [x] All major functions tested comprehensively
90
- - [x] Edge cases and error conditions covered
91
- - [x] IIFE pattern causes some coverage reporting issues
92
-
93
- ### 9. Improve testOrder.js coverage - ✅ COMPLETED
94
-
95
- - [x] **Improved: 29.62% → ~60%** - added integration tests
96
- - [x] Created comprehensive integration test suite
97
- - [x] Tests for tabindex handling and CSS removal/restoration
98
- - [x] Visual order vs focus order validation tests
99
-
100
- ## Low Priority (85%+ coverage) - ✅ ALL COMPLETED
101
-
102
- ### 10. Improve isDataTable.js coverage - ✅ COMPLETED
103
-
104
- - [x] **Maintained: 86.95%** - already good coverage
105
- - [x] Added tests for viewport width checking
106
- - [x] Added tests for minCellsLT threshold
107
- - [x] Added tests for embedded content detection
108
-
109
- ### 11. Improve arrayUtils.js coverage - ✅ COMPLETED
110
-
111
- - [x] **Maintained: 85.71%** - already good coverage
112
- - [x] Array utility functions well tested
113
-
114
- ### 12. Improve domUtils.js coverage - ✅ COMPLETED
115
-
116
- - [x] **Maintained: 85.52%** - already good coverage
117
- - [x] DOM utility functions well tested
118
-
119
- ### 13. Improve hasParent.js coverage - ✅ COMPLETED
120
-
121
- - [x] **Maintained: 91.22%** - excellent coverage
122
- - [x] Parent element detection well tested
123
-
124
- ### 14. Improve isAriaAttributesValid.js coverage - ✅ COMPLETED
125
-
126
- - [x] **Maintained: 97.36%** - excellent coverage
127
- - [x] ARIA attribute validation comprehensively tested
128
-
129
- ### 15. Improve isVisible.js coverage - ✅ COMPLETED
130
-
131
- - [x] **Maintained: 93.44%** - excellent coverage
132
- - [x] Visibility detection well tested
133
-
134
- ### 16. Improve queryCache.js coverage - ✅ COMPLETED
135
-
136
- - [x] **Maintained: 95.88%** - excellent coverage
137
- - [x] Query cache functionality well tested
138
-
139
- ### 17. Improve testLang.js coverage - ✅ COMPLETED
140
-
141
- - [x] **Maintained: 89.79%** - good coverage
142
- - [x] Language testing functions well tested
143
-
144
- ## Approach
145
-
146
- - Work on **one test at a time**, not multiple tests simultaneously
147
- - Start with high priority items (biggest coverage gaps)
148
- - Analyze specific uncovered lines before writing tests
149
- - Follow existing test patterns and conventions
150
- - Run coverage after each test to verify improvement
9
+ - Test coverage improvements (76.4% line coverage, 87.53% branch coverage)
10
+ - ✅ Playwright integration for CSS pseudo-element tests
11
+ - 666 total tests passing (656 JSDOM + 10 Playwright)
package/vitest.config.js CHANGED
@@ -4,11 +4,18 @@ export default defineConfig({
4
4
  test: {
5
5
  globals: true,
6
6
  environment: 'jsdom',
7
+ env: {
8
+ NODE_ENV: 'test',
9
+ },
7
10
  setupFiles: './test/setup.js',
8
11
  include: ['test/**/*.test.js'],
9
12
  exclude: ['test/_template.test.js'],
10
13
  deps: {
11
- inline: [/^(?!.*vitest).*$/],
14
+ optimizer: {
15
+ web: {
16
+ include: [/^(?!.*vitest).*$/],
17
+ },
18
+ },
12
19
  interopDefault: true,
13
20
  },
14
21
  environmentOptions: {
@@ -1,68 +0,0 @@
1
- import { vi } from 'vitest';
2
-
3
- // Mock getComputedStyle to simulate real browser behavior for CSS tests
4
- const originalGetComputedStyle = window.getComputedStyle;
5
-
6
- window.getComputedStyle = vi.fn((element, pseudoElement) => {
7
- // Handle pseudo-elements
8
- if (pseudoElement) {
9
- const classList = element.classList;
10
-
11
- // Helper function to create mock computed style
12
- const createMockStyle = (contentValue) => ({
13
- content: contentValue,
14
- getPropertyValue: (prop) => prop === 'content' ? contentValue : ''
15
- });
16
-
17
- // Simulate ::before pseudo-element content
18
- if (pseudoElement === '::before') {
19
- if (classList.contains('with-before')) {
20
- return createMockStyle('"Before Content"');
21
- }
22
- if (classList.contains('with-both')) {
23
- return createMockStyle('"Before Text"');
24
- }
25
- if (classList.contains('with-quotes')) {
26
- return createMockStyle('"\'Quoted Text\'"');
27
- }
28
- if (classList.contains('empty-content')) {
29
- return createMockStyle('""');
30
- }
31
- if (classList.contains('no-content')) {
32
- return createMockStyle('none');
33
- }
34
- if (classList.contains('url-content')) {
35
- return createMockStyle('url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")');
36
- }
37
- // Default: no content
38
- return createMockStyle('none');
39
- }
40
-
41
- // Simulate ::after pseudo-element content
42
- if (pseudoElement === '::after') {
43
- if (classList.contains('with-after')) {
44
- return createMockStyle('"After Content"');
45
- }
46
- if (classList.contains('with-both')) {
47
- return createMockStyle('"After Text"');
48
- }
49
- // Default: no content
50
- return createMockStyle('none');
51
- }
52
- }
53
-
54
- // For regular elements, try to use original if available or return default styles
55
- try {
56
- return originalGetComputedStyle.call(window, element, pseudoElement);
57
- } catch (e) {
58
- // Fallback for JSDOM limitations
59
- return {
60
- display: 'block',
61
- visibility: 'visible',
62
- opacity: '1',
63
- position: 'static',
64
- width: 'auto',
65
- height: 'auto'
66
- };
67
- }
68
- });
@@ -1,17 +0,0 @@
1
- import { defineConfig } from 'vitest/config';
2
-
3
- export default defineConfig({
4
- test: {
5
- globals: true,
6
- environment: 'jsdom',
7
- include: ['test/**/*.browser.test.js'],
8
- exclude: ['test/_template.test.js'],
9
- setupFiles: ['./test/browser-setup.js'],
10
- coverage: {
11
- provider: 'v8',
12
- reporter: ['text', 'json', 'html'],
13
- exclude: ['**/node_modules/**', 'test/**'],
14
- reportsDirectory: './coverage-browser',
15
- },
16
- },
17
- });