Files
edx-platform/lms/static/js/spec/dashboard/donation.js
Andy Armstrong 1689004189 Create a common paginated list view
TNL-2384

Refactored Studio's PagingView to use RequireJS Text and moved it
to common so that it can also be used by LMS.
2015-06-15 13:51:09 -04:00

170 lines
7.3 KiB
JavaScript

define(['common/js/spec_helpers/template_helpers', 'common/js/spec_helpers/ajax_helpers', 'js/dashboard/donation'],
function(TemplateHelpers, AjaxHelpers) {
'use strict';
describe("edx.dashboard.donation.DonationView", function() {
var PAYMENT_URL = "https://fake.processor.com/pay/";
var PAYMENT_PARAMS = {
orderId: "test-order",
signature: "abcd1234"
};
var AMOUNT = "45.67";
var COURSE_ID = "edx/DemoX/Demo";
var view = null;
var requests = null;
beforeEach(function() {
setFixtures("<div></div>");
TemplateHelpers.installTemplate('templates/dashboard/donation');
view = new edx.dashboard.donation.DonationView({
el: $("#jasmine-fixtures"),
course: COURSE_ID
}).render();
// Stub out the actual submission of the payment form
// (which would cause the page to reload)
// This function gets passed the dynamically constructed
// form with signed payment parameters from the LMS server,
// so we can verify that the form is constructed correctly.
spyOn(view, 'submitPaymentForm').andCallFake(function() {});
// Stub the analytics event tracker
window.analytics = jasmine.createSpyObj('analytics', ['track']);
});
it("processes a donation for a course", function() {
// Spy on AJAX requests
requests = AjaxHelpers.requests(this);
// Enter a donation amount and proceed to the payment page
view.$amount.val(AMOUNT);
view.donate();
// Verify that the client contacts the server to create
// the donation item in the shopping cart and receive
// the signed payment params.
AjaxHelpers.expectRequest(
requests, "POST", "/shoppingcart/donation/",
$.param({ amount: AMOUNT, course_id: COURSE_ID })
);
// Simulate a response from the server containing the signed
// parameters to send to the payment processor
AjaxHelpers.respondWithJson(requests, {
payment_url: PAYMENT_URL,
payment_params: PAYMENT_PARAMS,
});
// Verify that the payment form has the payment parameters
// sent by the LMS server, and that it's targeted at the
// correct payment URL.
// We stub out the actual submission of the form to avoid
// leaving the current page during the test.
expect(view.submitPaymentForm).toHaveBeenCalled();
var form = view.submitPaymentForm.mostRecentCall.args[0];
expect(form.serialize()).toEqual($.param(PAYMENT_PARAMS));
expect(form.attr('method')).toEqual("post");
expect(form.attr('action')).toEqual(PAYMENT_URL);
});
it("validates the donation amount", function() {
var assertValidAmount = function(amount, isValid) {
expect(view.validateAmount(amount)).toBe(isValid);
};
assertValidAmount("", false);
assertValidAmount(" ", false);
assertValidAmount("abc", false);
assertValidAmount("14.", false);
assertValidAmount(".1", false);
assertValidAmount("-1", false);
assertValidAmount("-1.00", false);
assertValidAmount("-", false);
assertValidAmount("0", false);
assertValidAmount("0.00", false);
assertValidAmount("00.00", false);
assertValidAmount("3", true);
assertValidAmount("12.34", true);
assertValidAmount("278", true);
assertValidAmount("278.91", true);
assertValidAmount("0.14", true);
});
it("displays validation errors", function() {
// Attempt to submit an invalid donation amount
view.$amount.val("");
view.donate();
// Verify that the amount field is marked as having a validation error
expect(view.$amount).toHaveClass("validation-error");
// Verify that the error message appears
expect(view.$errorMsg.text()).toEqual("Please enter a valid donation amount.");
// Expect that the submit button is re-enabled to allow users to submit again
expect(view.$submit).not.toHaveClass("disabled");
// Try again, this time submitting a valid amount
view.$amount.val(AMOUNT);
view.donate();
// Expect that the errors are cleared
expect(view.$errorMsg.text()).toEqual("");
// Expect that the submit button is disabled
expect(view.$submit).toHaveClass("disabled");
});
it("displays an error when the server cannot be contacted", function() {
// Spy on AJAX requests
requests = AjaxHelpers.requests(this);
// Simulate an error from the LMS servers
view.donate();
AjaxHelpers.respondWithError(requests);
// Expect that the error is displayed
expect(view.$errorMsg.text()).toEqual("Your donation could not be submitted.");
// Verify that the submit button is re-enabled
// so users can try again.
expect(view.$submit).not.toHaveClass("disabled");
});
it("disables the submit button once the user donates", function() {
// Before we submit, the button should be enabled
expect(view.$submit).not.toHaveClass("disabled");
// Simulate starting a donation
// Since we're not simulating the AJAX response, this will block
// in the state just after the user kicks off the donation process.
view.donate();
// Verify that the submit button is disabled
expect(view.$submit).toHaveClass("disabled");
});
it("sends an analytics event when the user submits a donation", function() {
// Simulate the submission to the payment processor
// We skip the intermediary steps here by passing in
// the payment url and parameters,
// which the view would ordinarily retrieve from the LMS server.
view.startPayment({
payment_url: PAYMENT_URL,
payment_params: PAYMENT_PARAMS
});
// Verify that the analytics event was fired
expect(window.analytics.track).toHaveBeenCalledWith(
"edx.bi.user.payment_processor.visited",
{
category: "donations",
label: COURSE_ID
}
);
});
});
}
);