Skip to content

Commit 0582fa2

Browse files
committed
Fix undefined target element does not throw
When `assert.dom(undefined)` is called, it incorrectly defaults to the root element instead of throwing `TypeError: Unexpected Parameter: undefined`. This means code like `assert.dom(findAll('.foo')[0]).exists()` silently passes even when `.foo` doesn't exist (because `findAll` returns an empty array, and `array[0]` is `undefined`). PR#2107 changed the argument detection logic from `arguments.length === 0` to `target !== undefined`, which cannot distinguish between "no argument" and passing "undefined". This behavior was not caught by tests because tests only used mock implementation of assert.dom. This commit restores the original behavior that correctly distinguishes passing no arguments and passing undefined and adds a test to ensure passing undefined throws an error as expected. Addresses: #2186
1 parent 3d26080 commit 0582fa2

4 files changed

Lines changed: 15 additions & 7 deletions

File tree

packages/qunit-dom/lib/assertions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export default class DOMAssertions {
5454
* @hideconstructor
5555
*/
5656
constructor(
57-
target: string | Element | null | IDOMElementDescriptor,
57+
target: string | Element | null | IDOMElementDescriptor | undefined,
5858
rootElement: RootElement,
5959
private testContext: Assert
6060
) {

packages/qunit-dom/lib/descriptor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class ElementData {
4747
* Create an {@link IDOMElementDescriptor} from a target and a root element
4848
*/
4949
export default function createDescriptor(
50-
target: string | Element | null | IDOMElementDescriptor,
50+
target: string | Element | null | IDOMElementDescriptor | undefined,
5151
rootElement: RootElement
5252
): IDOMElementDescriptor {
5353
if (typeof target === 'string') {

packages/qunit-dom/lib/install.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,13 @@ export default function (assert: Assert) {
2525

2626
rootElement = rootElement || this.dom.rootElement || getRootElement();
2727

28-
return new DOMAssertions(
29-
target !== undefined ? target : rootElement instanceof Element ? rootElement : null,
30-
rootElement,
31-
this
32-
);
28+
// Only default to rootElement when NO arguments provided.
29+
// This allows assert.dom(undefined) to throw while assert.dom() still works.
30+
if (arguments.length === 0) {
31+
target = rootElement instanceof Element ? rootElement : null;
32+
}
33+
34+
return new DOMAssertions(target, rootElement, this);
3335
};
3436

3537
function isValidRootElement(element: any): element is Element {

packages/test-app/tests/acceptance/qunit-dom-test.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,11 @@ module('Acceptance | qunit-dom', function (hooks) {
5151
() => assert.dom('foo', 'bar'),
5252
/bar is not a valid root element/,
5353
);
54+
55+
assert.throws(
56+
() => assert.dom(undefined),
57+
/Unexpected Parameter: undefined/,
58+
'assert.dom(undefined) throws',
59+
);
5460
});
5561
});

0 commit comments

Comments
 (0)