travis-web/assets/scripts/spec/unit/chunk_buffer_spec.coffee

114 lines
3.3 KiB
CoffeeScript

createChunk = (number, content, options) ->
Em.Object.create(number: number, content: content, final: options?.final)
describe 'Travis.ChunkBuffer', ->
it 'waits for parts to be in order before revealing them', ->
buffer = Travis.ChunkBuffer.create(content: [])
buffer.pushObject createChunk(3, "baz")
buffer.pushObject createChunk(2, "bar")
expect(buffer.get('length')).toEqual(0)
buffer.pushObject createChunk(1, "foo")
expect(buffer.get('length')).toEqual(3)
expect(buffer.toArray()).toEqual(['foo', 'bar', 'baz'])
it 'ignores a part if it fails to be delivered within timeout', ->
buffer = Travis.ChunkBuffer.create(content: [], timeout: 20, checkTimeoutFrequency: 5)
buffer.pushObject createChunk(3, "baz")
expect(buffer.get('length')).toEqual(0)
buffer.pushObject createChunk(1, "foo")
expect(buffer.get('length')).toEqual(1)
waits 100
runs ->
expect(buffer.get('length')).toEqual(2)
expect(buffer.toArray()).toEqual(['foo', 'baz'])
buffer.destroy()
it 'works correctly when parts are passed as content', ->
content = [createChunk(2, 'bar')]
buffer = Travis.ChunkBuffer.create(content: content)
expect(buffer.get('length')).toEqual(0)
buffer.pushObject createChunk(1, "foo")
expect(buffer.get('length')).toEqual(2)
expect(buffer.toArray()).toEqual(['foo', 'bar'])
it 'works correctly when parts duplicated', ->
buffer = Travis.ChunkBuffer.create(content: [])
buffer.pushObject createChunk(1, "foo")
buffer.pushObject createChunk(2, "bar")
buffer.pushObject createChunk(3, "baz")
buffer.pushObject createChunk(2, "bar")
buffer.pushObject createChunk(3, "baz")
buffer.pushObject createChunk(4, "qux")
expect(buffer.get('length')).toEqual(4)
expect(buffer.toArray()).toEqual(['foo', 'bar', 'baz', 'qux'])
it 'fires array observers properly', ->
changes = []
buffer = Travis.ChunkBuffer.create(content: [])
observer = Em.Object.extend(
init: ->
@_super.apply this, arguments
@get('content').addArrayObserver this,
willChange: 'arrayWillChange',
didChange: 'arrayDidChange'
arrayWillChange: (->)
arrayDidChange: (array, index, removedCount, addedCount) ->
changes.pushObject([index, addedCount])
).create(content: buffer)
buffer.pushObject createChunk(2, "baz")
expect(buffer.get('length')).toEqual(0)
expect(changes.length).toEqual(0)
buffer.pushObject createChunk(1, "foo")
expect(buffer.get('length')).toEqual(2)
expect(changes.length).toEqual(1)
expect(changes[0]).toEqual([0, 2])
it 'sets next to start if start is given at init', ->
buffer = Travis.ChunkBuffer.create(content: [], start: 5)
expect(buffer.get('next')).toEqual(5)
it 'runs finalize after getting final element', ->
finalizeRuns = 0
buffer = Travis.ChunkBuffer.extend({
finalize: ->
@_super.apply this, arguments
finalizeRuns += 1
}).create(content: [])
buffer.pushObject createChunk(1, "foo")
buffer.pushObject createChunk(2, "bar")
buffer.pushObject createChunk(3, "baz")
expect(finalizeRuns).toEqual(0)
buffer.pushObject createChunk(4, "qux", final: true)
expect(buffer.get('length')).toEqual(4)
expect(finalizeRuns).toEqual(1)