Files
edx-platform/lms/static/js/spec/student_account/account_spec.js
Renzo Lucioni f9ecd8849a Fix logistration Jasmine tests
Includes several bug fixes caught during test writing, general clean-up, and adds js-url, a lightweight URL parser
2014-11-06 12:07:49 -05:00

202 lines
8.8 KiB
JavaScript

define(['js/student_account/account'],
function() {
describe("edx.student.account.AccountModel", function() {
'use strict';
var account = null;
var assertValid = function(fields, isValid, expectedErrors) {
account.set(fields);
var errors = account.validate(account.attributes);
if (isValid) {
expect(errors).toBe(undefined);
} else {
expect(errors).toEqual(expectedErrors);
}
};
var EXPECTED_ERRORS = {
email: {
email: "Please enter a valid email address"
},
password: {
password: "Please enter a valid password"
}
};
beforeEach(function() {
account = new edx.student.account.AccountModel();
account.set({
email: "bob@example.com",
password: "password"
});
});
it("accepts valid email addresses", function() {
assertValid({email: "bob@example.com"}, true);
assertValid({email: "bob+smith@example.com"}, true);
assertValid({email: "bob+smith@example.com"}, true);
assertValid({email: "bob+smith@example.com"}, true);
assertValid({email: "bob@test.example.com"}, true);
assertValid({email: "bob@test-example.com"}, true);
});
it("rejects blank email addresses", function() {
assertValid({email: ""}, false, EXPECTED_ERRORS.email);
assertValid({email: " "}, false, EXPECTED_ERRORS.email);
});
it("rejects invalid email addresses", function() {
assertValid({email: "bob"}, false, EXPECTED_ERRORS.email);
assertValid({email: "bob@example"}, false, EXPECTED_ERRORS.email);
assertValid({email: "@"}, false, EXPECTED_ERRORS.email);
assertValid({email: "@example.com"}, false, EXPECTED_ERRORS.email);
// The server will reject emails with non-ASCII unicode
// Technically these are valid email addresses, but the email validator
// in Django 1.4 will reject them anyway, so we should too.
assertValid({email: "fŕáńḱ@example.com"}, false, EXPECTED_ERRORS.email);
assertValid({email: "frank@éxáḿṕĺé.com"}, false, EXPECTED_ERRORS.email);
});
it("rejects a long email address", function() {
// Construct an email exactly one character longer than the maximum length
var longEmail = new Array(account.EMAIL_MAX_LENGTH - 10).join("e") + "@example.com";
assertValid({email: longEmail}, false, EXPECTED_ERRORS.email);
});
it("accepts a valid password", function() {
assertValid({password: "password-test123"}, true, EXPECTED_ERRORS.password);
});
it("rejects a short password", function() {
assertValid({password: ""}, false, EXPECTED_ERRORS.password);
assertValid({password: "a"}, false, EXPECTED_ERRORS.password);
assertValid({password: "aa"}, true, EXPECTED_ERRORS.password);
});
it("rejects a long password", function() {
// Construct a password exactly one character longer than the maximum length
var longPassword = new Array(account.PASSWORD_MAX_LENGTH + 2).join("a");
assertValid({password: longPassword}, false, EXPECTED_ERRORS.password);
});
});
describe("edx.student.account.AccountView", function() {
var view = null,
ajaxSuccess = true;
var requestEmailChange = function(email, password) {
var fakeEvent = {preventDefault: function() {}};
view.model.set({
email: email,
password: password
});
view.submit(fakeEvent);
};
var requestPasswordChange = function() {
var fakeEvent = {preventDefault: function() {}};
view.click(fakeEvent);
};
var assertAjax = function(url, method, data) {
expect($.ajax).toHaveBeenCalled();
var ajaxArgs = $.ajax.mostRecentCall.args[0];
expect(ajaxArgs.url).toEqual(url);
expect(ajaxArgs.type).toEqual(method);
expect(ajaxArgs.data).toEqual(data);
expect(ajaxArgs.headers.hasOwnProperty("X-CSRFToken")).toBe(true);
};
var assertStatus = function(selection, success, errorClass, expectedStatus) {
if (!success) {
expect(selection).toHaveClass(errorClass);
} else {
expect(selection).not.toHaveClass(errorClass);
}
expect(selection.text()).toEqual(expectedStatus);
};
beforeEach(function() {
var fixture = readFixtures("templates/student_account/account.underscore");
setFixtures("<div id=\"account-tpl\">" + fixture + "</div>");
view = new edx.student.account.AccountView().render();
// Stub Ajax calls to return success/failure
spyOn($, "ajax").andCallFake(function() {
return $.Deferred(function(defer) {
if (ajaxSuccess) {
defer.resolve();
} else {
defer.reject();
}
}).promise();
});
});
it("requests an email address change", function() {
requestEmailChange("bob@example.com", "password");
assertAjax("email", "POST", {
email: "bob@example.com",
password: "password"
});
assertStatus(view.$requestStatus, true, "error", "Please check your email to confirm the change");
});
it("displays email validation errors", function() {
// Invalid email should display an error
requestEmailChange("invalid", "password");
assertStatus(view.$emailStatus, false, "validation-error", "Please enter a valid email address");
// Once the error is fixed, the status should return to normal
requestEmailChange("bob@example.com", "password");
assertStatus(view.$emailStatus, true, "validation-error", "");
});
it("displays an invalid password error", function() {
// Password cannot be empty
requestEmailChange("bob@example.com", "");
assertStatus(view.$passwordStatus, false, "validation-error", "Please enter a valid password");
// Once the error is fixed, the status should return to normal
requestEmailChange("bob@example.com", "password");
assertStatus(view.$passwordStatus, true, "validation-error", "");
});
it("displays server errors", function() {
// Simulate an error from the server
ajaxSuccess = false;
requestEmailChange("bob@example.com", "password");
assertStatus(view.$requestStatus, false, "error", "The data could not be saved.");
// On retry, it should succeed
ajaxSuccess = true;
requestEmailChange("bob@example.com", "password");
assertStatus(view.$requestStatus, true, "error", "Please check your email to confirm the change");
});
it("requests a password reset", function() {
requestPasswordChange();
assertAjax("password", "POST", {});
assertStatus(view.$passwordResetStatus, true, "error", "Password reset email sent. Follow the link in the email to change your password.");
});
it("displays an error message if a password reset email could not be sent", function() {
// Simulate an error from the server
ajaxSuccess = false;
requestPasswordChange();
assertStatus(view.$passwordResetStatus, false, "error", "We weren't able to send you a password reset email.");
// Retry, this time simulating success
ajaxSuccess = true;
requestPasswordChange();
assertStatus(view.$passwordResetStatus, true, "error", "Password reset email sent. Follow the link in the email to change your password.");
});
});
}
);