There might be a chance that an error got thrown after 'contentChanged' event was fired and stop the `toggleArrow()` method to be called. This will make sure that the navigation will still be working even some element in the content is failed.
160 lines
5.6 KiB
CoffeeScript
160 lines
5.6 KiB
CoffeeScript
describe 'Sequence', ->
|
|
beforeEach ->
|
|
# Stub MathJax
|
|
window.MathJax = { Hub: { Queue: -> } }
|
|
spyOn Logger, 'log'
|
|
|
|
loadFixtures 'sequence.html'
|
|
@items = $.parseJSON readFixtures('items.json')
|
|
|
|
describe 'constructor', ->
|
|
beforeEach ->
|
|
@sequence = new Sequence '1', @items, 'sequence', 1
|
|
|
|
it 'set the element', ->
|
|
expect(@sequence.element).toEqual $('#sequence_1')
|
|
|
|
it 'build the navigation', ->
|
|
classes = $('#sequence-list li>a').map(-> $(this).attr('class')).get()
|
|
elements = $('#sequence-list li>a').map(-> $(this).attr('data-element')).get()
|
|
titles = $('#sequence-list li>a>p').map(-> $(this).html()).get()
|
|
|
|
expect(classes).toEqual ['seq_video_active', 'seq_video_inactive', 'seq_problem_inactive']
|
|
expect(elements).toEqual ['1', '2', '3']
|
|
expect(titles).toEqual ['Video 1', 'Video 2', 'Sample Problem']
|
|
|
|
it 'bind the page events', ->
|
|
expect($('#sequence-list a')).toHandleWith 'click', @sequence.goto
|
|
|
|
it 'render the active sequence content', ->
|
|
expect($('#seq_content').html()).toEqual 'Video 1'
|
|
|
|
describe 'toggleArrows', ->
|
|
beforeEach ->
|
|
@sequence = new Sequence '1', @items, 'sequence', 1
|
|
|
|
describe 'when the first tab is active', ->
|
|
beforeEach ->
|
|
@sequence.position = 1
|
|
@sequence.toggleArrows()
|
|
|
|
it 'disable the previous button', ->
|
|
expect($('.sequence-nav-buttons .prev a')).toHaveClass 'disabled'
|
|
|
|
it 'enable the next button', ->
|
|
expect($('.sequence-nav-buttons .next a')).not.toHaveClass 'disabled'
|
|
expect($('.sequence-nav-buttons .next a')).toHandleWith 'click', @sequence.next
|
|
|
|
describe 'when the middle tab is active', ->
|
|
beforeEach ->
|
|
@sequence.position = 2
|
|
@sequence.toggleArrows()
|
|
|
|
it 'enable the previous button', ->
|
|
expect($('.sequence-nav-buttons .prev a')).not.toHaveClass 'disabled'
|
|
expect($('.sequence-nav-buttons .prev a')).toHandleWith 'click', @sequence.previous
|
|
|
|
it 'enable the next button', ->
|
|
expect($('.sequence-nav-buttons .next a')).not.toHaveClass 'disabled'
|
|
expect($('.sequence-nav-buttons .next a')).toHandleWith 'click', @sequence.next
|
|
|
|
describe 'when the last tab is active', ->
|
|
beforeEach ->
|
|
@sequence.position = 3
|
|
@sequence.toggleArrows()
|
|
|
|
it 'enable the previous button', ->
|
|
expect($('.sequence-nav-buttons .prev a')).not.toHaveClass 'disabled'
|
|
expect($('.sequence-nav-buttons .prev a')).toHandleWith 'click', @sequence.previous
|
|
|
|
it 'disable the next button', ->
|
|
expect($('.sequence-nav-buttons .next a')).toHaveClass 'disabled'
|
|
|
|
describe 'render', ->
|
|
beforeEach ->
|
|
spyOn $, 'postWithPrefix'
|
|
@sequence = new Sequence '1', @items, 'sequence'
|
|
spyOnEvent @sequence.element, 'contentChanged'
|
|
spyOn(@sequence, 'toggleArrows').andCallThrough()
|
|
|
|
describe 'with a different position than the current one', ->
|
|
beforeEach ->
|
|
@sequence.render 1
|
|
|
|
describe 'with no previous position', ->
|
|
it 'does not save the new position', ->
|
|
expect($.postWithPrefix).not.toHaveBeenCalled()
|
|
|
|
describe 'with previous position', ->
|
|
beforeEach ->
|
|
@sequence.position = 2
|
|
@sequence.render 1
|
|
|
|
it 'mark the previous tab as visited', ->
|
|
expect($('[data-element="2"]')).toHaveClass 'seq_video_visited'
|
|
|
|
it 'save the new position', ->
|
|
expect($.postWithPrefix).toHaveBeenCalledWith '/modx/sequence/1/goto_position', position: 1
|
|
|
|
it 'mark new tab as active', ->
|
|
expect($('[data-element="1"]')).toHaveClass 'seq_video_active'
|
|
|
|
it 'render the new content', ->
|
|
expect($('#seq_content').html()).toEqual 'Video 1'
|
|
|
|
it 'update the position', ->
|
|
expect(@sequence.position).toEqual 1
|
|
|
|
it 're-update the arrows', ->
|
|
expect(@sequence.toggleArrows).toHaveBeenCalled()
|
|
|
|
it 'trigger contentChanged event', ->
|
|
expect('contentChanged').toHaveBeenTriggeredOn @sequence.element
|
|
|
|
describe 'with the same position as the current one', ->
|
|
it 'should not trigger contentChanged event', ->
|
|
@sequence.position = 2
|
|
@sequence.render 2
|
|
expect('contentChanged').not.toHaveBeenTriggeredOn @sequence.element
|
|
|
|
describe 'goto', ->
|
|
beforeEach ->
|
|
jasmine.stubRequests()
|
|
@sequence = new Sequence '1', @items, 'sequence', 2
|
|
$('[data-element="3"]').click()
|
|
|
|
it 'log the sequence goto event', ->
|
|
expect(Logger.log).toHaveBeenCalledWith 'seq_goto', old: 2, new: 3, id: '1'
|
|
|
|
it 'call render on the right sequence', ->
|
|
expect($('#seq_content').html()).toEqual 'Sample Problem'
|
|
|
|
describe 'next', ->
|
|
beforeEach ->
|
|
jasmine.stubRequests()
|
|
@sequence = new Sequence '1', @items, 'sequence', 2
|
|
$('.sequence-nav-buttons .next a').click()
|
|
|
|
it 'log the next sequence event', ->
|
|
expect(Logger.log).toHaveBeenCalledWith 'seq_next', old: 2, new: 3, id: '1'
|
|
|
|
it 'call render on the next sequence', ->
|
|
expect($('#seq_content').html()).toEqual 'Sample Problem'
|
|
|
|
describe 'previous', ->
|
|
beforeEach ->
|
|
jasmine.stubRequests()
|
|
@sequence = new Sequence '1', @items, 'sequence', 2
|
|
$('.sequence-nav-buttons .prev a').click()
|
|
|
|
it 'log the previous sequence event', ->
|
|
expect(Logger.log).toHaveBeenCalledWith 'seq_prev', old: 2, new: 1, id: '1'
|
|
|
|
it 'call render on the previous sequence', ->
|
|
expect($('#seq_content').html()).toEqual 'Video 1'
|
|
|
|
describe 'link_for', ->
|
|
it 'return a link for specific position', ->
|
|
sequence = new Sequence '1', @items, 2
|
|
expect(sequence.link_for(2)).toBe '[data-element="2"]'
|