339 lines
14 KiB
JavaScript
339 lines
14 KiB
JavaScript
define([
|
|
'jquery',
|
|
'jquery.ajax-retry',
|
|
'js/commerce/views/receipt_view',
|
|
'edx-ui-toolkit/js/utils/spec-helpers/ajax-helpers'
|
|
],
|
|
function($, AjaxRetry, ReceiptView, AjaxHelpers) {
|
|
'use strict';
|
|
describe('edx.commerce.ReceiptView', function() {
|
|
var data, courseResponseData, providerResponseData, mockRequests, mockRender, createReceiptView,
|
|
createProduct, createLine, createOrderResponse, doCheckVerification, doCheckVerificationNagRendered,
|
|
userResponseData;
|
|
|
|
createReceiptView = function() {
|
|
return new ReceiptView({el: $('#receipt-container')});
|
|
};
|
|
|
|
mockRequests = function(requests, method, apiUrl, responseData) {
|
|
AjaxHelpers.expectRequest(requests, method, apiUrl);
|
|
AjaxHelpers.respondWithJson(requests, responseData);
|
|
};
|
|
|
|
mockRender = function(useEcommerceOrderNumber, isVerified, requestInThemedSite) {
|
|
var requests, view, orderUrlFormat,
|
|
actualRequestInThemedSite = requestInThemedSite;
|
|
if (typeof actualRequestInThemedSite === 'undefined') {
|
|
actualRequestInThemedSite = 'False';
|
|
}
|
|
requests = AjaxHelpers.requests(this);
|
|
$('#receipt-container').data({
|
|
verified: isVerified,
|
|
'is-request-in-themed-site': actualRequestInThemedSite
|
|
});
|
|
view = createReceiptView();
|
|
view.useEcommerceApi = true;
|
|
if (useEcommerceOrderNumber) {
|
|
view.ecommerceOrderNumber = 'EDX-123456';
|
|
orderUrlFormat = '/api/commerce/v1/orders/EDX-123456/';
|
|
} else {
|
|
view.ecommerceBasketId = 'EDX-123456';
|
|
orderUrlFormat = '/api/commerce/v0/baskets/EDX-123456/order/';
|
|
}
|
|
view.render();
|
|
mockRequests(requests, 'GET', orderUrlFormat, data);
|
|
|
|
mockRequests(
|
|
requests, 'GET', '/commerce/checkout/verification_status/?course_id=' +
|
|
encodeURIComponent('course-v1:edx+dummy+2015_T3'), {is_verification_required: true}
|
|
);
|
|
|
|
mockRequests(
|
|
requests, 'GET', '/api/courses/v1/courses/course-v1:edx+dummy+2015_T3/', courseResponseData
|
|
);
|
|
|
|
mockRequests(
|
|
requests, 'GET', '/api/user/v1/accounts/user-1', userResponseData
|
|
);
|
|
|
|
mockRequests(requests, 'GET', '/api/credit/v1/providers/edx/', providerResponseData);
|
|
return view;
|
|
};
|
|
|
|
createProduct = function(attributes) {
|
|
var actualAttributes = attributes;
|
|
if (typeof actualAttributes === 'undefined') {
|
|
actualAttributes = [
|
|
{
|
|
name: 'certificate_type',
|
|
value: 'verified'
|
|
},
|
|
{
|
|
name: 'course_key',
|
|
code: 'course_key',
|
|
value: 'course-v1:edx+dummy+2015_T3'
|
|
},
|
|
{
|
|
name: 'credit_provider',
|
|
value: 'edx'
|
|
}
|
|
];
|
|
}
|
|
|
|
return {
|
|
attribute_values: actualAttributes,
|
|
stockrecords: [
|
|
{
|
|
price_currency: 'USD',
|
|
product: 123,
|
|
partner_sku: '1234ABC',
|
|
partner: 1,
|
|
price_excl_tax: '10.00',
|
|
id: 123
|
|
}
|
|
],
|
|
product_class: 'Seat',
|
|
title: 'Dummy title',
|
|
url: 'https://ecom.edx.org/api/v2/products/123/',
|
|
price: '10.00',
|
|
expires: null,
|
|
is_available_to_buy: true,
|
|
id: 123,
|
|
structure: 'child'
|
|
};
|
|
};
|
|
|
|
createLine = function(product) {
|
|
var actualProduct = product;
|
|
if (typeof actualProduct === 'undefined') {
|
|
actualProduct = createProduct();
|
|
}
|
|
return {
|
|
status: 'Open',
|
|
unit_price_excl_tax: '10.00',
|
|
product: actualProduct,
|
|
line_price_excl_tax: '10.00',
|
|
description: 'dummy description',
|
|
title: 'dummy title',
|
|
quantity: 1
|
|
};
|
|
};
|
|
|
|
createOrderResponse = function(lines) {
|
|
var actualLines = lines;
|
|
if (typeof actualLines === 'undefined') {
|
|
actualLines = [createLine()];
|
|
}
|
|
return {
|
|
status: 'Open',
|
|
billed_to: {
|
|
city: 'dummy city',
|
|
first_name: 'john',
|
|
last_name: 'doe',
|
|
country: 'AL',
|
|
line2: 'line2',
|
|
line1: 'line1',
|
|
state: '',
|
|
postcode: '12345'
|
|
},
|
|
lines: actualLines,
|
|
number: 'EDX-123456',
|
|
date_placed: '2016-01-01T01:01:01Z',
|
|
currency: 'USD',
|
|
total_excl_tax: '10.00'
|
|
};
|
|
};
|
|
|
|
doCheckVerification = function(attributes, expected) {
|
|
var view = createReceiptView(),
|
|
product = createProduct(attributes);
|
|
expect(view.requiresVerification(product)).toBe(expected);
|
|
};
|
|
|
|
doCheckVerificationNagRendered = function(attributes, userVerified, expected, requestInThemedSite) {
|
|
var view;
|
|
data = createOrderResponse([createLine(createProduct(attributes))]);
|
|
view = mockRender(true, userVerified, requestInThemedSite);
|
|
if (expected) {
|
|
expect(view.$('.nav-wizard.is-ready').text()).toContain('Want to confirm your identity later');
|
|
} else {
|
|
expect(view.$('.nav-wizard.is-ready').text()).toContain('Go to Dashboard');
|
|
}
|
|
};
|
|
|
|
beforeEach(function() {
|
|
var receiptFixture, providerFixture;
|
|
// Stub analytics tracking
|
|
window.analytics = jasmine.createSpyObj('analytics', ['page', 'track', 'trackLink']);
|
|
|
|
loadFixtures('js/fixtures/commerce/checkout_receipt.html');
|
|
|
|
receiptFixture = readFixtures('templates/commerce/receipt.underscore');
|
|
providerFixture = readFixtures('templates/commerce/provider.underscore');
|
|
appendSetFixtures(
|
|
'<script id="receipt-tpl" type="text/template" >' + receiptFixture + '</script>' +
|
|
'<script id="provider-tpl" type="text/template" >' + providerFixture + '</script>'
|
|
);
|
|
|
|
data = createOrderResponse();
|
|
|
|
providerResponseData = {
|
|
id: 'edx',
|
|
display_name: 'edX',
|
|
url: 'http://www.edx.org',
|
|
status_url: 'http://www.edx.org/status',
|
|
description: 'Nothing',
|
|
enable_integration: false,
|
|
fulfillment_instructions: '',
|
|
thumbnail_url: 'http://edx.org/thumbnail.png'
|
|
};
|
|
|
|
courseResponseData = {
|
|
id: 'course-v1:edx+dummy+2015_T3',
|
|
name: 'receipt test',
|
|
category: 'course',
|
|
org: 'edx',
|
|
run: '2015_T2',
|
|
course: 'CS420',
|
|
uri: 'http://test.com/api/courses/v1/courses/course-v1:edx+dummy+2015_T3/',
|
|
image_url: '/test.jpg',
|
|
start: '2030-01-01T00:00:00Z',
|
|
end: null
|
|
};
|
|
userResponseData = {
|
|
username: 'user-1',
|
|
name: 'full name'
|
|
};
|
|
});
|
|
|
|
it('sends analytic event when verified receipt is rendered', function() {
|
|
mockRender(true, 'True');
|
|
expect(window.analytics.track).toHaveBeenCalledWith(
|
|
'Completed Purchase',
|
|
{
|
|
orderId: 'EDX-123456',
|
|
total: '10.00',
|
|
currency: 'USD'
|
|
}
|
|
);
|
|
});
|
|
|
|
it('sends analytic event when non verified receipt is rendered', function() {
|
|
mockRender(true, 'False');
|
|
expect(window.analytics.track).toHaveBeenCalledWith(
|
|
'Completed Purchase',
|
|
{
|
|
orderId: 'EDX-123456',
|
|
total: '10.00',
|
|
currency: 'USD'
|
|
}
|
|
);
|
|
});
|
|
|
|
it('renders a receipt correctly with Ecommerce Order Number', function() {
|
|
var view;
|
|
|
|
view = mockRender(true, 'True');
|
|
expect(view.$('.course_name_placeholder').text()).toContain('receipt test');
|
|
});
|
|
|
|
it('renders a receipt correctly with Ecommerce Basket Id', function() {
|
|
var view;
|
|
|
|
view = mockRender(false, 'True');
|
|
expect(view.$('.course_name_placeholder').text()).toContain('receipt test');
|
|
});
|
|
|
|
it('requiresVerification returns true if product requires verification', function() {
|
|
var expected = true,
|
|
attributes = [
|
|
{name: 'certificate_type', value: 'professional'},
|
|
{name: 'course_key', value: 'course-v1:OC+OC+2'},
|
|
{name: 'id_verification_required', value: true}
|
|
];
|
|
doCheckVerification(attributes, expected, 'False');
|
|
});
|
|
|
|
it('requiresVerification returns true if product requires verification, different order', function() {
|
|
var expected = true,
|
|
attributes = [
|
|
{name: 'certificate_type', value: 'professional'},
|
|
{name: 'id_verification_required', value: true},
|
|
{name: 'course_key', value: 'course-v1:OC+OC+2'}
|
|
];
|
|
doCheckVerification(attributes, expected, 'False');
|
|
});
|
|
|
|
it('requiresVerification defaults to true', function() {
|
|
var expected = true,
|
|
attributes = [
|
|
{name: 'certificate_type', value: 'professional'},
|
|
{name: 'course_key', value: 'course-v1:OC+OC+2'}
|
|
];
|
|
doCheckVerification(attributes, expected, 'False');
|
|
});
|
|
|
|
it('requiresVerification returns false for courses not requiring verification', function() {
|
|
var expected = false,
|
|
attributes = [
|
|
{name: 'certificate_type', value: 'professional'},
|
|
{name: 'id_verification_required', value: false},
|
|
{name: 'course_key', value: 'course-v1:OC+OC+2'}
|
|
];
|
|
doCheckVerification(attributes, expected, 'False');
|
|
});
|
|
|
|
it('receipt view verification nag for not verified users in a verified course', function() {
|
|
var attributes = [
|
|
{name: 'certificate_type', value: 'professional'},
|
|
{name: 'id_verification_required', value: true},
|
|
{name: 'course_key', value: 'course-v1:edx+dummy+2015_T3'},
|
|
{name: 'credit_provider', value: 'edx'}
|
|
];
|
|
doCheckVerificationNagRendered(attributes, 'False', true, 'False');
|
|
});
|
|
|
|
it("receipt view doesn't show verification nag for a verified user in a verified course", function() {
|
|
var attributes = [
|
|
{name: 'certificate_type', value: 'professional'},
|
|
{name: 'id_verification_required', value: true},
|
|
{name: 'course_key', value: 'course-v1:edx+dummy+2015_T3'},
|
|
{name: 'credit_provider', value: 'edx'}
|
|
];
|
|
doCheckVerificationNagRendered(attributes, 'True', false, 'False');
|
|
});
|
|
|
|
it("receipt view doesn't show verification for a unverified user in a not verified course", function() {
|
|
var attributes = [
|
|
{name: 'certificate_type', value: 'professional'},
|
|
{name: 'id_verification_required', value: false},
|
|
{name: 'course_key', value: 'course-v1:edx+dummy+2015_T3'},
|
|
{name: 'credit_provider', value: 'edx'}
|
|
];
|
|
doCheckVerificationNagRendered(attributes, 'False', false, 'False');
|
|
});
|
|
|
|
it("receipt view doesn't show verification nag for a verified user in a not verified course", function() {
|
|
var attributes = [
|
|
{name: 'certificate_type', value: 'professional'},
|
|
{name: 'id_verification_required', value: false},
|
|
{name: 'course_key', value: 'course-v1:edx+dummy+2015_T3'},
|
|
{name: 'credit_provider', value: 'edx'}
|
|
];
|
|
doCheckVerificationNagRendered(attributes, 'True', false, 'False');
|
|
});
|
|
|
|
it("receipt view doesn't show verification nag for a not verified user in a verified" +
|
|
' course on themed site', function() {
|
|
var attributes = [
|
|
{name: 'certificate_type', value: 'professional'},
|
|
{name: 'id_verification_required', value: true},
|
|
{name: 'course_key', value: 'course-v1:edx+dummy+2015_T3'},
|
|
{name: 'credit_provider', value: 'edx'}
|
|
];
|
|
doCheckVerificationNagRendered(attributes, 'False', false, 'True');
|
|
});
|
|
});
|
|
}
|
|
);
|