diff --git a/src/annotator/guest.coffee b/src/annotator/guest.coffee index 1a2e04173de..9e053e92daa 100644 --- a/src/annotator/guest.coffee +++ b/src/annotator/guest.coffee @@ -7,6 +7,7 @@ Delegator = require('./delegator') $ = require('jquery') adder = require('./adder') +htmlAnchoring = require('./anchoring/html') highlighter = require('./highlighter') rangeUtil = require('./range-util') selections = require('./selections') @@ -37,7 +38,7 @@ module.exports = class Guest extends Delegator TextSelection: {} # Anchoring module - anchoring: require('./anchoring/html') + anchoring: null # Internal state plugins: null @@ -48,7 +49,7 @@ module.exports = class Guest extends Delegator html: adder: '' - constructor: (element, config) -> + constructor: (element, config, anchoring = htmlAnchoring) -> super this.adder = $(this.html.adder).appendTo(@element).hide() @@ -77,6 +78,8 @@ module.exports = class Guest extends Delegator # The "top" guest instance will have this as null since it's in a top frame not a sub frame this.frameIdentifier = config.subFrameIdentifier || null + this.anchoring = anchoring + cfOptions = config: config on: (event, handler) => diff --git a/src/annotator/plugin/test/cross-frame-test.coffee b/src/annotator/plugin/test/cross-frame-test.coffee index 84eaa6ba518..a895a71628a 100644 --- a/src/annotator/plugin/test/cross-frame-test.coffee +++ b/src/annotator/plugin/test/cross-frame-test.coffee @@ -1,7 +1,5 @@ -proxyquire = require('proxyquire') - Plugin = require('../../plugin') -CrossFrame = null +CrossFrame = require('../cross-frame') describe 'CrossFrame', -> fakeDiscovery = null @@ -41,16 +39,16 @@ describe 'CrossFrame', -> proxyDiscovery = sandbox.stub().returns(fakeDiscovery) proxyBridge = sandbox.stub().returns(fakeBridge) - CrossFrame = proxyquire('../cross-frame', { + CrossFrame.$imports.$mock({ '../plugin': Plugin, '../annotation-sync': proxyAnnotationSync, '../../shared/bridge': proxyBridge, '../../shared/discovery': proxyDiscovery }) - afterEach -> sandbox.restore() + CrossFrame.$imports.$restore() describe 'CrossFrame constructor', -> it 'instantiates the Discovery component', -> diff --git a/src/annotator/test/guest-test.coffee b/src/annotator/test/guest-test.coffee index 217703be43c..39ce085cbc5 100644 --- a/src/annotator/test/guest-test.coffee +++ b/src/annotator/test/guest-test.coffee @@ -1,5 +1,3 @@ -proxyquire = require('proxyquire') - adder = require('../adder') Observable = require('../util/observable').Observable Plugin = require('../plugin') @@ -8,9 +6,7 @@ Delegator = require('../delegator') $ = require('jquery') Delegator['@noCallThru'] = true -Guest = null -anchoring = {} -highlighter = {} +Guest = require('../guest') rangeUtil = null selections = null @@ -50,12 +46,15 @@ describe 'Guest', -> sandbox = sinon.sandbox.create() CrossFrame = null fakeCrossFrame = null + highlighter = null guestConfig = null + htmlAnchoring = null createGuest = (config={}) -> config = Object.assign({}, guestConfig, config) element = document.createElement('div') - return new Guest(element, config) + guest = new Guest(element, config) + return guest beforeEach -> sinon.stub(console, 'warn') @@ -67,10 +66,17 @@ describe 'Guest', -> } selections = null guestConfig = {pluginClasses: {}} + highlighter = { + highlightRange: sinon.stub() + removeHighlights: sinon.stub() + } + htmlAnchoring = { + anchor: sinon.stub() + } - Guest = proxyquire('../guest', { + Guest.$imports.$mock({ './adder': {Adder: FakeAdder}, - './anchoring/html': anchoring, + './anchoring/html': htmlAnchoring, './highlighter': highlighter, './range-util': rangeUtil, './selections': (document) -> @@ -97,6 +103,7 @@ describe 'Guest', -> afterEach -> sandbox.restore() console.warn.restore() + Guest.$imports.$restore() describe 'plugins', -> fakePlugin = null @@ -478,7 +485,7 @@ describe 'Guest', -> {selector: [{type: 'TextQuoteSelector', exact: 'hello'}]}, ] } - sandbox.stub(anchoring, 'anchor').returns(Promise.resolve(range)) + htmlAnchoring.anchor.returns(Promise.resolve(range)) guest.anchor(annotation).then -> assert.isFalse(annotation.$orphan) @@ -491,7 +498,7 @@ describe 'Guest', -> {selector: [{type: 'TextQuoteSelector', exact: 'hello'}]}, ] } - sandbox.stub(anchoring, 'anchor') + htmlAnchoring.anchor .onFirstCall().returns(Promise.reject()) .onSecondCall().returns(Promise.resolve(range)) @@ -505,7 +512,7 @@ describe 'Guest', -> {selector: [{type: 'TextQuoteSelector', exact: 'notinhere'}]}, ] } - sandbox.stub(anchoring, 'anchor').returns(Promise.reject()) + htmlAnchoring.anchor.returns(Promise.reject()) guest.anchor(annotation).then -> assert.isTrue(annotation.$orphan) @@ -518,7 +525,7 @@ describe 'Guest', -> {selector: [{type: 'TextQuoteSelector', exact: 'neitherami'}]}, ] } - sandbox.stub(anchoring, 'anchor').returns(Promise.reject()) + htmlAnchoring.anchor.returns(Promise.reject()) guest.anchor(annotation).then -> assert.isTrue(annotation.$orphan) @@ -532,7 +539,7 @@ describe 'Guest', -> } # This shouldn't be called, but if it is, we successfully anchor so that # this test is guaranteed to fail. - sandbox.stub(anchoring, 'anchor').returns(Promise.resolve(range)) + htmlAnchoring.anchor.returns(Promise.resolve(range)) guest.anchor(annotation).then -> assert.isTrue(annotation.$orphan) @@ -544,10 +551,9 @@ describe 'Guest', -> {selector: [{type: 'TextPositionSelector', start: 0, end: 5}]}, ] } - sandbox.spy(anchoring, 'anchor') guest.anchor(annotation).then -> - assert.notCalled(anchoring.anchor) + assert.notCalled(htmlAnchoring.anchor) it 'updates the cross frame and bucket bar plugins', () -> guest = createGuest() @@ -563,8 +569,8 @@ describe 'Guest', -> it 'returns a promise of the anchors for the annotation', () -> guest = createGuest() highlights = [document.createElement('span')] - sandbox.stub(anchoring, 'anchor').returns(Promise.resolve(range)) - sandbox.stub(highlighter, 'highlightRange').returns(highlights) + htmlAnchoring.anchor.returns(Promise.resolve(range)) + highlighter.highlightRange.returns(highlights) target = {selector: [{type: 'TextQuoteSelector', exact: 'hello'}]} return guest.anchor({target: [target]}).then (anchors) -> assert.equal(anchors.length, 1) @@ -572,8 +578,8 @@ describe 'Guest', -> it 'adds the anchor to the "anchors" instance property"', () -> guest = createGuest() highlights = [document.createElement('span')] - sandbox.stub(anchoring, 'anchor').returns(Promise.resolve(range)) - sandbox.stub(highlighter, 'highlightRange').returns(highlights) + htmlAnchoring.anchor.returns(Promise.resolve(range)) + highlighter.highlightRange.returns(highlights) target = {selector: [{type: 'TextQuoteSelector', exact: 'hello'}]} annotation = {target: [target]} return guest.anchor(annotation).then -> @@ -589,7 +595,7 @@ describe 'Guest', -> highlights = [] guest = createGuest() guest.anchors = [{annotation, target, highlights}] - removeHighlights = sandbox.stub(highlighter, 'removeHighlights') + removeHighlights = highlighter.removeHighlights return guest.anchor(annotation).then -> assert.equal(guest.anchors.length, 0) @@ -599,11 +605,11 @@ describe 'Guest', -> it 'does not reanchor targets that are already anchored', () -> guest = createGuest() annotation = target: [{selector: [{type: 'TextQuoteSelector', exact: 'hello'}]}] - stub = sandbox.stub(anchoring, 'anchor').returns(Promise.resolve(range)) + htmlAnchoring.anchor.returns(Promise.resolve(range)) return guest.anchor(annotation).then -> guest.anchor(annotation).then -> assert.equal(guest.anchors.length, 1) - assert.calledOnce(stub) + assert.calledOnce(htmlAnchoring.anchor) describe '#detach()', -> it 'removes the anchors from the "anchors" instance variable', -> @@ -636,7 +642,7 @@ describe 'Guest', -> guest = createGuest() annotation = {} highlights = [document.createElement('span')] - removeHighlights = sandbox.stub(highlighter, 'removeHighlights') + removeHighlights = highlighter.removeHighlights guest.anchors.push({annotation, highlights}) guest.deleteAnnotation(annotation) diff --git a/src/annotator/test/host-test.coffee b/src/annotator/test/host-test.coffee index 91fd3df6b44..30d532e0632 100644 --- a/src/annotator/test/host-test.coffee +++ b/src/annotator/test/host-test.coffee @@ -1,5 +1,4 @@ -proxyquire = require('proxyquire') -Host = proxyquire('../host', {}) +Host = require('../host') describe 'Host', -> sandbox = sinon.sandbox.create() diff --git a/src/annotator/test/integration/multi-frame-test.js b/src/annotator/test/integration/multi-frame-test.js index 4e7a9ef58a6..0abc9e1d518 100644 --- a/src/annotator/test/integration/multi-frame-test.js +++ b/src/annotator/test/integration/multi-frame-test.js @@ -1,9 +1,9 @@ 'use strict'; -const proxyquire = require('proxyquire'); const isLoaded = require('../../util/frame-util').isLoaded; const FRAME_DEBOUNCE_WAIT = require('../../frame-observer').DEBOUNCE_WAIT + 10; +const CrossFrame = require('../../plugin/cross-frame'); describe('CrossFrame multi-frame scenario', function() { let fakeAnnotationSync; @@ -30,7 +30,7 @@ describe('CrossFrame multi-frame scenario', function() { proxyAnnotationSync = sandbox.stub().returns(fakeAnnotationSync); proxyBridge = sandbox.stub().returns(fakeBridge); - const CrossFrame = proxyquire('../../plugin/cross-frame', { + CrossFrame.$imports.$mock({ '../annotation-sync': proxyAnnotationSync, '../../shared/bridge': proxyBridge, }); @@ -53,6 +53,8 @@ describe('CrossFrame multi-frame scenario', function() { sandbox.restore(); crossFrame.destroy(); container.parentNode.removeChild(container); + + CrossFrame.$imports.$restore(); }); it('detects frames on page', function() { diff --git a/src/annotator/test/sidebar-test.coffee b/src/annotator/test/sidebar-test.coffee index c0c8eafc281..dbd5e65719a 100644 --- a/src/annotator/test/sidebar-test.coffee +++ b/src/annotator/test/sidebar-test.coffee @@ -1,11 +1,6 @@ events = require('../../shared/bridge-events') -proxyquire = require('proxyquire') - -rafStub = (fn) -> - fn() - -Sidebar = proxyquire('../sidebar', { raf: rafStub }) +Sidebar = require('../sidebar') DEFAULT_WIDTH = 350 DEFAULT_HEIGHT = 600 @@ -17,6 +12,14 @@ describe 'Sidebar', -> fakeCrossFrame = null sidebarConfig = {pluginClasses: {}} + before -> + rafStub = (fn) -> + fn() + Sidebar.$imports.$mock({ raf: rafStub }) + + after -> + Sidebar.$imports.$restore() + createSidebar = (config={}) -> config = Object.assign({}, sidebarConfig, config) element = document.createElement('div')