From 51920795d5a1244674f7b762e86e1228bb692f84 Mon Sep 17 00:00:00 2001 From: Fawad Ali Date: Mon, 30 Aug 2021 23:29:23 +0500 Subject: [PATCH 1/3] feat(fireEvent): make read-only event target properties definable for testing --- src/events.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/events.js b/src/events.js index b964f305..1fb960dc 100644 --- a/src/events.js +++ b/src/events.js @@ -45,7 +45,16 @@ function createEvent( value: files, }) } - Object.assign(node, targetProperties) + + const modifiableProperties = {} + Object.keys(targetProperties).forEach(key => { + modifiableProperties[key] = { + value: targetProperties[key], + writable: true, + } + }) + Object.defineProperties(node, modifiableProperties) + const window = getWindowFromNode(node) const EventConstructor = window[EventType] || window.Event let event From eb800afac52d5ff042d2153b0309aac39d4f5390 Mon Sep 17 00:00:00 2001 From: Fawad Ali Date: Tue, 31 Aug 2021 16:40:35 +0200 Subject: [PATCH 2/3] test(fireEvent): add test spec for read-only target properties --- src/__tests__/events.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/__tests__/events.js b/src/__tests__/events.js index 8f8ea563..5ff0118d 100644 --- a/src/__tests__/events.js +++ b/src/__tests__/events.js @@ -376,6 +376,16 @@ test('assigns clipboardData properties', () => { expect(clipboardData.getData('text')).toBe('example') }) +test('assigns read-only target properties', () => { + const node = document.createElement('div') + const spy = jest.fn() + node.addEventListener('scroll', spy) + + expect(node.scrollWidth).toBe(0) + fireEvent.scroll(node, {target: {scrollWidth: 10}}) + expect(node.scrollWidth).toBe(10) +}) + test('fires events on Window', () => { const messageSpy = jest.fn() window.addEventListener('message', messageSpy) From b901f7ff9fc7b4cc938d8e3003be7b90e094de69 Mon Sep 17 00:00:00 2001 From: Fawad Ali Date: Mon, 26 Sep 2022 22:54:05 +0500 Subject: [PATCH 3/3] feat(fireEvent): improve code for definable read-only properties --- src/__tests__/events.js | 2 ++ src/events.js | 7 +++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/__tests__/events.js b/src/__tests__/events.js index 5ff0118d..b79cea35 100644 --- a/src/__tests__/events.js +++ b/src/__tests__/events.js @@ -383,6 +383,8 @@ test('assigns read-only target properties', () => { expect(node.scrollWidth).toBe(0) fireEvent.scroll(node, {target: {scrollWidth: 10}}) + + expect(spy).toHaveBeenCalledTimes(1) expect(node.scrollWidth).toBe(10) }) diff --git a/src/events.js b/src/events.js index 1fb960dc..aba4f7b4 100644 --- a/src/events.js +++ b/src/events.js @@ -46,14 +46,13 @@ function createEvent( }) } - const modifiableProperties = {} + // Make read-only properties of events specifiable for tests. Object.keys(targetProperties).forEach(key => { - modifiableProperties[key] = { + Object.defineProperty(node, key, { value: targetProperties[key], writable: true, - } + }) }) - Object.defineProperties(node, modifiableProperties) const window = getWindowFromNode(node) const EventConstructor = window[EventType] || window.Event