codecombat/test/app/lib/CoursesHelper.spec.coffee

133 lines
6.9 KiB
CoffeeScript

helper = require 'lib/coursesHelper'
Campaigns = require 'collections/Campaigns'
Users = require 'collections/Users'
Courses = require 'collections/Courses'
CourseInstances = require 'collections/CourseInstances'
Classrooms = require 'collections/Classrooms'
Levels = require 'collections/Levels'
LevelSessions = require 'collections/LevelSessions'
factories = require 'test/app/factories'
describe 'CoursesHelper', ->
describe 'calculateAllProgress', ->
beforeEach ->
# classrooms, courses, campaigns, courseInstances, students
@course = factories.makeCourse()
@courses = new Courses([@course])
@members = new Users(_.times(2, -> factories.makeUser()))
@levels = new Levels(_.times(2, -> factories.makeLevel()))
@classroom = factories.makeClassroom({}, { @courses, @members, levels: [@levels] })
@classrooms = new Classrooms([ @classroom ])
courseInstance = factories.makeCourseInstance({}, { @course, @classroom, @members })
@courseInstances = new CourseInstances([courseInstance])
describe 'when all students have completed a course', ->
beforeEach ->
sessions = []
for level in @levels.models
for creator in @members.models
sessions.push(factories.makeLevelSession({state: {complete: true}}, { level, creator }))
@classroom.sessions = new LevelSessions(sessions)
describe 'progressData.get({classroom, course})', ->
it 'returns object with .completed=true and .started=true', ->
progressData = helper.calculateAllProgress(@classrooms, @courses, @courseInstances, @members)
progress = progressData.get {@classroom, @course}
expect(progress.completed).toBe true
expect(progress.started).toBe true
describe 'progressData.get({classroom, course, level, user})', ->
it 'returns object with .completed=true and .started=true', ->
for student in @members.models
progressData = helper.calculateAllProgress(@classrooms, @courses, @courseInstances, @members)
progress = progressData.get {@classroom, @course, user: student}
expect(progress.completed).toBe true
expect(progress.started).toBe true
describe 'progressData.get({classroom, course, level, user})', ->
it 'returns object with .completed=true and .started=true', ->
progressData = helper.calculateAllProgress(@classrooms, @courses, @courseInstances, @members)
for level in @levels.models
progress = progressData.get {@classroom, @course, level}
expect(progress.completed).toBe true
expect(progress.started).toBe true
describe 'progressData.get({classroom, course, level, user})', ->
it 'returns object with .completed=true and .started=true', ->
progressData = helper.calculateAllProgress(@classrooms, @courses, @courseInstances, @members)
for level in @levels.models
for user in @members.models
progress = progressData.get {@classroom, @course, level, user}
expect(progress.completed).toBe true
expect(progress.started).toBe true
describe 'when NOT all students have completed a course', ->
beforeEach ->
sessions = []
@finishedMember = @members.first()
@unfinishedMember = @members.last()
for level in @levels.models
sessions.push(factories.makeLevelSession(
{state: {complete: true}},
{level, creator: @finishedMember})
)
sessions.push(factories.makeLevelSession(
{state: {complete: false}},
{level: @levels.first(), creator: @unfinishedMember})
)
@classroom.sessions = new LevelSessions(sessions)
it 'progressData.get({classroom, course}) returns object with .completed=false', ->
progressData = helper.calculateAllProgress(@classrooms, @courses, @courseInstances, @members)
progress = progressData.get {@classroom, @course}
expect(progress.completed).toBe false
describe 'when NOT all students have completed a level', ->
it 'progressData.get({classroom, course, level}) returns object with .completed=false and .started=true', ->
progressData = helper.calculateAllProgress(@classrooms, @courses, @courseInstances, @members)
for level in @levels.models
progress = progressData.get {@classroom, @course, level}
expect(progress.completed).toBe false
describe 'when the student has completed the course', ->
it 'progressData.get({classroom, course, user}) returns object with .completed=true and .started=true', ->
progressData = helper.calculateAllProgress(@classrooms, @courses, @courseInstances, @members)
progress = progressData.get {@classroom, @course, user: @finishedMember}
expect(progress.completed).toBe true
expect(progress.started).toBe true
describe 'when the student has NOT completed the course', ->
it 'progressData.get({classroom, course, user}) returns object with .completed=false and .started=true', ->
progressData = helper.calculateAllProgress(@classrooms, @courses, @courseInstances, @members)
progress = progressData.get {@classroom, @course, user: @unfinishedMember}
expect(progress.completed).toBe false
expect(progress.started).toBe true
describe 'when the student has completed the level', ->
it 'progressData.get({classroom, course, level, user}) returns object with .completed=true and .started=true', ->
progressData = helper.calculateAllProgress(@classrooms, @courses, @courseInstances, @members)
for level in @levels.models
progress = progressData.get {@classroom, @course, level, user: @finishedMember}
expect(progress.completed).toBe true
expect(progress.started).toBe true
describe 'when the student has NOT completed the level but has started', ->
it 'progressData.get({classroom, course, level, user}) returns object with .completed=true and .started=true', ->
progressData = helper.calculateAllProgress(@classrooms, @courses, @courseInstances, @members)
level = @levels.first()
progress = progressData.get {@classroom, @course, level, user: @unfinishedMember}
expect(progress.completed).toBe false
expect(progress.started).toBe true
describe 'when the student has NOT started the level', ->
it 'progressData.get({classroom, course, level, user}) returns object with .completed=false and .started=false', ->
progressData = helper.calculateAllProgress(@classrooms, @courses, @courseInstances, @members)
level = @levels.last()
progress = progressData.get {@classroom, @course, level, user: @unfinishedMember}
expect(progress.completed).toBe false
expect(progress.started).toBe false