Skip to content
Snippets Groups Projects
Commit 5f6ddf47 authored by Clinton Blackburn's avatar Clinton Blackburn Committed by GitHub
Browse files

Merge pull request #12470 from open-craft/jbzdak/hide-verification

Honor verification required setting for professional courses in the receipt view
parents eb6bb036 83e557dc
No related branches found
No related tags found
No related merge requests found
......@@ -24,15 +24,37 @@ var edx = edx || {};
this.render();
},
renderReceipt: function (data) {
var templateHtml = $("#receipt-tpl").html(),
/**
* @param product
* @returns {bool} True if product requires user to be verified by Software Secure.
*/
requiresVerification: function(product) {
function getAttribute(attribute, defaultValue) {
var attr = _.findWhere(product.attribute_values, {name: attribute});
if (!attr) {
return defaultValue;
}
return attr.value;
}
return getAttribute('id_verification_required', true);
},
renderReceipt: function(data) {
var templateHtml = $('#receipt-tpl').html(),
self = this,
context = {
platformName: this.$el.data('platform-name'),
verified: this.$el.data('verified').toLowerCase() === 'true',
is_request_in_themed_site: this.$el.data('is-request-in-themed-site').toLowerCase() === 'true'
},
providerId;
providerId,
courseRequiresVerification;
// True if any of the courses bought requires verification
courseRequiresVerification = _.any(data.lines, function(line) {
return this.requiresVerification(line.product);
}, this);
// Add the receipt info to the template context
this.courseKey = this.getOrderCourseKey(data);
......@@ -45,7 +67,7 @@ var edx = edx || {};
_.extend(context, {
receipt: self.receiptContext(data),
courseKey: self.courseKey,
is_verification_required: response.is_verification_required
is_verification_required: response.is_verification_required && courseRequiresVerification
});
self.$el.html(_.template(templateHtml)(context));
......@@ -331,7 +353,7 @@ var edx = edx || {};
new edx.commerce.ReceiptView({
el: $('#receipt-container')
});
})(jQuery, _, Backbone);
}(jQuery, _, Backbone));
function completeOrder(event) {
'use strict';
......
......@@ -8,6 +8,7 @@ define([
'use strict';
describe('edx.commerce.ReceiptView', function() {
var data, courseResponseData, providerResponseData, mockRequests, mockRender, createReceiptView,
createProduct, createLine, createOrderResponse, doCheckVerification, doCheckVerificationNagRendered,
userResponseData;
createReceiptView = function() {
......@@ -19,17 +20,23 @@ define([
AjaxHelpers.respondWithJson(requests, responseData);
};
mockRender = function(useEcommerceOrderNumber, isVerified) {
var requests, view, orderUrlFormat;
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);
$('#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 {
} else {
view.ecommerceBasketId = 'EDX-123456';
orderUrlFormat = '/api/commerce/v0/baskets/EDX-123456/order/';
}
......@@ -53,6 +60,107 @@ define([
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
......@@ -63,97 +171,38 @@ define([
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>'
'<script id="receipt-tpl" type="text/template" >' + receiptFixture + '</script>' +
'<script id="provider-tpl" type="text/template" >' + providerFixture + '</script>'
);
data = {
'status': 'Open',
'billed_to': {
'city': 'dummy city',
'first_name': 'john',
'last_name': 'doe',
'country': 'AL',
'line2': 'line2',
'line1': 'line1',
'state': '',
'postcode': '12345'
},
'lines': [
{
'status': 'Open',
'unit_price_excl_tax': '10.00',
'product': {
'attribute_values': [
{
'name': 'certificate_type',
'value': 'verified'
},
{
'name': 'course_key',
'code': 'course_key',
'value': 'course-v1:edx+dummy+2015_T3'
},
{
'name': 'credit_provider',
'value': 'edx'
}
],
'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'
},
'line_price_excl_tax': '10.00',
'description': 'dummy description',
'title': 'dummy title',
'quantity': 1
}
],
'number': 'EDX-123456',
'date_placed': '2016-01-01T01:01:01Z',
'currency': 'USD',
'total_excl_tax': '10.00'
};
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'
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
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'
username: 'user-1',
name: 'full name'
};
});
......@@ -194,6 +243,96 @@ define([
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');
});
});
}
);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment