mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-02-17 00:40:56 -05:00
/courses/update-account page
Allows a user to update their account based on their current role of: individual, student, or teacher Closes #3647
This commit is contained in:
parent
f017ecd52b
commit
6f6d65a005
11 changed files with 511 additions and 23 deletions
|
@ -69,6 +69,7 @@ module.exports = class CocoRouter extends Backbone.Router
|
|||
'courses/teachers': redirect('/teachers/classes')
|
||||
'courses/purchase': redirect('/teachers/enrollments')
|
||||
'courses/enroll(/:courseID)': redirect('/teachers/enrollments')
|
||||
'courses/update-account': go('courses/CoursesUpdateAccountView')
|
||||
'courses/:classroomID': go('courses/ClassroomView') #, { studentsOnly: true })
|
||||
'courses/:courseID/:courseInstanceID': go('courses/CourseDetailsView')
|
||||
|
||||
|
|
|
@ -1134,6 +1134,7 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr
|
|||
remove_student: "remove student"
|
||||
assign: "Assign"
|
||||
to_assign: "to assign paid courses."
|
||||
student: "Student"
|
||||
teacher: "Teacher"
|
||||
complete: "Complete"
|
||||
none: "None"
|
||||
|
@ -1293,6 +1294,33 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr
|
|||
create_class: "Create Class"
|
||||
class_name: "Class Name"
|
||||
teacher_account_restricted: "Your account is a teacher account, and so cannot access student content."
|
||||
update_account_login_title: "Log in to update your account"
|
||||
update_account_title: "Your account needs attention!"
|
||||
update_account_blurb: "Before you can access your classes, choose how you want to use this account."
|
||||
update_account_current_type: "Current Account Type:"
|
||||
update_account_account_email: "Account Email:"
|
||||
update_account_am_teacher: "I am a teacher"
|
||||
update_account_keep_access: "Keep access to classes I've created"
|
||||
update_account_teachers_can: "Teacher accounts can:"
|
||||
update_account_teachers_can1: "Create/manage/add classes"
|
||||
update_account_teachers_can2: "Assign/enroll students in courses"
|
||||
update_account_teachers_can3: "Unlock all course levels to try out"
|
||||
update_account_teachers_can4: "Access new teacher-only features as we release them"
|
||||
update_account_teachers_warning: "Warning: You will be removed from all classes that you have previously joined and will not be able to play as a student."
|
||||
update_account_remain_teacher: "Remain a Teacher"
|
||||
update_account_update_teacher: "Update to Teacher"
|
||||
update_account_am_student: "I am a student"
|
||||
update_account_remove_access: "Remove access to classes I have created"
|
||||
update_account_students_can: "Student accounts can:"
|
||||
update_account_students_can1: "Join classes"
|
||||
update_account_students_can2: "Play through courses as a student and track your own progress"
|
||||
update_account_students_can3: "Compete against classmates in arenas"
|
||||
update_account_students_can4: "Access new student-only features as we release them"
|
||||
update_account_students_warning: "Warning: You will not be able to manage any classes that you have previously created or create new classes."
|
||||
update_account_remain_student: "Remain a Student"
|
||||
update_account_update_student: "Update to Student"
|
||||
update_account_not_sure: "Not sure which one to choose? Email"
|
||||
update_account_confirm_update_student: "Are you sure you want to update your account to a Student experience? You will lose the ability to manage any classes you have previously created, or to create new classes."
|
||||
|
||||
teacher:
|
||||
teacher_dashboard: "Teacher Dashboard" # Navbar
|
||||
|
|
|
@ -267,6 +267,16 @@ module.exports = class User extends CocoModel
|
|||
options.data.facebookAccessToken = application.facebookHandler.token()
|
||||
@fetch(options)
|
||||
|
||||
becomeStudent: (options={}) ->
|
||||
options.url = '/db/user/-/become-student'
|
||||
options.type = 'PUT'
|
||||
@fetch(options)
|
||||
|
||||
remainTeacher: (options={}) ->
|
||||
options.url = '/db/user/-/remain-teacher'
|
||||
options.type = 'PUT'
|
||||
@fetch(options)
|
||||
|
||||
tiersByLevel = [-1, 0, 0.05, 0.14, 0.18, 0.32, 0.41, 0.5, 0.64, 0.82, 0.91, 1.04, 1.22, 1.35, 1.48, 1.65, 1.78, 1.96, 2.1, 2.24, 2.38, 2.55, 2.69, 2.86, 3.03, 3.16, 3.29, 3.42, 3.58, 3.74, 3.89, 4.04, 4.19, 4.32, 4.47, 4.64, 4.79, 4.96,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5, 15
|
||||
]
|
||||
|
|
19
app/styles/courses/courses-update-account-view.sass
Normal file
19
app/styles/courses/courses-update-account-view.sass
Normal file
|
@ -0,0 +1,19 @@
|
|||
#courses-update-account-view
|
||||
|
||||
#main-content
|
||||
background-color: #f2dede
|
||||
padding: 20px 80px 20px 80px
|
||||
|
||||
.warning
|
||||
color: red
|
||||
font-size: 14px
|
||||
line-height: 15px
|
||||
|
||||
.well
|
||||
font-size: 15px
|
||||
line-height: 16px
|
||||
margin: 20px
|
||||
|
||||
.not_you
|
||||
font-size: 14px
|
||||
margin-left: 20px
|
81
app/templates/courses/courses-update-account-view.jade
Normal file
81
app/templates/courses/courses-update-account-view.jade
Normal file
|
@ -0,0 +1,81 @@
|
|||
extends /templates/base-flat
|
||||
|
||||
block content
|
||||
.container#main-content
|
||||
.row.m-y-3
|
||||
.col-xs-12
|
||||
if me.isAnonymous()
|
||||
.text-center
|
||||
h3(data-i18n="courses.update_account_login_title")
|
||||
p(data-i18n="courses.update_account_blurb")
|
||||
p
|
||||
button.login-btn.btn.btn-navy(data-i18n="login.log_in")
|
||||
|
||||
if !me.isAnonymous()
|
||||
.text-center
|
||||
h3(data-i18n="courses.update_account_title")
|
||||
p(data-i18n="courses.update_account_blurb")
|
||||
.row
|
||||
.col-md-6
|
||||
.text-right
|
||||
if view.accountType
|
||||
div
|
||||
strong(data-i18n="courses.update_account_current_type")
|
||||
div
|
||||
strong(data-i18n="courses.update_account_account_email")
|
||||
.col-md-6
|
||||
if view.accountType
|
||||
div #{view.accountType}
|
||||
div
|
||||
span.spr #{me.get('email')}
|
||||
span.not_you
|
||||
span.spr(data-i18n="courses.not_you")
|
||||
a.logout-btn(data-i18n="login.log_out", href="#")
|
||||
br
|
||||
.row
|
||||
.col-md-6
|
||||
.well(style='background-color:white;')
|
||||
.text-center
|
||||
h4
|
||||
strong(data-i18n="courses.update_account_am_teacher")
|
||||
p(data-i18n="courses.update_account_keep_access")
|
||||
div(style='margin: 0px 20px 0px 20px; font-size: 10pt')
|
||||
div(data-i18n="courses.update_account_teachers_can")
|
||||
ul
|
||||
li(data-i18n="courses.update_account_teachers_can1")
|
||||
li(data-i18n="courses.update_account_teachers_can2")
|
||||
li(data-i18n="courses.update_account_teachers_can3")
|
||||
li(data-i18n="courses.update_account_teachers_can4")
|
||||
.warning(data-i18n="courses.update_account_teachers_warning")
|
||||
br
|
||||
.text-center
|
||||
if me.isTeacher()
|
||||
button.remain-teacher-btn.btn.btn-navy(data-i18n="courses.update_account_remain_teacher")
|
||||
else
|
||||
button.update-teacher-btn.btn.btn-forest(data-i18n="courses.update_account_update_teacher")
|
||||
br
|
||||
.col-md-6
|
||||
.well(style='background-color:white;')
|
||||
.text-center
|
||||
h4
|
||||
strong(data-i18n="courses.update_account_am_student")
|
||||
p(data-i18n="courses.update_account_remove_access")
|
||||
div(style='margin: 0px 20px 0px 20px; font-size: 10pt')
|
||||
div(data-i18n="courses.update_account_students_can")
|
||||
ul
|
||||
li(data-i18n="courses.update_account_students_can1")
|
||||
li(data-i18n="courses.update_account_students_can2")
|
||||
li(data-i18n="courses.update_account_students_can3")
|
||||
li(data-i18n="courses.update_account_students_can4")
|
||||
.warning(data-i18n="courses.update_account_students_warning")
|
||||
br
|
||||
.text-center
|
||||
if me.isStudent()
|
||||
button.remain-student-btn.btn.btn-navy(data-i18n="courses.update_account_remain_student")
|
||||
else
|
||||
button.update-student-btn.btn.btn-forest(data-i18n="courses.update_account_update_student")
|
||||
br
|
||||
br
|
||||
.small.text-center
|
||||
span.spr(data-i18n="courses.update_account_not_sure")
|
||||
a(href='mailto:team@codecombat.com') team@codecombat.com
|
68
app/views/courses/CoursesUpdateAccountView.coffee
Normal file
68
app/views/courses/CoursesUpdateAccountView.coffee
Normal file
|
@ -0,0 +1,68 @@
|
|||
errors = require 'core/errors'
|
||||
RootView = require 'views/core/RootView'
|
||||
template = require 'templates/courses/courses-update-account-view'
|
||||
AuthModal = require 'views/core/AuthModal'
|
||||
{logoutUser, me} = require('core/auth')
|
||||
|
||||
module.exports = class CoursesUpdateAccountView extends RootView
|
||||
id: 'courses-update-account-view'
|
||||
template: template
|
||||
|
||||
events:
|
||||
'click .login-btn': 'onClickLogInButton'
|
||||
'click .logout-btn': 'onClickLogoutButton'
|
||||
'click .remain-teacher-btn': 'onClickRemainTeacherButton'
|
||||
'click .update-teacher-btn': 'onClickUpdateTeacherButton'
|
||||
'click .remain-student-btn': 'onClickRemainStudentButton'
|
||||
'click .update-student-btn': 'onClickUpdateStudentButton'
|
||||
|
||||
initialize: (options) ->
|
||||
@accountType = switch
|
||||
when me.isTeacher() then $.i18n.t('courses.teacher')
|
||||
when me.isStudent() then $.i18n.t('courses.student')
|
||||
|
||||
onClickLogInButton: ->
|
||||
@openModalView(new AuthModal())
|
||||
application.tracker?.trackEvent 'Started Student Login', category: 'Courses Update Account'
|
||||
|
||||
onClickLogoutButton: ->
|
||||
Backbone.Mediator.publish("auth:logging-out", {})
|
||||
logoutUser()
|
||||
|
||||
onClickRemainTeacherButton: (e) ->
|
||||
@remainTeacher(e.target, 'Remain teacher')
|
||||
|
||||
onClickUpdateTeacherButton: (e) ->
|
||||
$(e.target).prop('disabled', true)
|
||||
application.tracker?.trackEvent 'Update teacher', category: 'Courses Update Account'
|
||||
application.router.navigate('/teachers/update-account', {trigger: true})
|
||||
|
||||
onClickRemainStudentButton: (e) ->
|
||||
@becomeStudent(e.target, 'Remain student')
|
||||
|
||||
onClickUpdateStudentButton: (e) ->
|
||||
return unless window.confirm($.i18n.t('courses.update_account_confirm_update_student'))
|
||||
@becomeStudent(e.target, 'Update student')
|
||||
|
||||
becomeStudent: (targetElem, trackEventMsg) ->
|
||||
$(targetElem).prop('disabled', true)
|
||||
me.becomeStudent({
|
||||
success: ->
|
||||
application.tracker?.trackEvent trackEventMsg, category: 'Courses Update Account'
|
||||
application.router.navigate('/courses', {trigger: true})
|
||||
error: ->
|
||||
$(targetElem).prop('disabled', false)
|
||||
errors.showNotyNetworkError(arguments...)
|
||||
})
|
||||
|
||||
remainTeacher: (targetElem, trackEventMsg) ->
|
||||
$(targetElem).prop('disabled', true)
|
||||
me.remainTeacher({
|
||||
success: ->
|
||||
application.tracker?.trackEvent trackEventMsg, category: 'Courses Update Account'
|
||||
application.router.navigate('/teachers', {trigger: true})
|
||||
error: ->
|
||||
$(targetElem).prop('disabled', false)
|
||||
console.log(arguments)
|
||||
errors.showNotyNetworkError(arguments...)
|
||||
})
|
|
@ -25,7 +25,7 @@ module.exports =
|
|||
user = yield User.findOne({gplusID: gpID})
|
||||
throw new errors.NotFound('No user with that G+ ID') unless user
|
||||
res.status(200).send(user.toObject({req: req}))
|
||||
|
||||
|
||||
fetchByFacebookID: wrap (req, res, next) ->
|
||||
fbID = req.query.facebookID
|
||||
fbAT = req.query.facebookAccessToken
|
||||
|
@ -42,13 +42,18 @@ module.exports =
|
|||
res.status(200).send(user.toObject({req: req}))
|
||||
|
||||
removeFromClassrooms: wrap (req, res, next) ->
|
||||
userID = mongoose.Types.ObjectId(req.user.id)
|
||||
yield Classroom.update(
|
||||
{ members: userID }
|
||||
{
|
||||
$addToSet: { deletedMembers: userID }
|
||||
$pull: { members: userID }
|
||||
}
|
||||
{ multi: true }
|
||||
)
|
||||
yield req.user.removeFromClassrooms()
|
||||
next()
|
||||
|
||||
remainTeacher: wrap (req, res, next) ->
|
||||
yield req.user.removeFromClassrooms()
|
||||
user = yield User.findById req.user.id
|
||||
res.status(200).send(user.toObject({req: req}))
|
||||
|
||||
becomeStudent: wrap (req, res, next) ->
|
||||
userID = mongoose.Types.ObjectId(req.user.id)
|
||||
yield Classroom.remove({ ownerID: userID }, false)
|
||||
userID = mongoose.Types.ObjectId(req.user.id)
|
||||
yield User.update({ _id: userID }, { $set: { "role": "student" } })
|
||||
user = yield User.findById req.user.id
|
||||
res.status(200).send(user.toObject({req: req}))
|
||||
|
|
|
@ -6,6 +6,7 @@ mail = require '../commons/mail'
|
|||
log = require 'winston'
|
||||
plugins = require '../plugins/plugins'
|
||||
AnalyticsUsersActive = require './AnalyticsUsersActive'
|
||||
Classroom = require '../models/Classroom'
|
||||
languages = require '../routes/languages'
|
||||
|
||||
config = require '../../server_config'
|
||||
|
@ -69,6 +70,17 @@ UserSchema.methods.isTeacher = ->
|
|||
UserSchema.methods.getUserInfo = ->
|
||||
id: @get('_id')
|
||||
email: if @get('anonymous') then 'Unregistered User' else @get('email')
|
||||
|
||||
UserSchema.methods.removeFromClassrooms = ->
|
||||
userID = @get('_id')
|
||||
yield Classroom.update(
|
||||
{ members: userID }
|
||||
{
|
||||
$addToSet: { deletedMembers: userID }
|
||||
$pull: { members: userID }
|
||||
}
|
||||
{ multi: true }
|
||||
)
|
||||
|
||||
UserSchema.methods.trackActivity = (activityName, increment) ->
|
||||
now = new Date()
|
||||
|
|
|
@ -13,7 +13,7 @@ module.exports.setup = (app) ->
|
|||
app.post('/auth/stop-spying', mw.auth.stopSpying)
|
||||
app.get('/auth/unsubscribe', mw.auth.unsubscribe)
|
||||
app.get('/auth/whoami', mw.auth.whoAmI)
|
||||
|
||||
|
||||
Achievement = require '../models/Achievement'
|
||||
app.get('/db/achievement', mw.achievements.fetchByRelated, mw.rest.get(Achievement))
|
||||
app.post('/db/achievement', mw.auth.checkHasPermission(['admin', 'artisan']), mw.rest.post(Achievement))
|
||||
|
@ -25,7 +25,7 @@ module.exports.setup = (app) ->
|
|||
app.get('/db/achievement/:handle/patches', mw.patchable.patches(Achievement))
|
||||
app.post('/db/achievement/:handle/watchers', mw.patchable.joinWatchers(Achievement))
|
||||
app.delete('/db/achievement/:handle/watchers', mw.patchable.leaveWatchers(Achievement))
|
||||
|
||||
|
||||
Article = require '../models/Article'
|
||||
app.get('/db/article', mw.rest.get(Article))
|
||||
app.post('/db/article', mw.auth.checkHasPermission(['admin', 'artisan']), mw.rest.post(Article))
|
||||
|
@ -53,7 +53,7 @@ module.exports.setup = (app) ->
|
|||
app.get('/db/campaign/:handle/levels', mw.campaigns.fetchRelatedLevels)
|
||||
app.get('/db/campaign/:handle/patches', mw.patchable.patches(Campaign))
|
||||
app.get('/db/campaign/-/overworld', mw.campaigns.fetchOverworld)
|
||||
|
||||
|
||||
app.post('/db/classroom', mw.classrooms.post)
|
||||
app.get('/db/classroom', mw.classrooms.getByOwner)
|
||||
app.get('/db/classroom/:handle/levels', mw.classrooms.fetchAllLevels)
|
||||
|
@ -71,16 +71,18 @@ module.exports.setup = (app) ->
|
|||
app.get('/db/course', mw.rest.get(Course))
|
||||
app.get('/db/course/:handle', mw.rest.getByHandle(Course))
|
||||
app.get('/db/course/:handle/levels/:levelOriginal/next', mw.courses.fetchNextLevel)
|
||||
|
||||
|
||||
app.get('/db/course_instance/:handle/levels/:levelOriginal/next', mw.courseInstances.fetchNextLevel)
|
||||
app.post('/db/course_instance/:handle/members', mw.auth.checkLoggedIn(), mw.courseInstances.addMembers)
|
||||
app.get('/db/course_instance/:handle/classroom', mw.auth.checkLoggedIn(), mw.courseInstances.fetchClassroom)
|
||||
|
||||
|
||||
app.delete('/db/user/:handle', mw.users.removeFromClassrooms)
|
||||
app.get('/db/user', mw.users.fetchByGPlusID, mw.users.fetchByFacebookID)
|
||||
app.put('/db/user/-/become-student', mw.users.becomeStudent)
|
||||
app.put('/db/user/-/remain-teacher', mw.users.remainTeacher)
|
||||
|
||||
app.get '/db/products', require('./db/product').get
|
||||
|
||||
|
||||
TrialRequest = require '../models/TrialRequest'
|
||||
app.get('/db/trial.request', mw.trialRequests.fetchByApplicant, mw.auth.checkHasPermission(['admin']), mw.rest.get(TrialRequest))
|
||||
app.post('/db/trial.request', mw.trialRequests.post)
|
||||
|
|
|
@ -119,7 +119,7 @@ describe 'PUT /db/user', ->
|
|||
form.append('_id', joe.id)
|
||||
form.append('email', 'farghlarghlfarghlarghlfarghlarghlfarghlarghlfarghlarghlfarghlar
|
||||
ghlfarghlarghlfarghlarghlfarghlarghlfarghlarghlfarghlarghlfarghlarghlfarghlarghlfarghlarghl')
|
||||
|
||||
|
||||
it 'does not allow normals to edit their permissions', utils.wrap (done) ->
|
||||
user = yield utils.initUser()
|
||||
yield utils.loginUser(user)
|
||||
|
@ -221,7 +221,7 @@ ghlfarghlarghlfarghlarghlfarghlarghlfarghlarghlfarghlarghlfarghlarghlfarghlarghl
|
|||
request.put {uri:getURL(urlUser + '/' + sam.id), json: sam.toObject()}, (err, response) ->
|
||||
expect(err).toBeNull()
|
||||
done()
|
||||
|
||||
|
||||
describe 'when role is changed to teacher or other school administrator', ->
|
||||
it 'removes the user from all classrooms they are in', utils.wrap (done) ->
|
||||
user = yield utils.initUser()
|
||||
|
@ -230,11 +230,11 @@ ghlfarghlarghlfarghlarghlfarghlarghlfarghlarghlfarghlarghlfarghlarghlfarghlarghl
|
|||
expect(classroom.get('members').length).toBe(1)
|
||||
yield utils.loginUser(user)
|
||||
[res, body] = yield request.putAsync { uri: getURL('/db/user/'+user.id), json: { role: 'teacher' }}
|
||||
yield new Promise (resolve) -> setTimeout(resolve, 10)
|
||||
yield new Promise (resolve) -> setTimeout(resolve, 10)
|
||||
classroom = yield Classroom.findById(classroom.id)
|
||||
expect(classroom.get('members').length).toBe(0)
|
||||
done()
|
||||
|
||||
|
||||
it 'ignores attempts to change away from a teacher role', utils.wrap (done) ->
|
||||
user = yield utils.initUser()
|
||||
yield utils.loginUser(user)
|
||||
|
@ -246,7 +246,210 @@ ghlfarghlarghlfarghlarghlfarghlarghlfarghlarghlfarghlarghlfarghlarghlfarghlarghl
|
|||
[res, body] = yield request.putAsync { uri: url, json: { role: 'student' }}
|
||||
expect(body.role).toBe('advisor')
|
||||
done()
|
||||
|
||||
|
||||
describe 'PUT /db/user/-/become-student', ->
|
||||
beforeEach utils.wrap (done) ->
|
||||
@url = getURL('/db/user/-/become-student')
|
||||
@user = yield utils.initUser()
|
||||
yield utils.loginUser(@user)
|
||||
done()
|
||||
|
||||
describe 'when a user is in a classroom', ->
|
||||
beforeEach utils.wrap (done) ->
|
||||
classroom = new Classroom({
|
||||
members: [@user._id]
|
||||
})
|
||||
yield classroom.save()
|
||||
done()
|
||||
it 'keeps the user in their classroom and sets their role to student', utils.wrap (done) ->
|
||||
[res, body] = yield request.putAsync { uri: @url}
|
||||
expect(res.statusCode).toEqual(200)
|
||||
expect(JSON.parse(body).role).toEqual('student')
|
||||
user = yield User.findById @user._id
|
||||
expect(user.get('role')).toEqual('student')
|
||||
classrooms = yield Classroom.find members: @user._id
|
||||
expect(classrooms.length).toEqual(1)
|
||||
done()
|
||||
|
||||
describe 'when a teacher', ->
|
||||
beforeEach utils.wrap (done) ->
|
||||
@user.set('role', 'student')
|
||||
yield @user.save()
|
||||
done()
|
||||
it 'keeps the user in their classroom and sets their role to student', utils.wrap (done) ->
|
||||
[res, body] = yield request.putAsync { uri: @url}
|
||||
expect(res.statusCode).toEqual(200)
|
||||
expect(JSON.parse(body).role).toEqual('student')
|
||||
user = yield User.findById @user._id
|
||||
expect(user.get('role')).toEqual('student')
|
||||
classrooms = yield Classroom.find members: @user._id
|
||||
expect(classrooms.length).toEqual(1)
|
||||
done()
|
||||
|
||||
describe 'when a student', ->
|
||||
beforeEach utils.wrap (done) ->
|
||||
@user.set('role', 'student')
|
||||
yield @user.save()
|
||||
done()
|
||||
it 'keeps the user in their classroom and sets their role to student', utils.wrap (done) ->
|
||||
[res, body] = yield request.putAsync { uri: @url}
|
||||
expect(res.statusCode).toEqual(200)
|
||||
expect(JSON.parse(body).role).toEqual('student')
|
||||
user = yield User.findById @user._id
|
||||
expect(user.get('role')).toEqual('student')
|
||||
classrooms = yield Classroom.find members: @user._id
|
||||
expect(classrooms.length).toEqual(1)
|
||||
done()
|
||||
|
||||
describe 'when a user owns a classroom', ->
|
||||
beforeEach utils.wrap (done) ->
|
||||
classroom = new Classroom({
|
||||
ownerID: @user._id
|
||||
})
|
||||
yield classroom.save()
|
||||
done()
|
||||
it 'removes the classroom and sets their role to student', utils.wrap (done) ->
|
||||
[res, body] = yield request.putAsync { uri: @url}
|
||||
expect(res.statusCode).toEqual(200)
|
||||
expect(JSON.parse(body).role).toEqual('student')
|
||||
user = yield User.findById @user._id
|
||||
expect(user.get('role')).toEqual('student')
|
||||
classrooms = yield Classroom.find ownerID: @user._id
|
||||
expect(classrooms.length).toEqual(0)
|
||||
done()
|
||||
|
||||
describe 'when a student', ->
|
||||
beforeEach utils.wrap (done) ->
|
||||
@user.set('role', 'student')
|
||||
yield @user.save()
|
||||
done()
|
||||
it 'removes the classroom and sets their role to student', utils.wrap (done) ->
|
||||
[res, body] = yield request.putAsync { uri: @url}
|
||||
expect(res.statusCode).toEqual(200)
|
||||
expect(JSON.parse(body).role).toEqual('student')
|
||||
user = yield User.findById @user._id
|
||||
expect(user.get('role')).toEqual('student')
|
||||
classrooms = yield Classroom.find ownerID: @user._id
|
||||
expect(classrooms.length).toEqual(0)
|
||||
done()
|
||||
|
||||
describe 'when a teacher', ->
|
||||
beforeEach utils.wrap (done) ->
|
||||
@user.set('role', 'teacher')
|
||||
yield @user.save()
|
||||
done()
|
||||
it 'removes the classroom and sets their role to student', utils.wrap (done) ->
|
||||
[res, body] = yield request.putAsync { uri: @url}
|
||||
expect(res.statusCode).toEqual(200)
|
||||
expect(JSON.parse(body).role).toEqual('student')
|
||||
user = yield User.findById @user._id
|
||||
expect(user.get('role')).toEqual('student')
|
||||
classrooms = yield Classroom.find ownerID: @user._id
|
||||
expect(classrooms.length).toEqual(0)
|
||||
done()
|
||||
|
||||
describe 'when a user in a classroom and owns a classroom', ->
|
||||
beforeEach utils.wrap (done) ->
|
||||
classroom = new Classroom({
|
||||
members: [@user._id]
|
||||
})
|
||||
yield classroom.save()
|
||||
classroom = new Classroom({
|
||||
ownerID: @user._id
|
||||
})
|
||||
yield classroom.save()
|
||||
done()
|
||||
it 'removes owned classrooms, keeps in classrooms, and sets their role to student', utils.wrap (done) ->
|
||||
[res, body] = yield request.putAsync { uri: @url}
|
||||
expect(res.statusCode).toEqual(200)
|
||||
expect(JSON.parse(body).role).toEqual('student')
|
||||
user = yield User.findById @user._id
|
||||
expect(user.get('role')).toEqual('student')
|
||||
classrooms = yield Classroom.find ownerID: @user._id
|
||||
expect(classrooms.length).toEqual(0)
|
||||
classrooms = yield Classroom.find members: @user._id
|
||||
expect(classrooms.length).toEqual(1)
|
||||
done()
|
||||
|
||||
describe 'when a student in a classroom and owns a classroom', ->
|
||||
beforeEach utils.wrap (done) ->
|
||||
@user.set('role', 'student')
|
||||
yield @user.save()
|
||||
classroom = new Classroom({
|
||||
members: [@user._id]
|
||||
})
|
||||
yield classroom.save()
|
||||
classroom = new Classroom({
|
||||
ownerID: @user._id
|
||||
})
|
||||
yield classroom.save()
|
||||
done()
|
||||
it 'removes owned classrooms, keeps in classrooms, and sets their role to student', utils.wrap (done) ->
|
||||
[res, body] = yield request.putAsync { uri: @url}
|
||||
expect(res.statusCode).toEqual(200)
|
||||
expect(JSON.parse(body).role).toEqual('student')
|
||||
user = yield User.findById @user._id
|
||||
expect(user.get('role')).toEqual('student')
|
||||
classrooms = yield Classroom.find ownerID: @user._id
|
||||
expect(classrooms.length).toEqual(0)
|
||||
classrooms = yield Classroom.find members: @user._id
|
||||
expect(classrooms.length).toEqual(1)
|
||||
done()
|
||||
|
||||
describe 'when a teacher in a classroom and owns a classroom', ->
|
||||
beforeEach utils.wrap (done) ->
|
||||
@user.set('role', 'teacher')
|
||||
yield @user.save()
|
||||
classroom = new Classroom({
|
||||
members: [@user._id]
|
||||
})
|
||||
yield classroom.save()
|
||||
classroom = new Classroom({
|
||||
ownerID: @user._id
|
||||
})
|
||||
yield classroom.save()
|
||||
done()
|
||||
it 'removes owned classrooms, keeps in classrooms, and sets their role to student', utils.wrap (done) ->
|
||||
[res, body] = yield request.putAsync { uri: @url}
|
||||
expect(res.statusCode).toEqual(200)
|
||||
expect(JSON.parse(body).role).toEqual('student')
|
||||
user = yield User.findById @user._id
|
||||
expect(user.get('role')).toEqual('student')
|
||||
classrooms = yield Classroom.find ownerID: @user._id
|
||||
expect(classrooms.length).toEqual(0)
|
||||
classrooms = yield Classroom.find members: @user._id
|
||||
expect(classrooms.length).toEqual(1)
|
||||
done()
|
||||
|
||||
describe 'PUT /db/user/-/remain-teacher', ->
|
||||
|
||||
describe 'when a teacher in classroom and owns a classroom', ->
|
||||
beforeEach utils.wrap (done) ->
|
||||
@url = getURL('/db/user/-/remain-teacher')
|
||||
@user = yield utils.initUser()
|
||||
yield utils.loginUser(@user)
|
||||
@user.set('role', 'teacher')
|
||||
yield @user.save()
|
||||
classroom = new Classroom({
|
||||
members: [@user._id]
|
||||
})
|
||||
yield classroom.save()
|
||||
classroom = new Classroom({
|
||||
ownerID: @user._id
|
||||
})
|
||||
yield classroom.save()
|
||||
done()
|
||||
it 'removes from classrooms', utils.wrap (done) ->
|
||||
[res, body] = yield request.putAsync { uri: @url}
|
||||
expect(res.statusCode).toEqual(200)
|
||||
expect(JSON.parse(body).role).toEqual('teacher')
|
||||
user = yield User.findById @user._id
|
||||
expect(user.get('role')).toEqual('teacher')
|
||||
classrooms = yield Classroom.find ownerID: @user._id
|
||||
expect(classrooms.length).toEqual(1)
|
||||
classrooms = yield Classroom.find members: @user._id
|
||||
expect(classrooms.length).toEqual(0)
|
||||
done()
|
||||
|
||||
describe 'GET /db/user', ->
|
||||
|
||||
|
@ -323,7 +526,7 @@ describe 'DELETE /db/user', ->
|
|||
continue if key in ['_id', 'deleted', 'dateDeleted']
|
||||
expect(_.isEmpty(value)).toEqual(true)
|
||||
done()
|
||||
|
||||
|
||||
it 'moves user to classroom.deletedMembers', utils.wrap (done) ->
|
||||
user = yield utils.initUser()
|
||||
user2 = yield utils.initUser()
|
||||
|
@ -369,7 +572,7 @@ describe 'Statistics', ->
|
|||
expect(guy.get 'id').toBe joe.get 'id'
|
||||
expect(guy.get 'stats.gamesCompleted').toBe 1
|
||||
done()
|
||||
|
||||
|
||||
setTimeout f, 100
|
||||
|
||||
it 'recalculates games completed', (done) ->
|
||||
|
|
59
test/app/views/courses/CoursesUpdateAccountView.spec.coffee
Normal file
59
test/app/views/courses/CoursesUpdateAccountView.spec.coffee
Normal file
|
@ -0,0 +1,59 @@
|
|||
CoursesUpdateAccountView = require 'views/courses/CoursesUpdateAccountView'
|
||||
factories = require 'test/app/factories'
|
||||
|
||||
describe '/courses/update-account', ->
|
||||
|
||||
describe 'when logged out', ->
|
||||
beforeEach (done) ->
|
||||
me.clear()
|
||||
@view = new CoursesUpdateAccountView()
|
||||
@view.render()
|
||||
done()
|
||||
|
||||
it 'shows log in button', ->
|
||||
expect(@view.$el.find('.login-btn').length).toEqual(1)
|
||||
|
||||
describe 'when logged in as individual', ->
|
||||
beforeEach (done) ->
|
||||
me.set(factories.makeUser({}).attributes)
|
||||
@view = new CoursesUpdateAccountView()
|
||||
@view.render()
|
||||
expect(@view.$el.find('.login-btn').length).toEqual(0)
|
||||
done()
|
||||
|
||||
it 'shows update to teacher button', ->
|
||||
expect(@view.$el.find('.update-teacher-btn').length).toEqual(1)
|
||||
|
||||
it 'shows update to student button', ->
|
||||
expect(@view.$el.find('.update-student-btn').length).toEqual(1)
|
||||
|
||||
describe 'when logged in as student', ->
|
||||
beforeEach (done) ->
|
||||
me.set(factories.makeUser({role: 'student'}).attributes)
|
||||
@view = new CoursesUpdateAccountView()
|
||||
@view.render()
|
||||
expect(@view.$el.find('.login-btn').length).toEqual(0)
|
||||
expect(@view.$el.find('.remain-teacher-btn').length).toEqual(0)
|
||||
expect(@view.$el.find('.logout-btn').length).toEqual(1)
|
||||
done()
|
||||
|
||||
it 'shows remain a student button', ->
|
||||
expect(@view.$el.find('.remain-student-btn').length).toEqual(1)
|
||||
|
||||
it 'shows update to teacher button', ->
|
||||
expect(@view.$el.find('.update-teacher-btn').length).toEqual(1)
|
||||
|
||||
describe 'when logged in as teacher', ->
|
||||
beforeEach (done) ->
|
||||
me.set(factories.makeUser({role: 'teacher'}).attributes)
|
||||
@view = new CoursesUpdateAccountView()
|
||||
@view.render()
|
||||
expect(@view.$el.find('.login-btn').length).toEqual(0)
|
||||
expect(@view.$el.find('.remain-student-btn').length).toEqual(0)
|
||||
done()
|
||||
|
||||
it 'shows remain a teacher button', ->
|
||||
expect(@view.$el.find('.remain-teacher-btn').length).toEqual(1)
|
||||
|
||||
it 'shows update to student button', ->
|
||||
expect(@view.$el.find('.update-student-btn').length).toEqual(1)
|
Loading…
Reference in a new issue