Add in-place enrollment to course home page.

This commit is contained in:
Diana Huang
2017-07-26 10:54:12 -04:00
parent 4f5b033c27
commit 8d3fa5432a
8 changed files with 189 additions and 8 deletions

View File

@@ -0,0 +1 @@
<button class="enroll-btn btn-link">Enroll Now</button>

View File

@@ -0,0 +1,45 @@
/*
* Course Enrollment on the Course Home page
*/
export class CourseEnrollment { // eslint-disable-line import/prefer-default-export
/**
* Redirect to a URL. Mainly useful for mocking out in tests.
* @param {string} url The URL to redirect to.
*/
static redirect(url) {
window.location.href = url;
}
static refresh() {
window.location.reload(false);
}
static createEnrollment(courseId) {
const data = JSON.stringify({
course_details: { course_id: courseId },
});
const enrollmentAPI = '/api/enrollment/v1/enrollment';
const trackSelection = '/course_modes/choose/';
return () =>
$.ajax(
{
type: 'POST',
url: enrollmentAPI,
data,
contentType: 'application/json',
}).done(() => {
window.analytics.track('edx.bi.user.course-home.enrollment');
CourseEnrollment.refresh();
}).fail(() => {
// If the simple enrollment we attempted failed, go to the track selection page,
// which is better for handling more complex enrollment situations.
CourseEnrollment.redirect(trackSelection + courseId);
});
}
constructor(buttonClass, courseId) {
$(buttonClass).click(CourseEnrollment.createEnrollment(courseId));
}
}

View File

@@ -0,0 +1,48 @@
/* globals $, loadFixtures */
import {
expectRequest,
requests as mockRequests,
respondWithJson,
respondWithError,
} from 'edx-ui-toolkit/js/utils/spec-helpers/ajax-helpers';
import { CourseEnrollment } from '../Enrollment';
describe('CourseEnrollment tests', () => {
describe('Ensure button behavior', () => {
const endpointUrl = '/api/enrollment/v1/enrollment';
const courseId = 'course-v1:edX+DemoX+Demo_Course';
const enrollButtonClass = '.enroll-btn';
window.analytics = jasmine.createSpyObj('analytics', ['page', 'track', 'trackLink']);
beforeEach(() => {
loadFixtures('course_experience/fixtures/enrollment-button.html');
new CourseEnrollment('.enroll-btn', courseId); // eslint-disable-line no-new
});
it('Verify that we reload on success', () => {
const requests = mockRequests(this);
$(enrollButtonClass).click();
expectRequest(
requests,
'POST',
endpointUrl,
`{"course_details":{"course_id":"${courseId}"}}`,
);
spyOn(CourseEnrollment, 'refresh');
respondWithJson(requests);
expect(CourseEnrollment.refresh).toHaveBeenCalled();
expect(window.analytics.track).toHaveBeenCalled();
requests.restore();
});
it('Verify that we redirect to track selection on fail', () => {
const requests = mockRequests(this);
$(enrollButtonClass).click();
spyOn(CourseEnrollment, 'redirect');
respondWithError(requests, 403);
expect(CourseEnrollment.redirect).toHaveBeenCalled();
requests.restore();
});
});
});