/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:
Matt Lott 2016-05-16 14:33:20 -07:00
parent f017ecd52b
commit 6f6d65a005
11 changed files with 511 additions and 23 deletions

View file

@ -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')

View file

@ -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

View file

@ -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
]

View 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

View 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

View 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...)
})

View file

@ -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}))

View file

@ -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()

View file

@ -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)

View file

@ -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) ->

View 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)