From 8743298c4c8a02e2ce2f33159b07c6807ab28d28 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 11 May 2017 17:59:40 -0600 Subject: [PATCH] Avoid polluting test with click events on the test runner We now pass an isolated document into the AtomEnvironment instance under test to avoid accidentally handling clicks on the test runner itself. --- spec/atom-environment-spec.coffee | 68 +++++++++++++++++++++---------- src/atom-environment.coffee | 2 +- 2 files changed, 48 insertions(+), 22 deletions(-) diff --git a/spec/atom-environment-spec.coffee b/spec/atom-environment-spec.coffee index ed27b00c9..a955d2cda 100644 --- a/spec/atom-environment-spec.coffee +++ b/spec/atom-environment-spec.coffee @@ -221,44 +221,70 @@ describe "AtomEnvironment", -> atom.loadState().then (state) -> expect(state).toEqual(serializedState) it "saves state when the CPU is idle after a keydown or mousedown event", -> - spyOn(atom, 'saveState') + atomEnv = new AtomEnvironment({ + applicationDelegate: global.atom.applicationDelegate, + }) idleCallbacks = [] - spyOn(window, 'requestIdleCallback').andCallFake (callback) -> idleCallbacks.push(callback) + atomEnv.initialize({ + window: { + requestIdleCallback: (callback) -> idleCallbacks.push(callback), + addEventListener: () -> + removeEventListener: () -> + }, + document: document.implementation.createHTMLDocument() + }) + + spyOn(atomEnv, 'saveState') keydown = new KeyboardEvent('keydown') - atom.document.dispatchEvent(keydown) - advanceClock atom.saveStateDebounceInterval + atomEnv.document.dispatchEvent(keydown) + advanceClock atomEnv.saveStateDebounceInterval idleCallbacks.shift()() - expect(atom.saveState).toHaveBeenCalledWith({isUnloading: false}) - expect(atom.saveState).not.toHaveBeenCalledWith({isUnloading: true}) + expect(atomEnv.saveState).toHaveBeenCalledWith({isUnloading: false}) + expect(atomEnv.saveState).not.toHaveBeenCalledWith({isUnloading: true}) - atom.saveState.reset() + atomEnv.saveState.reset() mousedown = new MouseEvent('mousedown') - atom.document.dispatchEvent(mousedown) - advanceClock atom.saveStateDebounceInterval + atomEnv.document.dispatchEvent(mousedown) + advanceClock atomEnv.saveStateDebounceInterval idleCallbacks.shift()() - expect(atom.saveState).toHaveBeenCalledWith({isUnloading: false}) - expect(atom.saveState).not.toHaveBeenCalledWith({isUnloading: true}) + expect(atomEnv.saveState).toHaveBeenCalledWith({isUnloading: false}) + expect(atomEnv.saveState).not.toHaveBeenCalledWith({isUnloading: true}) + + atomEnv.destroy() it "ignores mousedown/keydown events happening after calling unloadEditorWindow", -> - spyOn(atom, 'saveState') + atomEnv = new AtomEnvironment({ + applicationDelegate: global.atom.applicationDelegate, + }) idleCallbacks = [] - spyOn(window, 'requestIdleCallback').andCallFake (callback) -> idleCallbacks.push(callback) + atomEnv.initialize({ + window: { + requestIdleCallback: (callback) -> idleCallbacks.push(callback), + addEventListener: () -> + removeEventListener: () -> + }, + document: document.implementation.createHTMLDocument() + }) + + spyOn(atomEnv, 'saveState') mousedown = new MouseEvent('mousedown') - atom.document.dispatchEvent(mousedown) - atom.unloadEditorWindow() - expect(atom.saveState).not.toHaveBeenCalled() + atomEnv.document.dispatchEvent(mousedown) + atomEnv.unloadEditorWindow() + expect(atomEnv.saveState).not.toHaveBeenCalled() - advanceClock atom.saveStateDebounceInterval + advanceClock atomEnv.saveStateDebounceInterval idleCallbacks.shift()() - expect(atom.saveState).not.toHaveBeenCalled() + expect(atomEnv.saveState).not.toHaveBeenCalled() mousedown = new MouseEvent('mousedown') - atom.document.dispatchEvent(mousedown) - advanceClock atom.saveStateDebounceInterval + atomEnv.document.dispatchEvent(mousedown) + advanceClock atomEnv.saveStateDebounceInterval idleCallbacks.shift()() - expect(atom.saveState).not.toHaveBeenCalled() + expect(atomEnv.saveState).not.toHaveBeenCalled() + + atomEnv.destroy() it "serializes the project state with all the options supplied in saveState", -> spyOn(atom.project, 'serialize').andReturn({foo: 42}) diff --git a/src/atom-environment.coffee b/src/atom-environment.coffee index 88c200f93..a283608d9 100644 --- a/src/atom-environment.coffee +++ b/src/atom-environment.coffee @@ -264,7 +264,7 @@ class AtomEnvironment extends Model attachSaveStateListeners: -> saveState = _.debounce((=> - window.requestIdleCallback => @saveState({isUnloading: false}) unless @unloaded + @window.requestIdleCallback => @saveState({isUnloading: false}) unless @unloaded ), @saveStateDebounceInterval) @document.addEventListener('mousedown', saveState, true) @document.addEventListener('keydown', saveState, true)