codecombat/test/app/views/play/level/modal/CourseVictoryModal.spec.coffee
2016-04-27 09:58:04 -07:00

133 lines
5.2 KiB
CoffeeScript

Course = require 'models/Course'
Level = require 'models/Level'
LevelSession = require 'models/LevelSession'
Achievements = require 'collections/Achievements'
CourseVictoryModal = require 'views/play/level/modal/CourseVictoryModal'
fixtures = require './CourseVictoryModal.fixtures'
NewItemView = require 'views/play/level/modal/NewItemView'
ProgressView = require 'views/play/level/modal/ProgressView'
describe 'CourseVictoryModal', ->
beforeEach ->
me.clear()
it 'will eventually be the only victory modal'
makeViewOptions = ->
{
course: new Course(fixtures.course)
level: new Level(fixtures.level)
session: new LevelSession(fixtures.session)
achievements: new Achievements(fixtures.achievements)
nextLevel: new Level(fixtures.nextLevel)
courseInstanceID: '56414c3868785b5f152424f1'
courseID: '560f1a9f22961295f9427742'
}
nextLevelRequest = null
handleRequests = ->
requests = jasmine.Ajax.requests.all()
thangRequest = _.find(requests, (r) -> _.string.startsWith(r.url, '/db/thang.type'))
thangRequest?.respondWith({status: 200, responseText: JSON.stringify(fixtures.thangType)})
earnedAchievementRequests = _.where(requests, {url: '/db/earned_achievement'})
for [request, response] in _.zip(earnedAchievementRequests, fixtures.earnedAchievements)
request.respondWith({status: 200, responseText: JSON.stringify(response)})
sessionsRequest = _.findWhere(requests, {url: '/db/course_instance/56414c3868785b5f152424f1/my-course-level-sessions'})
sessionsRequest.respondWith({status: 200, responseText: JSON.stringify(fixtures.courseInstanceSessions)})
classroomRequest = _.findWhere(requests, {url: '/db/course_instance/56414c3868785b5f152424f1/classroom'})
classroomRequest.respondWith({status: 200, responseText: JSON.stringify(fixtures.campaign)}) # TODO: Fix this...
nextLevelRequest = _.findWhere(requests, {url: '/db/course_instance/56414c3868785b5f152424f1/levels/54173c90844506ae0195a0b4/next'})
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()
nextLevelRequest.respondWith({status: 200, responseText: JSON.stringify(fixtures.nextLevel)})
_.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()
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)
describe 'given a course level with a new item', ->
modal = null
beforeEach (done) ->
options = makeViewOptions()
# insert new item into achievement properties
achievement = options.achievements.first()
rewards = _.cloneDeep(achievement.get('rewards'))
rewards.items = ["53e4108204c00d4607a89f78"]
achievement.set('rewards', rewards)
modal = new CourseVictoryModal(options)
handleRequests()
nextLevelRequest.respondWith({status: 200, responseText: JSON.stringify(fixtures.nextLevel)})
_.defer done
it 'includes a NewItemView when the level rewards a new item', ->
expect(_.size(modal.views)).toBe(2)
expect(modal.views[0] instanceof NewItemView).toBe(true)
it 'continues to the ProgressView when you click the continue button', ->
expect(modal.currentView instanceof NewItemView).toBe(true)
modal.$el.find('#continue-btn').click()
expect(modal.currentView instanceof ProgressView).toBe(true)
it '(demo)', -> jasmine.demoModal(modal)