From 427967ea835bcb3aa778d1df73cd08c22b2325a4 Mon Sep 17 00:00:00 2001 From: "Albert St. Aubin" Date: Fri, 7 Jul 2017 19:58:16 +0000 Subject: [PATCH] Working tests for the new Group moderator error messaging --- .../instructor_dashboard/membership.html | 135 ++++++++++++++++++ .../js/instructor_dashboard/membership.js | 12 +- .../membership_auth_spec.js | 97 +++++++++++++ lms/static/lms/js/spec/main.js | 17 +++ 4 files changed, 256 insertions(+), 5 deletions(-) create mode 100644 lms/static/js/fixtures/instructor_dashboard/membership.html create mode 100644 lms/static/js/spec/instructor_dashboard/membership_auth_spec.js diff --git a/lms/static/js/fixtures/instructor_dashboard/membership.html b/lms/static/js/fixtures/instructor_dashboard/membership.html new file mode 100644 index 0000000000..058845c4e3 --- /dev/null +++ b/lms/static/js/fixtures/instructor_dashboard/membership.html @@ -0,0 +1,135 @@ +
+

Membership

+ +
+

Course Team Management

+ +
+ +
+ +
+ +
+
+
+
Staff
+
+
+ Course team members with the Staff role help you manage your course. Staff can enroll and unenroll learners, + as well as modify their grades and access all course data. Staff also have access to your course in Studio and + Insights. You can only give course team roles to enrolled users. +
+
+ + + + + + + + + +
UsernameEmailRevoke access
+
+
+ + +
+
+
+ +
+
+
+
Group Community TA
+
+
+ Group Community TAs are members of the community who help course teams moderate discussions. Group Community + TAs see only posts by learners in their assigned group. They can edit or delete posts, clear flags, close and + re-open threads, and endorse responses, but only for posts by learners in their group. +
+
+ + + + + + + + + + +
UsernameEmailGroupRevoke access
+
+
+ + +
+
+
+ +
+
+
+
Discussion Community TA
+
+
+ Community TAs are members of the community who help course teams moderate discussions. They can see posts by + all learners, and can edit or delete posts, clear flags, close or re-open threads, and endorse responses. + Their posts are marked as 'Community TA'. Only enrolled users can be added as Community TAs. +
+
+ + + + + + + + + +
UsernameEmailRevoke access
+
+
+ + +
+
+
+ +
+
diff --git a/lms/static/js/instructor_dashboard/membership.js b/lms/static/js/instructor_dashboard/membership.js index 12fc79240e..45870df249 100644 --- a/lms/static/js/instructor_dashboard/membership.js +++ b/lms/static/js/instructor_dashboard/membership.js @@ -8,11 +8,14 @@ wrap in (-> ... apply) to defer evaluation such that the value can be defined later than this assignment (file load order). */ - (function() { 'use strict'; - var AuthListWidget, BatchEnrollment, BetaTesterBulkAddition, - MemberListWidget, Membership, emailStudents, plantTimeout, statusAjaxError, enableAddButton, + var AuthListWidget, + Membership, + BatchEnrollment, + BetaTesterBulkAddition, + MemberListWidget, + emailStudents, plantTimeout, statusAjaxError, enableAddButton, /* eslint-disable */ __hasProp = {}.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; @@ -223,7 +226,7 @@ such that the value can be defined later than this assignment (file load order). AuthListWidget.prototype.get_member_list = function(cb) { var authlistwidgetgetmemberlist = this; - return $.ajax({ + $.ajax({ type: 'POST', dataType: 'json', url: this.list_endpoint, @@ -1004,7 +1007,6 @@ such that the value can be defined later than this assignment (file load order). this.$list_selector.change(function() { var $opt, j, len1, ref1; $opt = thismembership.$list_selector.children('option:selected'); - if (!($opt.length > 0)) { return; } diff --git a/lms/static/js/spec/instructor_dashboard/membership_auth_spec.js b/lms/static/js/spec/instructor_dashboard/membership_auth_spec.js new file mode 100644 index 0000000000..9da5b13ef8 --- /dev/null +++ b/lms/static/js/spec/instructor_dashboard/membership_auth_spec.js @@ -0,0 +1,97 @@ +/* global define, Membership */ +define(['jquery', + 'edx-ui-toolkit/js/utils/spec-helpers/ajax-helpers', + 'js/instructor_dashboard/membership'], + function($, AjaxHelpers) { + 'use strict'; + describe('Membership.AuthListWidget', function() { + var membership, // eslint-disable-line no-unused-vars + changeSelectedList; + + changeSelectedList = function(listName) { + var i, options; + options = document.getElementById('member-lists-selector').options; + for (i = 0; i < options.length; i++) { + if (options[i].value === listName) { + document.getElementById('member-lists-selector').selectedIndex = i; + $('select#member-lists-selector').trigger('change'); + break; + } + } + }; + + beforeEach(function() { + var membershipMain, membershipTpl; + membershipMain = readFixtures('js/fixtures/instructor_dashboard/membership.html'); + membershipTpl = readFixtures( + 'templates/instructor/instructor_dashboard_2/membership-list-widget.underscore' + ); + appendSetFixtures( + "' + + membershipMain + ); + membership = new window.InstructorDashboard.sections.Membership($('#membership')); + }); + + it('binds the ajax call and the result will be success for Group Moderator', function() { + var requests = AjaxHelpers.requests(this), + data, + url = '/courses/course-v1:edx+ed202+2017_T3/instructor/api/list_forum_members'; + + data = { + course_id: 'course-v1:edx+ed202+2017_T3', + 'Group Moderator': [{ + email: 'verified@example.com', + first_name: '', + group_name: 'Verified', + last_name: '', + username: 'verified' + }], + division_scheme: 'enrollment_track' + }; + changeSelectedList('Group Moderator'); + + AjaxHelpers.expectPostRequest(requests, url, 'rolename=Group+Moderator'); + AjaxHelpers.respondWithJson(requests, data); + + expect($('.auth-list-container.active').data('rolename')).toEqual('Group Moderator'); + + expect($('.request-response-error').text()).toEqual(''); + + // Both buttons should be enabled + expect($('.auth-list-container.active .add').attr('disabled')).toBe(undefined); + expect($('.auth-list-container.active .add-field').attr('disabled')).toBe(undefined); + }); + + it('When no discussions division scheme is selected error is shown and inputs are disabled', function() { + var requests = AjaxHelpers.requests(this), + data, + url = '/courses/course-v1:edx+ed202+2017_T3/instructor/api/list_forum_members'; + + data = { + course_id: 'course-v1:edx+ed202+2017_T3', + 'Group Moderator': [{ + email: 'verified@example.com', + first_name: '', + group_name: 'Verified', + last_name: '', + username: 'verified' + }], + division_scheme: 'none' + }; + changeSelectedList('Group Moderator'); + + AjaxHelpers.expectPostRequest(requests, url, 'rolename=Group+Moderator'); + AjaxHelpers.respondWithJson(requests, data); + + expect($('.auth-list-container.active').data('rolename')).toEqual('Group Moderator'); + + // Error message is shown. + expect($('.request-response-error').text()).toEqual('This role requires a divided discussions scheme.'); + + // Both buttons should be disabled + expect($('.auth-list-container.active .add').attr('disabled')).toBe('disabled'); + expect($('.auth-list-container.active .add-field').attr('disabled')).toBe('disabled'); + }); + }); + }); diff --git a/lms/static/lms/js/spec/main.js b/lms/static/lms/js/spec/main.js index 4395917af6..a139fdf294 100644 --- a/lms/static/lms/js/spec/main.js +++ b/lms/static/lms/js/spec/main.js @@ -306,6 +306,21 @@ exports: 'js/instructor_dashboard/certificates', deps: ['jquery', 'gettext', 'underscore'] }, + 'js/instructor_dashboard/membership': { + exports: 'js/instructor_dashboard/membership', + deps: ['jquery', 'underscore'], + init: function() { + // Set global variables that the util code is expecting to be defined + require([ // eslint-disable-line global-require + 'edx-ui-toolkit/js/utils/html-utils', + 'edx-ui-toolkit/js/utils/string-utils' + ], function(HtmlUtils, StringUtils) { + window.edx = window.edx || {}; + window.edx.HtmlUtils = HtmlUtils; + window.edx.StringUtils = StringUtils; + }); + } + }, // LMS class loaded explicitly until they are converted to use RequireJS 'js/student_account/account': { exports: 'js/student_account/account', @@ -341,6 +356,7 @@ exports: 'edx.instructor_dashboard.ecommerce.ExpiryCouponView', deps: ['backbone', 'jquery', 'underscore'] }, + 'js/models/notification': { exports: 'NotificationModel', deps: ['backbone'] @@ -738,6 +754,7 @@ 'js/spec/instructor_dashboard/certificates_invalidation_spec.js', 'js/spec/instructor_dashboard/certificates_spec.js', 'js/spec/instructor_dashboard/ecommerce_spec.js', + 'js/spec/instructor_dashboard/membership_auth_spec.js', 'js/spec/instructor_dashboard/student_admin_spec.js', 'js/spec/learner_dashboard/collection_list_view_spec.js', 'js/spec/learner_dashboard/program_card_view_spec.js',