UNPKG

box-chrome-sdk

Version:

A Chrome App SDK for the Box V2 API

98 lines (91 loc) 4.64 kB
/*jshint expr: true*/ describe('rx.extensions', function() { describe('fromChromeCallback()', function() { var callback, mocks, observer; beforeEach(function() { mocks = sinon.sandbox.create(); observer = mocks.spy(); callback = mocks.stub(); if (!chrome.runtime) { chrome.runtime = {}; } }); afterEach(function() { mocks.restore(); if (chrome.runtime) { chrome.runtime.lastError = undefined; } }); it('should return an observable that calls the passed function', function() { callback.yields('foo'); Rx.Observable.fromChromeCallback(callback)('foo', 'bar').subscribe(observer); expect(callback).to.have.been.calledOnce.and.to.have.been.calledWith('foo', 'bar'); expect(observer).to.have.been.calledOnce.and.to.have.been.calledWithExactly('foo'); }); it('should return an observable that calls schedule on the passed scheduler', function() { var scheduler = mocks.stub(Rx.Scheduler.immediate); scheduler.schedule.yields(); callback.yields('foo'); Rx.Observable.fromChromeCallback(callback, scheduler)().subscribe(observer); expect(callback).to.have.been.calledOnce.and.to.have.been.calledWith(); expect(observer).to.have.been.calledOnce.and.to.have.been.calledWithExactly('foo'); expect(scheduler.schedule).to.have.been.calledOnce; }); it('should return an observable that calls the passed function on the passed context', function() { var context = {}; callback.yields('foo'); Rx.Observable.fromChromeCallback(callback, null, context)().subscribe(observer); expect(callback).to.have.been.calledOnce.and.to.have.been.calledWith().and.to.have.been.calledOn(context); expect(observer).to.have.been.calledOnce.and.to.have.been.calledWithExactly('foo'); }); it('should return an observable that propagates chrome.runtime.lastError', function() { var errObserver = mocks.spy(), completedObserver = mocks.spy(); callback.yields('foo'); chrome.runtime.lastError = {message: 'err'}; Rx.Observable.fromChromeCallback(callback)().subscribe(observer, errObserver, completedObserver); expect(observer).to.not.have.been.called; expect(errObserver).to.have.been.calledOnce.and.to.have.been.calledWithExactly('err'); expect(completedObserver).to.not.have.been.called; }); it('should return an observable that uses the passed selector to translate the callback results', function() { var selector = mocks.stub(); selector.returnsArg(0); callback.yields('foo', 'bar'); var args; function saveArgs() { args = arguments; } saveArgs('foo', 'bar'); Rx.Observable.fromChromeCallback(callback, null, null, selector)('foo', 'bar').subscribe(observer); expect(callback).to.have.been.calledOnce.and.to.have.been.calledWith('foo', 'bar'); expect(selector).to.have.been.calledOnce.and.to.have.been.calledWithExactly(args); expect(observer).to.have.been.calledOnce.and.to.have.been.calledWithExactly(args); }); }); describe('fromChromeEvent()', function() { var mocks; beforeEach(function() { mocks = sinon.sandbox.create(); mocks.stub(Rx.Observable, 'fromEventPattern'); }); afterEach(function() { mocks.restore(); }); it('should call Rx.Observable.fromEventPattern', function() { var event = {addListener: mocks.spy(), removeListener: mocks.spy()}, selector = mocks.spy(), stub = Rx.Observable.fromEventPattern, handler = mocks.spy(); Rx.Observable.fromChromeEvent(event, selector); expect(stub).to.have.been.calledOnce; var args = stub.firstCall.args; expect(args[0]).to.be.a('function'); args[0](handler); expect(event.addListener).to.have.been.calledOnce.and.to.have.been.calledWithExactly(handler); expect(args[1]).to.be.a('function'); args[1](handler); expect(event.removeListener).to.have.been.calledOnce.and.to.have.been.calledWithExactly(handler); expect(args[2]).to.equal(selector); }); }); });