codecombat/test/app/views/play/level/modal/CourseVictoryModal.spec.coffee
2016-07-11 16:01:34 -07:00

100 lines
3.5 KiB
CoffeeScript

Course = require 'models/Course'
Level = require 'models/Level'
LevelSession = require 'models/LevelSession'
CourseVictoryModal = require 'views/play/level/modal/CourseVictoryModal'
ProgressView = require 'views/play/level/modal/ProgressView'
factories = require 'test/app/factories'
describe 'CourseVictoryModal', ->
beforeEach ->
me.clear()
it 'will eventually be the only victory modal'
makeViewOptions = ->
level = factories.makeLevel()
course = factories.makeCourse()
courseInstance = factories.makeCourseInstance()
{
course: factories.makeCourse()
level: level
session: factories.makeLevelSession({ state: { complete: true } }, { level })
nextLevel: factories.makeLevel()
courseInstanceID: courseInstance.id
courseID: course.id
}
nextLevelRequest = null
handleRequests = (modal) ->
requests = jasmine.Ajax.requests.all()
modal.levelSessions.fakeRequests[0].respondWith({ status: 200, responseText: '[]' })
modal.classroom.fakeRequests[0].respondWith({
status: 200, responseText: factories.makeClassroom().stringify()
})
if me.fakeRequests
lastRequest = _.last(me.fakeRequests)
if not lastRequest.response
lastRequest.respondWith({
status: 200, responseText: factories.makeUser().stringify()
})
nextLevelRequest = modal.nextLevel.fakeRequests[0]
describe 'given a course level with a next level and no item or hero rewards', ->
modal = null
beforeEach (done) ->
options = makeViewOptions()
modal = new CourseVictoryModal(options)
handleRequests(modal)
nextLevelRequest.respondWith({status: 200, responseText: factories.makeLevel().stringify()})
_.defer done
it 'only shows the ProgressView', ->
expect(_.size(modal.views)).toBe(1)
expect(modal.views[0] instanceof ProgressView).toBe(true)
it '(demo)', -> jasmine.demoModal(modal)
describe 'its ProgressView', ->
it 'has a next level button which navigates to the next level on click', ->
spyOn(application.router, 'navigate')
button = modal.$el.find('#next-level-btn')
expect(button.length).toBe(1)
button.click()
expect(application.router.navigate).toHaveBeenCalled()
it 'has two columns', ->
expect(modal.$('.row:first .col-sm-12').length).toBe(0)
expect(modal.$('.row:first .col-sm-5').length).toBe(1)
expect(modal.$('.row:first .col-sm-7').length).toBe(1)
describe 'given a course level without a next level', ->
modal = null
beforeEach (done) ->
options = makeViewOptions()
# make the level not have a next level
level = options.level
level.unset('nextLevel')
delete options.nextLevel
modal = new CourseVictoryModal(options)
handleRequests(modal)
nextLevelRequest.respondWith({status: 404, responseText: '{}'})
_.defer done
describe 'its ProgressView', ->
it 'has a single large column, since there is no next level to display', ->
expect(modal.$('.row:first .col-sm-12').length).toBe(1)
expect(modal.$('.row:first .col-sm-5').length).toBe(0)
expect(modal.$('.row:first .col-sm-7').length).toBe(0)
it 'has a done button which navigates to the CourseDetailsView for the given course instance', ->
spyOn(application.router, 'navigate')
button = modal.$el.find('#done-btn')
expect(button.length).toBe(1)
button.click()
expect(application.router.navigate).toHaveBeenCalled()
it '(demo)', -> jasmine.demoModal(modal)