jam-cloud/web/spec/javascripts/download_jamtrack_spec.js.c...

311 lines
12 KiB
CoffeeScript
Raw Permalink Normal View History

describe "DownloadJamTrack", ->
beforeEach ->
2015-02-27 17:51:45 +00:00
this.fixtures = fixture.load("downloadJamTrack.html"); # append these fixtures which were already cached
window.jamClient = sinon.stub()
2015-02-27 17:51:45 +00:00
this.app = sinon.stub()
this.jamTrackId = '1'
this.jamTrack = {id: this.jamTrackId, jam_track_right_id: '1', name: 'Back in Black', version:'1'}
window.gon = {}
window.JK.JamServer = {}
window.stats = {}
@statsSpy = window.stats.write = sinon.spy()
window.JK.JamServer.send = sinon.stub(); # attempts to subscribe to the socket will need this
afterEach ->
2015-02-27 17:51:45 +00:00
window.stats.write.reset()
describe "normal browser", ->
beforeEach ->
window.gon.isNativeClient = false
@showNoClientSpy = sinon.spy(JK.DownloadJamTrack.prototype, 'showNoClient')
@downloadJamTrack = new JK.DownloadJamTrack(@app, @jamTrack)
$('body').append(this.downloadJamTrack.root)
afterEach ->
@showNoClientSpy.restore()
it "switches to 'no client' correctly", ->
window.jamClient.JamTrackGetTrackDetail = sinon.stub()
window.jamClient.InvalidateJamTrack = sinon.stub()
#window.jamClient.JamTrackGetTrackDetail.returns({'key_state' : 'ready'})
@downloadJamTrack.init();
expect(window.jamClient.JamTrackGetTrackDetail.callCount).toBe(0)
expect(@showNoClientSpy.calledOnce).toBe(true)
expect(@downloadJamTrack.stateHolder.find('.state-no-client')).toHaveLength(1)
expect(@statsSpy.calledOnce).toBe(true)
describe "client", ->
beforeEach ->
window.gon.isNativeClient = true
describe "already synchronized", ->
beforeEach ->
@showSynchronizedSpy = sinon.spy(JK.DownloadJamTrack.prototype, 'showSynchronized')
@downloadJamTrack = new JK.DownloadJamTrack(@app, @jamTrack)
$('body').append(@downloadJamTrack.root)
afterEach ->
@showSynchronizedSpy.restore()
@downloadJamTrack.destroy()
it "shows synchronized state", ->
window.jamClient.JamTrackGetTrackDetail = sinon.stub()
window.jamClient.JamTrackGetTrackDetail.returns({'key_state' : 'ready', 'version' : '1'})
window.jamClient.InvalidateJamTrack = sinon.stub()
@downloadJamTrack.init();
expect(window.jamClient.JamTrackGetTrackDetail.callCount).toBe(1)
expect(window.jamClient.InvalidateJamTrack.callCount).toBe(0)
expect(@showSynchronizedSpy.calledOnce).toBe(true)
expect(@downloadJamTrack.transitionTimer).toBe(null)
expect(@downloadJamTrack.downloadTimer).toBe(null)
expect(@statsSpy.calledOnce).toBe(true)
expect(@downloadJamTrack.stateHolder.find('.state-synchronized')).toHaveLength(1)
describe "pending", ->
beforeEach ->
window.jamClient.JamTrackKeysRequest = sinon.stub()
@showSynchronizedSpy = sinon.spy(JK.DownloadJamTrack.prototype, 'showSynchronized')
@showErrorSpy = sinon.spy(JK.DownloadJamTrack.prototype, 'showError')
@showKeyingSpy = sinon.spy(JK.DownloadJamTrack.prototype, 'showKeying')
@downloadJamTrack = new JK.DownloadJamTrack(@app, @jamTrack)
@downloadJamTrack.states.keying.max_time = -1 # hurry up the test, instead of waiting 10 seconds
$('body').append(@downloadJamTrack.root)
afterEach ->
@showSynchronizedSpy.restore()
@showErrorSpy.restore()
@showKeyingSpy.restore()
@downloadJamTrack.destroy()
it "shows errored state due to timeout", ->
window.jamClient.JamTrackGetTrackDetail = sinon.stub()
window.jamClient.JamTrackGetTrackDetail.returns({'key_state' : 'pending', 'version' : '1'})
window.jamClient.InvalidateJamTrack = sinon.stub()
@downloadJamTrack.init();
expect(window.jamClient.JamTrackGetTrackDetail.callCount).toBe(1)
expect(@showKeyingSpy.calledOnce).toBe(true)
expect(@downloadJamTrack.states.keying.timer).toNotBe(null)
@downloadJamTrack.stateIntervalCheck()
expect(window.jamClient.JamTrackGetTrackDetail.callCount).toBe(2)
expect(@showErrorSpy.calledOnce).toBe(true)
expect(@downloadJamTrack.states.keying.timer).toBe(null)
expect(@downloadJamTrack.stateHolder.find('.state-errored')).toHaveLength(1)
expect(@downloadJamTrack.stateHolder.find('.state-errored .msg')).toContainText('It took too long for the JamTrack to be keyed.')
expect(@statsSpy.calledOnce).toBe(true)
expect(@downloadJamTrack.attempts).toBe(1)
# now simulate a retry attempt
@downloadJamTrack.stateHolder.find('.retry-button').trigger('click')
# and verify that we are beginning a re-attempt
expect(window.jamClient.JamTrackGetTrackDetail.callCount).toBe(3)
expect(@showKeyingSpy.calledTwice).toBe(true)
expect(@downloadJamTrack.states.keying.timer).toNotBe(null)
expect(@downloadJamTrack.attempts).toBe(2)
it "shows synchronized", ->
window.jamClient.JamTrackGetTrackDetail = sinon.stub()
window.jamClient.JamTrackGetTrackDetail.returns({'key_state' : 'pending', 'version' : '1'})
window.jamClient.InvalidateJamTrack = sinon.stub()
@downloadJamTrack.init()
expect(window.jamClient.JamTrackGetTrackDetail.callCount).toBe(1)
expect(@showKeyingSpy.calledOnce).toBe(true)
# keying timer should be firing
expect(@downloadJamTrack.states.keying.timer).toNotBe(null)
# say the keys have been fetched
window.jamClient.JamTrackGetTrackDetail.returns({'key_state' : 'ready', 'version' : '1'})
window.jamClient.InvalidateJamTrack = sinon.stub()
# then do a check
@downloadJamTrack.stateIntervalCheck()
expect(@showSynchronizedSpy.calledOnce).toBe(true)
expect(@downloadJamTrack.states.keying.timer).toBe(null)
expect(@downloadJamTrack.stateHolder.find('.state-synchronized')).toHaveLength(1)
expect(@statsSpy.calledOnce).toBe(true)
describe "JamTrack needs downloading", ->
beforeEach ->
window.jamClient.JamTrackDownload = sinon.stub()
@showSynchronizedSpy = sinon.spy(JK.DownloadJamTrack.prototype, 'showSynchronized')
@showErrorSpy = sinon.spy(JK.DownloadJamTrack.prototype, 'showError')
@showKeyingSpy = sinon.spy(JK.DownloadJamTrack.prototype, 'showKeying')
@showDownloadingSpy = sinon.spy(JK.DownloadJamTrack.prototype, 'showDownloading')
@showPackagingSpy = sinon.spy(JK.DownloadJamTrack.prototype, 'showPackaging')
@downloadJamTrack = new JK.DownloadJamTrack(@app, @jamTrack)
@downloadJamTrack.states.keying.max_time = -1 # hurry up the test, instead of waiting 10 seconds
$('body').append(@downloadJamTrack.root)
afterEach ->
@showSynchronizedSpy.restore()
@showErrorSpy.restore()
@showKeyingSpy.restore()
@showDownloadingSpy.restore()
@showPackagingSpy.restore()
@downloadJamTrack.destroy()
it "shows downloading for signed package", ->
window.jamClient.JamTrackKeysRequest = sinon.stub()
window.jamClient.JamTrackGetTrackDetail = sinon.stub()
window.jamClient.JamTrackGetTrackDetail.returns({'key_state' : 'unknown', 'version' : '1'})
window.jamClient.InvalidateJamTrack = sinon.stub()
spyOn(@downloadJamTrack.rest, 'getJamTrackRight').andCallFake((data) =>
d = $.Deferred();
d.resolve({signing_state: 'SIGNED'});
d.promise();
)
window.jamClient.JamTrackDownload = sinon.stub()
@downloadJamTrack.init()
expect(window.jamClient.JamTrackGetTrackDetail.callCount).toBe(1)
expect(window.jamClient.JamTrackDownload.callCount).toBe(1)
expect(@showDownloadingSpy.calledOnce).toBe(true)
expect(@downloadJamTrack.stateHolder.find('.state-downloading')).toHaveLength(1)
eval(@downloadJamTrack.makeDownloadSuccessCallback() + '()')
expect(@showKeyingSpy.calledOnce).toBe(true)
expect(@downloadJamTrack.stateHolder.find('.state-keying')).toHaveLength(1)
# keying timer should be firing
expect(@downloadJamTrack.states.keying.timer).toNotBe(null)
# say the keys have been fetched
window.jamClient.JamTrackGetTrackDetail.returns({'key_state' : 'ready', 'version' : '1'})
window.jamClient.InvalidateJamTrack = sinon.stub()
# check state again
@downloadJamTrack.stateIntervalCheck()
# we should now be synchronized
expect(@showSynchronizedSpy.calledOnce).toBe(true)
expect(@downloadJamTrack.states.keying.timer).toBe(null)
expect(@downloadJamTrack.stateHolder.find('.state-synchronized')).toHaveLength(1)
expect(@statsSpy.calledOnce).toBe(true)
it "is not yet packaged", ->
window.jamClient.JamTrackGetTrackDetail = sinon.stub()
window.jamClient.JamTrackGetTrackDetail.returns({'key_state' : 'unknown', 'version' : '1'})
window.jamClient.InvalidateJamTrack = sinon.stub()
spyOn(@downloadJamTrack.rest, 'getJamTrackRight').andCallFake((data) =>
d = $.Deferred();
d.resolve({signing_state: 'QUIET'});
d.promise();
)
spyOn(@downloadJamTrack.rest, 'enqueueJamTrack').andCallFake((data) =>
d = $.Deferred();
d.resolve({});
d.promise();
)
window.jamClient.JamTrackDownload = sinon.stub()
@downloadJamTrack.init()
expect(@downloadJamTrack.attemptedEnqueue).toBe(true)
expect(@downloadJamTrack.transitionTimer?).toBe(true)
# simulate poke from server saying the track has been queued
@downloadJamTrack.onJamTrackRightEvent(null, {body: {signing_state: 'QUEUED'}})
# the frontend should be saying that it's packaging now
expect(@downloadJamTrack.transitionTimer?).toBe(true)
expect(@showPackagingSpy.calledOnce).toBe(true)
expect(@downloadJamTrack.stateHolder.find('.state-packaging')).toHaveLength(1)
# simulate poke from server saying the track is currently signing
@downloadJamTrack.onJamTrackRightEvent(null, {body: {signing_state: 'SIGNING'}})
# the frontend still be saying it's packaging
expect(@downloadJamTrack.transitionTimer?).toBe(true)
expect(@showPackagingSpy.calledOnce).toBe(true)
# simulate poke from server saying the track is signed
@downloadJamTrack.onJamTrackRightEvent(null, {body: {signing_state: 'SIGNED'}})
expect(@downloadJamTrack.transitionTimer?).toBe(false)
# downloading has started; other test covers this, so we stop testing
expect(@showDownloadingSpy.calledOnce).toBe(true)
expect(@downloadJamTrack.stateHolder.find('.state-downloading')).toHaveLength(1)
# since we haven't yet made it to a leave node, make sure we haven't reported a stat
expect(@statsSpy.callCount).toBe(0)
it "queue time out when packaging", ->
window.jamClient.JamTrackGetTrackDetail = sinon.stub()
window.jamClient.JamTrackGetTrackDetail.returns({'key_state' : 'unknown', 'version' : '1'})
window.jamClient.InvalidateJamTrack = sinon.stub()
getJamTrackRightSpy = spyOn(@downloadJamTrack.rest, 'getJamTrackRight')
getJamTrackRightSpy.andCallFake((data) =>
d = $.Deferred();
d.resolve({signing_state: 'QUIET'});
d.promise();
)
spyOn(@downloadJamTrack.rest, 'enqueueJamTrack').andCallFake((data) =>
d = $.Deferred();
d.resolve({});
d.promise();
)
window.jamClient.JamTrackDownload = sinon.stub()
@downloadJamTrack.init()
expect(@downloadJamTrack.attemptedEnqueue).toBe(true)
expect(@downloadJamTrack.transitionTimer?).toBe(true)
getJamTrackRightSpy.reset()
# simulate timer running out, and server check resulting in QUEUED_TIMEOUT
getJamTrackRightSpy.andCallFake((data) =>
d = $.Deferred();
d.resolve({signing_state: 'QUEUED_TIMEOUT'});
d.promise();
)
@downloadJamTrack.transitionCheck()
# the frontend should be saying that it's packaging now
expect(@downloadJamTrack.transitionTimer?).toBe(false)
expect(@showErrorSpy.calledOnce).toBe(true)
expect(@downloadJamTrack.stateHolder.find('.state-errored')).toHaveLength(1)
expect(@downloadJamTrack.stateHolder.find('.state-errored .msg')).toContainText('The server took too long to begin processing your JamTrack.')
expect(@statsSpy.calledOnce).toBe(true)