mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-12-12 08:41:46 -05:00
414 lines
15 KiB
CoffeeScript
414 lines
15 KiB
CoffeeScript
CreateAccountModal = require 'views/core/CreateAccountModal'
|
|
Classroom = require 'models/Classroom'
|
|
#COPPADenyModal = require 'views/core/COPPADenyModal'
|
|
forms = require 'core/forms'
|
|
factories = require 'test/app/factories'
|
|
|
|
# TODO: Figure out why these tests break Travis. Suspect it has to do with the
|
|
# asynchronous, Promise system. On the browser, these work, but in Travis, they
|
|
# sometimes fail, so it's some sort of race condition.
|
|
|
|
responses = {
|
|
signupSuccess: { status: 200, responseText: JSON.stringify({ email: 'some@email.com' })}
|
|
}
|
|
|
|
xdescribe 'CreateAccountModal', ->
|
|
|
|
modal = null
|
|
|
|
# initModal = (options) -> ->
|
|
# application.facebookHandler.fakeAPI()
|
|
# application.gplusHandler.fakeAPI()
|
|
# modal = new CreateAccountModal(options)
|
|
# jasmine.demoModal(modal)
|
|
|
|
describe 'click SIGN IN button', ->
|
|
it 'switches to AuthModal', ->
|
|
modal = new CreateAccountModal()
|
|
modal.render()
|
|
jasmine.demoModal(modal)
|
|
spyOn(modal, 'openModalView')
|
|
modal.$('.login-link').click()
|
|
expect(modal.openModalView).toHaveBeenCalled()
|
|
|
|
describe 'ChooseAccountTypeView', ->
|
|
beforeEach ->
|
|
modal = new CreateAccountModal()
|
|
modal.render()
|
|
jasmine.demoModal(modal)
|
|
|
|
describe 'click sign up as TEACHER button', ->
|
|
beforeEach ->
|
|
spyOn application.router, 'navigate'
|
|
modal.$('.teacher-path-button').click()
|
|
|
|
it 'navigates the user to /teachers/signup', ->
|
|
expect(application.router.navigate).toHaveBeenCalled()
|
|
args = application.router.navigate.calls.argsFor(0)
|
|
expect(args[0]).toBe('/teachers/signup')
|
|
|
|
describe 'click sign up as STUDENT button', ->
|
|
beforeEach ->
|
|
modal.$('.student-path-button').click()
|
|
|
|
it 'switches to SegmentCheckView and sets "path" to "student"', ->
|
|
expect(modal.signupState.get('path')).toBe('student')
|
|
expect(modal.signupState.get('screen')).toBe('segment-check')
|
|
|
|
describe 'click sign up as INDIVIDUAL button', ->
|
|
beforeEach ->
|
|
modal.$('.individual-path-button').click()
|
|
|
|
it 'switches to SegmentCheckView and sets "path" to "individual"', ->
|
|
expect(modal.signupState.get('path')).toBe('individual')
|
|
expect(modal.signupState.get('screen')).toBe('segment-check')
|
|
|
|
describe 'SegmentCheckView', ->
|
|
|
|
segmentCheckView = null
|
|
|
|
describe 'INDIVIDUAL path', ->
|
|
beforeEach ->
|
|
modal = new CreateAccountModal()
|
|
modal.render()
|
|
jasmine.demoModal(modal)
|
|
modal.$('.individual-path-button').click()
|
|
segmentCheckView = modal.subviews.segment_check_view
|
|
|
|
it 'has a birthdate form', ->
|
|
expect(modal.$('.birthday-form-group').length).toBe(1)
|
|
|
|
describe 'STUDENT path', ->
|
|
beforeEach ->
|
|
modal = new CreateAccountModal()
|
|
modal.render()
|
|
jasmine.demoModal(modal)
|
|
modal.$('.student-path-button').click()
|
|
segmentCheckView = modal.subviews.segment_check_view
|
|
spyOn(segmentCheckView, 'checkClassCodeDebounced')
|
|
|
|
it 'has a classCode input', ->
|
|
expect(modal.$('.class-code-input').length).toBe(1)
|
|
|
|
it 'checks the class code when the input changes', ->
|
|
modal.$('.class-code-input').val('test').trigger('input')
|
|
expect(segmentCheckView.checkClassCodeDebounced).toHaveBeenCalled()
|
|
|
|
describe 'fetchClassByCode()', ->
|
|
it 'is memoized', ->
|
|
promise1 = segmentCheckView.fetchClassByCode('testA')
|
|
promise2 = segmentCheckView.fetchClassByCode('testA')
|
|
promise3 = segmentCheckView.fetchClassByCode('testB')
|
|
expect(promise1).toBe(promise2)
|
|
expect(promise1).not.toBe(promise3)
|
|
|
|
describe 'checkClassCode()', ->
|
|
it 'shows a success message if the classCode is found', ->
|
|
request = jasmine.Ajax.requests.mostRecent()
|
|
expect(request).toBeUndefined()
|
|
modal.$('.class-code-input').val('test').trigger('input')
|
|
segmentCheckView.checkClassCode()
|
|
request = jasmine.Ajax.requests.mostRecent()
|
|
expect(request).toBeDefined()
|
|
request.respondWith({
|
|
status: 200
|
|
responseText: JSON.stringify({
|
|
data: factories.makeClassroom({name: 'Some Classroom'}).toJSON()
|
|
owner: factories.makeUser({name: 'Some Teacher'}).toJSON()
|
|
})
|
|
})
|
|
|
|
describe 'on submit with class code', ->
|
|
|
|
classCodeRequest = null
|
|
|
|
beforeEach ->
|
|
request = jasmine.Ajax.requests.mostRecent()
|
|
expect(request).toBeUndefined()
|
|
modal.$('.class-code-input').val('test').trigger('input')
|
|
modal.$('form.segment-check').submit()
|
|
classCodeRequest = jasmine.Ajax.requests.mostRecent()
|
|
expect(classCodeRequest).toBeDefined()
|
|
|
|
describe 'when the classroom IS found', ->
|
|
beforeEach (done) ->
|
|
classCodeRequest.respondWith({
|
|
status: 200
|
|
responseText: JSON.stringify({
|
|
data: factories.makeClassroom({name: 'Some Classroom'}).toJSON()
|
|
owner: factories.makeUser({name: 'Some Teacher'}).toJSON()
|
|
})
|
|
})
|
|
_.defer done
|
|
|
|
it 'navigates to the BasicInfoView', ->
|
|
expect(modal.signupState.get('screen')).toBe('basic-info')
|
|
|
|
describe 'when the classroom IS NOT found', ->
|
|
beforeEach (done) ->
|
|
classCodeRequest.respondWith({
|
|
status: 404
|
|
responseText: '{}'
|
|
})
|
|
segmentCheckView.once 'special-render', done
|
|
|
|
it 'shows an error', ->
|
|
expect(modal.$('[data-i18n="signup.classroom_not_found"]').length).toBe(1)
|
|
|
|
describe 'CoppaDenyView', ->
|
|
|
|
coppaDenyView = null
|
|
|
|
beforeEach ->
|
|
modal = new CreateAccountModal()
|
|
modal.signupState.set({
|
|
path: 'individual'
|
|
screen: 'coppa-deny'
|
|
})
|
|
modal.render()
|
|
jasmine.demoModal(modal)
|
|
coppaDenyView = modal.subviews.coppa_deny_view
|
|
|
|
it 'shows an input for a parent\'s email address to sign up their child', ->
|
|
expect(modal.$('#parent-email-input').length).toBe(1)
|
|
|
|
|
|
describe 'BasicInfoView', ->
|
|
|
|
basicInfoView = null
|
|
|
|
beforeEach ->
|
|
modal = new CreateAccountModal()
|
|
modal.signupState.set({
|
|
path: 'individual'
|
|
screen: 'basic-info'
|
|
})
|
|
modal.render()
|
|
jasmine.demoModal(modal)
|
|
basicInfoView = modal.subviews.basic_info_view
|
|
|
|
it 'checks for name conflicts when the name input changes', ->
|
|
spyOn(basicInfoView, 'checkName')
|
|
basicInfoView.$('#username-input').val('test').trigger('change')
|
|
expect(basicInfoView.checkName).toHaveBeenCalled()
|
|
|
|
describe 'checkEmail()', ->
|
|
beforeEach ->
|
|
basicInfoView.$('input[name="email"]').val('some@email.com')
|
|
basicInfoView.checkEmail()
|
|
|
|
it 'shows checking', ->
|
|
expect(basicInfoView.$('[data-i18n="signup.checking"]').length).toBe(1)
|
|
|
|
describe 'if email DOES exist', ->
|
|
beforeEach (done) ->
|
|
jasmine.Ajax.requests.mostRecent().respondWith({
|
|
status: 200
|
|
responseText: JSON.stringify({exists: true})
|
|
})
|
|
_.defer done
|
|
|
|
it 'says an account already exists and encourages to sign in', ->
|
|
expect(basicInfoView.$('[data-i18n="signup.account_exists"]').length).toBe(1)
|
|
expect(basicInfoView.$('.login-link[data-i18n="signup.sign_in"]').length).toBe(1)
|
|
|
|
describe 'if email DOES NOT exist', ->
|
|
beforeEach (done) ->
|
|
jasmine.Ajax.requests.mostRecent().respondWith({
|
|
status: 200
|
|
responseText: JSON.stringify({exists: false})
|
|
})
|
|
_.defer done
|
|
|
|
it 'says email looks good', ->
|
|
expect(basicInfoView.$('[data-i18n="signup.email_good"]').length).toBe(1)
|
|
|
|
describe 'checkName()', ->
|
|
beforeEach ->
|
|
basicInfoView.$('input[name="name"]').val('Some Name').trigger('change')
|
|
basicInfoView.checkName()
|
|
|
|
it 'shows checking', ->
|
|
expect(basicInfoView.$('[data-i18n="signup.checking"]').length).toBe(1)
|
|
|
|
# does not work in travis since en.coffee is not included. TODO: Figure out workaround
|
|
# describe 'if name DOES exist', ->
|
|
# beforeEach (done) ->
|
|
# jasmine.Ajax.requests.mostRecent().respondWith({
|
|
# status: 200
|
|
# responseText: JSON.stringify({conflicts: true, suggestedName: 'test123'})
|
|
# })
|
|
# _.defer done
|
|
#
|
|
# it 'says name is taken and suggests a different one', ->
|
|
# expect(basicInfoView.$el.text().indexOf('test123') > -1).toBe(true)
|
|
|
|
describe 'if email DOES NOT exist', ->
|
|
beforeEach (done) ->
|
|
jasmine.Ajax.requests.mostRecent().respondWith({
|
|
status: 200
|
|
responseText: JSON.stringify({conflicts: false})
|
|
})
|
|
_.defer done
|
|
|
|
it 'says name looks good', ->
|
|
expect(basicInfoView.$('[data-i18n="signup.name_available"]').length).toBe(1)
|
|
|
|
describe 'onSubmitForm()', ->
|
|
it 'shows required errors for empty fields when on INDIVIDUAL path', ->
|
|
basicInfoView.$('input').val('')
|
|
basicInfoView.$('#basic-info-form').submit()
|
|
expect(basicInfoView.$('.form-group.has-error').length).toBe(3)
|
|
|
|
it 'shows required errors for empty fields when on STUDENT path', ->
|
|
modal.signupState.set('path', 'student')
|
|
modal.render()
|
|
basicInfoView.$('#basic-info-form').submit()
|
|
expect(basicInfoView.$('.form-group.has-error').length).toBe(5) # includes first and last name
|
|
|
|
describe 'submit with password', ->
|
|
beforeEach ->
|
|
forms.objectToForm(basicInfoView.$el, {
|
|
email: 'some@email.com'
|
|
password: 'password'
|
|
name: 'A Username'
|
|
})
|
|
basicInfoView.$('form').submit()
|
|
|
|
it 'checks for email and name conflicts', ->
|
|
emailCheck = _.find(jasmine.Ajax.requests.all(), (r) -> _.string.startsWith(r.url, '/auth/email'))
|
|
nameCheck = _.find(jasmine.Ajax.requests.all(), (r) -> _.string.startsWith(r.url, '/auth/name'))
|
|
expect(_.all([emailCheck, nameCheck])).toBe(true)
|
|
|
|
describe 'a check does not pass', ->
|
|
beforeEach (done) ->
|
|
nameCheck = _.find(jasmine.Ajax.requests.all(), (r) -> _.string.startsWith(r.url, '/auth/name'))
|
|
nameCheck.respondWith({
|
|
status: 200
|
|
responseText: JSON.stringify({conflicts: false})
|
|
})
|
|
emailCheck = _.find(jasmine.Ajax.requests.all(), (r) -> _.string.startsWith(r.url, '/auth/email'))
|
|
emailCheck.respondWith({
|
|
status: 200
|
|
responseText: JSON.stringify({ exists: true })
|
|
})
|
|
_.defer done
|
|
|
|
it 're-enables the form and shows which field failed', ->
|
|
|
|
describe 'both checks do pass', ->
|
|
beforeEach (done) ->
|
|
nameCheck = _.find(jasmine.Ajax.requests.all(), (r) -> _.string.startsWith(r.url, '/auth/name'))
|
|
nameCheck.respondWith({
|
|
status: 200
|
|
responseText: JSON.stringify({conflicts: false})
|
|
})
|
|
emailCheck = _.find(jasmine.Ajax.requests.all(), (r) -> _.string.startsWith(r.url, '/auth/email'))
|
|
emailCheck.respondWith({
|
|
status: 200
|
|
responseText: JSON.stringify({ exists: false })
|
|
})
|
|
_.defer done
|
|
|
|
it 'saves the user', ->
|
|
request = jasmine.Ajax.requests.mostRecent()
|
|
expect(_.string.startsWith(request.url, '/db/user')).toBe(true)
|
|
|
|
describe 'saving the user FAILS', ->
|
|
beforeEach (done) ->
|
|
request = jasmine.Ajax.requests.mostRecent()
|
|
request.respondWith({
|
|
status: 422
|
|
responseText: JSON.stringify({
|
|
message: 'Some error happened'
|
|
})
|
|
})
|
|
_.defer(done)
|
|
|
|
it 'displays the server error', ->
|
|
expect(basicInfoView.$('.alert-danger').length).toBe(1)
|
|
|
|
describe 'saving the user SUCCEEDS', ->
|
|
beforeEach (done) ->
|
|
request = jasmine.Ajax.requests.mostRecent()
|
|
request.respondWith({
|
|
status: 200
|
|
responseText: '{}'
|
|
})
|
|
_.defer(done)
|
|
|
|
it 'signs the user up with the password', ->
|
|
request = jasmine.Ajax.requests.mostRecent()
|
|
expect(_.string.endsWith(request.url, 'signup-with-password')).toBe(true)
|
|
|
|
describe 'after signup STUDENT', ->
|
|
beforeEach (done) ->
|
|
basicInfoView.signupState.set({
|
|
path: 'student'
|
|
classCode: 'ABC'
|
|
classroom: new Classroom()
|
|
})
|
|
request = jasmine.Ajax.requests.mostRecent()
|
|
request.respondWith(responses.signupSuccess)
|
|
_.defer(done)
|
|
|
|
it 'joins the classroom', ->
|
|
request = jasmine.Ajax.requests.mostRecent()
|
|
expect(request.url).toBe('/db/classroom/~/members')
|
|
|
|
describe 'signing the user up SUCCEEDS', ->
|
|
beforeEach (done) ->
|
|
spyOn(basicInfoView, 'finishSignup')
|
|
request = jasmine.Ajax.requests.mostRecent()
|
|
request.respondWith(responses.signupSuccess)
|
|
_.defer(done)
|
|
|
|
it 'calls finishSignup()', ->
|
|
expect(basicInfoView.finishSignup).toHaveBeenCalled()
|
|
|
|
describe 'ConfirmationView', ->
|
|
confirmationView = null
|
|
|
|
beforeEach ->
|
|
modal = new CreateAccountModal()
|
|
modal.signupState.set('screen', 'confirmation')
|
|
modal.render()
|
|
jasmine.demoModal(modal)
|
|
confirmationView = modal.subviews.confirmation_view
|
|
|
|
it '(for demo testing)', ->
|
|
me.set('name', 'A Sweet New Username')
|
|
me.set('email', 'some@email.com')
|
|
confirmationView.signupState.set('ssoUsed', 'gplus')
|
|
|
|
describe 'SingleSignOnConfirmView', ->
|
|
singleSignOnConfirmView = null
|
|
|
|
beforeEach ->
|
|
modal = new CreateAccountModal()
|
|
modal.signupState.set({
|
|
screen: 'sso-confirm'
|
|
email: 'some@email.com'
|
|
})
|
|
modal.render()
|
|
jasmine.demoModal(modal)
|
|
singleSignOnConfirmView = modal.subviews.single_sign_on_confirm_view
|
|
|
|
it '(for demo testing)', ->
|
|
me.set('name', 'A Sweet New Username')
|
|
me.set('email', 'some@email.com')
|
|
singleSignOnConfirmView.signupState.set('ssoUsed', 'facebook')
|
|
|
|
describe 'CoppaDenyView', ->
|
|
coppaDenyView = null
|
|
|
|
beforeEach ->
|
|
modal = new CreateAccountModal()
|
|
modal.signupState.set({
|
|
screen: 'coppa-deny'
|
|
})
|
|
modal.render()
|
|
jasmine.demoModal(modal)
|
|
coppaDenyView = modal.subviews.coppa_deny_view
|
|
|
|
it '(for demo testing)', ->
|