From 51920795d5a1244674f7b762e86e1228bb692f84 Mon Sep 17 00:00:00 2001
From: Fawad Ali <m.fawaadali98@gmail.com>
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 <fawad.ali@mercateo.com>
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 <m.fawaadali98@gmail.com>
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