diff --git a/app/coffeescripts/SubmissionDetailsDialog.js b/app/coffeescripts/SubmissionDetailsDialog.js index c1a7fe18761..e1854ef9444 100644 --- a/app/coffeescripts/SubmissionDetailsDialog.js +++ b/app/coffeescripts/SubmissionDetailsDialog.js @@ -101,7 +101,7 @@ export default class SubmissionDetailsDialog { buildSpeedGraderUrl = () => { const assignmentParam = `assignment_id=${this.assignment.id}` - const speedGraderUrlParams = this.options.anonymous_moderated_marking_enabled && this.assignment.anonymous_grading + const speedGraderUrlParams = this.assignment.anonymous_grading ? assignmentParam : `${assignmentParam}#{"student_id":"${this.student.id}"}` return encodeURI(`${this.options.context_url}/gradebook/speed_grader?${speedGraderUrlParams}`) diff --git a/app/coffeescripts/ember/screenreader_gradebook/controllers/screenreader_gradebook_controller.coffee b/app/coffeescripts/ember/screenreader_gradebook/controllers/screenreader_gradebook_controller.coffee index cb0ad0f6a80..e3b1fcdcca0 100644 --- a/app/coffeescripts/ember/screenreader_gradebook/controllers/screenreader_gradebook_controller.coffee +++ b/app/coffeescripts/ember/screenreader_gradebook/controllers/screenreader_gradebook_controller.coffee @@ -819,7 +819,6 @@ define [ hasGradingPeriods: !!@has_grading_periods selectedGradingPeriodID: @get('selectedGradingPeriod.id') || '0' isAdmin: ENV.current_user_roles && _.contains(ENV.current_user_roles, "admin") - anonymousModeratedMarkingEnabled: ENV.GRADEBOOK_OPTIONS.anonymous_moderated_marking_enabled ) map.setup(@get('students').toArray(), @get('assignmentsFromGroups.content').toArray()) @set('submissionStateMap', map) diff --git a/app/coffeescripts/gradebook/Gradebook.coffee b/app/coffeescripts/gradebook/Gradebook.coffee index d3969f77af9..45ab46533a3 100644 --- a/app/coffeescripts/gradebook/Gradebook.coffee +++ b/app/coffeescripts/gradebook/Gradebook.coffee @@ -317,9 +317,8 @@ define [ for assignment in group.assignments assignment.assignment_group = group assignment.due_at = tz.parse(assignment.due_at) - if @options.anonymous_moderated_marking_enabled - assignment.moderation_in_progress = assignment.moderated_grading and !assignment.grades_published - assignment.hide_grades_when_muted = assignment.anonymous_grading + assignment.moderation_in_progress = assignment.moderated_grading and !assignment.grades_published + assignment.hide_grades_when_muted = assignment.anonymous_grading @updateAssignmentEffectiveDueDates(assignment) @assignments[assignment.id] = assignment diff --git a/app/coffeescripts/gradebook/GradebookHeaderMenu.coffee b/app/coffeescripts/gradebook/GradebookHeaderMenu.coffee index 27442ae6df3..4e05476ca72 100644 --- a/app/coffeescripts/gradebook/GradebookHeaderMenu.coffee +++ b/app/coffeescripts/gradebook/GradebookHeaderMenu.coffee @@ -182,8 +182,7 @@ define [ canUnmute: => not ( - @gradebook.options.anonymous_moderated_marking_enabled and - @assignment.muted and - @assignment.moderated_grading and - not @assignment.grades_published + @assignment?.muted and + @assignment?.moderated_grading and + not @assignment?.grades_published ) diff --git a/app/coffeescripts/gradezilla/Gradebook.coffee b/app/coffeescripts/gradezilla/Gradebook.coffee index e4b1a9a58b1..dad8ed3fc9a 100644 --- a/app/coffeescripts/gradezilla/Gradebook.coffee +++ b/app/coffeescripts/gradezilla/Gradebook.coffee @@ -1186,7 +1186,6 @@ define [ hasGradingPeriods: @gradingPeriodSet? selectedGradingPeriodID: @getGradingPeriodToShow() isAdmin: isAdmin() - anonymousModeratedMarkingEnabled: @options.anonymous_moderated_marking_enabled initPostGradesStore: -> @postGradesStore = PostGradesStore @@ -2159,7 +2158,6 @@ define [ submissionState = @submissionStateMap.getSubmissionState({ user_id: studentId, assignment_id: assignmentId }) isGroupWeightZero = @assignmentGroups[assignment.assignment_group_id].group_weight == 0 - anonymousModeratedMarkingEnabled: @options.anonymous_moderated_marking_enabled assignment: ConvertCase.camelize(assignment) colors: @getGridColors() comments: comments @@ -2681,8 +2679,7 @@ define [ manager = new AssignmentMuterDialogManager( assignment, "#{@options.context_url}/assignments/#{assignmentId}/mute", - @contentLoadStates.submissionsLoaded, - @options.anonymous_moderated_marking_enabled + @contentLoadStates.submissionsLoaded ) { diff --git a/app/coffeescripts/views/assignments/EditView.coffee b/app/coffeescripts/views/assignments/EditView.coffee index 504d1951991..f367fcea10b 100644 --- a/app/coffeescripts/views/assignments/EditView.coffee +++ b/app/coffeescripts/views/assignments/EditView.coffee @@ -382,7 +382,6 @@ define [ conditionalReleaseServiceEnabled: ENV?.CONDITIONAL_RELEASE_SERVICE_ENABLED or false lockedItems: @lockedItems anonymousGradingEnabled: ENV?.ANONYMOUS_GRADING_ENABLED or false - anonymousModeratedMarkingEnabled: ENV.ANONYMOUS_MODERATED_MARKING_ENABLED or false _attachEditorToDescription: => return if @lockedItems.content @@ -520,9 +519,8 @@ define [ errors = @_validateSubmissionTypes data, errors errors = @_validateAllowedExtensions data, errors errors = @assignmentGroupSelector.validateBeforeSave(data, errors) - if ENV.ANONYMOUS_MODERATED_MARKING_ENABLED - Object.assign(errors, @validateFinalGrader(data)) - Object.assign(errors, @validateGraderCount(data)) + Object.assign(errors, @validateFinalGrader(data)) + Object.assign(errors, @validateGraderCount(data)) unless ENV?.IS_LARGE_ROSTER errors = @groupCategorySelector.validateBeforeSave(data, errors) errors = @_validatePointsPossible(data, errors) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index cc239179eaf..95d03207ef5 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2206,17 +2206,14 @@ class ApplicationController < ActionController::Base js_env hash end - def set_js_assignment_data(include_assignment_permissions: false) + def set_js_assignment_data rights = [:manage_assignments, :manage_grades, :read_grades, :manage] permissions = @context.rights_status(@current_user, *rights) permissions[:manage_course] = permissions[:manage] permissions[:manage] = permissions[:manage_assignments] - - if include_assignment_permissions - permissions[:by_assignment_id] = @context.assignments.map do |assignment| - [assignment.id, {update: assignment.user_can_update?(@current_user, session)}] - end.to_h - end + permissions[:by_assignment_id] = @context.assignments.map do |assignment| + [assignment.id, {update: assignment.user_can_update?(@current_user, session)}] + end.to_h js_env({ :URLS => { diff --git a/app/controllers/assignments_controller.rb b/app/controllers/assignments_controller.rb index 3d41fa8e32d..a459f448114 100644 --- a/app/controllers/assignments_controller.rb +++ b/app/controllers/assignments_controller.rb @@ -52,10 +52,7 @@ class AssignmentsController < ApplicationController # because of course import/copy. @context.require_assignment_group - set_js_assignment_data( - include_assignment_permissions: @context.root_account.feature_enabled?(:anonymous_moderated_marking) - ) - + set_js_assignment_data set_tutorial_js_env hash = { WEIGHT_FINAL_GRADES: @context.apply_group_weights?, @@ -192,21 +189,13 @@ class AssignmentsController < ApplicationController add_crumb(@assignment.title, polymorphic_url([@context, @assignment])) add_crumb(t('Moderate')) - if @assignment.root_account.feature_enabled?(:anonymous_moderated_marking) - css_bundle :assignment_grade_summary - js_bundle :assignment_grade_summary - js_env(new_moderate_env) + css_bundle :assignment_grade_summary + js_bundle :assignment_grade_summary + js_env(new_moderate_env) - @page_title = @assignment.title + @page_title = @assignment.title - render html: "", layout: true - else - js_env(old_moderate_env) - - respond_to do |format| - format.html { render } - end - end + render html: "", layout: true end def downloadable_submissions?(current_user, context, assignment) @@ -366,10 +355,7 @@ class AssignmentsController < ApplicationController @assignment = @context.assignments.active.find(params[:assignment_id]) toggle_value = params[:status] == 'true' - - unless toggle_value - return render_unauthorized_action if !@assignment.grades_published? && @assignment.root_account.feature_enabled?(:anonymous_moderated_marking) - end + return render_unauthorized_action if !toggle_value && !@assignment.grades_published? method = toggle_value ? :mute! : :unmute! @@ -477,7 +463,6 @@ class AssignmentsController < ApplicationController post_to_sis = Assignment.sis_grade_export_enabled?(@context) hash = { - ANONYMOUS_MODERATED_MARKING_ENABLED: @context.root_account.feature_enabled?(:anonymous_moderated_marking), ASSIGNMENT_GROUPS: json_for_assignment_groups, ASSIGNMENT_INDEX_URL: polymorphic_url([@context, :assignments]), ASSIGNMENT_OVERRIDES: assignment_overrides_json( @@ -530,11 +515,9 @@ class AssignmentsController < ApplicationController hash[:active_grading_periods] = GradingPeriod.json_for(@context, @current_user) end - hash[:ANONYMOUS_GRADING_ENABLED] = - hash[:ANONYMOUS_MODERATED_MARKING_ENABLED] && @context.feature_enabled?(:anonymous_marking) + hash[:ANONYMOUS_GRADING_ENABLED] = @context.feature_enabled?(:anonymous_marking) - hash[:MODERATED_GRADING_ENABLED] = - hash[:ANONYMOUS_MODERATED_MARKING_ENABLED] && @context.feature_enabled?(:moderated_grading) + hash[:MODERATED_GRADING_ENABLED] = @context.feature_enabled?(:moderated_grading) append_sis_data(hash) if context.is_a?(Course) @@ -586,31 +569,6 @@ class AssignmentsController < ApplicationController } end - def old_moderate_env - can_edit_grades = @context.grants_right?(@current_user, :manage_grades) - { - ANONYMOUS_MODERATED_MARKING_ENABLED: false, - ASSIGNMENT_MUTED: @assignment.muted?, - ASSIGNMENT_TITLE: @assignment.title, - COURSE_ID: @context.id, - GRADES_PUBLISHED: @assignment.grades_published?, - PERMISSIONS: { - edit_grades: can_edit_grades, - view_grades: can_edit_grades || @context.grants_right?(@current_user, :view_all_grades) - }, - STUDENT_CONTEXT_CARDS_ENABLED: @domain_root_account.feature_enabled?(:student_context_cards), - URLS: { - add_moderated_students: api_v1_add_moderated_students_url({course_id: @context.id, assignment_id: @assignment.id}), - assignment_speedgrader_url: speed_grader_course_gradebook_url({course_id: @context.id, assignment_id: @assignment.id}), - list_gradeable_students: api_v1_course_assignment_gradeable_students_url({course_id: @context.id, assignment_id: @assignment.id}) + "?include[]=provisional_grades&per_page=50", - provisional_grades_base_url: polymorphic_url([:api_v1, @context, @assignment]) + "/provisional_grades", - publish_grades_url: api_v1_publish_provisional_grades_url({course_id: @context.id, assignment_id: @assignment.id}), - student_submissions_url: polymorphic_url([:api_v1, @context, @assignment, :submissions]) + "?include[]=user_summary&include[]=provisional_grades", - unmute_assignment_url: course_assignment_mute_url(course_id: @context.id, assignment_id: @assignment.id, status: 'false') - } - } - end - def tool_eula_url @assignment.tool_settings_tool.try(:tool_proxy)&.find_service(Assignment::LTI_EULA_SERVICE, 'GET')&.endpoint end diff --git a/app/controllers/canvadoc_sessions_controller.rb b/app/controllers/canvadoc_sessions_controller.rb index 820bb1f57f6..3e49e489a23 100644 --- a/app/controllers/canvadoc_sessions_controller.rb +++ b/app/controllers/canvadoc_sessions_controller.rb @@ -71,8 +71,6 @@ class CanvadocSessionsController < ApplicationController private def anonymous_grading_enabled?(attachment) - return false unless @domain_root_account.feature_enabled?(:anonymous_moderated_marking) - Assignment.joins(submissions: :attachment_associations). where( submissions: {attachment_associations: {context_type: 'Submission', attachment: attachment}}, diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index f19020e5931..b7072abb8b4 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -1754,9 +1754,7 @@ class CoursesController < ApplicationController @padless = true when 'assignments' add_crumb(t('#crumbs.assignments', "Assignments")) - set_js_assignment_data( - include_assignment_permissions: @context.root_account.feature_enabled?(:anonymous_moderated_marking) - ) + set_js_assignment_data js_env(:SIS_NAME => AssignmentUtil.post_to_sis_friendly_name(@context)) js_env(:COURSE_HOME => true) @upcoming_assignments = get_upcoming_assignments(@context) diff --git a/app/controllers/gradebooks_controller.rb b/app/controllers/gradebooks_controller.rb index 79afe93cb50..2f70d221a4f 100644 --- a/app/controllers/gradebooks_controller.rb +++ b/app/controllers/gradebooks_controller.rb @@ -307,7 +307,6 @@ class GradebooksController < ApplicationController GRADEBOOK_OPTIONS: { api_max_per_page: per_page, chunk_size: Setting.get('gradebook2.submissions_chunk_size', '10').to_i, - anonymous_moderated_marking_enabled: anonymous_moderated_marking_enabled?, assignment_groups_url: api_v1_course_assignment_groups_url( @context, include: ag_includes, @@ -447,7 +446,7 @@ class GradebooksController < ApplicationController # decorate submissions with user_ids if not present submissions_without_user_ids = submissions.select {|s| s[:user_id].blank?} - if submissions_without_user_ids.present? && anonymous_moderated_marking_enabled? + if submissions_without_user_ids.present? submissions = populate_user_ids(submissions_without_user_ids) end @@ -563,7 +562,7 @@ class GradebooksController < ApplicationController def submissions_json(submissions:, assignments:) submissions.map do |sub| assignment = assignments[sub[:assignment_id].to_i] - omitted_field = assignment.anonymous_grading? && anonymous_moderated_marking_enabled? ? :user_id : :anonymous_id + omitted_field = assignment.anonymous_grading? ? :user_id : :anonymous_id json_params = { include: { submission_history: { methods: %i[late missing], except: omitted_field } }, except: omitted_field @@ -627,14 +626,13 @@ class GradebooksController < ApplicationController end @can_comment_on_submission = !@context.completed? && !@context_enrollment.try(:completed?) - @disable_unmute_assignment = @assignment.muted && !@assignment.grades_published? && anonymous_moderated_marking_enabled? + @disable_unmute_assignment = @assignment.muted && !@assignment.grades_published? respond_to do |format| format.html do rubric = @assignment&.rubric_association&.rubric @headers = false @outer_frame = true - @anonymous_moderated_marking_enabled = anonymous_moderated_marking_enabled? log_asset_access([ "speed_grader", @context ], "grades", "other") env = { CONTEXT_ACTION_SOURCE: :speed_grader, @@ -645,7 +643,6 @@ class GradebooksController < ApplicationController lti_retrieve_url: retrieve_course_external_tools_url( @context.id, assignment_id: @assignment.id, display: 'borderless' ), - anonymous_moderated_marking_enabled: @anonymous_moderated_marking_enabled, course_id: @context.id, assignment_id: @assignment.id, assignment_title: @assignment.title, @@ -669,8 +666,7 @@ class GradebooksController < ApplicationController append_sis_data(env) js_env(env) - anonymous_grading = @assignment.anonymous_grading? && @anonymous_moderated_marking_enabled - render :speed_grader, locals: { anonymous_grading: anonymous_grading } + render :speed_grader, locals: { anonymous_grading: @assignment.anonymous_grading? } end format.json do @@ -762,10 +758,6 @@ class GradebooksController < ApplicationController end end - def anonymous_moderated_marking_enabled? - @context.root_account.feature_enabled?(:anonymous_moderated_marking) - end - def new_gradebook_env graded_late_submissions_exist = @context.submissions.graded.late.exists? diff --git a/app/controllers/provisional_grades_base_controller.rb b/app/controllers/provisional_grades_base_controller.rb index de8c3611ef6..87133f9582d 100644 --- a/app/controllers/provisional_grades_base_controller.rb +++ b/app/controllers/provisional_grades_base_controller.rb @@ -33,9 +33,7 @@ class ProvisionalGradesBaseController < ApplicationController return render json: { message: "Assignment grades have already been published" }, status: :bad_request end - # in theory we could apply visibility here, but for now we would rather be performant - # e.g. @assignment.students_with_visibility(@context.students_visible_to(@current_user)).find(params[:student_id]) - json = {needs_provisional_grade: @assignment.student_needs_provisional_grade?(@student)} + json = {needs_provisional_grade: @assignment.can_be_moderated_grader?(@current_user)} return render json: json unless submission_updated? diff --git a/app/controllers/submissions/previews_base_controller.rb b/app/controllers/submissions/previews_base_controller.rb index d999177a6bc..874bf202b27 100644 --- a/app/controllers/submissions/previews_base_controller.rb +++ b/app/controllers/submissions/previews_base_controller.rb @@ -51,10 +51,7 @@ module Submissions if redirect? redirect_to(named_context_url(@context, redirect_path_name, @assignment.quiz.id, redirect_params)) else - anonymous_grading = @assignment.anonymous_grading? && - @context.root_account.feature_enabled?(:anonymous_moderated_marking) - - render 'submissions/show_preview', locals: { anonymous_grading: anonymous_grading } + render 'submissions/show_preview', locals: { anonymous_grading: @assignment.anonymous_grading? } end end end diff --git a/app/helpers/gradebooks_helper.rb b/app/helpers/gradebooks_helper.rb index d389020614c..fefc3b1cb3e 100644 --- a/app/helpers/gradebooks_helper.rb +++ b/app/helpers/gradebooks_helper.rb @@ -25,22 +25,14 @@ module GradebooksHelper !!anonymous_assignment end - def anonymous_grading_required?(assignment) - if assignment.root_account.feature_enabled?(:anonymous_moderated_marking) - assignment.anonymous_grading? - else - assignment.course.feature_enabled?(:anonymous_grading) - end - end - def force_anonymous_grading?(assignment) - anonymous_assignment?(assignment) || anonymous_grading_required?(assignment) + anonymous_assignment?(assignment) || assignment.anonymous_grading? end def force_anonymous_grading_reason(assignment) if anonymous_assignment?(assignment) I18n.t("Student names must be hidden because this is an anonymous survey.") - elsif anonymous_grading_required?(assignment) + elsif assignment.anonymous_grading? I18n.t("Student names must be hidden because anonymous grading is required.") else "" diff --git a/app/jsx/assignments/ModerationApp.js b/app/jsx/assignments/ModerationApp.js index 1c5f130e833..a44ee068596 100644 --- a/app/jsx/assignments/ModerationApp.js +++ b/app/jsx/assignments/ModerationApp.js @@ -77,7 +77,6 @@ export default React.createClass({

{I18n.t('Moderate %{assignment_name}', {assignment_name: this.state.assignment.title})}

{ this.props.store.dispatch(Actions.publishStarted()); diff --git a/app/jsx/assignments/ModerationHeader.js b/app/jsx/assignments/ModerationHeader.js index 98cff46cb2a..215d01bac0c 100644 --- a/app/jsx/assignments/ModerationHeader.js +++ b/app/jsx/assignments/ModerationHeader.js @@ -24,7 +24,6 @@ import I18n from 'i18n!moderated_grading' displayName: 'Header', propTypes: { - anonymousModeratedMarkingEnabled: PropTypes.bool.isRequired, muted: PropTypes.bool.isRequired, onPublishClick: PropTypes.func.isRequired, onReviewClick: PropTypes.func.isRequired, @@ -111,7 +110,7 @@ import I18n from 'i18n!moderated_grading' }, render () { - const showUnmuteButton = this.props.anonymousModeratedMarkingEnabled && this.props.permissions.editGrades + const showUnmuteButton = this.props.permissions.editGrades return (
diff --git a/app/jsx/bundles/assignment_moderation.js b/app/jsx/bundles/assignment_moderation.js index 46435176307..c4c1cd62718 100644 --- a/app/jsx/bundles/assignment_moderation.js +++ b/app/jsx/bundles/assignment_moderation.js @@ -38,7 +38,6 @@ const store = configureStore({ unmute: false }, assignment: { - anonymousModeratedMarkingEnabled: window.ENV.ANONYMOUS_MODERATED_MARKING_ENABLED, muted: window.ENV.ASSIGNMENT_MUTED, published: window.ENV.GRADES_PUBLISHED, title: window.ENV.ASSIGNMENT_TITLE, diff --git a/app/jsx/gradebook/SubmissionStateMap.js b/app/jsx/gradebook/SubmissionStateMap.js index 68b01944019..c4f8bc6d34d 100644 --- a/app/jsx/gradebook/SubmissionStateMap.js +++ b/app/jsx/gradebook/SubmissionStateMap.js @@ -36,10 +36,9 @@ import GradingPeriodsHelper from '../grading/helpers/GradingPeriodsHelper' student, hasGradingPeriods, selectedGradingPeriodID, - isAdmin, - anonymousModeratedMarkingEnabled + isAdmin ) { - if (assignment.anonymous_grading && assignment.muted && anonymousModeratedMarkingEnabled) { + if (assignment.anonymous_grading && assignment.muted) { return { locked: true, hideGrade: true }; } else if (!visibleToStudent(assignment, student)) { return { locked: true, hideGrade: true, tooltip: TOOLTIP_KEYS.NONE }; @@ -74,11 +73,10 @@ import GradingPeriodsHelper from '../grading/helpers/GradingPeriodsHelper' } class SubmissionState { - constructor({ hasGradingPeriods, selectedGradingPeriodID, isAdmin, anonymousModeratedMarkingEnabled }) { + constructor({ hasGradingPeriods, selectedGradingPeriodID, isAdmin }) { this.hasGradingPeriods = hasGradingPeriods; this.selectedGradingPeriodID = selectedGradingPeriodID; this.isAdmin = isAdmin; - this.anonymousModeratedMarkingEnabled = anonymousModeratedMarkingEnabled; this.submissionCellMap = {}; this.submissionMap = {}; } @@ -100,8 +98,7 @@ import GradingPeriodsHelper from '../grading/helpers/GradingPeriodsHelper' student, this.hasGradingPeriods, this.selectedGradingPeriodID, - this.isAdmin, - this.anonymousModeratedMarkingEnabled + this.isAdmin ]; this.submissionCellMap[student.id][assignment.id] = cellMapForSubmission(...params); diff --git a/app/jsx/gradezilla/SubmissionStateMap.js b/app/jsx/gradezilla/SubmissionStateMap.js index 9ed26e7e7a2..d0ce39f0be6 100644 --- a/app/jsx/gradezilla/SubmissionStateMap.js +++ b/app/jsx/gradezilla/SubmissionStateMap.js @@ -65,12 +65,12 @@ function cellMappingsForMultipleGradingPeriods (assignment, student, selectedGra return { ...cellMapping, ...gradingPeriodInfo }; } -function cellMapForSubmission (assignment, student, hasGradingPeriods, selectedGradingPeriodID, isAdmin, anonymousModeratedMarkingEnabled) { +function cellMapForSubmission (assignment, student, hasGradingPeriods, selectedGradingPeriodID, isAdmin) { if (!assignment.published) { return { locked: true, hideGrade: true }; - } else if (assignment.moderated_grading && !assignment.grades_published && anonymousModeratedMarkingEnabled) { + } else if (assignment.moderated_grading && !assignment.grades_published) { return { locked: true, hideGrade: false }; - } else if (assignment.anonymous_grading && assignment.muted && anonymousModeratedMarkingEnabled) { + } else if (assignment.anonymous_grading && assignment.muted) { return { locked: true, hideGrade: true }; } else if (!visibleToStudent(assignment, student)) { return { locked: true, hideGrade: true }; @@ -98,11 +98,10 @@ function missingSubmission (student, assignment) { } class SubmissionStateMap { - constructor ({ hasGradingPeriods, selectedGradingPeriodID, isAdmin, anonymousModeratedMarkingEnabled }) { + constructor ({ hasGradingPeriods, selectedGradingPeriodID, isAdmin }) { this.hasGradingPeriods = hasGradingPeriods; this.selectedGradingPeriodID = selectedGradingPeriodID; this.isAdmin = isAdmin; - this.anonymousModeratedMarkingEnabled = anonymousModeratedMarkingEnabled; this.submissionCellMap = {}; this.submissionMap = {}; } @@ -124,8 +123,7 @@ class SubmissionStateMap { student, this.hasGradingPeriods, this.selectedGradingPeriodID, - this.isAdmin, - this.anonymousModeratedMarkingEnabled + this.isAdmin ]; this.submissionCellMap[student.id][assignment.id] = cellMapForSubmission(...params); diff --git a/app/jsx/gradezilla/default_gradebook/GradebookGrid/headers/AssignmentColumnHeaderRenderer.js b/app/jsx/gradezilla/default_gradebook/GradebookGrid/headers/AssignmentColumnHeaderRenderer.js index b6d7cd55506..1773af1c851 100644 --- a/app/jsx/gradezilla/default_gradebook/GradebookGrid/headers/AssignmentColumnHeaderRenderer.js +++ b/app/jsx/gradezilla/default_gradebook/GradebookGrid/headers/AssignmentColumnHeaderRenderer.js @@ -62,7 +62,7 @@ function getProps (column, gradebook, options) { addGradebookElement: gradebook.keyboardNav.addGradebookElement, assignment: { - anonymousGrading: assignment.anonymous_grading && gradebook.options.anonymous_moderated_marking_enabled, + anonymousGrading: assignment.anonymous_grading, courseId: assignment.course_id, htmlUrl: assignment.html_url, id: assignment.id, diff --git a/app/jsx/gradezilla/default_gradebook/components/SubmissionTray.js b/app/jsx/gradezilla/default_gradebook/components/SubmissionTray.js index ea194838e51..7d1d13c41ee 100644 --- a/app/jsx/gradezilla/default_gradebook/components/SubmissionTray.js +++ b/app/jsx/gradezilla/default_gradebook/components/SubmissionTray.js @@ -65,7 +65,6 @@ export default class SubmissionTray extends React.Component { }; static propTypes = { - anonymousModeratedMarkingEnabled: bool.isRequired, assignment: shape({ name: string.isRequired, htmlUrl: string.isRequired, @@ -199,7 +198,7 @@ export default class SubmissionTray extends React.Component { renderSpeedGraderLink (speedGraderProps) { const buttonProps = { variant: 'link', href: speedGraderProps.speedGraderUrl } - if (this.props.anonymousModeratedMarkingEnabled && speedGraderProps.anonymousGrading) { + if (speedGraderProps.anonymousGrading) { buttonProps.onClick = (e) => { e.preventDefault(); this.props.onAnonymousSpeedGraderClick(speedGraderProps.speedGraderUrl); @@ -219,7 +218,7 @@ export default class SubmissionTray extends React.Component { const { name, avatarUrl } = this.props.student; const assignmentParam = `assignment_id=${this.props.submission.assignmentId}`; const studentParam = `#{"student_id":"${this.props.student.id}"}`; - const speedGraderUrlParams = this.props.anonymousModeratedMarkingEnabled && this.props.assignment.anonymousGrading + const speedGraderUrlParams = this.props.assignment.anonymousGrading ? assignmentParam : `${assignmentParam}${studentParam}` const speedGraderUrl = encodeURI(`/courses/${this.props.courseId}/gradebook/speed_grader?${speedGraderUrlParams}`) diff --git a/app/jsx/gradezilla/shared/AssignmentMuterDialogManager.js b/app/jsx/gradezilla/shared/AssignmentMuterDialogManager.js index b0a9cfc9a70..dabcfdcdd87 100644 --- a/app/jsx/gradezilla/shared/AssignmentMuterDialogManager.js +++ b/app/jsx/gradezilla/shared/AssignmentMuterDialogManager.js @@ -19,11 +19,10 @@ import AssignmentMuter from 'compiled/AssignmentMuter' export default class AssignmentMuterDialogManager { - constructor(assignment, url, submissionsLoaded, anonymousModeratedMarkingEnabled) { + constructor(assignment, url, submissionsLoaded) { this.assignment = assignment this.url = url this.submissionsLoaded = submissionsLoaded - this.anonymousModeratedMarkingEnabled = anonymousModeratedMarkingEnabled this.showDialog = this.showDialog.bind(this) this.isDialogEnabled = this.isDialogEnabled.bind(this) @@ -41,11 +40,7 @@ export default class AssignmentMuterDialogManager { return false } - if ( - this.assignment.muted && - this.anonymousModeratedMarkingEnabled && - this.assignment.moderated_grading - ) { + if (this.assignment.muted && this.assignment.moderated_grading) { return this.assignment.grades_published } diff --git a/app/models/assignment.rb b/app/models/assignment.rb index f77751e38b5..1da65ec0c57 100644 --- a/app/models/assignment.rb +++ b/app/models/assignment.rb @@ -100,17 +100,13 @@ class Assignment < ActiveRecord::Base validate :assignment_name_length_ok? validates :lti_context_id, presence: true, uniqueness: true - before_create do - self.muted = true if moderated_grading? && anonymous_moderated_marking? - end - with_options unless: :moderated_grading? do validates :graders_anonymous_to_graders, absence: true validates :grader_section, absence: true validates :final_grader, absence: true end - with_options if: -> { moderated_grading? && anonymous_moderated_marking? } do + with_options if: -> { moderated_grading? } do validates :grader_count, numericality: { greater_than: 0, message: "Number of graders must be positive" } validate :grader_section_ok? validate :final_grader_ok? @@ -454,7 +450,8 @@ class Assignment < ActiveRecord::Base :default_values, :maintain_group_category_attribute, :validate_assignment_overrides, - :mute_if_changed_to_anonymous + :mute_if_changed_to_anonymous, + :mute_if_changed_to_moderated after_save :update_submissions_and_grades_if_details_changed, @@ -1387,11 +1384,10 @@ class Assignment < ActiveRecord::Base def user_can_update?(user, session=nil) return false unless context.grants_right?(user, session, :manage_assignments) - return true unless moderated_grading? && root_account.feature_enabled?(:anonymous_moderated_marking) + return true unless moderated_grading? - # When Anonymous Moderated Marking is on, a moderated assignment may only be - # edited by the assignment's moderator (assuming one has been specified) or - # by an account admin with 'Select Final Grader for Moderation' privileges. + # a moderated assignment may only be edited by the assignment's moderator (assuming one has + # been specified) or by an account admin with 'Select Final Grader for Moderation' privileges. final_grader_id.blank? || permits_moderation?(user) end @@ -1737,7 +1733,7 @@ class Assignment < ActiveRecord::Base opts[:assessment_request].complete unless opts[:assessment_request].rubric_association end - ensure_grader_can_adjudicate(grader: opts[:commenter], provisional: opts[:provisional]) do + ensure_grader_can_adjudicate(grader: opts[:author], provisional: opts[:provisional]) do if opts[:comment] && Canvas::Plugin.value_to_boolean(opts[:group_comment]) uuid = CanvasSlug.generate_securish_uuid res = find_or_create_submissions(students) do |submission| @@ -1864,25 +1860,6 @@ class Assignment < ActiveRecord::Base !moderated_grading? || grades_published_at.present? end - def student_needs_provisional_grade?(student, preloaded_counts=nil) - # For Anonymous Moderated Marking, we aren't concerned with the assignment's - # moderation set or the hard-coded provisional grade limit. Instead we - # check (elsewhere) that we're below the assignment's max grader count. - return true if anonymous_moderated_marking? - - pg_count = if preloaded_counts - preloaded_counts[student.id] || 0 - else - self.provisional_grades.not_final.where(:submissions => {:user_id => student}).count - end - in_moderation_set = if self.moderated_grading_selections.loaded? - self.moderated_grading_selections.detect{|s| s.student_id == student.id}.present? - else - self.moderated_grading_selections.where(:student_id => student).exists? - end - pg_count < (in_moderation_set ? 2 : 1) - end - def sections_with_visibility(user) return context.active_course_sections unless self.differentiated_assignments_applies? @@ -2665,7 +2642,7 @@ class Assignment < ActiveRecord::Base def unmute! return unless muted? - return super unless !grades_published? && anonymous_moderated_marking? && anonymous_grading? + return super unless !grades_published? && anonymous_grading? errors.add :muted, I18n.t("Anonymous moderated assignments cannot be unmuted until grades are posted") false end @@ -2773,11 +2750,7 @@ class Assignment < ActiveRecord::Base end def permits_moderation?(user) - if anonymous_moderated_marking? - final_grader_id == user.id || context.account_membership_allows(user, :select_final_grade) - else - context.grants_right?(user, :moderate_grades) - end + final_grader_id == user.id || context.account_membership_allows(user, :select_final_grade) end def available_moderators @@ -2804,7 +2777,7 @@ class Assignment < ActiveRecord::Base end def moderated_grader_limit_reached? - moderated_grading? && anonymous_moderated_marking? && provisional_moderation_graders.count >= grader_count + moderated_grading? && provisional_moderation_graders.count >= grader_count end def can_be_moderated_grader?(user) @@ -2820,7 +2793,7 @@ class Assignment < ActiveRecord::Base def can_view_other_grader_identities?(user) return false unless context.grants_any_right?(user, :manage_grades, :view_all_grades) - return true unless anonymous_moderated_marking? && moderated_grading? + return true unless moderated_grading? return grader_names_visible_to_final_grader? if final_grader_id == user.id return true if context.account_membership_allows(user, :select_final_grade) @@ -2831,7 +2804,7 @@ class Assignment < ActiveRecord::Base def can_view_other_grader_comments?(user) return false unless context.grants_any_right?(user, :manage_grades, :view_all_grades) - return true unless anonymous_moderated_marking? && moderated_grading? + return true unless moderated_grading? return true if final_grader_id == user.id || context.account_membership_allows(user, :select_final_grade) @@ -2845,9 +2818,7 @@ class Assignment < ActiveRecord::Base end def can_view_student_names?(user) - return false unless context.grants_any_right?(user, :manage_grades, :view_all_grades) - return true unless anonymous_moderated_marking? - !anonymous_grading? + !anonymous_grading && context.grants_any_right?(user, :manage_grades, :view_all_grades) end private @@ -2855,7 +2826,13 @@ class Assignment < ActiveRecord::Base def mute_if_changed_to_anonymous return unless anonymous_grading_changed? - self.muted = true if anonymous_grading? && anonymous_moderated_marking? + self.muted = true if anonymous_grading? + end + + def mute_if_changed_to_moderated + return unless moderated_grading_changed? + + self.muted = true if moderated_grading? end def due_date_ok? @@ -2925,10 +2902,6 @@ class Assignment < ActiveRecord::Base end end - def anonymous_moderated_marking? - root_account.feature_enabled?(:anonymous_moderated_marking) - end - def clear_moderated_grading_attributes(assignment) assignment.final_grader_id = nil assignment.grader_count = nil @@ -2940,7 +2913,7 @@ class Assignment < ActiveRecord::Base def create_moderation_grader_if_needed(grader:) return false if moderation_graders.where(user: grader).exists? - if provisional_moderation_graders.count >= grader_count + if moderated_grader_limit_reached? raise MaxGradersReachedError unless grader.id == final_grader_id end @@ -2960,13 +2933,12 @@ class Assignment < ActiveRecord::Base end # This is a helper method intended to ensure the number of provisional graders - # for a moderated assignment (if Anonymous Moderated Marking is enabled) doesn't - # exceed the prescribed maximum. Currently, it is used for submitting grades and - # comments via SpeedGrader. If the assignment is not moderated, the grade/comment - # being issued is not provisional, or Anonymous Moderated Marking is off, this + # for a moderated assignment doesn't exceed the prescribed maximum. Currently, + # it is used for submitting grades and comments via SpeedGrader. If the assignment + # is not moderated or the grade/comment being issued is not provisional, this # method will simply execute the provided block without any additional checks. def ensure_grader_can_adjudicate(grader:, provisional: false) - unless provisional && moderated_grading? && anonymous_moderated_marking? + unless provisional && moderated_grading? yield and return end diff --git a/app/models/assignment/speed_grader.rb b/app/models/assignment/speed_grader.rb index ffc82b4a73a..3ce6e72f7b0 100644 --- a/app/models/assignment/speed_grader.rb +++ b/app/models/assignment/speed_grader.rb @@ -75,8 +75,6 @@ class Assignment all_provisional_rubric_assessments = @grading_role == :moderator && (@assignment.visible_rubric_assessments_for(@user, :provisional_moderator => true) || []) - # if we're a provisional grader, calculate whether the student needs a grade - preloaded_pg_counts = is_provisional && @assignment.provisional_grades.not_final.group("submissions.user_id").count ActiveRecord::Associations::Preloader.new.preload(@assignment, :moderated_grading_selections) if is_provisional includes = [{ versions: :versionable }, :quiz_submission, :user, :attachment_associations, :assignment, :originality_reports] @@ -90,11 +88,7 @@ class Assignment res[:context][:students] = @students.map do |student| json = student.as_json(include_root: false, methods: submission_comment_methods, only: student_json_fields) json[:anonymous_id] = student_ids_to_anonymous_ids[student.id.to_s] if anonymous_students? - - if preloaded_pg_counts - json[:needs_provisional_grade] = @assignment.student_needs_provisional_grade?(student, preloaded_pg_counts) - end - + json[:needs_provisional_grade] = @assignment.can_be_moderated_grader?(@user) if is_provisional json[:rubric_assessments] = rubric_assessements_to_json(current_user_rubric_assessments.select {|assessment| assessment.user_id == student.id}) json end diff --git a/app/models/course.rb b/app/models/course.rb index a6d639c33ac..5b048da8c9a 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -3181,8 +3181,6 @@ class Course < ActiveRecord::Base end def moderators - return [] unless root_account.feature_enabled?(:anonymous_moderated_marking) - active_instructors = users.merge(Enrollment.active_or_pending.of_instructor_type) active_instructors.select { |user| grants_right?(user, :select_final_grade) } end diff --git a/app/models/enrollment.rb b/app/models/enrollment.rb index d308621203f..961db77b33e 100644 --- a/app/models/enrollment.rb +++ b/app/models/enrollment.rb @@ -1440,7 +1440,6 @@ class Enrollment < ActiveRecord::Base def remove_user_as_final_grader? instructor? && - root_account.feature_enabled?(:anonymous_moderated_marking) && !other_enrollments_of_type(['TaEnrollment', 'TeacherEnrollment']).exists? end diff --git a/app/models/importers/assignment_importer.rb b/app/models/importers/assignment_importer.rb index aba3adf2090..7075bcd4290 100644 --- a/app/models/importers/assignment_importer.rb +++ b/app/models/importers/assignment_importer.rb @@ -288,7 +288,7 @@ module Importers [:peer_reviews, :automatic_peer_reviews, :anonymous_peer_reviews, :grade_group_students_individually, :allowed_extensions, - :position, :peer_review_count, :moderated_grading, + :position, :peer_review_count, :omit_from_final_grade, :intra_group_peer_reviews, :post_to_sis ].each do |prop| item.send("#{prop}=", hash[prop]) unless hash[prop].nil? diff --git a/app/models/moderated_grading/provisional_grade.rb b/app/models/moderated_grading/provisional_grade.rb index 513d0679b79..f58999f090f 100644 --- a/app/models/moderated_grading/provisional_grade.rb +++ b/app/models/moderated_grading/provisional_grade.rb @@ -45,7 +45,7 @@ class ModeratedGrading::ProvisionalGrade < ActiveRecord::Base scope :not_final, -> { where(:final => false)} def must_be_final_or_student_in_need_of_provisional_grade - if !self.final && !self.submission.assignment.student_needs_provisional_grade?(self.submission.user) + if !self.final && !self.submission.assignment.can_be_moderated_grader?(self.scorer) raise(Assignment::GradeError, "Student already has the maximum number of provisional grades") end end diff --git a/app/models/role_override.rb b/app/models/role_override.rb index 998a983438a..c182216498c 100644 --- a/app/models/role_override.rb +++ b/app/models/role_override.rb @@ -910,14 +910,12 @@ class RoleOverride < ActiveRecord::Base :select_final_grade => { :label => -> { t('Select final grade for moderation') }, :true_for => %w(AccountAdmin TeacherEnrollment TaEnrollment), - :available_to => %w(AccountAdmin AccountMembership TeacherEnrollment TaEnrollment), - :account_allows => lambda {|a| a.feature_enabled?(:anonymous_moderated_marking)} + :available_to => %w(AccountAdmin AccountMembership TeacherEnrollment TaEnrollment) }, :view_audit_trail => { :label => -> { t('View audit trail') }, :true_for => %w(TeacherEnrollment AccountAdmin), - :available_to => %w(TeacherEnrollment AccountAdmin AccountMembership), - :account_allows => lambda {|a| a.feature_enabled?(:anonymous_moderated_marking)} + :available_to => %w(TeacherEnrollment AccountAdmin AccountMembership) } }) diff --git a/app/models/submission.rb b/app/models/submission.rb index 3e8657b6d34..45bb6c4f046 100644 --- a/app/models/submission.rb +++ b/app/models/submission.rb @@ -462,7 +462,6 @@ class Submission < ActiveRecord::Base end def can_view_details?(user) - return true unless self.assignment.root_account.feature_enabled?(:anonymous_moderated_marking) return true unless self.assignment.anonymous_grading && self.assignment.muted user == self.user || Account.site_admin.grants_right?(user, :update) end @@ -1509,9 +1508,7 @@ class Submission < ActiveRecord::Base def can_grade_symbolic_status(user = nil) user ||= grader - if assignment.root_account&.feature_enabled?(:anonymous_moderated_marking) - return :moderation_in_progress unless assignment.grades_published? || grade_posting_in_progress - end + return :moderation_in_progress unless assignment.grades_published? || grade_posting_in_progress || assignment.permits_moderation?(user) return :not_applicable if deleted? return :unpublished unless assignment.published? diff --git a/app/views/gradebooks/speed_grader.html.erb b/app/views/gradebooks/speed_grader.html.erb index 8f5c09a0913..f8d0ec988bb 100644 --- a/app/views/gradebooks/speed_grader.html.erb +++ b/app/views/gradebooks/speed_grader.html.erb @@ -53,31 +53,7 @@ - <% unless @anonymous_moderated_marking_enabled %> - - <% end %> - - <% if help_link && !@anonymous_moderated_marking_enabled %> - <%= link_to help_link_url, - class: help_link_classes(["Button Button--icon-action gradebookActions__Button exclude_external_icon"]), - title: help_link_name, - data: help_link_data do %> - <%= svg_icon help_link_icon %> - - <% end %> - <% end %> - - <% if @anonymous_moderated_marking_enabled %> - - <% else %> - - <% end %> +
@@ -280,10 +256,7 @@ <% if can_do(@context, @current_user, :manage_grades) || (@context.concluded? && can_do(@context, @current_user, :read_as_admin)) %>
<%= render partial: "grading_box_extended", - locals: { - assignment: @assignment, - anonymous_moderated_marking_enabled: @anonymous_moderated_marking_enabled - } + locals: {assignment: @assignment} %>
<%= t('links.submit_same_score', "Use this same grade for the resubmission") %>
diff --git a/app/views/jst/assignments/EditView.handlebars b/app/views/jst/assignments/EditView.handlebars index 691d78a1105..5e3b248ef52 100644 --- a/app/views/jst/assignments/EditView.handlebars +++ b/app/views/jst/assignments/EditView.handlebars @@ -161,22 +161,7 @@ {{/if}} {{#unless isQuizLTIAssignment}} - {{#if anonymousModeratedMarkingEnabled}} - - {{else}} -
-
{{#t}}Moderated Grading{{/t}}
-
- -
-
- {{/if}} + {{/unless}} {{#if anonymousGradingEnabled}} diff --git a/lib/api/v1/assignment.rb b/lib/api/v1/assignment.rb index dc64ca60e42..f0c1f63eecd 100644 --- a/lib/api/v1/assignment.rb +++ b/lib/api/v1/assignment.rb @@ -682,7 +682,7 @@ module Api::V1::Assignment assignment.moderated_grading = value_to_boolean(assignment_params['moderated_grading']) end - grader_changes = final_grader_changes(assignment, context, assignment_params) + grader_changes = final_grader_changes(assignment, assignment_params) assignment.final_grader_id = grader_changes.grader_id if grader_changes.grader_changed? if assignment_params.key?('anonymous_grading') && assignment.course.feature_enabled?(:anonymous_marking) @@ -773,10 +773,9 @@ module Api::V1::Assignment private - def final_grader_changes(assignment, course, assignment_params) + def final_grader_changes(assignment, assignment_params) no_changes = OpenStruct.new(grader_changed?: false) return no_changes unless assignment.moderated_grading && assignment_params.key?('final_grader_id') - return no_changes unless course.root_account.feature_enabled?(:anonymous_moderated_marking) final_grader_id = assignment_params.fetch("final_grader_id") return OpenStruct.new(grader_changed?: true, grader_id: nil) if final_grader_id.blank? diff --git a/lib/feature.rb b/lib/feature.rb index a9b3be419fe..53d912e6bdb 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -69,7 +69,7 @@ class Feature # display_name: -> { I18n.t('features.automatic_essay_grading', 'Automatic Essay Grading') }, # description: -> { I18n.t('features.automatic_essay_grading_description, 'Popup text describing the feature goes here') }, # applies_to: 'Course', # or 'RootAccount' or 'Account' or 'User' - # state: 'allowed', # or 'off', 'on', 'hidden', or 'hidden_in_prod' + # state: 'allowed', # or 'on', 'hidden', or 'hidden_in_prod' # # - 'hidden' means the feature must be set by a site admin before it will be visible # # (in that context and below) to other users # # - 'hidden_in_prod' registers 'hidden' in production environments or 'allowed' elsewhere diff --git a/lib/features/anonymous_moderated_marking.rb b/lib/features/anonymous_moderated_marking.rb index 10b41ef8660..367fdda69c7 100644 --- a/lib/features/anonymous_moderated_marking.rb +++ b/lib/features/anonymous_moderated_marking.rb @@ -25,31 +25,21 @@ Feature.register( DESCRIPTION }, applies_to: 'Account', - state: 'allowed', + state: 'hidden', root_opt_in: true, beta: true, - development: false + development: true }, anonymous_marking: { display_name: -> { I18n.t 'Anonymous Marking' }, description: -> { I18n.t <<~DESCRIPTION - Enable anonymous marking of assignments. Only relevant if the Anonymous Moderated Marking flag is enabled. + Enable anonymous marking of assignments. DESCRIPTION }, applies_to: 'Course', state: 'allowed', root_opt_in: true, - beta: true, - development: false, - visible_on: ->(context) do - if context.is_a?(Account) - context.feature_enabled?(:anonymous_moderated_marking) - elsif context.is_a?(Course) - context.root_account.feature_enabled?(:anonymous_moderated_marking) - else - false - end - end + beta: true } ) diff --git a/lib/features/moderated_grading.rb b/lib/features/moderated_grading.rb index 9fd7c251a0e..dc5cd2068b3 100644 --- a/lib/features/moderated_grading.rb +++ b/lib/features/moderated_grading.rb @@ -21,22 +21,12 @@ Feature.register( display_name: -> { I18n.t 'Moderated Grading' }, description: -> { I18n.t <<~DESCRIPTION - Enable moderated grading. Only relevant if the Anonymous Moderated Marking flag is enabled. + Enable moderated grading. DESCRIPTION }, applies_to: 'Course', state: 'allowed', root_opt_in: true, - beta: true, - development: false, - visible_on: ->(context) do - if context.is_a?(Account) - context.feature_enabled?(:anonymous_moderated_marking) - elsif context.is_a?(Course) - context.root_account.feature_enabled?(:anonymous_moderated_marking) - else - false - end - end + beta: true } ) diff --git a/lib/gradebook_importer.rb b/lib/gradebook_importer.rb index fa390d91fa8..ad87ba18845 100644 --- a/lib/gradebook_importer.rb +++ b/lib/gradebook_importer.rb @@ -21,7 +21,7 @@ require 'csv' class GradebookImporter ASSIGNMENT_PRELOADED_FIELDS = %i/ id title points_possible grading_type updated_at context_id context_type group_category_id - created_at due_at only_visible_to_overrides + created_at due_at only_visible_to_overrides moderated_grading /.freeze class NegativeId diff --git a/lib/moderation.rb b/lib/moderation.rb index e691e7153f4..07735c1dee7 100644 --- a/lib/moderation.rb +++ b/lib/moderation.rb @@ -18,7 +18,7 @@ module Moderation def create_moderation_selections_for_assignment(assignment_id, student_ids, student_context) assignment = Assignment.find(assignment_id) - return unless assignment.root_account.feature_enabled?(:anonymous_moderated_marking) && assignment.moderated_grading + return unless assignment.moderated_grading # Add selections for students in Student IDs already_moderated_ids = assignment.moderated_grading_selections.pluck(:student_id) diff --git a/public/javascripts/speed_grader.js b/public/javascripts/speed_grader.js index 8856cdbff12..0899ccdf1d4 100644 --- a/public/javascripts/speed_grader.js +++ b/public/javascripts/speed_grader.js @@ -45,7 +45,6 @@ import htmlEscape from './str/htmlEscape'; import rubricAssessment from './rubric_assessment'; import SpeedgraderSelectMenu from './speed_grader_select_menu'; import SpeedgraderHelpers, { - isAnonymousModeratedMarkingEnabled, setupAnonymizableId, setupAnonymizableStudentId, setupAnonymizableUserId, @@ -471,13 +470,7 @@ function setupHeader () { modal: $('#unmute_dialog') }, nav: $gradebook_header.find('#prev-student-button, #next-student-button'), - settings: { - form: $('#settings_form'), - link: $('#settings_link') - }, - keyinfo: { - icon: $('#keyboard-shortcut-info-icon') - } + settings: { form: $('#settings_form') } }, courseId: utils.getParam('courses'), assignmentId: utils.getParam('assignment_id'), @@ -492,10 +485,6 @@ function setupHeader () { this.elements.mute.link.click($.proxy(this.onMuteClick, this)); this.elements.settings.form.submit(this.submitSettingsForm.bind(this)); - if (!isAnonymous) { - this.elements.settings.link.click(this.showSettingsModal.bind(this)); - } - this.elements.keyinfo.icon.click(this.keyboardShortcutInfoModal.bind(this)); }, createModals () { this.elements.settings.form.dialog({ @@ -1346,20 +1335,18 @@ EG = { } if (ENV.grading_role == "moderator") { this.current_prov_grade_index = null; - this.handleModerationTabs(0); // sets up tabs and loads first grade + this.removeModerationBarAndShowSubmission(); - if (isAnonymousModeratedMarkingEnabled()) { - this.renderProvisionalGradeSelector({showingNewStudent: true}) + this.renderProvisionalGradeSelector({showingNewStudent: true}) - const selectedGrade = currentStudentProvisionalGrades().find(grade => grade.selected); - if (selectedGrade) { - this.setActiveProvisionalGradeFields({ - label: provisionalGraderDisplayNames[selectedGrade.provisional_grade_id], - grade: selectedGrade - }); - } else { - this.setActiveProvisionalGradeFields(); - } + const selectedGrade = currentStudentProvisionalGrades().find(grade => grade.selected); + if (selectedGrade) { + this.setActiveProvisionalGradeFields({ + label: provisionalGraderDisplayNames[selectedGrade.provisional_grade_id], + grade: selectedGrade + }); + } else { + this.setActiveProvisionalGradeFields(); } } else { // showSubmissionOverride is optionally set if the user is @@ -1387,94 +1374,6 @@ EG = { this.setReadOnly(false) }, - handleModerationTabs: function(index_to_load) { - if (isAnonymousModeratedMarkingEnabled()) { - this.removeModerationBarAndShowSubmission() - return - } - - var prov_grades = this.currentStudent.submission && this.currentStudent.submission.provisional_grades; - var final_grade = this.currentStudent.submission && this.currentStudent.submission.final_provisional_grade; - - if (prov_grades && prov_grades.length == 1 && !final_grade && !prov_grades[0].readonly) { - $full_width_container.removeClass("with_moderation_tabs"); - $moderation_bar.hide(); - EG.showProvisionalGrade(0); - } else if (prov_grades && prov_grades.length > 0) { - if (prov_grades.length == 1) { - // hide and disable second mark tab - $moderation_tab_2nd.hide(); - $moderation_tabs_div.tabs('disable', 1); - - if (this.currentStudent.needs_provisional_grade || final_grade) { - $new_mark_container.show(); - $new_mark_copy_link2_menu_item.hide(); // hide copy 2nd mark - if (final_grade) { - $new_mark_link_menu_item.hide(); - } else { - EG.can_add_review = true; - $new_mark_link_menu_item.show(); - } - } else { - $new_mark_container.hide(); // hide new mark dropdown if not selected for moderation - } - } else if (prov_grades.length == 2) { - // enable and show second mark tab - $moderation_tabs_div.tabs('enable', 1); - $moderation_tab_2nd.show(); - $new_mark_container.show(); - $new_mark_link_menu_item.hide(); - if (prov_grades[1].provisional_grade_id) { - $new_mark_copy_link2_menu_item.show(); // show copy 2nd mark - } else { - $new_mark_copy_link2_menu_item.hide(); // don't show if it's a new unsaved mark - } - } - - if (final_grade) { - $moderation_tabs_div.tabs('enable', 2); - $moderation_tab_final.show(); - $new_mark_final_link_menu_item.hide(); - } else { - $moderation_tabs_div.tabs('disable', 2); - $moderation_tab_final.hide(); - $new_mark_final_link_menu_item.show(); - } - - $full_width_container.addClass("with_moderation_tabs"); - $moderation_bar.show(); - - if (this.add_review && this.can_add_review) { - this.add_review = false; - this.newProvisionalGrade('new', 1); - } else { - if (this.selected_provisional_grade_id) { - var selected_id = this.selected_provisional_grade_id; - // load provisional grade id from anchor hash - - if (final_grade && final_grade.provisional_grade_id == selected_id) { - index_to_load = 'final'; // final mark - } else { - $.each(prov_grades, function (idx, pg) { - if (pg.provisional_grade_id == selected_id) { - index_to_load = idx; - } - }); - } - - this.selected_provisional_grade_id = null; // don't load it again - } - if (index_to_load == 'final') { - $moderation_tab_final.find('a').click(); - } else { - $moderation_tabs.eq(index_to_load).find('a').click(); // show a grade - } - } - } else { - this.removeModerationBarAndShowSubmission() - } - }, - updateModerationTabs: function() { if (!this.currentStudent.submission) return; var prov_grades = this.currentStudent.submission.provisional_grades; @@ -1547,11 +1446,10 @@ EG = { }; if (index == 1) { this.currentStudent.submission.provisional_grades.push(new_mark); - this.handleModerationTabs(1); } else if (index == 'final') { this.currentStudent.submission.final_provisional_grade = new_mark; - this.handleModerationTabs('final'); } + this.removeModerationBarAndShowSubmission(); } else if (type == 'copy') { if (!this.currentStudent.submission.final_provisional_grade || confirm(I18n.t("Are you sure you want to copy to the final mark? This will overwrite the existing mark."))) { @@ -1564,7 +1462,7 @@ EG = { EG.currentStudent.submission_state = SpeedgraderHelpers.submissionState(EG.currentStudent, ENV.grading_role); EG.current_prov_grade_index = null; - EG.handleModerationTabs('final'); + this.removeModerationBarAndShowSubmission(); EG.updateModerationTabs(); $moderation_tab_final.focus(); }) @@ -2648,11 +2546,7 @@ EG = { $multiple_submissions.change(); EG.showGrade(); - if ( - isAnonymousModeratedMarkingEnabled() && - ENV.grading_role === 'moderator' && - currentStudentProvisionalGrades().length > 0 - ) { + if (ENV.grading_role === 'moderator' && currentStudentProvisionalGrades().length > 0) { // This is the ID of the possibly-new grade that the server returned const newProvisionalGradeId = submissions[0].submission.provisional_grade_id; const existingGrade = currentStudentProvisionalGrades().find( @@ -3201,10 +3095,7 @@ function currentStudentProvisionalGrades () { export default { setup () { setupSelectors() - - if (isAnonymousModeratedMarkingEnabled()) { - renderSettingsMenu() - } + renderSettingsMenu() function registerQuizzesNext (overriddenShowSubmission) { showSubmissionOverride = overriddenShowSubmission; diff --git a/public/javascripts/speed_grader_helpers.js b/public/javascripts/speed_grader_helpers.js index f2f45e15e46..e814c45ae6e 100644 --- a/public/javascripts/speed_grader_helpers.js +++ b/public/javascripts/speed_grader_helpers.js @@ -22,12 +22,8 @@ import I18n from 'i18n!gradebook' import './jquery.instructure_date_and_time' import './jquery.instructure_misc_helpers' -export function isAnonymousModeratedMarkingEnabled () { - return !!ENV.anonymous_moderated_marking_enabled -} - export function setupIsAnonymous ({anonymous_grading}) { - return isAnonymousModeratedMarkingEnabled() && anonymous_grading + return anonymous_grading } export function setupAnonymizableId (isAnonymous) { @@ -168,8 +164,7 @@ export function setupAnonymizableUserId (isAnonymous) { setupIsAnonymous, setupAnonymizableId, setupAnonymizableUserId, - setupAnonymizableStudentId, - isAnonymousModeratedMarkingEnabled + setupAnonymizableStudentId } export default speedgraderHelpers diff --git a/spec/apis/lti/originality_reports_api_spec.rb b/spec/apis/lti/originality_reports_api_spec.rb index fe34d8e8b6e..1774ed1455a 100644 --- a/spec/apis/lti/originality_reports_api_spec.rb +++ b/spec/apis/lti/originality_reports_api_spec.rb @@ -59,7 +59,6 @@ module Lti create: "/api/lti/assignments/#{@assignment.id}/submissions/#{@submission.id}/originality_report" } - allow_any_instance_of(Account).to receive(:feature_enabled?).with(:anonymous_moderated_marking).and_return(false) allow_any_instance_of(Account).to receive(:feature_enabled?).with(:plagiarism_detection_platform).and_return(true) end diff --git a/spec/apis/v1/anonymous_provisional_grades_api_spec.rb b/spec/apis/v1/anonymous_provisional_grades_api_spec.rb index 09f6f05081d..002809bec22 100644 --- a/spec/apis/v1/anonymous_provisional_grades_api_spec.rb +++ b/spec/apis/v1/anonymous_provisional_grades_api_spec.rb @@ -26,7 +26,7 @@ describe 'Anonymous Provisional Grades API', type: :request do course_with_teacher(active_all: true) ta_in_course(active_all: true) @student = student_in_course(active_all: true).user - @assignment = @course.assignments.create!(moderated_grading: true) + @assignment = @course.assignments.create!(moderated_grading: true, grader_count: 1) @submission = @assignment.submit_homework(@student, body: 'EHLO') @path = "/api/v1/courses/#{@course.id}/assignments/#{@assignment.id}/anonymous_provisional_grades/status" @params = { diff --git a/spec/apis/v1/assignments_api_spec.rb b/spec/apis/v1/assignments_api_spec.rb index 046ad31d94b..dc9829c308f 100644 --- a/spec/apis/v1/assignments_api_spec.rb +++ b/spec/apis/v1/assignments_api_spec.rb @@ -2528,144 +2528,119 @@ describe AssignmentsApiController, type: :request do describe 'final_grader_id' do before(:once) do course_with_teacher(active_all: true) + course_with_teacher(active_all: true) end - context 'when Anonymous Moderated Marking is enabled' do - before(:once) do - course_with_teacher(active_all: true) - @course.root_account.enable_feature!(:anonymous_moderated_marking) - end - - it 'allows updating final_grader_id for a participating instructor with "Select Final Grade" permissions' do - assignment = @course.assignments.create!(name: 'Some Assignment', moderated_grading: true, grader_count: 2) - api_call( - :put, - "/api/v1/courses/#{@course.id}/assignments/#{assignment.id}", - { - controller: 'assignments_api', - action: 'update', - format: 'json', - course_id: @course.id, - id: assignment.to_param - }, - { assignment: { final_grader_id: @teacher.id } }, - ) - expect(json_parse(response.body)['final_grader_id']).to eq @teacher.id - end - - it 'does not allow updating final_grader_id if the user does not have "Select Final Grade" permissions' do - assignment = @course.assignments.create!(name: 'Some Assignment', moderated_grading: true, grader_count: 2) - @course.root_account.role_overrides.create!( - permission: 'select_final_grade', - role: teacher_role, - enabled: false - ) - api_call( - :put, - "/api/v1/courses/#{@course.id}/assignments/#{assignment.id}", - { - controller: 'assignments_api', - action: 'update', - format: 'json', - course_id: @course.id, - id: assignment.to_param - }, - { assignment: { final_grader_id: @teacher.id } }, - ) - error = json_parse(response.body)['errors']['final_grader_id'].first - expect(error['message']).to eq 'user does not have permission to select final grade' - end - - it 'does not allow updating final_grader_id if the user is not active in the course' do - assignment = @course.assignments.create!(name: 'Some Assignment', moderated_grading: true, grader_count: 2) - deactivated_teacher = User.create! - deactivated_teacher = @course.enroll_teacher(deactivated_teacher, enrollment_state: 'inactive') - api_call( - :put, - "/api/v1/courses/#{@course.id}/assignments/#{assignment.id}", - { - controller: 'assignments_api', - action: 'update', - format: 'json', - course_id: @course.id, - id: assignment.to_param - }, - { assignment: { final_grader_id: deactivated_teacher.id } }, - ) - error = json_parse(response.body)['errors']['final_grader_id'].first - expect(error['message']).to eq 'course has no active instructors with this ID' - end - - it 'does not allow updating final_grader_id if the course has no user with the supplied ID' do - user_not_enrolled_in_course = User.create! - assignment = @course.assignments.create!(name: 'Some Assignment', moderated_grading: true, grader_count: 2) - api_call( - :put, - "/api/v1/courses/#{@course.id}/assignments/#{assignment.id}", - { - controller: 'assignments_api', - action: 'update', - format: 'json', - course_id: @course.id, - id: assignment.to_param - }, - { assignment: { final_grader_id: user_not_enrolled_in_course.id } }, - ) - error = json_parse(response.body)['errors']['final_grader_id'].first - expect(error['message']).to eq 'course has no active instructors with this ID' - end - - it 'skips final_grader_id validation if the field has not changed' do - assignment = @course.assignments.create!( - final_grader: @teacher, - grader_count: 2, - moderated_grading: true, - name: 'Some Assignment' - ) - @course.root_account.role_overrides.create!( - permission: 'select_final_grade', - role: teacher_role, - enabled: false - ) - api_call( - :put, - "/api/v1/courses/#{@course.id}/assignments/#{assignment.id}", - { - controller: 'assignments_api', - action: 'update', - format: 'json', - course_id: @course.id, - id: assignment.to_param - }, - { assignment: { name: 'a fancy new name' } }, - ) - expect(response).to be_success - end + it 'allows updating final_grader_id for a participating instructor with "Select Final Grade" permissions' do + assignment = @course.assignments.create!(name: 'Some Assignment', moderated_grading: true, grader_count: 2) + api_call( + :put, + "/api/v1/courses/#{@course.id}/assignments/#{assignment.id}", + { + controller: 'assignments_api', + action: 'update', + format: 'json', + course_id: @course.id, + id: assignment.to_param + }, + { assignment: { final_grader_id: @teacher.id } }, + ) + expect(json_parse(response.body)['final_grader_id']).to eq @teacher.id end - context 'when Anonymous Moderated Marking is disabled' do - it 'ignores updates to final_grader_id' do - assignment = @course.assignments.create!(name: 'Some Assignment', moderated_grading: true) - api_call( - :put, - "/api/v1/courses/#{@course.id}/assignments/#{assignment.id}", - { - controller: 'assignments_api', - action: 'update', - format: 'json', - course_id: @course.id, - id: assignment.to_param - }, - { assignment: { final_grader_id: @teacher.id } }, - ) - expect(json_parse(response.body)['final_grader_id']).to be_nil - end + it 'does not allow updating final_grader_id if the user does not have "Select Final Grade" permissions' do + assignment = @course.assignments.create!(name: 'Some Assignment', moderated_grading: true, grader_count: 2) + @course.root_account.role_overrides.create!( + permission: 'select_final_grade', + role: teacher_role, + enabled: false + ) + api_call( + :put, + "/api/v1/courses/#{@course.id}/assignments/#{assignment.id}", + { + controller: 'assignments_api', + action: 'update', + format: 'json', + course_id: @course.id, + id: assignment.to_param + }, + { assignment: { final_grader_id: @teacher.id } }, + ) + error = json_parse(response.body)['errors']['final_grader_id'].first + expect(error['message']).to eq 'user does not have permission to select final grade' + end + + it 'does not allow updating final_grader_id if the user is not active in the course' do + assignment = @course.assignments.create!(name: 'Some Assignment', moderated_grading: true, grader_count: 2) + deactivated_teacher = User.create! + deactivated_teacher = @course.enroll_teacher(deactivated_teacher, enrollment_state: 'inactive') + api_call( + :put, + "/api/v1/courses/#{@course.id}/assignments/#{assignment.id}", + { + controller: 'assignments_api', + action: 'update', + format: 'json', + course_id: @course.id, + id: assignment.to_param + }, + { assignment: { final_grader_id: deactivated_teacher.id } }, + ) + error = json_parse(response.body)['errors']['final_grader_id'].first + expect(error['message']).to eq 'course has no active instructors with this ID' + end + + it 'does not allow updating final_grader_id if the course has no user with the supplied ID' do + user_not_enrolled_in_course = User.create! + assignment = @course.assignments.create!(name: 'Some Assignment', moderated_grading: true, grader_count: 2) + api_call( + :put, + "/api/v1/courses/#{@course.id}/assignments/#{assignment.id}", + { + controller: 'assignments_api', + action: 'update', + format: 'json', + course_id: @course.id, + id: assignment.to_param + }, + { assignment: { final_grader_id: user_not_enrolled_in_course.id } }, + ) + error = json_parse(response.body)['errors']['final_grader_id'].first + expect(error['message']).to eq 'course has no active instructors with this ID' + end + + it 'skips final_grader_id validation if the field has not changed' do + assignment = @course.assignments.create!( + final_grader: @teacher, + grader_count: 2, + moderated_grading: true, + name: 'Some Assignment' + ) + @course.root_account.role_overrides.create!( + permission: 'select_final_grade', + role: teacher_role, + enabled: false + ) + api_call( + :put, + "/api/v1/courses/#{@course.id}/assignments/#{assignment.id}", + { + controller: 'assignments_api', + action: 'update', + format: 'json', + course_id: @course.id, + id: assignment.to_param + }, + { assignment: { name: 'a fancy new name' } }, + ) + expect(response).to be_success end end it 'allows updating grader_count' do course_with_teacher(active_all: true) - assignment = @course.assignments.create!(name: 'Some Assignment', moderated_grading: true) + assignment = @course.assignments.create!(name: 'Some Assignment', moderated_grading: true, grader_count: 1) api_call( :put, "/api/v1/courses/#{@course.id}/assignments/#{assignment.id}", @@ -4546,7 +4521,6 @@ describe AssignmentsApiController, type: :request do context "when the anonymous marking feature flag is set" do before(:once) do - @course.account.enable_feature!(:anonymous_moderated_marking) @course.enable_feature!(:anonymous_marking) end diff --git a/spec/apis/v1/moderation_set_api_spec.rb b/spec/apis/v1/moderation_set_api_spec.rb index f9104a0a452..90db1f608c4 100644 --- a/spec/apis/v1/moderation_set_api_spec.rb +++ b/spec/apis/v1/moderation_set_api_spec.rb @@ -26,13 +26,13 @@ describe 'Moderated Grades API', type: :request do sec2 = @course.course_sections.create!(:name => "section 2") @assignment = @course.assignments.create! name: "asdf" @assignment.update_attribute :moderated_grading, true + @assignment.update_attribute :grader_count, 1 @student1, @student2, @student3 = n_students_in_course(3, course: @course) @course.enroll_student(@student1, :section => sec1, :allow_multiple_enrollments => true) @course.enroll_student(@student2, :section => sec1, :allow_multiple_enrollments => true) @course.enroll_student(@student3, :section => sec1, :allow_multiple_enrollments => true) @course.enroll_student(@student3, :section => sec2, :allow_multiple_enrollments => true) @user = @teacher - @assignment.moderated_grading_selections.create! student: @student1 end before :each do @@ -46,7 +46,7 @@ describe 'Moderated Grades API', type: :request do {controller: 'moderation_set', action: 'index', format: 'json', course_id: @course.id, assignment_id: @assignment.id} expect(response).to be_success - expect(json.size).to eq 1 + expect(json.size).to eq 3 expect(json.first["id"]).to eq @student1.id end diff --git a/spec/apis/v1/provisional_grades_api_spec.rb b/spec/apis/v1/provisional_grades_api_spec.rb index d996a33cd4d..c74885a7eab 100644 --- a/spec/apis/v1/provisional_grades_api_spec.rb +++ b/spec/apis/v1/provisional_grades_api_spec.rb @@ -26,7 +26,9 @@ describe 'Provisional Grades API', type: :request do course_with_student :active_all => true ta_in_course :active_all => true @assignment = @course.assignments.build + @assignment.grader_count = 1 @assignment.moderated_grading = true + @assignment.final_grader_id = @teacher.id @assignment.save! subs = @assignment.grade_student @student, :grader => @ta, :score => 0, :provisional => true @pg = subs.first.provisional_grade(@ta) @@ -37,52 +39,45 @@ describe 'Provisional Grades API', type: :request do end it "should fail if the student isn't in the moderation set" do + @assignment.moderated_grading_selections.destroy_all json = api_call_as_user(@teacher, :put, @path, @params, {}, {}, { :expected_status => 400 }) expect(json['message']).to eq 'student not in moderation set' end - context "with moderation set" do - before(:once) do - @selection = @assignment.moderated_grading_selections.build - @selection.student_id = @student.id - @selection.save! - end - - it "should require :moderate_grades" do - api_call_as_user(@ta, :put, @path, @params, {}, {}, { :expected_status => 401 }) - end - - it "should select a provisional grade" do - json = api_call_as_user(@teacher, :put, @path, @params) - expect(json).to eq({ - 'assignment_id' => @assignment.id, - 'student_id' => @student.id, - 'selected_provisional_grade_id' => @pg.id - }) - expect(@selection.reload.provisional_grade).to eq(@pg) - end - - it_behaves_like 'authorization when Anonymous Moderated Marking is enabled', :put - - it "should use anonymous_id instead of student_id if user cannot view student names" do - allow_any_instance_of(Assignment).to receive(:can_view_student_names?).and_return false - json = api_call_as_user(@teacher, :put, @path, @params) - expect(json).to eq({ - 'assignment_id' => @assignment.id, - 'anonymous_id' => @pg.submission.anonymous_id, - 'selected_provisional_grade_id' => @pg.id - }) - expect(@selection.reload.provisional_grade).to eq(@pg) - end + it "should select a provisional grade" do + json = api_call_as_user(@teacher, :put, @path, @params) + expect(json).to eq({ + 'assignment_id' => @assignment.id, + 'student_id' => @student.id, + 'selected_provisional_grade_id' => @pg.id + }) + expect(@assignment.moderated_grading_selections.where(student_id: @student.id).first.provisional_grade).to eq(@pg) end + + it "should use anonymous_id instead of student_id if user cannot view student names" do + allow_any_instance_of(Assignment).to receive(:can_view_student_names?).and_return false + json = api_call_as_user(@teacher, :put, @path, @params) + expect(json).to eq({ + 'assignment_id' => @assignment.id, + 'anonymous_id' => @pg.submission.anonymous_id, + 'selected_provisional_grade_id' => @pg.id + }) + expect(@assignment.moderated_grading_selections.where(student_id: @student.id).first.provisional_grade).to eq(@pg) + end + + it_behaves_like 'authorization for provisional final grade selection', :put end describe "copy_to_final_mark" do before(:once) do course_with_student :active_all => true ta_in_course :active_all => true - @assignment = @course.assignments.create! submission_types: 'online_text_entry', moderated_grading: true - @assignment.moderated_grading_selections.create! student: @student + @assignment = @course.assignments.create!( + submission_types: 'online_text_entry', + moderated_grading: true, + grader_count: 1, + final_grader_id: @teacher.id + ) @submission = @assignment.submit_homework(@student, :submission_type => 'online_text_entry', :body => 'hallo') @pg = @submission.find_or_create_provisional_grade!(@ta, score: 80) @submission.add_comment(:commenter => @ta, :comment => 'huttah!', :provisional => true) @@ -121,7 +116,7 @@ describe 'Provisional Grades API', type: :request do expect(json['crocodoc_urls']).to eq([]) end - it_behaves_like 'authorization when Anonymous Moderated Marking is enabled', :post + it_behaves_like 'authorization for provisional final grade selection', :post end describe "publish" do @@ -135,6 +130,7 @@ describe 'Provisional Grades API', type: :request do end it "requires a moderated assignment" do + @assignment.update_attribute :final_grader_id, @teacher.id json = api_call_as_user(@teacher, :post, @path, @params, {}, {}, { :expected_status => 400 }) expect(json['message']).to eq 'Assignment does not use moderated grading' end @@ -142,16 +138,14 @@ describe 'Provisional Grades API', type: :request do context "with moderated assignment" do before(:once) do @assignment.update_attribute :moderated_grading, true + @assignment.update_attribute :grader_count, 2 + @assignment.update_attribute :final_grader_id, @teacher.id end it "responds with a 200 for a valid request" do api_call_as_user(@teacher, :post, @path, @params, {}, {}, expected_status: 200) end - it "requires moderate_grades permissions" do - api_call_as_user(@ta, :post, @path, @params, {}, {}, { :expected_status => 401 }) - end - it "requires manage_grades permissions" do @course.root_account.role_overrides.create!( permission: :manage_grades, @@ -209,12 +203,6 @@ describe 'Provisional Grades API', type: :request do end it "publishes provisional grades" do - @student.communication_channels.create(:path => 'student@example.edu', :path_type => 'email').confirm - n = Notification.create!(:name => 'Submission Graded', :category => 'TestImmediately') - NotificationPolicy.create!(:notification => n, - :communication_channel => @student.communication_channel, - :frequency => 'immediately') - expect(@submission.workflow_state).to eq 'submitted' expect(@submission.score).to be_nil expect(@student.messages).to be_empty @@ -227,15 +215,12 @@ describe 'Provisional Grades API', type: :request do @assignment.reload expect(@assignment.grades_published_at).to be_within(1.minute.to_i).of(Time.now.utc) - - @student.reload - expect(@student.messages.map(&:notification_name)).to be_include 'Submission Graded' end it "publishes the selected provisional grade when the student is in the moderation set" do @submission.provisional_grade(@ta).update_attribute(:graded_at, 1.minute.ago) - sel = @assignment.moderated_grading_selections.create!(:student => @student) + sel = @assignment.moderated_grading_selections.find_by(student: @student) @other_ta = user_factory :active_user => true @course.enroll_ta @other_ta, :enrollment_state => 'active' @@ -255,9 +240,7 @@ describe 'Provisional Grades API', type: :request do context "with one provisional grade" do it "publishes the only provisional grade if none have been explicitly selected" do course_with_user("TaEnrollment", course: @course, active_all: true) - second_ta = @user @submission = @assignment.submit_homework(@student, body: "hello") - @assignment.moderated_grading_selections.create!(student: @student) @assignment.grade_student(@student, grader: @ta, score: 72, provisional: true) api_call_as_user(@teacher, :post, @path, @params) @@ -274,7 +257,6 @@ describe 'Provisional Grades API', type: :request do it "publishes even when some submissions have no grades" do @submission = @assignment.submit_homework(@student, body: "hello") - @assignment.moderated_grading_selections.create!(student: @student) @user = @teacher raw_api_call(:post, @path, @params) @@ -286,7 +268,6 @@ describe 'Provisional Grades API', type: :request do it "does not publish if none have been explicitly selected" do @submission = @assignment.submit_homework(@student, body: "hello") - @assignment.moderated_grading_selections.create!(student: @student) @assignment.grade_student(@student, grader: @ta, score: 72, provisional: true) @assignment.grade_student(@student, grader: @second_ta, score: 88, provisional: true) @@ -303,8 +284,7 @@ describe 'Provisional Grades API', type: :request do student_2 = student_in_course(active_all: true, course: @course).user submission_1 = @assignment.submit_homework(student_1, body: "hello") submission_2 = @assignment.submit_homework(student_2, body: "hello") - selection_1 = @assignment.moderated_grading_selections.create!(student: student_1) - @assignment.moderated_grading_selections.create!(student: student_2) + selection_1 = @assignment.moderated_grading_selections.find_by(student: student_1) @assignment.grade_student(student_1, grader: @ta, score: 12, provisional: true) @assignment.grade_student(student_1, grader: @second_ta, score: 34, provisional: true) @assignment.grade_student(student_2, grader: @ta, score: 56, provisional: true) @@ -322,7 +302,7 @@ describe 'Provisional Grades API', type: :request do end end - it_behaves_like 'authorization when Anonymous Moderated Marking is enabled', :post + it_behaves_like 'authorization for provisional final grade selection', :post end end end diff --git a/spec/apis/v1/submissions_api_spec.rb b/spec/apis/v1/submissions_api_spec.rb index 786f6ed300a..e5673cfa1eb 100644 --- a/spec/apis/v1/submissions_api_spec.rb +++ b/spec/apis/v1/submissions_api_spec.rb @@ -1729,6 +1729,7 @@ describe 'Submissions API', type: :request do points_possible: 10 ) @assignment.update_attribute(:moderated_grading, true) + @assignment.update_attribute(:grader_count, 2) submission = @assignment.submit_homework(@student, body: 'nice work') @provisional_grade = submission.provisional_grades.build do |grade| grade.scorer = @teacher @@ -2805,7 +2806,10 @@ describe 'Submissions API', type: :request do end it "creates a provisional grade and comment" do - @assignment.update_attribute(:moderated_grading, true) + @assignment.moderated_grading = true + @assignment.grader_count = 2 + @assignment.final_grader = @teacher + @assignment.save! submission = @assignment.submit_homework(@student, :body => 'what') json = api_call( @@ -2844,7 +2848,10 @@ describe 'Submissions API', type: :request do end it "creates a provisional grade and comment when no submission exists" do - @assignment.update_attribute(:moderated_grading, true) + @assignment.moderated_grading = true + @assignment.grader_count = 2 + @assignment.final_grader = @teacher + @assignment.save! json = api_call( :put, @@ -3864,14 +3871,13 @@ describe 'Submissions API', type: :request do course_with_teacher_logged_in active_all: true student_in_course active_all: true @user = @teacher - assignment = @course.assignments.create!(moderated_grading: true) + assignment = @course.assignments.create!(moderated_grading: true, grader_count: 1) submission = assignment.submit_homework(@student, submission_type: 'online_upload', attachments: [crocodocable_attachment_model(context: @student)]) provisional_grade = submission.find_or_create_provisional_grade!(@teacher, score: 1) - assignment.moderated_grading_selections.create! do |s| - s.student = @student - s.provisional_grade = provisional_grade - end + assignment.moderated_grading_selections. + where(student_id: @student.id).first. + update_attribute(:provisional_grade, provisional_grade) assignment.update(grades_published_at: 1.hour.ago) submission.reload submission.attachments.first.create_crocodoc_document(uuid: '1234', @@ -4206,6 +4212,7 @@ describe 'Submissions API', type: :request do @student2 = student_in_course(:active_all => true).user @assignment = @course.assignments.build @assignment.moderated_grading = true + @assignment.grader_count = 1 @assignment.save! @assignment.submit_homework @student1, :body => 'EHLO' @path = "/api/v1/courses/#{@course.id}/assignments/#{@assignment.id}/gradeable_students" @@ -4263,35 +4270,31 @@ describe 'Submissions API', type: :request do api_call_as_user(@ta, :get, @path, @params, {}, {}, { :expected_status => 401 }) end - context "when Anonymous Moderated Marking is enabled" do - before(:once) { @course.root_account.enable_feature!(:anonymous_moderated_marking) } + it "is unauthorized when the user is not the assigned final grader" do + api_call_as_user(@teacher, :get, @path, @params, {}, {}, expected_status: 401) + end - it "is unauthorized when the user is not the assigned final grader" do - api_call_as_user(@teacher, :get, @path, @params, {}, {}, expected_status: 401) - end + it "is unauthorized when the user is an account admin without 'Select Final Grade for Moderation' permission" do + @course.account.role_overrides.create!(role: admin_role, enabled: false, permission: :select_final_grade) + api_call_as_user(account_admin_user, :get, @path, @params, {}, {}, expected_status: 401) + end - it "is unauthorized when the user is an account admin without 'Select Final Grade for Moderation' permission" do - @course.account.role_overrides.create!(role: admin_role, enabled: false, permission: :select_final_grade) - api_call_as_user(account_admin_user, :get, @path, @params, {}, {}, expected_status: 401) - end + it "is authorized when the user is the final grader" do + @assignment.update!(final_grader: @teacher, grader_count: 2) + api_call_as_user(@teacher, :get, @path, @params, {}, {}, expected_status: 200) + end - it "is authorized when the user is the final grader" do - @assignment.update!(final_grader: @teacher, grader_count: 2) - api_call_as_user(@teacher, :get, @path, @params, {}, {}, expected_status: 200) - end - - it "is authorized when the user is an account admin with 'Select Final Grade for Moderation' permission" do - api_call_as_user(account_admin_user, :get, @path, @params, {}, {}, expected_status: 200) - end + it "is authorized when the user is an account admin with 'Select Final Grade for Moderation' permission" do + api_call_as_user(account_admin_user, :get, @path, @params, {}, {}, expected_status: 200) end it "includes provisional grades with selections" do + @assignment.update!(final_grader: @teacher) sub = @assignment.grade_student(@student1, :score => 90, :grader => @ta, :provisional => true).first pg = sub.provisional_grades.first - sel = @assignment.moderated_grading_selections.build - sel.student_id = @student1.id - sel.selected_provisional_grade_id = pg.id - sel.save! + @assignment.moderated_grading_selections. + where(student_id: @student1.id).first. + update_attribute(:provisional_grade, pg) json = api_call_as_user(@teacher, :get, @path, @params) expect(json).to match_array( [{"id"=>@student1.id, @@ -4321,12 +4324,12 @@ describe 'Submissions API', type: :request do end it "anonymizes speedgrader_url if anonymously grading" do + @assignment.update!(final_grader: @teacher) sub = @assignment.grade_student(@student1, :score => 90, :grader => @ta, :provisional => true).first pg = sub.provisional_grades.first - sel = @assignment.moderated_grading_selections.build - sel.student_id = @student1.id - sel.selected_provisional_grade_id = pg.id - sel.save! + @assignment.moderated_grading_selections. + where(student_id: @student1.id).first. + update_attribute(:provisional_grade, pg) allow_any_instance_of(Assignment).to receive(:can_view_student_names?).and_return false json = api_call_as_user(@teacher, :get, @path, @params) anonymous_id = @assignment.submission_for_student(@student1).anonymous_id @@ -4339,12 +4342,12 @@ describe 'Submissions API', type: :request do end it "anonymizes scorer id of provisional grade if grading double blind" do + @assignment.update!(final_grader: @teacher) sub = @assignment.grade_student(@student1, :score => 90, :grader => @ta, :provisional => true).first pg = sub.provisional_grades.first - sel = @assignment.moderated_grading_selections.build - sel.student_id = @student1.id - sel.selected_provisional_grade_id = pg.id - sel.save! + @assignment.moderated_grading_selections. + where(student_id: @student1.id).first. + update_attribute(:provisional_grade, pg) allow_any_instance_of(Assignment).to receive(:can_view_student_names?).and_return false allow_any_instance_of(Assignment).to receive(:can_view_other_grader_identities?).and_return false json = api_call_as_user(@teacher, :get, @path, @params) @@ -4363,6 +4366,7 @@ describe 'Submissions API', type: :request do @student2 = student_in_course(:active_all => true).user @assignment1 = @course.assignments.build @assignment1.moderated_grading = true + @assignment1.grader_count = 1 @assignment1.save! @assignment2 = @course.assignments.build @assignment2.save! diff --git a/spec/coffeescripts/gradebook/GradebookHeaderMenuSpec.js b/spec/coffeescripts/gradebook/GradebookHeaderMenuSpec.js index 06c09c0c8fc..c77920fda2b 100644 --- a/spec/coffeescripts/gradebook/GradebookHeaderMenuSpec.js +++ b/spec/coffeescripts/gradebook/GradebookHeaderMenuSpec.js @@ -62,7 +62,7 @@ QUnit.module('GradebookHeaderMenu#hideMenuActionsWithUnmetDependencies', { submissions_downloads: 1 } this.gradebook = { - options: {anonymous_moderated_marking_enabled: false, gradebook_is_editable: true} + options: {gradebook_is_editable: true} } this.menuElement = document.createElement('ul') this.createMenu(this.menuElement) @@ -180,7 +180,7 @@ QUnit.module('GradebookHeaderMenu#disableUnavailableMenuActions', { this.createMenu(this.menuElement) this.menu = $(this.menuElement) this.gradebook = { - options: {anonymous_moderated_marking_enabled: false, gradebook_is_editable: true} + options: {gradebook_is_editable: true} } }, teardown() { @@ -242,28 +242,18 @@ test('does not disable "Set Default Grade" when isAdmin', function() { }) test('disables "Unmute Assignment" when the assignment is moderated and grades have not been published', function () { - this.gradebook.options.anonymous_moderated_marking_enabled = true this.assignment = {moderated_grading: true, grades_published: false, inClosedGradingPeriod: false, muted: true} this.disableUnavailableMenuActions(this.menu) strictEqual(this.menu.find('[data-action="toggleMuting"]')[0].getAttribute('aria-disabled'), 'true') }) -test('does not disable "Unmute Assignment" when Anonymous Moderated Marking is disabled', function () { - this.gradebook.options.anonymous_moderated_marking_enabled = false - this.assignment = {moderated_grading: true, grades_published: false, inClosedGradingPeriod: false, muted: true} - this.disableUnavailableMenuActions(this.menu) - strictEqual(this.menu.find('[data-action="toggleMuting"]')[0].getAttribute('aria-disabled'), null) -}) - test('does not disable "Unmute Assignment" when grades are published', function () { - this.gradebook.options.anonymous_moderated_marking_enabled = false this.assignment = {moderated_grading: true, grades_published: true, inClosedGradingPeriod: false, muted: true} this.disableUnavailableMenuActions(this.menu) strictEqual(this.menu.find('[data-action="toggleMuting"]')[0].getAttribute('aria-disabled'), null) }) -test('does not disable "Mute Assignment"', function () { - this.gradebook.options.anonymous_moderated_marking_enabled = true +test('does not disable "Mute Assignment" when the assignment can be muted', function () { this.assignment = {moderated_grading: true, grades_published: false, inClosedGradingPeriod: false, muted: false} this.disableUnavailableMenuActions(this.menu) strictEqual(this.menu.find('[data-action="toggleMuting"]')[0].getAttribute('aria-disabled'), null) diff --git a/spec/coffeescripts/gradebook/GradebookSpec.js b/spec/coffeescripts/gradebook/GradebookSpec.js index 5f6fa237849..6d0ae7a714a 100644 --- a/spec/coffeescripts/gradebook/GradebookSpec.js +++ b/spec/coffeescripts/gradebook/GradebookSpec.js @@ -943,43 +943,27 @@ QUnit.module('Gradebook#gotAllAssignmentGroups', suiteHooks => { $('#assignment_group_weights_dialog').remove() }) - QUnit.module('when Anonymous Moderated Marking is enabled', hooks => { - hooks.beforeEach(() => { - gradebook.options.anonymous_moderated_marking_enabled = true - }) + test('sets moderation_in_progress to true for a moderated assignment whose grades are not published', () => { + gradebook.gotAllAssignmentGroups(assignmentGroups) + strictEqual(moderatedUnpublishedAssignment.moderation_in_progress, true) }) - test('sets moderation_in_progress to true for a moderated assignment whose grades are not published', () => { - gradebook.gotAllAssignmentGroups(assignmentGroups) - strictEqual(moderatedUnpublishedAssignment.moderation_in_progress, true) }) - - test('sets moderation_in_progress to false for a moderated assignment whose grades are published', () => { - gradebook.gotAllAssignmentGroups(assignmentGroups) - strictEqual(moderatedPublishedAssignment.moderation_in_progress, false) - }) - - test('sets moderation_in_progress to false for an unmoderated assignment', () => { - gradebook.gotAllAssignmentGroups(assignmentGroups) - strictEqual(unmoderatedAssignment.moderation_in_progress, false) - }) - - test('sets hide_grades_when_muted to true for an anonymous assignment', () => { - gradebook.gotAllAssignmentGroups(assignmentGroups) - strictEqual(anonymousUnmoderatedAssignment.hide_grades_when_muted, true) - }) - - test('sets hide_grades_when_muted to false for a non-anonymous assignment', () => { - gradebook.gotAllAssignmentGroups(assignmentGroups) - strictEqual(unmoderatedAssignment.hide_grades_when_muted, false) - }) + test('sets moderation_in_progress to false for a moderated assignment whose grades are published', () => { + gradebook.gotAllAssignmentGroups(assignmentGroups) + strictEqual(moderatedPublishedAssignment.moderation_in_progress, false) }) - test('does not set moderation_in_progress when anonymous moderated marking is off', () => { + test('sets moderation_in_progress to false for an unmoderated assignment', () => { gradebook.gotAllAssignmentGroups(assignmentGroups) - strictEqual(moderatedUnpublishedAssignment.moderation_in_progress, undefined) + strictEqual(unmoderatedAssignment.moderation_in_progress, false) }) - test('does not set hide_grades_when_muted when anonymous moderated marking is off', () => { + test('sets hide_grades_when_muted to true for an anonymous assignment', () => { gradebook.gotAllAssignmentGroups(assignmentGroups) - strictEqual(moderatedUnpublishedAssignment.hide_grades_when_muted, undefined) + strictEqual(anonymousUnmoderatedAssignment.hide_grades_when_muted, true) + }) + + test('sets hide_grades_when_muted to false for a non-anonymous assignment', () => { + gradebook.gotAllAssignmentGroups(assignmentGroups) + strictEqual(unmoderatedAssignment.hide_grades_when_muted, false) }) }) diff --git a/spec/coffeescripts/gradebook/SubmissionDetailsDialogSpec.js b/spec/coffeescripts/gradebook/SubmissionDetailsDialogSpec.js index 7ada7230b3c..e8fbccba9d1 100644 --- a/spec/coffeescripts/gradebook/SubmissionDetailsDialogSpec.js +++ b/spec/coffeescripts/gradebook/SubmissionDetailsDialogSpec.js @@ -59,9 +59,7 @@ test('speed_grader_enabled sets speedgrader url', function() { equal(dialog.dialog.find('.more-details-link').length, 1) }) -test('speedGraderUrl excludes student id when Anonymous Moderated Marking is ' + -'enabled and the assignment is anonymously graded', function() { - this.options.anonymous_moderated_marking_enabled = true +test('speedGraderUrl excludes student id when assignment is anonymously graded', function() { this.assignment.anonymous_grading = true this.options.context_url = 'http://some-fake-url' const dialog = new SubmissionDetailsDialog(this.assignment, this.user, this.options) @@ -69,28 +67,7 @@ test('speedGraderUrl excludes student id when Anonymous Moderated Marking is ' + notOk(dialog.submission.speedGraderUrl.match(/student_id/)) }) -test('speedGraderUrl includes student id when Anonymous Moderated Marking is ' + -'enabled and the assignment is not anonymously graded', function() { - this.options.anonymous_moderated_marking_enabled = true - this.options.context_url = 'http://some-fake-url' - const dialog = new SubmissionDetailsDialog(this.assignment, this.user, this.options) - - ok(dialog.submission.speedGraderUrl.match(/student_id/)) -}) - -test('speedGraderUrl includes student id when Anonymous Moderated Marking is ' + -'disabled and the assignment is anonymously graded', function() { - this.options.anonymous_moderated_marking_enabled = false - this.assignment.anonymous_grading = true - this.options.context_url = 'http://some-fake-url' - const dialog = new SubmissionDetailsDialog(this.assignment, this.user, this.options) - - ok(dialog.submission.speedGraderUrl.match(/student_id/)) -}) - -test('speedGraderUrl includes student id when Anonymous Moderated Marking is ' + -'disabled and the assignment is not anonymously graded', function() { - this.options.anonymous_moderated_marking_enabled = false +test('speedGraderUrl includes student id when assignment is not anonymously graded', function() { this.options.context_url = 'http://some-fake-url' const dialog = new SubmissionDetailsDialog(this.assignment, this.user, this.options) diff --git a/spec/coffeescripts/jsx/assignments/ModerationHeaderSpec.js b/spec/coffeescripts/jsx/assignments/ModerationHeaderSpec.js index 831f317ad13..441e79ef2c5 100644 --- a/spec/coffeescripts/jsx/assignments/ModerationHeaderSpec.js +++ b/spec/coffeescripts/jsx/assignments/ModerationHeaderSpec.js @@ -25,7 +25,6 @@ import Header from 'jsx/assignments/ModerationHeader' QUnit.module('ModerationHeader', { setup() { this.props = { - anonymousModeratedMarkingEnabled: false, muted: false, onPublishClick() {}, onReviewClick() {}, @@ -153,7 +152,6 @@ QUnit.module('ModerationHeader#unmuteAssignmentButton', (hooks) => { hooks.beforeEach(() => { props = { - anonymousModeratedMarkingEnabled: true, muted: true, onPublishClick() {}, onReviewClick() {}, @@ -179,18 +177,11 @@ QUnit.module('ModerationHeader#unmuteAssignmentButton', (hooks) => { wrapper.unmount() }) - test('renders the unmute button if Anonymous Moderated Marking is enabled', () => { + test('renders the unmute button', () => { renderHeader() strictEqual(wrapper.find(unmuteButtonSelector).exists(), true) }) - test('does not render the unmute button if Anonymous Moderated Marking is not enabled', () => { - props.anonymousModeratedMarkingEnabled = false - - renderHeader() - strictEqual(wrapper.find(unmuteButtonSelector).exists(), false) - }) - test('enables the unmute button if the assignment is published and muted', () => { props.published = true props.muted = true diff --git a/spec/coffeescripts/models/AssignmentSpec.js b/spec/coffeescripts/models/AssignmentSpec.js index b8a93b46d61..c0ec617f77e 100644 --- a/spec/coffeescripts/models/AssignmentSpec.js +++ b/spec/coffeescripts/models/AssignmentSpec.js @@ -1199,7 +1199,6 @@ QUnit.module('Assignment#renderModeratedGradingFormFieldGroup', (hooks) => { hooks.beforeEach(() => { fakeENV.setup({ - ANONYMOUS_MODERATED_MARKING_ENABLED: false, AVAILABLE_MODERATORS: availableModerators, HAS_GRADED_SUBMISSIONS: false, LOCALE: 'en', diff --git a/spec/coffeescripts/speed_grader/SpeedgraderHelpersSpec.js b/spec/coffeescripts/speed_grader/SpeedgraderHelpersSpec.js index dd3298e5238..16d3fd751fe 100644 --- a/spec/coffeescripts/speed_grader/SpeedgraderHelpersSpec.js +++ b/spec/coffeescripts/speed_grader/SpeedgraderHelpersSpec.js @@ -18,7 +18,6 @@ import fakeENV from 'helpers/fakeENV' import SpeedgraderHelpers, { - isAnonymousModeratedMarkingEnabled, setupIsAnonymous, setupAnonymizableId } from 'speed_grader_helpers' @@ -36,10 +35,6 @@ QUnit.module('SpeedGrader', { } }) -test('isAnonymousModeratedMarkingEnabled is available on main object', () => { - strictEqual(SpeedgraderHelpers.isAnonymousModeratedMarkingEnabled, isAnonymousModeratedMarkingEnabled) -}) - test('setupIsAnonymous is available on main object', () => { strictEqual(SpeedgraderHelpers.setupIsAnonymous, setupIsAnonymous) }) @@ -441,56 +436,18 @@ test('Posts to the resubmit URL', () => { $.ajaxJSON = previousAjaxJson }) -QUnit.module('SpeedgraderHelpers.isAnonymousModeratedMarking', suiteHooks => { - suiteHooks.afterEach(() => { - fakeENV.teardown() - }) - - test('returns false when not set', () => { - delete ENV.anonymous_moderated_marking_enabled - strictEqual(isAnonymousModeratedMarkingEnabled(), false) - }) - - test('returns false when disabled', () => { - fakeENV.setup({anonymous_moderated_marking_enabled: false}) - strictEqual(isAnonymousModeratedMarkingEnabled(), false) - }) - - test('returns true when enabled', () => { - fakeENV.setup({anonymous_moderated_marking_enabled: true}) - strictEqual(isAnonymousModeratedMarkingEnabled(), true) - }) -}) - QUnit.module('SpeedgraderHelpers.setupIsAnonymous', suiteHooks => { suiteHooks.afterEach(() => { fakeENV.teardown() }) - test('returns true when assignment is anonymously graded and Anonymous Moderated Marking is enabled', () => { - fakeENV.setup({anonymous_moderated_marking_enabled: true}) + test('returns true when assignment is anonymously graded', () => { strictEqual(setupIsAnonymous({anonymous_grading: true}), true) }) - test('returns false when assignment is not anonymously graded and Anonymous Moderated Marking is enabled', () => { - fakeENV.setup({anonymous_moderated_marking_enabled: true}) + test('returns false when assignment is not anonymously graded', () => { strictEqual(setupIsAnonymous({anonymous_grading: false}), false) }) - - test('returns false when assignment is anonymously graded and Anonymous Moderated Marking is disabled', () => { - fakeENV.setup({anonymous_moderated_marking_enabled: false}) - strictEqual(setupIsAnonymous({anonymous_grading: true}), false) - }) - - test('returns false when assignment is not anonymously graded and Anonymous Moderated Marking is unset', () => { - delete ENV.anonymous_moderated_marking_enabled - strictEqual(setupIsAnonymous({anonymous_grading: false}), false) - }) - - test('returns false when assignment is anonymously graded and Anonymous Moderated Marking is unset', () => { - delete ENV.anonymous_moderated_marking_enabled - strictEqual(setupIsAnonymous({anonymous_grading: true}), false) - }) }) QUnit.module('SpeedgraderHelpers.setupAnonymizableId', suiteHooks => { diff --git a/spec/coffeescripts/views/assignments/EditViewSpec.js b/spec/coffeescripts/views/assignments/EditViewSpec.js index 9bf25fac397..d4253f907c1 100644 --- a/spec/coffeescripts/views/assignments/EditViewSpec.js +++ b/spec/coffeescripts/views/assignments/EditViewSpec.js @@ -149,16 +149,7 @@ test('rejects a letter for points_possible', function() { equal(errors.points_possible[0].message, 'Points possible must be a number') }) -test('does not validate presence of a final grader if anonymous moderated marking is disabled', function() { - const view = this.editView() - sinon.spy(view, 'validateFinalGrader') - view.validateBeforeSave({}, []) - strictEqual(view.validateFinalGrader.callCount, 0) - view.validateFinalGrader.restore() -}) - -test('validates presence of a final grader if anonymous moderated marking is enabled', function() { - ENV.ANONYMOUS_MODERATED_MARKING_ENABLED = true +test('validates presence of a final grader', function() { const view = this.editView() sinon.spy(view, 'validateFinalGrader') view.validateBeforeSave({}, []) @@ -166,16 +157,7 @@ test('validates presence of a final grader if anonymous moderated marking is ena view.validateFinalGrader.restore() }) -test('does not validate grader count if anonymous moderated marking is disabled', function() { - const view = this.editView() - sinon.spy(view, 'validateGraderCount') - view.validateBeforeSave({}, []) - strictEqual(view.validateGraderCount.callCount, 0) - view.validateGraderCount.restore() -}) - -test('validates grader count if anonymous moderated marking is enabled', function() { - ENV.ANONYMOUS_MODERATED_MARKING_ENABLED = true +test('validates grader count', function() { const view = this.editView() sinon.spy(view, 'validateGraderCount') view.validateBeforeSave({}, []) @@ -355,22 +337,6 @@ test('renders escaped angle brackets properly', function() { equal(view.$description.val().match(desc), desc) }) -test('allows changing moderation setting if no graded submissions exist', function() { - ENV.HAS_GRADED_SUBMISSIONS = false - const view = this.editView({has_submitted_submissions: true, moderated_grading: true}) - ok(view.$('[type=checkbox][name=moderated_grading]').prop('checked')) - notOk(view.$('[type=checkbox][name=moderated_grading]').prop('disabled')) - equal(view.$('[type=hidden][name=moderated_grading]').attr('value'), '0') -}) - -test('locks down moderation setting after students submit', function() { - ENV.HAS_GRADED_SUBMISSIONS = true - const view = this.editView({has_submitted_submissions: true, moderated_grading: true}) - ok(view.$('[type=checkbox][name=moderated_grading]').prop('checked')) - ok(view.$('[type=checkbox][name=moderated_grading]').prop('disabled')) - equal(view.$('[type=hidden][name=moderated_grading]').attr('value'), '1') -}) - test('routes to discussion details normally', function() { const view = this.editView({html_url: 'http://foo'}) equal(view.locationAfterSave({}), 'http://foo') @@ -1014,18 +980,11 @@ QUnit.module('EditView: Anonymous Moderated Marking', (hooks) => { fixtures.innerHTML = '' }) - test('adds the ModeratedGradingFormFieldGroup mount point when anonymous moderated marking is on', () => { - ENV.ANONYMOUS_MODERATED_MARKING_ENABLED = true + test('adds the ModeratedGradingFormFieldGroup mount point', () => { const view = editView() view.toJSON() strictEqual(view.$el.find('[data-component="ModeratedGradingFormFieldGroup"]').length, 1) }) - - test('does not add the ModeratedGradingFormFieldGroup mount point when anonymous moderated marking is off', () => { - const view = editView() - view.toJSON() - strictEqual(view.$el.find('[data-component="ModeratedGradingFormFieldGroup"]').length, 0) - }) }) QUnit.module('EditView#validateFinalGrader', (hooks) => { diff --git a/spec/controllers/anonymous_submissions_controller_spec.rb b/spec/controllers/anonymous_submissions_controller_spec.rb index c91d942f268..f78c2f29f82 100644 --- a/spec/controllers/anonymous_submissions_controller_spec.rb +++ b/spec/controllers/anonymous_submissions_controller_spec.rb @@ -25,7 +25,6 @@ RSpec.describe AnonymousSubmissionsController do before do course_with_student_and_submitted_homework @context = @course - @course.root_account.enable_feature!(:anonymous_moderated_marking) @assignment.update!(anonymous_grading: true) @submission.update!(score: 10) @assignment.unmute! diff --git a/spec/controllers/assignments_controller_spec.rb b/spec/controllers/assignments_controller_spec.rb index 0e331462128..8d18605e111 100644 --- a/spec/controllers/assignments_controller_spec.rb +++ b/spec/controllers/assignments_controller_spec.rb @@ -218,7 +218,7 @@ describe AssignmentsController do end describe "per-assignment permissions" do - let(:js_permissions) { assigns[:js_env][:PERMISSIONS] } + let(:assignment_permissions) { assigns[:js_env][:PERMISSIONS][:by_assignment_id] } before(:each) do @course.enable_feature!(:moderated_grading) @@ -230,39 +230,23 @@ describe AssignmentsController do ) user_session(@teacher) + ta_in_course(active_all: true) + + @noneditable_assignment = @course.assignments.create!( + moderated_grading: true, + grader_count: 2, + final_grader: @ta + ) end - context "when Anonymous Moderated Marking is on" do - let(:assignment_permissions) { assigns[:js_env][:PERMISSIONS][:by_assignment_id] } - - before(:once) do - @course.root_account.enable_feature!(:anonymous_moderated_marking) - - ta_in_course(active_all: true) - - @noneditable_assignment = @course.assignments.create!( - moderated_grading: true, - grader_count: 2, - final_grader: @ta - ) - end - - it "sets the 'update' attribute for an editable assignment to true" do - get 'index', params: {course_id: @course.id} - expect(assignment_permissions[@editable_assignment.id][:update]).to eq(true) - end - - it "sets the 'update' attribute for a non-editable assignment to false" do - get 'index', params: {course_id: @course.id} - expect(assignment_permissions[@noneditable_assignment.id][:update]).to eq(false) - end + it "sets the 'update' attribute for an editable assignment to true" do + get 'index', params: {course_id: @course.id} + expect(assignment_permissions[@editable_assignment.id][:update]).to eq(true) end - context "when Anonymous Moderated Marking is off" do - it "does not set permissions in js_env for individual assignments" do - get 'index', params: {course_id: @course.id} - expect(js_permissions).not_to include(:by_assignment_id) - end + it "sets the 'update' attribute for a non-editable assignment to false" do + get 'index', params: {course_id: @course.id} + expect(assignment_permissions[@noneditable_assignment.id][:update]).to eq(false) end end end @@ -270,202 +254,115 @@ describe AssignmentsController do describe "GET 'show_moderate'" do before(:each) do user_session(@teacher) - end - - let(:assignment) do - @course.assignments.create( - title: 'some assignment', - workflow_state: 'published', - moderated_grading: true + course_with_user('TeacherEnrollment', {active_all: true, course: @course}) + @other_teacher = @user + @assignment = @course.assignments.create!( + moderated_grading: true, + final_grader: @other_teacher, + grader_count: 2, + workflow_state: 'published' ) end - describe 'js_env for URLS' do - let(:urls) { assigns[:js_env][:URLS] } - - it 'sets student_submissions_url' do - get 'show_moderate', params: {course_id: @course.id, assignment_id: assignment.id} - expect(urls[:student_submissions_url]).to eq "http://test.host/api/v1/courses/#{@course.id}/assignments/#{assignment.id}/submissions?include[]=user_summary&include[]=provisional_grades" - end - - it 'sets provisional_grades_base_url' do - get 'show_moderate', params: {course_id: @course.id, assignment_id: assignment.id} - expect(urls[:provisional_grades_base_url]).to eq "http://test.host/api/v1/courses/#{@course.id}/assignments/#{assignment.id}/provisional_grades" - end - - it 'sets unmute_assignment_url' do - get 'show_moderate', params: {course_id: @course.id, assignment_id: assignment.id} - expect(urls[:unmute_assignment_url]).to eq "http://test.host/courses/#{@course.id}/assignments/#{assignment.id}/mute?status=false" - end + it "renders the page when the current user is the selected moderator" do + user_session(@other_teacher) + get 'show_moderate', params: {course_id: @course.id, assignment_id: @assignment.id} + assert_status(200) end - it "sets the js_env for ASSIGNMENT_TITLE" do - get 'show_moderate', params: {course_id: @course.id, assignment_id: assignment.id} - expect(assigns[:js_env][:ASSIGNMENT_TITLE]).to eq "some assignment" + it "renders unauthorized when the current user is not the selected moderator" do + user_session(@teacher) + get 'show_moderate', params: {course_id: @course.id, assignment_id: @assignment.id} + assert_unauthorized end - describe 'permissions' do - before(:once) do - @user = User.create! - @custom_role = @course.root_account.roles.create!(name: 'CustomRole', base_role_type: 'TaEnrollment') - @course.root_account.role_overrides.create!(permission: :moderate_grades, role: @custom_role, enabled: true) - @course.root_account.role_overrides.create!(permission: :view_all_grades, role: @custom_role, enabled: false) - @course.root_account.role_overrides.create!(permission: :manage_grades, role: @custom_role, enabled: false) - @course.enroll_user(@user, 'TaEnrollment', role: @custom_role, active_all: true) - @assignment = @course.assignments.create!(workflow_state: 'published', moderated_grading: true) - end - - before(:each) { user_session(@user) } - let(:permissions) { assigns[:js_env][:PERMISSIONS] } - - let(:allow_editing) do - override = @course.root_account.role_overrides.find_by(permission: 'manage_grades') - override.update!(enabled: true) - end - - let(:allow_viewing) do - override = @course.root_account.role_overrides.find_by(permission: 'view_all_grades') - override.update!(enabled: true) - end - - it 'grants the user view permissions if they have "View all grades" permissions in the course' do - allow_viewing - get :show_moderate, params: {course_id: @course, assignment_id: @assignment} - expect(permissions[:view_grades]).to eq true - end - - it 'grants the user view permissions if they have "Edit grades" permissions in the course' do - allow_editing - get :show_moderate, params: {course_id: @course, assignment_id: @assignment} - expect(permissions[:view_grades]).to eq true - end - - it 'denies the user view permissions if they lack both "View all grades" and "Edit grades" \ - permissions in the course' do - get :show_moderate, params: {course_id: @course, assignment_id: @assignment} - expect(permissions[:view_grades]).to eq false - end - - it 'grants the user edit permissions if they have "Edit grades" permissions in the course' do - allow_editing - get :show_moderate, params: {course_id: @course, assignment_id: @assignment} - expect(permissions[:edit_grades]).to eq true - end - - it 'denies the user edit permissions if they lack "Edit grades" permissions in the course' do - get :show_moderate, params: {course_id: @course, assignment_id: @assignment} - expect(permissions[:edit_grades]).to eq false - end + it "renders unauthorized when no moderator is selected and the user is not an admin" do + @assignment.update!(final_grader: nil) + user_session(@teacher) + get 'show_moderate', params: {course_id: @course.id, assignment_id: @assignment.id} + assert_status(401) end - context "when Anonymous Moderated Grading is enabled" do - before :once do - @course.root_account.enable_feature!(:anonymous_moderated_marking) + it "renders unauthorized when no moderator is selected and the user is an admin without " \ + "'Select Final Grade for Moderation' permission" do + @course.account.role_overrides.create!(role: admin_role, enabled: false, permission: :select_final_grade) + @assignment.update!(final_grader: nil) + user_session(account_admin_user) + get 'show_moderate', params: {course_id: @course.id, assignment_id: @assignment.id} + assert_status(401) + end + + it "renders the page when the current user is an admin and not the selected moderator" do + account_admin_user(account: @course.root_account) + user_session(@admin) + get 'show_moderate', params: {course_id: @course.id, assignment_id: @assignment.id} + assert_status(200) + end + + it "renders the page when no moderator is selected and the user is an admin with " \ + "'Select Final Grade for Moderation' permission" do + @assignment.update!(final_grader: nil) + user_session(account_admin_user) + get 'show_moderate', params: {course_id: @course.id, assignment_id: @assignment.id} + assert_status(200) + end + + describe "js_env" do + let_once(:grader_1) do course_with_user('TeacherEnrollment', {active_all: true, course: @course}) - @other_teacher = @user - @assignment = @course.assignments.create!( + @user + end + let_once(:grader_2) do + course_with_user('TeacherEnrollment', {active_all: true, course: @course}) + @user + end + + let(:env) { assigns[:js_env] } + + before :once do + @assignment.moderation_graders.create!(anonymous_id: "abcde", user: grader_1) + @assignment.moderation_graders.create!(anonymous_id: "fghij", user: grader_2) + end + + before :each do + @assignment.update_attributes( moderated_grading: true, final_grader: @other_teacher, - grader_count: 2, - workflow_state: 'published' + grader_count: 2 ) - end - - it "renders the page when the current user is the selected moderator" do user_session(@other_teacher) - get 'show_moderate', params: {course_id: @course.id, assignment_id: @assignment.id} - assert_status(200) end - it "renders unauthorized when the current user is not the selected moderator" do - user_session(@teacher) - get 'show_moderate', params: {course_id: @course.id, assignment_id: @assignment.id} - assert_unauthorized + it "includes ASSIGNMENT.course_id" do + get :show_moderate, params: {course_id: @course.id, assignment_id: @assignment.id} + expect(env[:ASSIGNMENT][:course_id]).to be(@course.id) end - it "renders unauthorized when no moderator is selected and the user is not an admin" do - @assignment.update!(final_grader: nil) - user_session(@teacher) - get 'show_moderate', params: {course_id: @course.id, assignment_id: @assignment.id} - assert_status(401) + it "includes ASSIGNMENT.id" do + get :show_moderate, params: {course_id: @course.id, assignment_id: @assignment.id} + expect(env[:ASSIGNMENT][:id]).to be(@assignment.id) end - it "renders unauthorized when no moderator is selected and the user is an admin without " \ - "'Select Final Grade for Moderation' permission" do - @course.account.role_overrides.create!(role: admin_role, enabled: false, permission: :select_final_grade) - @assignment.update!(final_grader: nil) - user_session(account_admin_user) - get 'show_moderate', params: {course_id: @course.id, assignment_id: @assignment.id} - assert_status(401) + it "includes ASSIGNMENT.grades_published" do + @assignment.update!(grades_published_at: 1.day.ago) + get :show_moderate, params: {course_id: @course.id, assignment_id: @assignment.id} + expect(env[:ASSIGNMENT][:grades_published]).to be(true) end - it "renders the page when the current user is an admin and not the selected moderator" do - account_admin_user(account: @course.root_account) - user_session(@admin) - get 'show_moderate', params: {course_id: @course.id, assignment_id: @assignment.id} - assert_status(200) + it "includes ASSIGNMENT.muted" do + get :show_moderate, params: {course_id: @course.id, assignment_id: @assignment.id} + expect(env[:ASSIGNMENT][:muted]).to be(true) end - it "renders the page when no moderator is selected and the user is an admin with " \ - "'Select Final Grade for Moderation' permission" do - @assignment.update!(final_grader: nil) - user_session(account_admin_user) - get 'show_moderate', params: {course_id: @course.id, assignment_id: @assignment.id} - assert_status(200) + it "includes ASSIGNMENT.title" do + get :show_moderate, params: {course_id: @course.id, assignment_id: @assignment.id} + expect(env[:ASSIGNMENT][:title]).to eql(@assignment.title) end - describe "js_env" do - let_once(:grader_1) do - course_with_user('TeacherEnrollment', {active_all: true, course: @course}) - @user - end - let_once(:grader_2) do - course_with_user('TeacherEnrollment', {active_all: true, course: @course}) - @user - end - - let(:env) { assigns[:js_env] } - - before :once do - @assignment.moderation_graders.create!(anonymous_id: "abcde", user: grader_1) - @assignment.moderation_graders.create!(anonymous_id: "fghij", user: grader_2) - end - - before :each do - user_session(@other_teacher) - end - - it "includes ASSIGNMENT.course_id" do - get :show_moderate, params: {course_id: @course.id, assignment_id: @assignment.id} - expect(env[:ASSIGNMENT][:course_id]).to be(@course.id) - end - - it "includes ASSIGNMENT.id" do - get :show_moderate, params: {course_id: @course.id, assignment_id: @assignment.id} - expect(env[:ASSIGNMENT][:id]).to be(@assignment.id) - end - - it "includes ASSIGNMENT.grades_published" do - @assignment.update!(grades_published_at: 1.day.ago) - get :show_moderate, params: {course_id: @course.id, assignment_id: @assignment.id} - expect(env[:ASSIGNMENT][:grades_published]).to be(true) - end - - it "includes ASSIGNMENT.muted" do - get :show_moderate, params: {course_id: @course.id, assignment_id: @assignment.id} - expect(env[:ASSIGNMENT][:muted]).to be(true) - end - - it "includes ASSIGNMENT.title" do - get :show_moderate, params: {course_id: @course.id, assignment_id: @assignment.id} - expect(env[:ASSIGNMENT][:title]).to eql(@assignment.title) - end - - it "includes moderation graders in GRADERS" do - get :show_moderate, params: {course_id: @course.id, assignment_id: @assignment.id} - moderation_grader_ids = @assignment.moderation_graders.map(&:id) - expect(env[:GRADERS].map {|grader| grader[:id]}).to match_array(moderation_grader_ids) - end + it "includes moderation graders in GRADERS" do + get :show_moderate, params: {course_id: @course.id, assignment_id: @assignment.id} + moderation_grader_ids = @assignment.moderation_graders.map(&:id) + expect(env[:GRADERS].map {|grader| grader[:id]}).to match_array(moderation_grader_ids) end end end @@ -719,18 +616,17 @@ describe AssignmentsController do user_session(@teacher) end - context "with anonymous moderated marking enabled and moderated grading on" do + context "with moderated grading on" do before :each do - @course.account.enable_feature!(:anonymous_moderated_marking) @assignment.update!(moderated_grading: true, grader_count: 1) end - it "should fail if anonymous_moderated_marking is enabled, grades are not published, and status is false" do + it "should fail if grades are not published, and status is false" do put 'toggle_mute', params: { course_id: @course.id, assignment_id: @assignment.id, status: false }, format: 'json' assert_unauthorized end - it "should mute if anonymous_moderated_marking is enabled, grades are not published, and status is true" do + it "should mute if grades are not published, and status is true" do @assignment.update!(muted: false) put 'toggle_mute', params: { course_id: @course.id, assignment_id: @assignment.id, status: true }, format: 'json' @assignment.reload @@ -893,7 +789,7 @@ describe AssignmentsController do let(:request_params) { [:edit, params: {course_id: course, id: @assignment}] } end - shared_examples 'course feature flag made available by Anonymous Moderated Marking account flag' do + shared_examples 'course feature flags for Anonymous Moderated Marking' do before(:each) do user_session(@teacher) end @@ -904,30 +800,11 @@ describe AssignmentsController do expect(assigns[:js_env][js_env_attribute]).to be false end - it 'is false when the feature flag is enabled' do + it 'is true when the feature flag is enabled' do @course.enable_feature!(feature_flag) get 'edit', params: { course_id: @course.id, id: @assignment.id } - expect(assigns[:js_env][js_env_attribute]).to be false - end - - context 'when Anonymous Moderated Marking is enabled' do - before(:once) do - @course.account.enable_feature!(:anonymous_moderated_marking) - end - - it 'is false when the feature flag is not enabled' do - get 'edit', params: { course_id: @course.id, id: @assignment.id } - - expect(assigns[:js_env][js_env_attribute]).to be false - end - - it 'is true when the feature flag is enabled' do - @course.enable_feature!(feature_flag) - get 'edit', params: { course_id: @course.id, id: @assignment.id } - - expect(assigns[:js_env][js_env_attribute]).to be true - end + expect(assigns[:js_env][js_env_attribute]).to be true end end @@ -983,26 +860,8 @@ describe AssignmentsController do expect(assigns[:js_env][:SIS_NAME]).to eq('Foo Bar') end - describe 'js_env ANONYMOUS_MODERATED_MARKING_ENABLED' do - before(:each) do - user_session(@teacher) - end - - it 'is true when the root account has Anonymous Moderated Marking enabled' do - @course.root_account.enable_feature!(:anonymous_moderated_marking) - get :edit, params: { course_id: @course.id, id: @assignment.id } - expect(assigns[:js_env][:ANONYMOUS_MODERATED_MARKING_ENABLED]).to be true - end - - it 'is false when the root account does not have Anonymous Moderated Marking enabled' do - get :edit, params: { course_id: @course.id, id: @assignment.id } - expect(assigns[:js_env][:ANONYMOUS_MODERATED_MARKING_ENABLED]).to be false - end - end - it 'js_env AVAILABLE_MODERATORS includes the name and id for each available moderator' do user_session(@teacher) - @course.root_account.enable_feature!(:anonymous_moderated_marking) @assignment.update!(grader_count: 2, moderated_grading: true) get :edit, params: { course_id: @course.id, id: @assignment.id } expected_moderators = @course.instructors.map { |user| { name: user.name, id: user.id } } @@ -1111,14 +970,14 @@ describe AssignmentsController do end describe 'js_env ANONYMOUS_GRADING_ENABLED' do - it_behaves_like 'course feature flag made available by Anonymous Moderated Marking account flag' do + it_behaves_like 'course feature flags for Anonymous Moderated Marking' do let(:js_env_attribute) { :ANONYMOUS_GRADING_ENABLED } let(:feature_flag) { :anonymous_marking } end end describe 'js_env MODERATED_GRADING_ENABLED' do - it_behaves_like 'course feature flag made available by Anonymous Moderated Marking account flag' do + it_behaves_like 'course feature flags for Anonymous Moderated Marking' do let(:js_env_attribute) { :MODERATED_GRADING_ENABLED } let(:feature_flag) { :moderated_grading } end diff --git a/spec/controllers/canvadoc_sessions_controller_spec.rb b/spec/controllers/canvadoc_sessions_controller_spec.rb index cf1fbd4659e..8ef1bb800b1 100644 --- a/spec/controllers/canvadoc_sessions_controller_spec.rb +++ b/spec/controllers/canvadoc_sessions_controller_spec.rb @@ -203,9 +203,7 @@ describe CanvadocSessionsController do end let(:hmac) { Canvas::Security.hmac_sha1(blob.to_json) } - it "disables submission annotations for an anonymously-graded assignment " \ - "when Anonymous Moderated Marking is enabled" do - @course.root_account.enable_feature!(:anonymous_moderated_marking) + it "disables submission annotations for an anonymously-graded assignment" do @assignment.update!(anonymous_grading: true) # The controller fetches different instances of the model objects we're # working with here, so unfortunately we can't mock them specifically. @@ -215,9 +213,8 @@ describe CanvadocSessionsController do get :show, params: {blob: blob.to_json, hmac: hmac} end - it "enables submission annotations for an anonymously-graded assignment " \ - "when Anonymous Moderated Marking is disabled" do - @assignment.update!(anonymous_grading: true) + it "enables submission annotations for a non-anonymously-graded assignment" do + @assignment.update!(anonymous_grading: false) # The controller fetches different instances of the model objects we're # working with here, so unfortunately we can't mock them specifically. expect_any_instance_of(Canvadoc).to receive(:session_url). diff --git a/spec/controllers/courses_controller_spec.rb b/spec/controllers/courses_controller_spec.rb index 378a6f5105f..e1ca5300398 100644 --- a/spec/controllers/courses_controller_spec.rb +++ b/spec/controllers/courses_controller_spec.rb @@ -488,38 +488,25 @@ describe CoursesController do grader_count: 2, final_grader: @teacher ) + + ta_in_course(active_all: true) + @uneditable_assignment = @course.assignments.create!( + moderated_grading: true, + grader_count: 2, + final_grader: @ta + ) end - context "when Anonymous Moderated Marking is on" do - let(:assignment_permissions) { assigns[:js_env][:PERMISSIONS][:by_assignment_id] } + let(:assignment_permissions) { assigns[:js_env][:PERMISSIONS][:by_assignment_id] } - before(:each) do - @course.root_account.enable_feature!(:anonymous_moderated_marking) - - ta_in_course(active_all: true) - @uneditable_assignment = @course.assignments.create!( - moderated_grading: true, - grader_count: 2, - final_grader: @ta - ) - end - - it "sets the 'update' attribute for an editable assignment to true" do - get 'show', params: {id: @course.id} - expect(assignment_permissions[@editable_assignment.id][:update]).to eq(true) - end - - it "sets the 'update' attribute for an uneditable assignment to false" do - get 'show', params: {id: @course.id} - expect(assignment_permissions[@uneditable_assignment.id][:update]).to eq(false) - end + it "sets the 'update' attribute for an editable assignment to true" do + get 'show', params: {id: @course.id} + expect(assignment_permissions[@editable_assignment.id][:update]).to eq(true) end - context "when Anonymous Moderated Marking is off" do - it "does not set permissions in js_env for individual assignments" do - get 'show', params: {id: @course.id} - expect(js_permissions).not_to include(:by_assignment_id) - end + it "sets the 'update' attribute for an uneditable assignment to false" do + get 'show', params: {id: @course.id} + expect(assignment_permissions[@uneditable_assignment.id][:update]).to eq(false) end end end @@ -2378,11 +2365,11 @@ describe CoursesController do user_session(@teacher) post 'student_view', params: {course_id: @course.id} test_student = @course.student_view_student - assignment = @course.assignments.create!(:workflow_state => 'published', :moderated_grading => true) + assignment = @course.assignments.create!(workflow_state: 'published', moderated_grading: true, grader_count: 2) assignment.grade_student test_student, { :grade => 1, :grader => @teacher, :provisional => true } file = assignment.attachments.create! uploaded_data: default_uploaded_data assignment.submissions.first.add_comment(commenter: @teacher, message: 'blah', provisional: true, attachments: [file]) - assignment.moderated_grading_selections.create!(:student => test_student, :provisional_grade => ModeratedGrading::ProvisionalGrade.last) + assignment.moderated_grading_selections.where(student: test_student).first.update_attribute(:provisional_grade, ModeratedGrading::ProvisionalGrade.last) expect(test_student.submissions.size).not_to be_zero delete 'reset_test_student', params: {course_id: @course.id} diff --git a/spec/controllers/gradebooks_controller_spec.rb b/spec/controllers/gradebooks_controller_spec.rb index 697261e037f..fab92c1f2b9 100644 --- a/spec/controllers/gradebooks_controller_spec.rb +++ b/spec/controllers/gradebooks_controller_spec.rb @@ -741,19 +741,6 @@ describe GradebooksController do end end - it "includes anonymous_moderated_marking_enabled for Old Gradebook" do - @course.root_account.enable_feature!(:anonymous_moderated_marking) - get :show, params: { course_id: @course.id } - expect(gradebook_options.fetch(:anonymous_moderated_marking_enabled)).to eq(true) - end - - it "includes anonymous_moderated_marking_enabled for New Gradebook" do - @course.enable_feature!(:new_gradebook) - @course.root_account.enable_feature!(:anonymous_moderated_marking) - get :show, params: { course_id: @course.id } - expect(gradebook_options.fetch(:anonymous_moderated_marking_enabled)).to eq(true) - end - it "includes colors if New Gradebook is enabled" do @course.enable_feature!(:new_gradebook) get :show, params: {course_id: @course.id} @@ -1285,10 +1272,6 @@ describe GradebooksController do end describe 'anonymous assignment' do - before :once do - @course.root_account.enable_feature!(:anonymous_moderated_marking) - end - it 'works with the absense of user_id and the presence of anonymous_id' do user_session(@teacher) @assignment.update!(anonymous_grading: true) @@ -1413,7 +1396,7 @@ describe GradebooksController do context "moderated grading" do before :once do - @assignment = @course.assignments.create!(:title => "some assignment", :moderated_grading => true) + @assignment = @course.assignments.create!(title: "some assignment", moderated_grading: true, grader_count: 1) @student = @course.enroll_student(User.create!(:name => "some user"), :enrollment_state => :active).user end @@ -1483,16 +1466,16 @@ describe GradebooksController do expect(pg.graded_anonymously).to eq false end - it "doesn't create a provisional grade when the student has one already (and isn't in the moderation set)" do - submission = @assignment.submit_homework(@student, :body => "hello") + it "doesn't create a provisional grade when the student has one already" do + @assignment.submit_homework(@student, :body => "hello") other_teacher = teacher_in_course(:course => @course, :active_all => true).user - submission.find_or_create_provisional_grade!(other_teacher) + @assignment.grade_student(@student, grade: 2, grader: other_teacher, provisional: true) post 'update_submission', params: {:course_id => @course.id, :submission => { :score => 100, :comment => "provisional!", :assignment_id => @assignment.id, :user_id => @student.id, :provisional => true }}, :format => :json expect(response).to_not be_success - expect(response.body).to include("Student already has the maximum number of provisional grades") + expect(response.body).to include("The maximum number of graders has been reached for this assignment") end it "should create a provisional grade even if the student has one but is in the moderation set" do @@ -1500,8 +1483,6 @@ describe GradebooksController do other_teacher = teacher_in_course(:course => @course, :active_all => true).user submission.find_or_create_provisional_grade!(other_teacher) - @assignment.moderated_grading_selections.create!(:student => @student) - post 'update_submission', params: {:course_id => @course.id, :submission => { :score => 100, :comment => "provisional!", :assignment_id => @assignment.id, :user_id => @student.id, :provisional => true }}, :format => :json @@ -1547,11 +1528,10 @@ describe GradebooksController do end end - describe 'provisional grade error handling for Anonymous Moderated Marking' do + describe 'provisional grade error handling' do before(:once) do course_with_student(active_all: true) teacher_in_course(active_all: true) - @course.root_account.enable_feature!(:anonymous_moderated_marking) @assignment = @course.assignments.create!( title: 'yet another assignment', @@ -1653,20 +1633,14 @@ describe GradebooksController do expect(assigns[:disable_unmute_assignment]).to eq false end - it 'sets disable_unmute_assignment to false if anonymous moderated marking is disabled' do - get 'speed_grader', params: {course_id: @course, assignment_id: @assignment.id} - expect(assigns[:disable_unmute_assignment]).to eq false - end - it 'sets disable_unmute_assignment to false if assignment grades have been published' do @assignment.update!(grades_published_at: Time.zone.now) get 'speed_grader', params: {course_id: @course, assignment_id: @assignment.id} expect(assigns[:disable_unmute_assignment]).to eq false end - it 'sets disable_unmute_assignment to true if assignment muted, anonymous moderated marking enabled, and grades not published' do + it 'sets disable_unmute_assignment to true if assignment muted and grades not published' do @assignment.update!(muted: true, grades_published_at: nil, moderated_grading: true, grader_count: 1) - @assignment.root_account.enable_feature!(:anonymous_moderated_marking) get 'speed_grader', params: {course_id: @course, assignment_id: @assignment.id} expect(assigns[:disable_unmute_assignment]).to eq true end diff --git a/spec/controllers/submissions_controller_spec.rb b/spec/controllers/submissions_controller_spec.rb index f957b573e7b..e32794fa346 100644 --- a/spec/controllers/submissions_controller_spec.rb +++ b/spec/controllers/submissions_controller_spec.rb @@ -543,47 +543,41 @@ describe SubmissionsController do expect(body['published_score']).to be nil end - context "for an assignment that has anonymous grading and muted with anonymous_moderated_marking enabled" do - before :each do - @assignment.root_account.enable_feature!(:anonymous_moderated_marking) - end + it "renders the page for submitting student" do + user_session(@student) + @assignment.update!(anonymous_grading: true, muted: true) + get :show, params: {course_id: @context.id, assignment_id: @assignment.id, id: @student.id} + assert_status(200) + end - it "renders the page for submitting student" do - user_session(@student) - @assignment.update!(anonymous_grading: true, muted: true) - get :show, params: {course_id: @context.id, assignment_id: @assignment.id, id: @student.id} - assert_status(200) - end + it "renders unauthorized for non-submitting student" do + new_student = User.create! + @context.enroll_student(new_student, enrollment_state: 'active') + user_session(new_student) + @assignment.update!(anonymous_grading: true, muted: true) + get :show, params: {course_id: @context.id, assignment_id: @assignment.id, id: @student.id} + assert_unauthorized + end - it "renders unauthorized for non-submitting student" do - new_student = User.create! - @context.enroll_student(new_student, enrollment_state: 'active') - user_session(new_student) - @assignment.update!(anonymous_grading: true, muted: true) - get :show, params: {course_id: @context.id, assignment_id: @assignment.id, id: @student.id} - assert_unauthorized - end + it "renders unauthorized for teacher" do + user_session(@teacher) + @assignment.update!(anonymous_grading: true, muted: true) + get :show, params: {course_id: @context.id, assignment_id: @assignment.id, id: @student.id} + assert_unauthorized + end - it "renders unauthorized for teacher" do - user_session(@teacher) - @assignment.update!(anonymous_grading: true, muted: true) - get :show, params: {course_id: @context.id, assignment_id: @assignment.id, id: @student.id} - assert_unauthorized - end + it "renders unauthorized for admin" do + user_session(account_admin_user) + @assignment.update!(anonymous_grading: true, muted: true) + get :show, params: {course_id: @context.id, assignment_id: @assignment.id, id: @student.id} + assert_unauthorized + end - it "renders unauthorized for admin" do - user_session(account_admin_user) - @assignment.update!(anonymous_grading: true, muted: true) - get :show, params: {course_id: @context.id, assignment_id: @assignment.id, id: @student.id} - assert_unauthorized - end - - it "renders the page for site admin" do - user_session(site_admin_user) - @assignment.update!(anonymous_grading: true, muted: true) - get :show, params: {course_id: @context.id, assignment_id: @assignment.id, id: @student.id} - assert_status(200) - end + it "renders the page for site admin" do + user_session(site_admin_user) + @assignment.update!(anonymous_grading: true, muted: true) + get :show, params: {course_id: @context.id, assignment_id: @assignment.id, id: @student.id} + assert_status(200) end context "with user id not present in course" do diff --git a/spec/helpers/gradebooks_helper_spec.rb b/spec/helpers/gradebooks_helper_spec.rb index fcd7f486030..7483760a490 100644 --- a/spec/helpers/gradebooks_helper_spec.rb +++ b/spec/helpers/gradebooks_helper_spec.rb @@ -56,44 +56,6 @@ describe GradebooksHelper do end end - describe '#anonymous_grading_required?' do - it 'returns false by default' do - assignment = assignment_model - expect(helper.anonymous_grading_required?(assignment)).to eq false - end - - it 'returns true if course setting is on' do - assignment = assignment_model - assignment.context.enable_feature!(:anonymous_grading) - expect(helper.anonymous_grading_required?(assignment)).to eq true - end - - it 'returns true if sub-account setting is on' do - root_account = Account.default - sub_account = root_account.sub_accounts.create! - sub_account.enable_feature!(:anonymous_grading) - sub_account_course = course_model(account: sub_account) - assignment = assignment_model(course: sub_account_course) - expect(helper.anonymous_grading_required?(assignment)).to eq true - end - - it 'returns true if root account setting is on' do - root_account = Account.default - root_account.enable_feature!(:anonymous_grading) - sub_account = root_account.sub_accounts.create! - sub_account_course = course_model(account: sub_account) - assignment = assignment_model(course: sub_account_course) - expect(helper.anonymous_grading_required?(assignment)).to eq true - end - - it 'returns true if site admin setting is on' do - site_admin_account = Account.site_admin - site_admin_account.enable_feature!(:anonymous_grading) - assignment = assignment_model - expect(helper.anonymous_grading_required?(assignment)).to eq true - end - end - describe '#force_anonymous_grading?' do it 'returns false by default' do expect(helper.force_anonymous_grading?(assignment_model)).to eq false @@ -104,26 +66,15 @@ describe GradebooksHelper do expect(helper.force_anonymous_grading?(assignment)).to eq true end - it 'returns true if anonymous grading flag set' do - Account.default.enable_feature!(:anonymous_grading) - expect(helper.force_anonymous_grading?(assignment_model)).to eq true + it 'returns true for an anonymously-graded assignment' do + assignment = assignment_model + assignment.anonymous_grading = true + expect(helper.force_anonymous_grading?(assignment)).to eq true end - context 'when Anonymous Moderated Marking is enabled' do - before(:once) do - Account.default.enable_feature!(:anonymous_moderated_marking) - end - - it 'returns true for an anonymously-graded assignment' do - assignment = assignment_model - assignment.anonymous_grading = true - expect(helper.force_anonymous_grading?(assignment)).to eq true - end - - it 'returns false for a non-anonymously-graded assignment' do - assignment = assignment_model - expect(helper.force_anonymous_grading?(assignment)).to eq false - end + it 'returns false for a non-anonymously-graded assignment' do + assignment = assignment_model + expect(helper.force_anonymous_grading?(assignment)).to eq false end end @@ -138,8 +89,9 @@ describe GradebooksHelper do end it 'returns anonymous grading' do - Account.default.enable_feature!(:anonymous_grading) - expect(helper.force_anonymous_grading_reason(assignment_model)).to match(/anonymous grading/) + assignment = assignment_model + assignment.anonymous_grading = true + expect(helper.force_anonymous_grading_reason(assignment)).to match(/anonymous grading/) end end diff --git a/spec/integration/assignments_spec.rb b/spec/integration/assignments_spec.rb index c76a8a40b06..d71843e8bc5 100644 --- a/spec/integration/assignments_spec.rb +++ b/spec/integration/assignments_spec.rb @@ -309,7 +309,7 @@ describe "ratio of submissions graded" do let(:moderate_button) { Nokogiri::HTML(response.body).at_css('#moderated_grading_button') } it 'shows the moderation link for moderated assignments' do - @assignment.update!(moderated_grading: true) + @assignment.update!(moderated_grading: true, grader_count: 1, final_grader: @teacher) get "/courses/#{@course.id}/assignments/#{@assignment.id}" expect(moderate_button).not_to be_nil diff --git a/spec/javascripts/jsx/gradebook/SubmissionStateMapGradeVisibilitySpec.js b/spec/javascripts/jsx/gradebook/SubmissionStateMapGradeVisibilitySpec.js index 34bdd3ab667..ffe4a21f4df 100644 --- a/spec/javascripts/jsx/gradebook/SubmissionStateMapGradeVisibilitySpec.js +++ b/spec/javascripts/jsx/gradebook/SubmissionStateMapGradeVisibilitySpec.js @@ -50,25 +50,25 @@ define([ // time this is being written a significant amount of work is needed // to be able to require javascript files that live in the spec directory - QUnit.module('SubmissionStateMap with anonymous moderated marking enabled'); + QUnit.module('SubmissionStateMap'); test ('submission has grade visible if not anonymous', function() { const assignment = { id: '1', muted: true }; - const map = createAndSetupMap(assignment, { anonymousModeratedMarkingEnabled: true }); + const map = createAndSetupMap(assignment); const state = map.getSubmissionState({ user_id: student.id, assignment_id: assignment.id }); strictEqual(state.hideGrade, false); }); test ('submission has grade visible if not muted', function() { const assignment = { id: '1', anonymous_grading: true }; - const map = createAndSetupMap(assignment, { anonymousModeratedMarkingEnabled: true }); + const map = createAndSetupMap(assignment); const state = map.getSubmissionState({ user_id: student.id, assignment_id: assignment.id }); strictEqual(state.hideGrade, false); }); test ('submission has grade hidden if anonymous and muted', function() { const assignment = { id: '1', anonymous_grading: true, muted: true }; - const map = createAndSetupMap(assignment, { anonymousModeratedMarkingEnabled: true }); + const map = createAndSetupMap(assignment); const state = map.getSubmissionState({ user_id: student.id, assignment_id: assignment.id }); strictEqual(state.hideGrade, true); }); diff --git a/spec/javascripts/jsx/gradebook/SubmissionStateMapLockingSpec.js b/spec/javascripts/jsx/gradebook/SubmissionStateMapLockingSpec.js index bbf0f3433b5..f4b84c91bdd 100644 --- a/spec/javascripts/jsx/gradebook/SubmissionStateMapLockingSpec.js +++ b/spec/javascripts/jsx/gradebook/SubmissionStateMapLockingSpec.js @@ -50,25 +50,25 @@ define([ // time this is being written a significant amount of work is needed // to be able to require javascript files that live in the spec directory - QUnit.module('SubmissionStateMap with anonymous moderated marking enabled'); + QUnit.module('SubmissionStateMap'); test ('submission is unlocked if not anonymous', function() { const assignment = { id: '1', muted: true }; - const map = createAndSetupMap(assignment, { anonymousModeratedMarkingEnabled: true }); + const map = createAndSetupMap(assignment); const state = map.getSubmissionState({ user_id: student.id, assignment_id: assignment.id }); strictEqual(state.locked, false); }); test ('submission is unlocked if not muted', function() { const assignment = { id: '1', anonymous_grading: true }; - const map = createAndSetupMap(assignment, { anonymousModeratedMarkingEnabled: true }); + const map = createAndSetupMap(assignment); const state = map.getSubmissionState({ user_id: student.id, assignment_id: assignment.id }); strictEqual(state.locked, false); }); test ('submission is locked if anonymous and muted', function() { const assignment = { id: '1', anonymous_grading: true, muted: true }; - const map = createAndSetupMap(assignment, { anonymousModeratedMarkingEnabled: true }); + const map = createAndSetupMap(assignment); const state = map.getSubmissionState({ user_id: student.id, assignment_id: assignment.id }); strictEqual(state.locked, true); }); diff --git a/spec/javascripts/jsx/gradezilla/GradebookSpec.js b/spec/javascripts/jsx/gradezilla/GradebookSpec.js index ac2e1388ed2..eb774097bce 100644 --- a/spec/javascripts/jsx/gradezilla/GradebookSpec.js +++ b/spec/javascripts/jsx/gradezilla/GradebookSpec.js @@ -6198,18 +6198,6 @@ test('sets the submission state map .isAdmin when the current user roles do not strictEqual(gradebook.submissionStateMap.isAdmin, false); }); -test('sets submission state map .anonymousModeratedMarkingEnabled when anonymous moderated marking flag is set', function () { - const gradebook = createGradebook({ anonymous_moderated_marking_enabled: true }); - gradebook.initSubmissionStateMap(); - strictEqual(gradebook.submissionStateMap.anonymousModeratedMarkingEnabled, true); -}); - -test('sets submission state map .anonymousModeratedMarkingEnabled to false when anonymous moderated marking flag is reset', function () { - const gradebook = createGradebook({ anonymous_moderated_marking_enabled: false }); - gradebook.initSubmissionStateMap(); - strictEqual(gradebook.submissionStateMap.anonymousModeratedMarkingEnabled, false); -}); - QUnit.module('Gradebook#initPostGradesLtis'); test('sets postGradesLtis as an array', function () { @@ -6973,19 +6961,6 @@ QUnit.module('Gradebook#getSubmissionTrayProps', function(suiteHooks) { moxios.uninstall(); }); - test('anonymousModeratedMarkingEnabled is true when options.anonymous_moderated_marking_enabled is true', function () { - gradebook.options.anonymous_moderated_marking_enabled = true - gradebook.setSubmissionTrayState(true, '1101', '2301'); - const props = gradebook.getSubmissionTrayProps(gradebook.student('1101')); - strictEqual(props.anonymousModeratedMarkingEnabled, true); - }); - - test('anonymousModeratedMarkingEnabled is false when options.anonymous_moderated_marking_enabled is false', function () { - gradebook.setSubmissionTrayState(true, '1101', '2301'); - const props = gradebook.getSubmissionTrayProps(gradebook.student('1101')); - strictEqual(props.anonymousModeratedMarkingEnabled, false); - }); - test('gradingDisabled is true when the submission state is locked', function () { sinon.stub(gradebook.submissionStateMap, 'getSubmissionState').returns({ locked: true }); gradebook.setSubmissionTrayState(true, '1101', '2301'); diff --git a/spec/javascripts/jsx/gradezilla/SubmissionStateMapSpec.js b/spec/javascripts/jsx/gradezilla/SubmissionStateMapSpec.js index 60f898c7bd9..c40f535d578 100644 --- a/spec/javascripts/jsx/gradezilla/SubmissionStateMapSpec.js +++ b/spec/javascripts/jsx/gradezilla/SubmissionStateMapSpec.js @@ -39,8 +39,7 @@ function createMap (opts = {}) { const defaults = { hasGradingPeriods: false, selectedGradingPeriodID: '0', - isAdmin: false, - anonymousModeratedMarkingEnabled: false + isAdmin: false }; const params = { ...defaults, ...opts }; @@ -122,123 +121,121 @@ QUnit.module('#setSubmissionCellState', function() { strictEqual(submission.hideGrade, false); }); - QUnit.module('anonymous moderated marking enabled', function() { - test('the submission state is locked when the student is not assigned', function() { - const assignment = { - id: '1', - published: true, - only_visible_to_overrides: true, - assignment_visibility: ['2'] - } - const map = createAndSetupMap(assignment, studentWithSubmission, { anonymousModeratedMarkingEnabled: true }) + test('the submission state is locked when the student is not assigned', function() { + const assignment = { + id: '1', + published: true, + only_visible_to_overrides: true, + assignment_visibility: ['2'] + } + const map = createAndSetupMap(assignment, studentWithSubmission) + const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }) + strictEqual(submission.locked, true) + }) + + test('the submission state is not locked if not moderated grading', function() { + const assignment = { + id: '1', + published: true, + moderated_grading: false + }; + const map = createAndSetupMap(assignment, studentWithSubmission); + const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }); + strictEqual(submission.locked, false); + }); + + test('the submission state has hideGrade not set if not moderated grading', function() { + const assignment = { + id: '1', + published: true, + moderated_grading: false + }; + const map = createAndSetupMap(assignment, studentWithSubmission); + const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }); + strictEqual(submission.hideGrade, false); + }); + + test('the submission state is not locked if moderated grading and grades published', function() { + const assignment = { + id: '1', + published: true, + moderated_grading: true, + grades_published: true + }; + const map = createAndSetupMap(assignment, studentWithSubmission); + const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }); + strictEqual(submission.locked, false); + }); + + test('the submission state has hideGrade not set if moderated grading and grades published', function() { + const assignment = { + id: '1', + published: true, + moderated_grading: true, + grades_published: true + }; + const map = createAndSetupMap(assignment, studentWithSubmission); + const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }); + strictEqual(submission.hideGrade, false); + }); + + test('the submission state is locked if moderated grading and grades not published', function() { + const assignment = { + id: '1', + published: true, + moderated_grading: true, + grades_published: false + }; + const map = createAndSetupMap(assignment, studentWithSubmission); + const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }); + strictEqual(submission.locked, true); + }); + + test('the submission state has hideGrade not set if moderated grading and grades not published', function() { + const assignment = { + id: '1', + published: true, + moderated_grading: true, + grades_published: false + }; + const map = createAndSetupMap(assignment, studentWithSubmission); + const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }); + strictEqual(submission.hideGrade, false); + }); + + QUnit.module('when the assignment is anonymous', function(hooks) { + let assignment + + hooks.beforeEach(() => { + assignment = { id: '1', published: true, anonymous_grading: true } + }) + + test('the submission state is locked when the assignment is muted', function() { + assignment.muted = true + const map = createAndSetupMap(assignment, studentWithSubmission) const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }) strictEqual(submission.locked, true) }) - test('the submission state is not locked if not moderated grading', function() { - const assignment = { - id: '1', - published: true, - moderated_grading: false - }; - const map = createAndSetupMap(assignment, studentWithSubmission, { anonymousModeratedMarkingEnabled: true }); - const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }); - strictEqual(submission.locked, false); - }); - - test('the submission state has hideGrade not set if not moderated grading', function() { - const assignment = { - id: '1', - published: true, - moderated_grading: false - }; - const map = createAndSetupMap(assignment, studentWithSubmission, { anonymousModeratedMarkingEnabled: true }); - const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }); - strictEqual(submission.hideGrade, false); - }); - - test('the submission state is not locked if moderated grading and grades published', function() { - const assignment = { - id: '1', - published: true, - moderated_grading: true, - grades_published: true - }; - const map = createAndSetupMap(assignment, studentWithSubmission, { anonymousModeratedMarkingEnabled: true }); - const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }); - strictEqual(submission.locked, false); - }); - - test('the submission state has hideGrade not set if moderated grading and grades published', function() { - const assignment = { - id: '1', - published: true, - moderated_grading: true, - grades_published: true - }; - const map = createAndSetupMap(assignment, studentWithSubmission, { anonymousModeratedMarkingEnabled: true }); - const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }); - strictEqual(submission.hideGrade, false); - }); - - test('the submission state is locked if moderated grading and grades not published', function() { - const assignment = { - id: '1', - published: true, - moderated_grading: true, - grades_published: false - }; - const map = createAndSetupMap(assignment, studentWithSubmission, { anonymousModeratedMarkingEnabled: true }); - const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }); - strictEqual(submission.locked, true); - }); - - test('the submission state has hideGrade not set if moderated grading and grades not published', function() { - const assignment = { - id: '1', - published: true, - moderated_grading: true, - grades_published: false - }; - const map = createAndSetupMap(assignment, studentWithSubmission, { anonymousModeratedMarkingEnabled: true }); - const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }); - strictEqual(submission.hideGrade, false); - }); - - QUnit.module('when the assignment is anonymous', function(hooks) { - let assignment - - hooks.beforeEach(() => { - assignment = { id: '1', published: true, anonymous_grading: true } - }) - - test('the submission state is locked when the assignment is muted', function() { - assignment.muted = true - const map = createAndSetupMap(assignment, studentWithSubmission, { anonymousModeratedMarkingEnabled: true }) - const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }) - strictEqual(submission.locked, true) - }) - - test('the submission state is hidden when the assignment is muted', function() { - assignment.muted = true - const map = createAndSetupMap(assignment, studentWithSubmission, { anonymousModeratedMarkingEnabled: true }) - const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }) - strictEqual(submission.hideGrade, true) - }) - - test('the submission state is unlocked when the assignment is unmuted', function() { - const map = createAndSetupMap(assignment, studentWithSubmission, { anonymousModeratedMarkingEnabled: true }) - const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }) - strictEqual(submission.locked, false) - }) - - test('the submission state is not hidden when the assignment is unmuted', function() { - const map = createAndSetupMap(assignment, studentWithSubmission, { anonymousModeratedMarkingEnabled: true }) - const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }) - strictEqual(submission.hideGrade, false) - }) + test('the submission state is hidden when the assignment is muted', function() { + assignment.muted = true + const map = createAndSetupMap(assignment, studentWithSubmission) + const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }) + strictEqual(submission.hideGrade, true) }) - }); + + test('the submission state is unlocked when the assignment is unmuted', function() { + const map = createAndSetupMap(assignment, studentWithSubmission) + const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }) + strictEqual(submission.locked, false) + }) + + test('the submission state is not hidden when the assignment is unmuted', function() { + const map = createAndSetupMap(assignment, studentWithSubmission) + const submission = map.getSubmissionState({ user_id: studentWithSubmission.id, assignment_id: assignment.id }) + strictEqual(submission.hideGrade, false) + }) + }) QUnit.module('no submission', function() { test('the submission object is missing if the assignment is late', function () { diff --git a/spec/javascripts/jsx/gradezilla/default_gradebook/GradebookGrid/headers/AssignmentColumnHeaderRendererSpec.js b/spec/javascripts/jsx/gradezilla/default_gradebook/GradebookGrid/headers/AssignmentColumnHeaderRendererSpec.js index 31c6e74ea0e..b147d0f84b0 100644 --- a/spec/javascripts/jsx/gradezilla/default_gradebook/GradebookGrid/headers/AssignmentColumnHeaderRendererSpec.js +++ b/spec/javascripts/jsx/gradezilla/default_gradebook/GradebookGrid/headers/AssignmentColumnHeaderRendererSpec.js @@ -173,11 +173,10 @@ QUnit.module('AssignmentColumnHeaderRenderer', function (suiteHooks) { equal(component.props.downloadSubmissionsAction, gradebook.getDownloadSubmissionsAction.returnValues[0]); }); - test('the anonymousGrading prop is `false` when the assignment is anonymous', function () { + test('the anonymousGrading prop is `true` when the assignment is anonymous', function () { assignment.anonymous_grading = true render() - // anonymousGrading can only be true if Anonymous Moderated Marking is enabled - strictEqual(component.props.assignment.anonymousGrading, false) + strictEqual(component.props.assignment.anonymousGrading, true) }) test('the anonymousGrading prop is `false` when the assignment is not anonymous', function () { @@ -505,23 +504,6 @@ QUnit.module('AssignmentColumnHeaderRenderer', function (suiteHooks) { render(); equal(component.props.sortBySetting.settingKey, 'grade'); }); - - QUnit.module('when Anonymous Moderated Marking is enabled', function (hooks) { - hooks.beforeEach(() => { - gradebook.options.anonymous_moderated_marking_enabled = true - }) - - test('the anonymousGrading prop is `true` when the assignment is anonymous', function () { - assignment.anonymous_grading = true - render() - strictEqual(component.props.assignment.anonymousGrading, true) - }) - - test('the anonymousGrading prop is `false` when the assignment is not anonymous', function () { - render() - strictEqual(component.props.assignment.anonymousGrading, false) - }) - }) }); QUnit.module('#destroy', function () { diff --git a/spec/javascripts/jsx/gradezilla/default_gradebook/GradebookSpecHelper.js b/spec/javascripts/jsx/gradezilla/default_gradebook/GradebookSpecHelper.js index a3474976c04..5b865377fd8 100644 --- a/spec/javascripts/jsx/gradezilla/default_gradebook/GradebookSpecHelper.js +++ b/spec/javascripts/jsx/gradezilla/default_gradebook/GradebookSpecHelper.js @@ -20,7 +20,6 @@ import Gradebook from 'compiled/gradezilla/Gradebook'; export function createGradebook (options = {}) { const gradebook = new Gradebook({ - anonymous_moderated_marking_enabled: false, colors: {}, context_allows_gradebook_uploads: true, context_id: '1', diff --git a/spec/javascripts/jsx/gradezilla/default_gradebook/components/SubmissionTraySpec.js b/spec/javascripts/jsx/gradezilla/default_gradebook/components/SubmissionTraySpec.js index 108f760b7a0..f0b2c7f3731 100644 --- a/spec/javascripts/jsx/gradezilla/default_gradebook/components/SubmissionTraySpec.js +++ b/spec/javascripts/jsx/gradezilla/default_gradebook/components/SubmissionTraySpec.js @@ -42,7 +42,6 @@ QUnit.module('SubmissionTray', function (hooks) { }); const defaultProps = { - anonymousModeratedMarkingEnabled: false, contentRef (ref) { content = ref; }, @@ -202,10 +201,8 @@ QUnit.module('SubmissionTray', function (hooks) { strictEqual(speedGraderLink, speedGraderUrl); }); - test('invokes "onAnonymousSpeedGraderClick" when the SpeedGrader link is clicked ' + - 'if the assignment is anonymous and Anonymous Moderated Marking is enabled', function () { + test('invokes "onAnonymousSpeedGraderClick" when the SpeedGrader link is clicked if the assignment is anonymous', function () { const props = { - anonymousModeratedMarkingEnabled: true, assignment: { name: 'Book Report', gradingType: 'points', @@ -221,18 +218,10 @@ QUnit.module('SubmissionTray', function (hooks) { strictEqual(props.onAnonymousSpeedGraderClick.callCount, 1) }) - test('omits student_id from SpeedGrader link if enabled and assignment is ' + - 'anonymously graded and anonymous moderated marking is enabled', function() { - mountComponent({anonymousModeratedMarkingEnabled: true, assignment: {anonymousGrading: true}}); - const speedGraderLink = document.querySelector('.SubmissionTray__Container a[href*="speed_grader"]').getAttribute('href'); - notOk(speedGraderLink.match(/student_id/)) - }); - - test('includes student_id in the SpeedGrader link if enabled and assignment is ' + - 'anonymously graded and anonymous moderated marking is disabled', function() { + test('omits student_id from SpeedGrader link if enabled and assignment is anonymously graded', function() { mountComponent({assignment: {anonymousGrading: true}}); const speedGraderLink = document.querySelector('.SubmissionTray__Container a[href*="speed_grader"]').getAttribute('href'); - ok(speedGraderLink.match(/student_id/)) + notOk(speedGraderLink.match(/student_id/)) }); test('does not show SpeedGrader link if disabled', function () { diff --git a/spec/javascripts/jsx/gradezilla/shared/AssignmentMuterDialogManagerSpec.js b/spec/javascripts/jsx/gradezilla/shared/AssignmentMuterDialogManagerSpec.js index 508aebe1828..6261b7da534 100644 --- a/spec/javascripts/jsx/gradezilla/shared/AssignmentMuterDialogManagerSpec.js +++ b/spec/javascripts/jsx/gradezilla/shared/AssignmentMuterDialogManagerSpec.js @@ -24,11 +24,9 @@ QUnit.module('AssignmentMuterDialogManager', suiteHooks => { let assignment let submissionsLoaded - let anonymousModeratedMarkingEnabled suiteHooks.beforeEach(() => { - anonymousModeratedMarkingEnabled = false - assignment = {moderated_grading: false, grades_published: true, muted: true} + assignment = {anonymous_grading: false, grades_published: true, muted: true} submissionsLoaded = false }) @@ -36,8 +34,7 @@ QUnit.module('AssignmentMuterDialogManager', suiteHooks => { return new AssignmentMuterDialogManager( assignment, url, - submissionsLoaded, - anonymousModeratedMarkingEnabled + submissionsLoaded ) } @@ -95,23 +92,13 @@ QUnit.module('AssignmentMuterDialogManager', suiteHooks => { }) test('returns false when the assignment is moderated and grades have not been published', () => { - anonymousModeratedMarkingEnabled = true assignment.grades_published = false assignment.moderated_grading = true submissionsLoaded = true strictEqual(createManager().isDialogEnabled(), false) }) - test('returns true for moderated assignments when Anonymous Moderated Marking is disabled', () => { - anonymousModeratedMarkingEnabled = false - assignment.grades_published = false - assignment.moderated_grading = true - submissionsLoaded = true - strictEqual(createManager().isDialogEnabled(), true) - }) - test('returns true for moderated assignments when grades have been published', () => { - anonymousModeratedMarkingEnabled = true assignment.grades_published = true assignment.moderated_grading = true submissionsLoaded = true @@ -119,7 +106,6 @@ QUnit.module('AssignmentMuterDialogManager', suiteHooks => { }) test('returns true for moderated assignments when not muted', () => { - anonymousModeratedMarkingEnabled = true assignment.grades_published = false assignment.moderated_grading = true assignment.muted = false @@ -128,7 +114,6 @@ QUnit.module('AssignmentMuterDialogManager', suiteHooks => { }) test('returns true for assignments when not moderated', () => { - anonymousModeratedMarkingEnabled = true assignment.grades_published = true assignment.moderated_grading = false submissionsLoaded = true diff --git a/spec/javascripts/jsx/speed_graderSpec.js b/spec/javascripts/jsx/speed_graderSpec.js index 57e896cfe84..63b05b71d83 100644 --- a/spec/javascripts/jsx/speed_graderSpec.js +++ b/spec/javascripts/jsx/speed_graderSpec.js @@ -34,7 +34,14 @@ let $div QUnit.module('SpeedGrader#showDiscussion', { setup () { - fakeENV.setup(); + fakeENV.setup({ + assignment_id: '17', + course_id: '29', + grading_role: 'moderator', + help_url: 'example.com/support', + show_help_menu_item: false + }) + fixtures.innerHTML = '' this.stub($, 'ajaxJSON'); this.spy($.fn, 'append'); this.originalWindowJSONData = window.jsonData; @@ -89,6 +96,7 @@ QUnit.module('SpeedGrader#showDiscussion', { $.getJSON.restore() SpeedGrader.EG.currentStudent = this.originalStudent; window.jsonData = this.originalWindowJSONData; + fixtures.innerHTML = '' fakeENV.teardown(); } }); @@ -116,7 +124,14 @@ test('showDiscussion should show private comments for non group assignments', () QUnit.module('SpeedGrader#refreshSubmissionToView', { setup () { - fakeENV.setup(); + fakeENV.setup({ + assignment_id: '17', + course_id: '29', + grading_role: 'moderator', + help_url: 'example.com/support', + show_help_menu_item: false + }) + fixtures.innerHTML = '' this.stub($, 'ajaxJSON'); this.spy($.fn, 'append'); this.originalWindowJSONData = window.jsonData; @@ -155,6 +170,7 @@ QUnit.module('SpeedGrader#refreshSubmissionToView', { $.getJSON.restore() window.jsonData = this.originalWindowJSONData; SpeedGrader.EG.currentStudent = this.originalStudent; + fixtures.innerHTML = '' fakeENV.teardown(); } }) @@ -169,7 +185,13 @@ QUnit.module('#showSubmissionDetails', function(hooks) { let originalStudent hooks.beforeEach(function() { - fakeENV.setup() + fakeENV.setup({ + assignment_id: '17', + course_id: '29', + grading_role: 'moderator', + help_url: 'example.com/support', + show_help_menu_item: false + }) sinon.stub(SpeedGrader.EG, 'handleSubmissionSelectionChange') originalWindowJSONData = window.jsonData window.jsonData = { @@ -183,7 +205,10 @@ QUnit.module('#showSubmissionDetails', function(hooks) { submission_state: 'not_graded', submission: { score: 7, grade: 70, submission_history: [] } } - fixtures.innerHTML = '
Submission Details
' + fixtures.innerHTML = ` + +
Submission Details
+ ` sinon.stub($, 'getJSON') sinon.stub($, 'ajaxJSON') sinon.stub(SpeedGrader.EG, 'domReady') @@ -476,11 +501,18 @@ test('Does not error out if a user has no submission', function () { QUnit.module('SpeedGrader#handleGradeSubmit', { setup () { - fakeENV.setup(); + fakeENV.setup({ + assignment_id: '17', + course_id: '29', + grading_role: 'moderator', + help_url: 'example.com/support', + show_help_menu_item: false + }) this.stub($, 'ajaxJSON'); this.spy($.fn, 'append'); this.originalWindowJSONData = window.jsonData; fixtures.innerHTML = ` +
` @@ -624,7 +656,10 @@ QUnit.module('loading a submission Preview', { setup() { fakeENV.setup(); this.stub($, 'ajaxJSON'); - fixtures.innerHTML = '
not empty
' + fixtures.innerHTML = ` + +
not empty
+ ` }, teardown() { @@ -685,9 +720,18 @@ test('clears the contents of the iframe_holder', () => { QUnit.module('renderLtiLaunch', { setup() { - fakeENV.setup(); - $div = $("
not empty
") - fixtures.innerHTML = $div + fakeENV.setup({ + assignment_id: '17', + course_id: '29', + grading_role: 'moderator', + help_url: 'example.com/support', + show_help_menu_item: false + }) + fixtures.innerHTML = ` + +
not empty
+ ` + $div = $(fixtures).find('#iframe_holder') sinon.stub($, 'getJSON') sinon.stub($, 'ajaxJSON') sinon.stub(SpeedGrader.EG, 'domReady') @@ -1099,14 +1143,23 @@ test('compares student sortable names when given function returns equal values f QUnit.module('SpeedGrader - gateway timeout', { setup () { - fakeENV.setup(); + fakeENV.setup({ + assignment_id: '17', + course_id: '29', + grading_role: 'moderator', + help_url: 'example.com/support', + show_help_menu_item: false + }) this.server = sinon.fakeServer.create({ respondImmediately: true }); this.server.respondWith( 'GET', `${window.location.pathname}.json${window.location.search}`, [504, { 'Content-Type': 'application/json' }, ''] ); - fixtures.innerHTML = '
' + fixtures.innerHTML = ` + +
+ ` }, teardown () { fixtures.innerHTML = '' @@ -1170,7 +1223,6 @@ QUnit.module('SpeedGrader - clicking save rubric button for an anonymous assignm sinon.stub($, 'ajaxJSON'); disableWhileLoadingStub = sinon.stub($.fn, 'disableWhileLoading'); fakeENV.setup({ - anonymous_moderated_marking_enabled: true, assignment_id: '27', course_id: '3', help_url: '', @@ -1182,6 +1234,7 @@ QUnit.module('SpeedGrader - clicking save rubric button for an anonymous assignm sinon.stub(window.rubricAssessment, 'assessmentData').returns({ 'rubric_assessment[user_id]': 'abcde' }); fixtures.innerHTML = ` +
@@ -1264,14 +1317,23 @@ QUnit.module('SpeedGrader - clicking save rubric button for an anonymous assignm QUnit.module('SpeedGrader - no gateway timeout', { setup () { - fakeENV.setup(); + fakeENV.setup({ + assignment_id: '17', + course_id: '29', + grading_role: 'moderator', + help_url: 'example.com/support', + show_help_menu_item: false + }) this.server = sinon.fakeServer.create({ respondImmediately: true }); this.server.respondWith( 'GET', `${window.location.pathname}.json${window.location.search}`, [200, { 'Content-Type': 'application/json' }, '{ hello: "world"}'] ); - fixtures.innerHTML = '
' + fixtures.innerHTML = ` + +
+ ` }, teardown () { fixtures.innerHTML = '' @@ -1287,7 +1349,26 @@ test('does not show an error when the gateway times out', function () { strictEqual($('#speed_grader_timeout_alert').text(), ''); }); -QUnit.module('SpeedGrader', function() { +QUnit.module('SpeedGrader', function(suiteHooks) { + suiteHooks.beforeEach(() => { + fakeENV.setup({ + assignment_id: '2', + course_id: '7', + help_url: 'example.com/foo', + show_help_menu_item: false + }) + sinon.stub($, 'getJSON') + sinon.stub($, 'ajaxJSON') + fixtures.innerHTML = '' + }) + + suiteHooks.afterEach(() => { + $.getJSON.restore() + $.ajaxJSON.restore() + fixtures.innerHTML = '' + fakeENV.teardown() + }) + QUnit.module('#refreshFullRubric', function(hooks) { let speedGraderCurrentStudent; let jsonData; @@ -1300,7 +1381,7 @@ QUnit.module('SpeedGrader', function() { hooks.beforeEach(function () { fixtures.innerHTML = rubricHTML - fakeENV.setup({ RUBRIC_ASSESSMENT: { assessment_type: 'peer_review' }}); + fakeENV.setup({ ...window.ENV, RUBRIC_ASSESSMENT: { assessment_type: 'peer_review' }}); ({jsonData} = window); speedGraderCurrentStudent = SpeedGrader.EG.currentStudent; window.jsonData = { rubric_association: {} }; @@ -1318,14 +1399,13 @@ QUnit.module('SpeedGrader', function() { JQuerySelectorCache.prototype.get.restore(); SpeedGrader.EG.currentStudent = speedGraderCurrentStudent; window.jsonData = jsonData; - fakeENV.teardown(); fixtures.innerHTML = '' }); QUnit.module('when the assessment is a grading assessment and the user is a grader', function(contextHooks) { contextHooks.beforeEach(function() { SpeedGrader.EG.currentStudent.rubric_assessments[0].assessment_type = 'grading' - fakeENV.setup({ current_user_id: '7', RUBRIC_ASSESSMENT: { assessment_type: 'grading' }}) + fakeENV.setup({ ...window.ENV, current_user_id: '7', RUBRIC_ASSESSMENT: { assessment_type: 'grading' }}) }) contextHooks.afterEach(function() { @@ -1363,18 +1443,14 @@ QUnit.module('SpeedGrader', function() { QUnit.module('#renderCommentTextArea', function(hooks) { hooks.beforeEach(function() { - fakeENV.setup() - fixtures.innerHTML = '
' - - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') + fixtures.innerHTML = ` + +
+ ` }) hooks.afterEach(function() { - $.ajaxJSON.restore() - $.getJSON.restore() fixtures.innerHTML = '' - fakeENV.teardown() }) test('mounts the comment text area when there is an element to mount it in', function() { @@ -1395,6 +1471,7 @@ QUnit.module('SpeedGrader', function() { QUnit.module('#setup', function(hooks) { hooks.beforeEach(function() { fakeENV.setup({ + ...window.ENV, assignment_id: '17', course_id: '29', grading_role: 'moderator', @@ -1403,30 +1480,17 @@ QUnit.module('SpeedGrader', function() { }) fixtures.innerHTML = '' - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') }) hooks.afterEach(function() { - $.ajaxJSON.restore() - $.getJSON.restore() fixtures.innerHTML = '' - fakeENV.teardown() }) - test('populates the settings mount point if anonymous_moderated_marking_enabled is true', () => { - fakeENV.setup({...window.ENV, anonymous_moderated_marking_enabled: true}) + test('populates the settings mount point', () => { SpeedGrader.setup() const mountPoint = document.getElementById('speedgrader-settings') strictEqual(mountPoint.textContent, 'SpeedGrader Settings') }) - - test('does not populate the settings mount point if anonymous_moderated_marking_enabled is false', () => { - fakeENV.setup({...window.ENV, anonymous_moderated_marking_enabled: false}) - SpeedGrader.setup() - const mountPoint = document.getElementById('speedgrader-settings') - strictEqual(mountPoint.textContent, '') - }) }) QUnit.module('#renderSubmissionPreview', hooks => { @@ -1476,8 +1540,6 @@ QUnit.module('SpeedGrader', function() {
` - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') SpeedGrader.setup() window.jsonData = windowJsonData SpeedGrader.EG.jsonReady() @@ -1485,10 +1547,7 @@ QUnit.module('SpeedGrader', function() { }) hooks.afterEach(() => { - $.ajaxJSON.restore() - $.getJSON.restore() fixtures.innerHTML = '' - fakeENV.teardown() delete SpeedGrader.EG.currentStudent window.jsonData = jsonData teardownHandleFragmentChanged() @@ -1561,14 +1620,13 @@ QUnit.module('SpeedGrader', function() { } anonymousHooks.beforeEach(() => { - fakeENV.setup({anonymous_moderated_marking_enabled: true, force_anonymous_grading: true}) + fakeENV.setup({...window.ENV, force_anonymous_grading: true}) window.jsonData = windowJsonData }) anonymousHooks.afterEach(() => { window.location.hash = '' window.jsonData = originalJsonData - fakeENV.teardown() }) QUnit.module('#jsonReady', contextHooks => { @@ -1687,8 +1745,6 @@ QUnit.module('SpeedGrader', function() { show_help_menu_item: false }) fixtures.innerHTML = '' - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') sinon.stub(SpeedGrader.EG, 'handleFragmentChanged'); sinon.stub(SpeedGrader.EG, 'goToStudent') SpeedGrader.setup() @@ -1697,10 +1753,7 @@ QUnit.module('SpeedGrader', function() { }) hooks.afterEach(function() { - $.ajaxJSON.restore() - $.getJSON.restore() fixtures.innerHTML = '' - fakeENV.teardown() SpeedGrader.EG.goToStudent.restore() SpeedGrader.EG.handleFragmentChanged.restore() window.jsonData = originalJsonData @@ -1733,8 +1786,6 @@ QUnit.module('SpeedGrader', function() { show_help_menu_item: false }) fixtures.innerHTML = '' - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') sinon.stub(SpeedGrader.EG, 'goToStudent') sinon.stub(SpeedGrader.EG, 'handleFragmentChanged'); SpeedGrader.setup() @@ -1746,11 +1797,8 @@ QUnit.module('SpeedGrader', function() { hooks.afterEach(function() { fixtures.innerHTML = '' - fakeENV.teardown() SpeedGrader.EG.goToStudent.restore() window.jsonData = originalJsonData - $.getJSON.restore() - $.ajaxJSON.restore() }) test('goToStudent is called with student anonymous_id', () => { @@ -1786,15 +1834,10 @@ QUnit.module('SpeedGrader', function() {
` - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') }) hooks.afterEach(() => { - $.ajaxJSON.restore() - $.getJSON.restore() fixtures.innerHTML = '' - fakeENV.teardown() window.jsonData = originalJsonData document.querySelector('.ui-selectmenu-menu').remove() }) @@ -1838,7 +1881,6 @@ QUnit.module('SpeedGrader', function() { }) QUnit.module('#handleStudentChanged', hooks => { - let getJSON hooks.beforeEach(() => { fakeENV.setup({ ...ENV, @@ -1849,18 +1891,13 @@ QUnit.module('SpeedGrader', function() { show_help_menu_item: false }) fixtures.innerHTML = '' - getJSON = sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') SpeedGrader.setup() window.jsonData = windowJsonData SpeedGrader.EG.jsonReady() }) hooks.afterEach(() => { - $.ajaxJSON.restore() - getJSON.restore() fixtures.innerHTML = '' - fakeENV.teardown() window.jsonData = originalJsonData delete SpeedGrader.EG.currentStudent teardownHandleFragmentChanged() @@ -1878,7 +1915,7 @@ QUnit.module('SpeedGrader', function() { submission: alphaSubmission }; setupCurrentStudent(); - const [url] = getJSON.firstCall.args; + const [url] = $.getJSON.firstCall.args; const {course_id: courseId, assignment_id: assignmentId} = ENV; const params = `anonymous_id=${alphaStudent.anonymous_id}&last_updated_at=${alphaSubmission.updated_at}`; strictEqual(url, `/api/v1/courses/${courseId}/assignments/${assignmentId}/anonymous_provisional_grades/status?${params}`); @@ -1918,18 +1955,13 @@ QUnit.module('SpeedGrader', function() {
`; - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') SpeedGrader.setup() window.jsonData = windowJsonData SpeedGrader.EG.jsonReady() }) hooks.afterEach(() => { - $.ajaxJSON.restore() - $.getJSON.restore() fixtures.innerHTML = '' - fakeENV.teardown() window.jsonData = originalJsonData delete SpeedGrader.EG.currentStudent }) @@ -1980,8 +2012,6 @@ QUnit.module('SpeedGrader', function() {
`; - sinon.stub($, 'getJSON'); - sinon.stub($, 'ajaxJSON'); sinon.stub(SpeedGrader.EG, 'showSubmission'); sinon.stub($.fn, 'ready'); SpeedGrader.setup(); @@ -1993,10 +2023,7 @@ QUnit.module('SpeedGrader', function() { hooks.afterEach(() => { window.jsonData = originalJsonData; SpeedGrader.EG.showSubmission.restore(); - $.ajaxJSON.restore(); - $.getJSON.restore(); fixtures.innerHTML = ''; - fakeENV.teardown(); }); test('sets graded_anonymously to true for the rubric ajax request', () => { @@ -2019,8 +2046,6 @@ QUnit.module('SpeedGrader', function() { show_help_menu_item: false }); fixtures.innerHTML = ''; - sinon.stub($, 'getJSON'); - sinon.stub($, 'ajaxJSON'); sinon.stub($.fn, 'ready'); SpeedGrader.setup(); window.jsonData = windowJsonData; @@ -2030,10 +2055,7 @@ QUnit.module('SpeedGrader', function() { hooks.afterEach(() => { window.jsonData = originalJsonData; - $.ajaxJSON.restore(); - $.getJSON.restore(); fixtures.innerHTML = ''; - fakeENV.teardown(); }); test('fetches student via anonymous_id', () => { @@ -2053,18 +2075,13 @@ QUnit.module('SpeedGrader', function() { show_help_menu_item: false }) fixtures.innerHTML = '' - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') SpeedGrader.setup() window.jsonData = windowJsonData SpeedGrader.EG.jsonReady() }) hooks.afterEach(() => { - $.ajaxJSON.restore() - $.getJSON.restore() fixtures.innerHTML = '' - fakeENV.teardown() window.jsonData = originalJsonData delete SpeedGrader.EG.currentStudent }) @@ -2101,8 +2118,6 @@ QUnit.module('SpeedGrader', function() { RUBRIC_ASSESSMENT: {} }) fixtures.innerHTML = '' - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') SpeedGrader.setup() window.jsonData = windowJsonData window.jsonData.rubric_association = {} @@ -2111,10 +2126,7 @@ QUnit.module('SpeedGrader', function() { }) hooks.afterEach(() => { - $.ajaxJSON.restore() - $.getJSON.restore() fixtures.innerHTML = '' - fakeENV.teardown() window.jsonData = originalJsonData delete SpeedGrader.EG.currentStudent teardownHandleFragmentChanged() @@ -2142,8 +2154,6 @@ QUnit.module('SpeedGrader', function() {
` - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') SpeedGrader.setup() window.jsonData = windowJsonData window.jsonData.rubric_association = {} @@ -2152,10 +2162,7 @@ QUnit.module('SpeedGrader', function() { }) hooks.afterEach(() => { - $.ajaxJSON.restore() - $.getJSON.restore() fixtures.innerHTML = '' - fakeENV.teardown() window.jsonData = originalJsonData delete SpeedGrader.EG.currentStudent teardownHandleFragmentChanged() @@ -2182,8 +2189,6 @@ QUnit.module('SpeedGrader', function() { fixtures.innerHTML = ` ` - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') SpeedGrader.setup() window.jsonData = windowJsonData window.jsonData.rubric_association = {} @@ -2192,10 +2197,7 @@ QUnit.module('SpeedGrader', function() { }) hooks.afterEach(() => { - $.ajaxJSON.restore() - $.getJSON.restore() fixtures.innerHTML = '' - fakeENV.teardown() window.jsonData = originalJsonData delete SpeedGrader.EG.currentStudent teardownHandleFragmentChanged() @@ -2227,8 +2229,6 @@ QUnit.module('SpeedGrader', function() { ` - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') SpeedGrader.setup() window.jsonData = windowJsonData window.jsonData.rubric_association = {} @@ -2241,9 +2241,7 @@ QUnit.module('SpeedGrader', function() { }) hooks.afterEach(() => { - $.getJSON.restore() fixtures.innerHTML = '' - fakeENV.teardown() window.jsonData = originalJsonData delete SpeedGrader.EG.currentStudent teardownHandleFragmentChanged() @@ -2252,25 +2250,23 @@ QUnit.module('SpeedGrader', function() { test('calls ajaxJSON with submission url with anonymous id', () => { $.ajaxJSON.restore() - const ajaxJSON = sinon.stub($, 'ajaxJSON') + sinon.stub($, 'ajaxJSON') SpeedGrader.EG.addSubmissionComment('draft comment') - const [url] = ajaxJSON.firstCall.args + const [url] = $.ajaxJSON.firstCall.args deepEqual(url, `${assignmentURL}/submissions/${alphaStudent.anonymous_id}`) - ajaxJSON.restore() }) test('calls ajaxJSON with with anonymous id in data', () => { $.ajaxJSON.restore() - const ajaxJSON = sinon.stub($, 'ajaxJSON') + sinon.stub($, 'ajaxJSON') SpeedGrader.EG.addSubmissionComment('draft comment') - const [,,formData] = ajaxJSON.firstCall.args + const [,,formData] = $.ajaxJSON.firstCall.args strictEqual(formData['submission[anonymous_id]'], alphaStudent.anonymous_id) - ajaxJSON.restore() }) test('calls handleGradingError if an error is encountered', () => { $.ajaxJSON.restore() - const ajaxJSON = sinon.stub($, 'ajaxJSON').callsFake((_url, _method, _form, _success, error) => { + sinon.stub($, 'ajaxJSON').callsFake((_url, _method, _form, _success, error) => { error() }) const handleGradingError = sinon.stub(SpeedGrader.EG, 'handleGradingError') @@ -2281,12 +2277,11 @@ QUnit.module('SpeedGrader', function() { revertFromFormSubmit.restore() handleGradingError.restore() - ajaxJSON.restore() }) test('calls revertFromFormSubmit to clear the comment if an error is encountered', () => { $.ajaxJSON.restore() - const ajaxJSON = sinon.stub($, 'ajaxJSON').callsFake((_url, _method, _form, _success, error) => { + sinon.stub($, 'ajaxJSON').callsFake((_url, _method, _form, _success, error) => { error() }) const revertFromFormSubmit = sinon.stub(SpeedGrader.EG, 'revertFromFormSubmit') @@ -2296,7 +2291,6 @@ QUnit.module('SpeedGrader', function() { deepEqual(params, {errorSubmitting: true}) revertFromFormSubmit.restore() - ajaxJSON.restore() }) }) @@ -2316,20 +2310,15 @@ QUnit.module('SpeedGrader', function() {
` - sinon.stub($, 'getJSON') - const ajaxJSON = sinon.stub($, 'ajaxJSON') SpeedGrader.setup() window.jsonData = windowJsonData window.jsonData.rubric_association = {} SpeedGrader.EG.jsonReady() setupCurrentStudent() - ajaxJSON.restore() }) hooks.afterEach(() => { - $.getJSON.restore() fixtures.innerHTML = '' - fakeENV.teardown() window.jsonData = originalJsonData delete SpeedGrader.EG.currentStudent teardownHandleFragmentChanged() @@ -2337,34 +2326,33 @@ QUnit.module('SpeedGrader', function() { }) test('calls isStudentConcluded with student looked up by anonymous id', () => { - const ajaxJSON = sinon.stub($, 'ajaxJSON') const isStudentConcluded = sinon.spy(SpeedGrader.EG, 'isStudentConcluded') SpeedGrader.EG.handleGradeSubmit({}, false) deepEqual(isStudentConcluded.firstCall.args, [alphaStudent.anonymous_id]) - ajaxJSON.restore() }) - test('calls ajaxJSON with with anonymous id in data', () => { - const ajaxJSON = sinon.stub($, 'ajaxJSON') + test('calls ajaxJSON with anonymous id in data', () => { + $.ajaxJSON.restore() + sinon.stub($, 'ajaxJSON') SpeedGrader.EG.handleGradeSubmit({}, false) - const [,,formData] = ajaxJSON.firstCall.args + const [,,formData] = $.ajaxJSON.firstCall.args strictEqual(formData['submission[anonymous_id]'], alphaStudent.anonymous_id) - ajaxJSON.restore() }) test('calls handleGradingError if an error is encountered', () => { - const ajaxJSON = sinon.stub($, 'ajaxJSON').callsFake((_url, _method, _form, _success, error) => { error() }) + $.ajaxJSON.restore() + sinon.stub($, 'ajaxJSON').callsFake((_url, _method, _form, _success, error) => { error() }) const handleGradingError = sinon.stub(SpeedGrader.EG, 'handleGradingError') SpeedGrader.EG.handleGradeSubmit({}, false) strictEqual(handleGradingError.callCount, 1) handleGradingError.restore() - ajaxJSON.restore() }) test('clears the grade input if an error is encountered', () => { - const ajaxJSON = sinon.stub($, 'ajaxJSON').callsFake((_url, _method, _form, _success, error) => { error() }) + $.ajaxJSON.restore() + sinon.stub($, 'ajaxJSON').callsFake((_url, _method, _form, _success, error) => { error() }) const handleGradingError = sinon.stub(SpeedGrader.EG, 'handleGradingError') const showGrade = sinon.stub(SpeedGrader.EG, 'showGrade') @@ -2373,15 +2361,14 @@ QUnit.module('SpeedGrader', function() { showGrade.restore() handleGradingError.restore() - ajaxJSON.restore() }) test('submission is always marked as graded anonymously', () => { - const ajaxJSON = sinon.stub($, 'ajaxJSON'); + $.ajaxJSON.restore() + sinon.stub($, 'ajaxJSON') SpeedGrader.EG.handleGradeSubmit({}, false); - const [,,formData] = ajaxJSON.firstCall.args; + const [,,formData] = $.ajaxJSON.firstCall.args; strictEqual(formData['submission[graded_anonymously]'], true); - ajaxJSON.restore(); }); }) @@ -2400,8 +2387,6 @@ QUnit.module('SpeedGrader', function() {
` - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') SpeedGrader.setup() window.jsonData = windowJsonData window.jsonData.rubric_association = {} @@ -2410,10 +2395,7 @@ QUnit.module('SpeedGrader', function() { }) hooks.afterEach(() => { - $.ajaxJSON.restore() - $.getJSON.restore() fixtures.innerHTML = '' - fakeENV.teardown() window.jsonData = originalJsonData delete SpeedGrader.EG.currentStudent teardownHandleFragmentChanged() @@ -2450,8 +2432,6 @@ QUnit.module('SpeedGrader', function() {
not empty
` - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') SpeedGrader.setup() window.jsonData = windowJsonData SpeedGrader.EG.jsonReady() @@ -2459,10 +2439,7 @@ QUnit.module('SpeedGrader', function() { }) hooks.afterEach(() => { - $.ajaxJSON.restore() - $.getJSON.restore() fixtures.innerHTML = '' - fakeENV.teardown() window.jsonData = originalJsonData delete SpeedGrader.EG.currentStudent teardownHandleFragmentChanged() @@ -2504,8 +2481,6 @@ QUnit.module('SpeedGrader', function() {
` - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') SpeedGrader.setup() window.jsonData = windowJsonData SpeedGrader.EG.jsonReady() @@ -2513,10 +2488,7 @@ QUnit.module('SpeedGrader', function() { }) hooks.afterEach(() => { - $.ajaxJSON.restore() - $.getJSON.restore() fixtures.innerHTML = '' - fakeENV.teardown() window.jsonData = originalJsonData delete SpeedGrader.EG.currentStudent teardownHandleFragmentChanged() @@ -2537,84 +2509,14 @@ QUnit.module('SpeedGrader', function() { }) }) - QUnit.module('#handleModerationTabs', (suiteHooks) => { - let originalCurrentStudent - - suiteHooks.beforeEach(() => { - fixtures.innerHTML = ` -
- ` - originalCurrentStudent = SpeedGrader.EG.currentStudent - SpeedGrader.EG.currentStudent = { - id: 4, - name: 'Guy B. Studying', - submission: { - provisional_grades: [ - {score: 3, grade: '3', provisional_grade_id: '22', scorer_id: '93'}, - {score: 4, grade: '4', provisional_grade_id: '91', scorer_id: '77'} - ] - } - } - fakeENV.setup() - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON') - sinon.stub(SpeedGrader.EG, 'domReady') - sinon.stub(SpeedGrader.EG, 'showSubmission') - SpeedGrader.setup() - }) - - suiteHooks.afterEach(() => { - SpeedGrader.EG.showSubmission.restore() - SpeedGrader.EG.domReady.restore() - $.ajaxJSON.restore() - $.getJSON.restore() - fakeENV.teardown() - SpeedGrader.EG.currentStudent = originalCurrentStudent - fixtures.innerHTML = '' - }) - - test('shows the moderation bar if there are provisional grades', () => { - SpeedGrader.EG.handleModerationTabs() - const moderationBar = document.getElementById('moderation_bar') - strictEqual(moderationBar.style.display, '') - }) - - test('hides the moderation bar if there are not any provisional grades', () => { - SpeedGrader.EG.currentStudent.submission.provisional_grades = [] - SpeedGrader.EG.handleModerationTabs() - const moderationBar = document.getElementById('moderation_bar') - strictEqual(moderationBar.style.display, 'none') - }) - - QUnit.module('when Anonymous Moderated Marking is enabled', (hooks) => { - hooks.beforeEach(() => { - ENV.anonymous_moderated_marking_enabled = true - }) - - test('hides the moderation bar if there are provisional grades', () => { - SpeedGrader.EG.handleModerationTabs() - const moderationBar = document.getElementById('moderation_bar') - strictEqual(moderationBar.style.display, 'none') - }) - - test('hides the moderation bar if there are not any provisional grades', () => { - SpeedGrader.EG.currentStudent.submission.provisional_grades = [] - SpeedGrader.EG.handleModerationTabs() - const moderationBar = document.getElementById('moderation_bar') - strictEqual(moderationBar.style.display, 'none') - }) - }) - }) - QUnit.module('#removeModerationBarAndShowSubmission', function(hooks) { hooks.beforeEach(() => { fixtures.innerHTML = ` +
` - sinon.stub($, 'getJSON') - sinon.stub($, 'ajaxJSON'); sinon.stub(SpeedGrader.EG, 'domReady') sinon.stub(SpeedGrader.EG, 'showSubmission') SpeedGrader.setup() @@ -2623,8 +2525,6 @@ QUnit.module('SpeedGrader', function() { hooks.afterEach(() => { SpeedGrader.EG.showSubmission.restore() SpeedGrader.EG.domReady.restore() - $.ajaxJSON.restore() - $.getJSON.restore() fixtures.innerHTML = '' }) @@ -2687,10 +2587,9 @@ QUnit.module('SpeedGrader', function() { let submission hooks.beforeEach(() => { - fakeENV.setup() ENV.grading_type = 'gpa_scale' - fixtures.innerHTML = ` +
@@ -2720,7 +2619,6 @@ QUnit.module('SpeedGrader', function() { EG.setupProvisionalGraderDisplayNames.restore() fixtures.innerHTML = '' - fakeENV.teardown() }) test('displays the component if at least one provisional grade is present', () => { @@ -2785,8 +2683,9 @@ QUnit.module('SpeedGrader', function() { let submission hooks.beforeEach(() => { - fakeENV.setup() + fixtures.innerHTML = ` +
@@ -2815,7 +2714,6 @@ QUnit.module('SpeedGrader', function() { EG.submitSelectedProvisionalGrade.restore() fixtures.innerHTML = '' - fakeENV.teardown() }) test('calls submitSelectedProvisionalGrade with the grade ID when selectedGrade is passed', () => { @@ -2861,8 +2759,8 @@ QUnit.module('SpeedGrader', function() { const EG = SpeedGrader.EG hooks.beforeEach(() => { - fakeENV.setup() fixtures.innerHTML = ` +
@@ -2885,7 +2783,6 @@ QUnit.module('SpeedGrader', function() { hooks.afterEach(() => { fixtures.innerHTML = '' - fakeENV.teardown() }) test('sets the selected grader text to the passed-in label', () => { @@ -2925,10 +2822,10 @@ QUnit.module('SpeedGrader', function() { const EG = SpeedGrader.EG hooks.beforeEach(() => { - fakeENV.setup() ENV.grading_role = 'moderator' fixtures.innerHTML = ` +
@@ -2948,21 +2845,17 @@ QUnit.module('SpeedGrader', function() { } } EG.setupProvisionalGraderDisplayNames() - ENV.anonymous_moderated_marking_enabled = true ENV.provisional_status_url = 'some_url_or_other' sinon.stub(EG, 'onProvisionalGradesFetched') - sinon.stub($, 'getJSON').callsFake((url, params, success) => { + $.getJSON.callsFake((url, params, success) => { success({needs_provisional_grade: true}) }) }) hooks.afterEach(() => { EG.onProvisionalGradesFetched.restore() - $.getJSON.restore() - fixtures.innerHTML = '' - fakeENV.teardown() }) test('calls onProvisionalGradesFetched upon fetching data', () => { @@ -3002,9 +2895,9 @@ QUnit.module('SpeedGrader', function() { let submission hooks.beforeEach(() => { - fakeENV.setup() fixtures.innerHTML = ` +
@@ -3024,7 +2917,6 @@ QUnit.module('SpeedGrader', function() { } } EG.setupProvisionalGraderDisplayNames() - ENV.anonymous_moderated_marking_enabled = true submission = EG.currentStudent.submission @@ -3037,7 +2929,6 @@ QUnit.module('SpeedGrader', function() { EG.showStudent.restore() fixtures.innerHTML = '' - fakeENV.teardown() }) test('sets needs_provisional_grade to the supplied value', () => { @@ -3086,10 +2977,10 @@ QUnit.module('SpeedGrader', function() { const EG = SpeedGrader.EG hooks.beforeEach(() => { - fakeENV.setup() ENV.provisional_select_url = "provisional_select_url?{{provisional_grade_id}}" fixtures.innerHTML = ` +
@@ -3109,9 +3000,8 @@ QUnit.module('SpeedGrader', function() { } } EG.setupProvisionalGraderDisplayNames() - ENV.anonymous_moderated_marking_enabled = true - sinon.stub($, 'ajaxJSON').callsFake((url, method, params, success) => { + $.ajaxJSON.callsFake((url, method, params, success) => { success(params) }) sinon.stub(EG, 'fetchProvisionalGrades') @@ -3121,15 +3011,15 @@ QUnit.module('SpeedGrader', function() { hooks.afterEach(() => { EG.renderProvisionalGradeSelector.restore() EG.fetchProvisionalGrades.restore() - $.ajaxJSON.restore() teardownHandleFragmentChanged() window.location.hash = '' fixtures.innerHTML = '' - fakeENV.teardown() }) test('includes the value of ENV.provisional_select_url and provisionalGradeId in the URL', () => { + $.ajaxJSON.restore() + sinon.stub($, 'ajaxJSON') EG.submitSelectedProvisionalGrade(123) const [url] = $.ajaxJSON.firstCall.args strictEqual(url, 'provisional_select_url?123') @@ -3152,18 +3042,15 @@ QUnit.module('SpeedGrader', function() { const EG = SpeedGrader.EG hooks.beforeEach(() => { - fakeENV.setup() - fixtures.innerHTML = ` +
` - SpeedGrader.setup() - ENV.anonymous_moderated_marking_enabled = true sinon.stub(EG, 'submitSelectedProvisionalGrade') sinon.spy(EG, 'setActiveProvisionalGradeFields') @@ -3176,7 +3063,6 @@ QUnit.module('SpeedGrader', function() { window.location.hash = '' fixtures.innerHTML = '' - fakeENV.teardown() }) test('assigns anonymous grader names based on sorted anonymous grader ID', () => { diff --git a/spec/lib/api/v1/submission_spec.rb b/spec/lib/api/v1/submission_spec.rb index 7285162e376..cb19e09b350 100644 --- a/spec/lib/api/v1/submission_spec.rb +++ b/spec/lib/api/v1/submission_spec.rb @@ -35,11 +35,16 @@ describe Api::V1::Submission do let(:user) { User.create! } let(:course) { Course.create! } let(:assignment) { course.assignments.create! } + let(:teacher) { + teacher = User.create! + course.enroll_teacher(teacher) + teacher + } let(:session) { {} } let(:context) { nil } let(:params) { { includes: [field]} } let(:submission) { assignment.submissions.create!(user: user) } - let(:provisional_grade) { submission.provisional_grades.create!(scorer: User.create!) } + let(:provisional_grade) { submission.provisional_grades.create!(scorer: teacher) } describe 'speedgrader_url' do it "links to the speed grader for a student's submission" do diff --git a/spec/lib/data_fixup/backfill_anonymous_grading_data_spec.rb b/spec/lib/data_fixup/backfill_anonymous_grading_data_spec.rb index e1bcda04907..45a62e79b03 100644 --- a/spec/lib/data_fixup/backfill_anonymous_grading_data_spec.rb +++ b/spec/lib/data_fixup/backfill_anonymous_grading_data_spec.rb @@ -52,41 +52,14 @@ describe DataFixup::BackfillAnonymousGradingData do @course.enable_feature!(:anonymous_grading) end - context "when the base Anonymous Moderated Marking flag is off" do - before(:once) do - @root_account.disable_feature!(:anonymous_moderated_marking) - end - - it "does not cause Anonymous Marking for the course to register as enabled" do - # Note that technically this *does* flip on the Anonymous Marking - # feature flag for the course, but because it depends on the base - # AMM flag, any check for whether it's enabled while that flag is - # off will return false. This is confusing but is the "correct" - # behavior for these purposes. - do_backfill - expect(@course).not_to be_feature_enabled(:anonymous_marking) - end - - it "sets assignments to be anonymously graded" do - do_backfill - expect(assignment_anonymously_graded).to be true - end + it "enables Anonymous Marking for the course" do + do_backfill + expect(@course).to be_feature_enabled(:anonymous_marking) end - context "when the base Anonymous Moderated Marking flag is on" do - before(:once) do - @root_account.enable_feature!(:anonymous_moderated_marking) - end - - it "enables Anonymous Marking for the course" do - do_backfill - expect(@course).to be_feature_enabled(:anonymous_marking) - end - - it "sets assignments to be anonymously graded" do - do_backfill - expect(assignment_anonymously_graded).to be true - end + it "sets assignments to be anonymously graded" do + do_backfill + expect(assignment_anonymously_graded).to be true end end end diff --git a/spec/lib/features/anonymous_moderated_marking_spec.rb b/spec/lib/features/anonymous_moderated_marking_spec.rb deleted file mode 100644 index 7ad7dac1446..00000000000 --- a/spec/lib/features/anonymous_moderated_marking_spec.rb +++ /dev/null @@ -1,69 +0,0 @@ -# -# Copyright (C) 2018 - present Instructure, Inc. -# -# This file is part of Canvas. -# -# Canvas is free software: you can redistribute it and/or modify it under -# the terms of the GNU Affero General Public License as published by the Free -# Software Foundation, version 3 of the License. -# -# Canvas is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR -# A PARTICULAR PURPOSE. See the GNU Affero General Public License for more -# details. -# -# You should have received a copy of the GNU Affero General Public License along -# with this program. If not, see . -# - -require_relative '../../spec_helper.rb' - -describe 'anonymous moderated marking' do - let(:root_account) { account_model } - let(:course) { course_factory(account: root_account, active_all: true) } - let(:anonymous_grading_feature) { Feature.definitions['anonymous_marking'] } - - describe 'anonymous grading flag' do - context 'when the base AMM flag is not enabled' do - it 'is not allowed on the account level' do - expect(root_account).not_to be_feature_allowed(:anonymous_marking) - end - - it 'is not visible on the account level' do - expect(anonymous_grading_feature.visible_on.call(root_account)).to be_falsey - end - - it 'is not allowed on the course level' do - expect(course).not_to be_feature_allowed(:anonymous_marking) - end - - it 'is not visible on the course level' do - expect(anonymous_grading_feature.visible_on.call(course)).to be_falsey - end - end - - context 'when the base AMM flag is enabled' do - before(:each) do - root_account.enable_feature!(:anonymous_moderated_marking) - end - - it 'is visible on the account level' do - expect(anonymous_grading_feature.visible_on.call(root_account)).to be_truthy - end - - it 'is visible on the course level' do - expect(anonymous_grading_feature.visible_on.call(course)).to be_truthy - end - - it 'is allowed on the course level if allowed on the account level' do - root_account.allow_feature!(:anonymous_marking) - expect(course).to be_feature_allowed(:anonymous_marking) - end - - it 'is enabled on the course level if enabled on the account level' do - root_account.enable_feature!(:anonymous_marking) - expect(course).to be_feature_enabled(:anonymous_marking) - end - end - end -end diff --git a/spec/lib/moderation_spec.rb b/spec/lib/moderation_spec.rb index c474b91e54c..1f11176cfd1 100644 --- a/spec/lib/moderation_spec.rb +++ b/spec/lib/moderation_spec.rb @@ -33,23 +33,16 @@ describe Moderation do @student = User.create! end - it "does not create selections if anonymous moderated marking is not enabled" do + it "does not create selections if moderated grading is false" do expect{ test_moderation.create_moderation_selections_for_assignment(@assignment.id, [@student.id], []) }. not_to change{ @assignment.moderated_grading_selections.count } end - it "does not create selections if anonymous moderated marking is enabled and moderated grading is false" do - @course.root_account.enable_feature!(:anonymous_moderated_marking) - expect{ test_moderation.create_moderation_selections_for_assignment(@assignment.id, [@student.id], []) }. - not_to change{ @assignment.moderated_grading_selections.count } - end - - context "with anonymous moderated marking enabled and moderated grading on" do + context "with moderated grading on" do before :once do @student2 = User.create! @student3 = User.create! - @course.root_account.enable_feature!(:anonymous_moderated_marking) @assignment.update!(moderated_grading: true, grader_count: 1) end diff --git a/spec/models/assignment/speed_grader_spec.rb b/spec/models/assignment/speed_grader_spec.rb index 59359bf6ee1..a726536d457 100644 --- a/spec/models/assignment/speed_grader_spec.rb +++ b/spec/models/assignment/speed_grader_spec.rb @@ -151,8 +151,11 @@ describe Assignment::SpeedGrader do it "excludes provisional comments" do setup_assignment_with_homework + @assignment.moderated_grading = true + @assignment.grader_count = 2 + @assignment.save! @submission = @assignment.submissions.first - @comment = @submission.add_comment(:comment => 'comment', :provisional => true) + @comment = @submission.add_comment(comment: 'comment', author: @teacher, provisional: true) json = Assignment::SpeedGrader.new(@assignment, @user).json expect(json[:submissions].first[:submission_comments]).to be_empty end @@ -616,8 +619,6 @@ describe Assignment::SpeedGrader do let(:submission_json) { json['submissions'][0] } before :once do - course.account.enable_feature!(:anonymous_moderated_marking) - course.enroll_student(student, section: section).accept! assignment.update_submission(student, comment: 'comment by student', commenter: student) @@ -919,11 +920,6 @@ describe Assignment::SpeedGrader do expect(ras.count).to eq 1 expect(ras[0]['assessor_id']).to eq @ta.id.to_s end - - it "determines whether the student needs a provisional grade" do - expect(@json['context']['students'][0]['needs_provisional_grade']).to be_falsey - expect(@json['context']['students'][1]['needs_provisional_grade']).to be_truthy # other student - end end describe "for moderator" do @@ -1202,8 +1198,6 @@ describe Assignment::SpeedGrader do let(:grader_json) { Assignment::SpeedGrader.new(assignment, ta, avatars: true, grading_role: :grader).json } before :once do - course.account.enable_feature!(:anonymous_moderated_marking) - course.enroll_student(student_1, section: section_1).accept! course.enroll_student(student_2, section: section_2).accept! @@ -1503,8 +1497,6 @@ describe Assignment::SpeedGrader do let(:submission_json) { json['submissions'][0] } before :once do - course.account.enable_feature!(:anonymous_moderated_marking) - course.enroll_student(student, section: section).accept! assignment.update_submission(student, comment: 'comment by student', commenter: student) diff --git a/spec/models/assignment_spec.rb b/spec/models/assignment_spec.rb index 1d5b878d864..794cd52fd1d 100644 --- a/spec/models/assignment_spec.rb +++ b/spec/models/assignment_spec.rb @@ -183,7 +183,7 @@ describe Assignment do assignment = @course.assignments.new(assignment_valid_attributes) expect(DueDateCacher).to receive(:recompute).with(assignment, update_grades: true) - assignment.update!(moderated_grading: !assignment.moderated_grading) + assignment.update!(moderated_grading: !assignment.moderated_grading, grader_count: 2) end it 'invokes DueDateCacher if called in a before_save context' do @@ -244,40 +244,23 @@ describe Assignment do ) end - context 'when Anonymous Moderated Marking is enabled' do - before(:once) do - @course.root_account.enable_feature!(:anonymous_moderated_marking) - end - - it 'returns false if the user is not the final grader and not an admin' do - assistant = User.create! - @course.enroll_ta(assistant, enrollment_state: 'active') - expect(@assignment.permits_moderation?(assistant)).to be false - end - - it 'returns true if the user is the final grader' do - expect(@assignment.permits_moderation?(@teacher)).to be true - end - - it 'returns true if the user is an admin with "select final grader for moderation" privileges' do - expect(@assignment.permits_moderation?(account_admin_user)).to be true - end - - it 'returns false if the user is an admin without "select final grader for moderation" privileges' do - @course.account.role_overrides.create!(role: admin_role, enabled: false, permission: :select_final_grade) - expect(@assignment.permits_moderation?(account_admin_user)).to be false - end + it 'returns false if the user is not the final grader and not an admin' do + assistant = User.create! + @course.enroll_ta(assistant, enrollment_state: 'active') + expect(@assignment.permits_moderation?(assistant)).to be false end - context 'when Anonymous Moderated Marking is disabled' do - it 'returns true if the user has moderate grades privileges' do - expect(@assignment.permits_moderation?(@teacher)).to be true - end + it 'returns true if the user is the final grader' do + expect(@assignment.permits_moderation?(@teacher)).to be true + end - it 'returns false if the user does not have moderate grades privileges' do - @course.root_account.role_overrides.create!(permission: 'moderate_grades', enabled: false, role: teacher_role) - expect(@assignment.permits_moderation?(@teacher)).to be false - end + it 'returns true if the user is an admin with "select final grader for moderation" privileges' do + expect(@assignment.permits_moderation?(account_admin_user)).to be true + end + + it 'returns false if the user is an admin without "select final grader for moderation" privileges' do + @course.account.role_overrides.create!(role: admin_role, enabled: false, permission: :select_final_grade) + expect(@assignment.permits_moderation?(account_admin_user)).to be false end end @@ -314,9 +297,8 @@ describe Assignment do end end - context 'when Anonymous Moderated Marking is enabled' do + context 'when the assignment is anonymously graded' do before(:once) do - @course.root_account.enable_feature!(:anonymous_moderated_marking) assignment.update!(anonymous_grading: true) end @@ -521,10 +503,6 @@ describe Assignment do end end end - - context 'when Anonymous Moderated Marking is disabled' do - it_behaves_like "grader anonymity does not apply" - end end describe '#can_view_other_grader_comments?' do @@ -560,75 +538,57 @@ describe Assignment do end end - context 'when Anonymous Moderated Marking is enabled' do - before(:once) do - @course.root_account.enable_feature!(:anonymous_moderated_marking) + context 'when the assignment is not moderated' do + before :once do + assignment.update!(moderated_grading: false) end - context 'when the assignment is not moderated' do - before :once do - assignment.update!(moderated_grading: false) - end + it_behaves_like "grader comment hiding does not apply" + end - it_behaves_like "grader comment hiding does not apply" + context 'when grader comments are visible to other graders' do + before :once do + assignment.update!( + grader_comments_visible_to_graders: true, + grader_names_visible_to_final_grader: true + ) end - context 'when the assignment is not anonymously graded' do - before :once do - assignment.update!(anonymous_grading: false) - end + it_behaves_like "grader comment hiding does not apply" - it_behaves_like "grader comment hiding does not apply" + it 'returns true when the user is not the final grader and not an admin' do + expect(assignment.can_view_other_grader_comments?(ta)).to be true end - context 'when grader comments are visible to other graders' do - before :once do - assignment.update!( - grader_comments_visible_to_graders: true, - grader_names_visible_to_final_grader: true - ) - end - - it_behaves_like "grader comment hiding does not apply" - - it 'returns true when the user is not the final grader and not an admin' do - expect(assignment.can_view_other_grader_comments?(ta)).to be true - end - - it 'returns true when the user is the final grader' do - expect(assignment.can_view_other_grader_comments?(@teacher)).to be true - end - - it 'returns true when the user is an admin' do - expect(assignment.can_view_other_grader_comments?(admin)).to be true - end + it 'returns true when the user is the final grader' do + expect(assignment.can_view_other_grader_comments?(@teacher)).to be true end - context 'when grader comments are hidden to other graders' do - before :once do - assignment.update!( - grader_comments_visible_to_graders: false, - grader_names_visible_to_final_grader: true - ) - end - - it 'returns false when the user is not the final grader and not an admin' do - expect(assignment.can_view_other_grader_comments?(ta)).to be false - end - - it 'returns true when the user is the final grader' do - # The final grader must always be able to see grader comments. - expect(assignment.can_view_other_grader_comments?(@teacher)).to be true - end - - it 'returns true when the user is an admin' do - expect(assignment.can_view_other_grader_comments?(admin)).to be true - end + it 'returns true when the user is an admin' do + expect(assignment.can_view_other_grader_comments?(admin)).to be true end end - context 'when Anonymous Moderated Marking is disabled' do - it_behaves_like "grader comment hiding does not apply" + context 'when grader comments are hidden to other graders' do + before :once do + assignment.update!( + grader_comments_visible_to_graders: false, + grader_names_visible_to_final_grader: true + ) + end + + it 'returns false when the user is not the final grader and not an admin' do + expect(assignment.can_view_other_grader_comments?(ta)).to be false + end + + it 'returns true when the user is the final grader' do + # The final grader must always be able to see grader comments. + expect(assignment.can_view_other_grader_comments?(@teacher)).to be true + end + + it 'returns true when the user is an admin' do + expect(assignment.can_view_other_grader_comments?(admin)).to be true + end end end @@ -665,32 +625,22 @@ describe Assignment do end end - context 'when Anonymous Moderated Marking is enabled' do - before(:once) do - @course.root_account.enable_feature!(:anonymous_moderated_marking) + context 'when the assignment is not anonymously graded' do + before :once do + assignment.update!(anonymous_grading: false) end - context 'when the assignment is not anonymously graded' do - before :once do - assignment.update!(anonymous_grading: false) - end - - it_behaves_like "student anonymity does not apply" - end - - context 'when the assignment is anonymously graded' do - it 'returns false when the user is not an admin' do - expect(assignment.can_view_student_names?(@teacher)).to be false - end - - it 'returns false when the user is an admin' do - expect(assignment.can_view_student_names?(admin)).to be false - end - end + it_behaves_like "student anonymity does not apply" end - context 'when Anonymous Moderated Marking is disabled' do - it_behaves_like "student anonymity does not apply" + context 'when the assignment is anonymously graded' do + it 'returns false when the user is not an admin' do + expect(assignment.can_view_student_names?(@teacher)).to be false + end + + it 'returns false when the user is an admin' do + expect(assignment.can_view_student_names?(admin)).to be false + end end end @@ -1388,9 +1338,8 @@ describe Assignment do end end - context 'for a moderated assignment with Anonymous Moderated Marking enabled' do + context 'for a moderated assignment' do before(:once) do - @course.root_account.enable_feature!(:anonymous_moderated_marking) student_in_course teacher_in_course @first_teacher = @teacher @@ -1623,10 +1572,8 @@ describe Assignment do expect(comment).not_to be_hidden end - context 'for moderated assignments with Anonymous Moderated Marking enabled' do + context 'for moderated assignments' do before(:once) do - @assignment.root_account.enable_feature!(:anonymous_moderated_marking) - teacher_in_course @first_teacher = @teacher @@ -2288,40 +2235,34 @@ describe Assignment do expect(@assignment.muted?).to eql false end - context 'when Anonymous Moderated Marking is enabled' do - before(:once) do - @course.root_account.enable_feature!(:anonymous_moderated_marking) - end + it 'does not mute non-anonymous, non-moderated assignments when created' do + assignment = @course.assignments.create! + expect(assignment).not_to be_muted + end - it 'does not mute non-anonymous, non-moderated assignments when created' do - assignment = @course.assignments.create! - expect(assignment).not_to be_muted - end + it 'mutes anonymous assignments when created' do + assignment = @course.assignments.create!(anonymous_grading: true) + expect(assignment).to be_muted + end - it 'mutes anonymous assignments when created' do - assignment = @course.assignments.create!(anonymous_grading: true) - expect(assignment).to be_muted - end + it 'mutes moderated assignments when created' do + assignment = @course.assignments.create!(moderated_grading: true, grader_count: 1) + expect(assignment).to be_muted + end - it 'mutes moderated assignments when created' do - assignment = @course.assignments.create!(moderated_grading: true, grader_count: 1) - expect(assignment).to be_muted - end + it 'mutes assignments when they are update from non-anonymous to anonymous' do + assignment = @course.assignments.create! + expect { assignment.update!(anonymous_grading: true) }.to change { + assignment.muted? + }.from(false).to(true) + end - it 'mutes assignments when they are update from non-anonymous to anonymous' do - assignment = @course.assignments.create! - expect { assignment.update!(anonymous_grading: true) }.to change { - assignment.muted? - }.from(false).to(true) - end - - it 'does not mute assignments when they are updated from anonymous to non-anonymous' do - assignment = @course.assignments.create!(anonymous_grading: true) - assignment.update!(muted: false) - expect { assignment.update!(anonymous_grading: false) }.not_to change { - assignment.muted? - }.from(false) - end + it 'does not mute assignments when they are updated from anonymous to non-anonymous' do + assignment = @course.assignments.create!(anonymous_grading: true) + assignment.update!(muted: false) + expect { assignment.update!(anonymous_grading: false) }.not_to change { + assignment.muted? + }.from(false) end end @@ -2335,9 +2276,8 @@ describe Assignment do expect(@assignment.unmute!).to be_falsey end - context "when Anonymous Moderated Marking is enabled and assignment is anonymously graded" do + context "when assignment is anonymously graded" do before :once do - @course.root_account.enable_feature! :anonymous_moderated_marking @assignment.update_attributes(moderated_grading: true, anonymous_grading: true, grader_count: 1) @assignment.mute! end @@ -2374,9 +2314,8 @@ describe Assignment do end end - context "when Anonymous Moderated Marking is enabled and assignment is anonymously graded and not moderated" do + context "when assignment is anonymously graded and not moderated" do before :once do - @course.account.enable_feature! :anonymous_moderated_marking @assignment.update_attributes(moderated_grading: false, anonymous_grading: true) @assignment.mute! end @@ -2391,9 +2330,8 @@ describe Assignment do end end - context "when Anonymous Moderated Marking is enabled and assignment is not anonymously graded" do + context "when assignment is not anonymously graded" do before :once do - @course.account.enable_feature! :anonymous_moderated_marking @assignment.update_attributes(moderated_grading: true, anonymous_grading: false, grader_count: 1) @assignment.mute! end @@ -2407,23 +2345,6 @@ describe Assignment do expect(@assignment.unmute!).to eq(true) end end - - context "when Anonymous Moderated Marking is disabled and assignment is anonymously graded" do - before :once do - @course.account.disable_feature! :anonymous_moderated_marking - @assignment.update_attributes(moderated_grading: true, anonymous_grading: true, grader_count: 1) - @assignment.mute! - end - - it "unmutes the assignment" do - @assignment.unmute! - expect(@assignment).not_to be_muted - end - - it "returns true" do - expect(@assignment.unmute!).to eq(true) - end - end end describe "infer_times" do @@ -3169,37 +3090,34 @@ describe Assignment do end describe "to update" do - context "when Anonymous Moderated Marking is enabled" do - before(:each) do - @course.root_account.enable_feature!(:anonymous_moderated_marking) - @course.enable_feature!(:moderated_grading) + before(:each) do + @course.enable_feature!(:moderated_grading) - @moderator = teacher_in_course(course: @course, active_all: true).user - @non_moderator = teacher_in_course(course: @course, active_all: true).user + @moderator = teacher_in_course(course: @course, active_all: true).user + @non_moderator = teacher_in_course(course: @course, active_all: true).user - @moderated_assignment = @course.assignments.create!( - moderated_grading: true, - grader_count: 3, - final_grader: @moderator - ) - end + @moderated_assignment = @course.assignments.create!( + moderated_grading: true, + grader_count: 3, + final_grader: @moderator + ) + end - it "allows the designated moderator to update a moderated assignment" do - expect(@moderated_assignment.grants_right?(@moderator, :update)).to eq(true) - end + it "allows the designated moderator to update a moderated assignment" do + expect(@moderated_assignment.grants_right?(@moderator, :update)).to eq(true) + end - it "does not allow non-moderators to update a moderated assignment" do - expect(@moderated_assignment.grants_right?(@non_moderator, :update)).to eq(false) - end + it "does not allow non-moderators to update a moderated assignment" do + expect(@moderated_assignment.grants_right?(@non_moderator, :update)).to eq(false) + end - it "allows an admin to update a moderated assignment" do - expect(@moderated_assignment.grants_right?(@admin, :update)).to eq(true) - end + it "allows an admin to update a moderated assignment" do + expect(@moderated_assignment.grants_right?(@admin, :update)).to eq(true) + end - it "allows a teacher to update a moderated assignment with no moderator selected" do - @moderated_assignment.update!(final_grader: nil) - expect(@moderated_assignment.grants_right?(@non_moderator, :update)).to eq(true) - end + it "allows a teacher to update a moderated assignment with no moderator selected" do + @moderated_assignment.update!(final_grader: nil) + expect(@moderated_assignment.grants_right?(@non_moderator, :update)).to eq(true) end end end @@ -5812,6 +5730,7 @@ describe Assignment do assignment_model(course: @course) @assignment.grade_student @student, score: 0, grader: @teacher @assignment.moderated_grading = true + @assignment.grader_count = 1 expect(@assignment.save).to eq false expect(@assignment.errors[:moderated_grading]).to be_present end @@ -5820,6 +5739,7 @@ describe Assignment do assignment_model(course: @course) @assignment.peer_reviews = true @assignment.moderated_grading = true + @assignment.grader_count = 1 expect(@assignment.save).to eq false expect(@assignment.errors[:moderated_grading]).to be_present end @@ -5828,12 +5748,13 @@ describe Assignment do assignment_model(course: @course) @assignment.group_category = @course.group_categories.create!(name: "groups") @assignment.moderated_grading = true + @assignment.grader_count = 1 expect(@assignment.save).to eq false expect(@assignment.errors[:moderated_grading]).to be_present end it "does not allow turning off if graded submissions exist" do - assignment_model(course: @course, moderated_grading: true) + assignment_model(course: @course, moderated_grading: true, grader_count: 2, final_grader: @teacher) expect(@assignment).to be_moderated_grading @assignment.grade_student @student, score: 0, grader: @teacher @assignment.moderated_grading = false @@ -5842,7 +5763,7 @@ describe Assignment do end it "does not allow turning off if provisional grades exist" do - assignment_model(course: @course, moderated_grading: true) + assignment_model(course: @course, moderated_grading: true, grader_count: 2) expect(@assignment).to be_moderated_grading submission = @assignment.submit_homework @student, body: "blah" submission.find_or_create_provisional_grade!(@teacher, score: 0) @@ -5854,6 +5775,7 @@ describe Assignment do it "does not allow turning on for an ungraded assignment" do assignment_model(course: @course, submission_types: 'not_graded') @assignment.moderated_grading = true + @assignment.grader_count = 1 expect(@assignment.save).to eq false expect(@assignment.errors[:moderated_grading]).to be_present end @@ -5861,6 +5783,7 @@ describe Assignment do it "does not allow creating a new ungraded assignment with moderated grading" do a = @course.assignments.build a.moderated_grading = true + a.grader_count = 1 a.submission_types = 'not_graded' expect(a).not_to be_valid end @@ -5953,17 +5876,18 @@ describe Assignment do describe '.remove_user_as_final_grader_immediately' do it 'removes the user as final grader in all assignments in the given course' do - 2.times { @course.assignments.create!(moderated_grading: true, final_grader: @teacher) } - another_teacher = User.create! + 2.times { @course.assignments.create!(moderated_grading: true, grader_count: 2, final_grader: @teacher) } + og_teacher = @teacher + another_teacher = teacher_in_course(course: @course, active_all: true).user @course.enroll_teacher(another_teacher, active_all: true) - @course.assignments.create!(moderated_grading: true, final_grader: another_teacher) - expect { Assignment.remove_user_as_final_grader_immediately(@teacher.id, @course.id) }.to change { + @course.assignments.create!(moderated_grading: true, grader_count: 2, final_grader: another_teacher) + expect { Assignment.remove_user_as_final_grader_immediately(og_teacher.id, @course.id) }.to change { @course.assignments.order(:created_at).pluck(:final_grader_id) - }.from([@teacher.id, @teacher.id, another_teacher.id]).to([nil, nil, another_teacher.id]) + }.from([og_teacher.id, og_teacher.id, another_teacher.id]).to([nil, nil, another_teacher.id]) end it 'includes soft-deleted assignments when removing the user as final grader' do - assignment = @course.assignments.create!(moderated_grading: true, final_grader: @teacher) + assignment = @course.assignments.create!(moderated_grading: true, grader_count: 2, final_grader: @teacher) assignment.destroy expect { Assignment.remove_user_as_final_grader_immediately(@teacher.id, @course.id) }.to change { assignment.reload.final_grader_id @@ -6044,7 +5968,6 @@ describe Assignment do describe '#available_moderators' do before(:once) do @course = Course.create! - @course.root_account.enable_feature!(:anonymous_moderated_marking) @first_teacher = User.create! @second_teacher = User.create! [@first_teacher, @second_teacher].each { |user| @course.enroll_teacher(user, enrollment_state: 'active') } @@ -6149,36 +6072,24 @@ describe Assignment do @assignment.moderation_graders.create!(user: second_teacher, anonymous_id: '12345') end - it 'returns false if anonymous moderated marking is off' do - @assignment.moderation_graders.create!(user: @ta, anonymous_id: '54321') + it 'returns false if all provisional grader slots are not filled' do expect(@assignment.moderated_grader_limit_reached?).to eq false end - context 'when anonymous moderated marking is enabled' do - before :once do - @course.root_account.enable_feature!(:anonymous_moderated_marking) - end + it 'returns true if all provisional grader slots are filled' do + @assignment.moderation_graders.create!(user: @ta, anonymous_id: '54321') + expect(@assignment.moderated_grader_limit_reached?).to eq true + end - it 'returns false if all provisional grader slots are not filled' do - expect(@assignment.moderated_grader_limit_reached?).to eq false - end + it 'ignores grades issued by the final grader when determining if slots are filled' do + @assignment.moderation_graders.create!(user: @teacher, anonymous_id: '00000') + expect(@assignment.moderated_grader_limit_reached?).to eq false + end - it 'returns true if all provisional grader slots are filled' do - @assignment.moderation_graders.create!(user: @ta, anonymous_id: '54321') - expect(@assignment.moderated_grader_limit_reached?).to eq true - end - - it 'ignores grades issued by the final grader when determining if slots are filled' do - @assignment.moderation_graders.create!(user: @teacher, anonymous_id: '00000') - expect(@assignment.moderated_grader_limit_reached?).to eq false - end - - - it 'returns false if moderated grading is off' do - @assignment.moderation_graders.create!(user: @ta, anonymous_id: '54321') - @assignment.moderated_grading = false - expect(@assignment.moderated_grader_limit_reached?).to eq false - end + it 'returns false if moderated grading is off' do + @assignment.moderation_graders.create!(user: @ta, anonymous_id: '54321') + @assignment.moderated_grading = false + expect(@assignment.moderated_grader_limit_reached?).to eq false end end @@ -6197,7 +6108,6 @@ describe Assignment do moderated_grading: true ) @assignment.moderation_graders.create!(user: @second_teacher, anonymous_id: '12345') - @course.root_account.enable_feature!(:anonymous_moderated_marking) end shared_examples 'grader permissions are checked' do @@ -6287,7 +6197,6 @@ describe Assignment do describe 'Anonymous Moderated Marking setting validation' do before(:once) do - @course.account.enable_feature!(:anonymous_moderated_marking) assignment_model(course: @course) end diff --git a/spec/models/assignments/needs_grading_count_query_spec.rb b/spec/models/assignments/needs_grading_count_query_spec.rb index 623d1d62e40..994f87d3459 100644 --- a/spec/models/assignments/needs_grading_count_query_spec.rb +++ b/spec/models/assignments/needs_grading_count_query_spec.rb @@ -127,8 +127,13 @@ module Assignments context "moderated grading count" do before do - @assignment = @course.assignments.create(:title => "some assignment", - :submission_types => ['online_text_entry'], :moderated_grading => true, :points_possible => 3) + @assignment = @course.assignments.create( + title: "some assignment", + submission_types: ['online_text_entry'], + moderated_grading: true, + grader_count: 2, + points_possible: 3 + ) @students = [] 3.times do student = student_in_course(:course => @course, :active_all => true).user @@ -136,8 +141,8 @@ module Assignments @students << student end - @ta1 = ta_in_course(:course => course_factory, :active_all => true).user - @ta2 = ta_in_course(:course => course_factory, :active_all => true).user + @ta1 = ta_in_course(:course => @course, :active_all => true).user + @ta2 = ta_in_course(:course => @course, :active_all => true).user end it "should only include students with no marks when unmoderated" do @@ -151,12 +156,10 @@ module Assignments expect(querier.count).to eq 2 @students[1].submissions.first.find_or_create_provisional_grade!(@ta1) - expect(querier.count).to eq 1 + expect(querier.count).to eq 2 end it "should only include students without two marks when moderated" do - @students.each{|s| @assignment.moderated_grading_selections.create!(:student => s)} - querier = NeedsGradingCountQuery.new(@assignment, @teacher) expect(querier.count).to eq 3 diff --git a/spec/models/content_migration/course_copy_assignments_spec.rb b/spec/models/content_migration/course_copy_assignments_spec.rb index 18ecc01fcc4..37503d72840 100644 --- a/spec/models/content_migration/course_copy_assignments_spec.rb +++ b/spec/models/content_migration/course_copy_assignments_spec.rb @@ -243,14 +243,6 @@ describe ContentMigration do expect(new_assignment.group_category.name).to eq "Project Groups" end - it "should copy moderated_grading setting" do - assignment_model(:course => @copy_from, :points_possible => 40, - :submission_types => 'file_upload', :grading_type => 'points', :moderated_grading => true) - run_course_copy - new_assignment = @copy_to.assignments.where(migration_id: mig_id(@assignment)).first - expect(new_assignment).to be_moderated_grading - end - it "should not copy peer_reviews_assigned" do assignment_model(:course => @copy_from, :points_possible => 40, :submission_types => 'file_upload', :grading_type => 'points') @assignment.peer_reviews_assigned = true diff --git a/spec/models/course_spec.rb b/spec/models/course_spec.rb index 1fa0b0a8166..b15ad0e8435 100644 --- a/spec/models/course_spec.rb +++ b/spec/models/course_spec.rb @@ -154,18 +154,12 @@ describe Course do describe '#moderators' do before(:once) do @course = Course.create! - @course.root_account.enable_feature!(:anonymous_moderated_marking) @teacher = User.create! @course.enroll_teacher(@teacher) @ta = User.create! @course.enroll_ta(@ta) end - it 'returns an empty list if the root account has Anonymous Moderated Marking disabled' do - @course.root_account.disable_feature!(:anonymous_moderated_marking) - expect(@course.moderators).to be_empty - end - it 'includes active teachers' do expect(@course.moderators).to include @teacher end diff --git a/spec/models/enrollment_spec.rb b/spec/models/enrollment_spec.rb index 12c8de73696..dfc30583b0a 100644 --- a/spec/models/enrollment_spec.rb +++ b/spec/models/enrollment_spec.rb @@ -201,7 +201,6 @@ describe Enrollment do context 'when the user is a final grader' do before(:once) do - @course.root_account.enable_feature!(:anonymous_moderated_marking) @teacher = User.create! @another_teacher = User.create! @course.enroll_teacher(@teacher, enrollment_state: 'active', allow_multiple_enrollments: true) @@ -210,7 +209,7 @@ describe Enrollment do @course.assignments.create!(moderated_grading: true, final_grader: @another_teacher, grader_count: 2) end - it 'removes the user as final grader from all course assignments if Anonymous Moderated Marking is enabled' do + it 'removes the user as final grader from all course assignments' do expect { @course.enrollments.find_by!(user: @teacher).destroy }.to change { @course.assignments.order(:created_at).pluck(:final_grader_id) }.from([nil, @teacher.id, @teacher.id, @another_teacher.id]).to([nil, nil, nil, @another_teacher.id]) diff --git a/spec/models/lti/lti_outbound_adapter_spec.rb b/spec/models/lti/lti_outbound_adapter_spec.rb index cc7b5c9d141..2dca9f53806 100644 --- a/spec/models/lti/lti_outbound_adapter_spec.rb +++ b/spec/models/lti/lti_outbound_adapter_spec.rb @@ -359,7 +359,6 @@ describe Lti::LtiOutboundAdapter do url: tool.url ) ) - allow_any_instance_of(Account).to receive(:feature_enabled?).with(:anonymous_moderated_marking).and_return(false) end it 'builds the expected encrypted JWT with the correct course data' do diff --git a/spec/models/moderated_grading/provisional_grade_spec.rb b/spec/models/moderated_grading/provisional_grade_spec.rb index 1c422902133..2f006d40594 100644 --- a/spec/models/moderated_grading/provisional_grade_spec.rb +++ b/spec/models/moderated_grading/provisional_grade_spec.rb @@ -238,9 +238,8 @@ describe ModeratedGrading::ProvisionalGrade do expect(sub.graded_anonymously).to eq true end - context 'for a moderated assignment with Anonymous Moderated Marking enabled' do + context 'for a moderated assignment' do before(:each) do - course.root_account.enable_feature!(:anonymous_moderated_marking) assignment.update!(moderated_grading: true, grader_count: 2) end diff --git a/spec/models/role_override_spec.rb b/spec/models/role_override_spec.rb index 059be17427e..a92af89a916 100644 --- a/spec/models/role_override_spec.rb +++ b/spec/models/role_override_spec.rb @@ -537,16 +537,6 @@ describe RoleOverride do it 'is available to account admins, account memberships, teachers, and TAs' do expect(permission[:available_to]).to match_array %w(AccountAdmin AccountMembership TeacherEnrollment TaEnrollment) end - - it 'is allowed when Anonymous Moderated Marking is enabled for the account' do - @account.root_account.enable_feature!(:anonymous_moderated_marking) - expect(permission[:account_allows].call(@account)).to be true - end - - it 'is not allowed when Anonymous Moderated Marking is disabled for the account' do - @account.root_account.disable_feature!(:anonymous_moderated_marking) - expect(permission[:account_allows].call(@account)).to be false - end end describe 'view_audit_trail' do @@ -559,16 +549,6 @@ describe RoleOverride do it 'is available to teachers, TAs, admins and account memberships' do expect(permission[:available_to]).to match_array %w(TeacherEnrollment AccountAdmin AccountMembership) end - - it 'is allowed when Anonymous Moderated Marking is enabled for the account' do - @account.root_account.enable_feature!(:anonymous_moderated_marking) - expect(permission[:account_allows].call(@account)).to be true - end - - it 'is not allowed when Anonymous Moderated Marking is disabled for the account' do - @account.root_account.disable_feature!(:anonymous_moderated_marking) - expect(permission[:account_allows].call(@account)).to be false - end end end diff --git a/spec/models/submission_spec.rb b/spec/models/submission_spec.rb index 17636329d21..9d452f13d99 100644 --- a/spec/models/submission_spec.rb +++ b/spec/models/submission_spec.rb @@ -188,41 +188,23 @@ describe Submission do submission_spec_model(assignment: @assignment) end - context 'with Anonymous Moderated Marking enabled' do - before(:once) do - @assignment.root_account.enable_feature!(:anonymous_moderated_marking) - @submission.assignment.reload - end - - it 'may not be graded if grades are not published' do - expect(@submission.grants_right?(@teacher, :grade)).to eq false - end - - it 'sets an error message indicating moderation is in progress if grades are not published' do - @submission.grants_right?(@teacher, :grade) - expect(@submission.grading_error_message).to eq 'This assignment is currently being moderated' - end - - it 'may be graded if grades are not published but grade_posting_in_progress is true' do - @submission.grade_posting_in_progress = true - expect(@submission.grants_right?(@teacher, :grade)).to eq true - end - - it 'may be graded when grades for the assignment are published' do - @submission.assignment.update!(grades_published_at: Time.zone.now) - expect(@submission.grants_right?(@teacher, :grade)).to eq true - end + it 'may not be graded if grades are not published' do + expect(@submission.grants_right?(@teacher, :grade)).to eq false end - context 'with Anonymous Moderated Marking disabled' do - it 'may be graded when grades for the assignment are not published' do - expect(@submission.grants_right?(@teacher, :grade)).to eq true - end + it 'sets an error message indicating moderation is in progress if grades are not published' do + @submission.grants_right?(@teacher, :grade) + expect(@submission.grading_error_message).to eq 'This assignment is currently being moderated' + end - it 'may be graded when grades for the assignment are published' do - @submission.assignment.update!(grades_published_at: Time.zone.now) - expect(@submission.grants_right?(@teacher, :grade)).to eq true - end + it 'may be graded if grades are not published but grade_posting_in_progress is true' do + @submission.grade_posting_in_progress = true + expect(@submission.grants_right?(@teacher, :grade)).to eq true + end + + it 'may be graded when grades for the assignment are published' do + @submission.assignment.update!(grades_published_at: Time.zone.now) + expect(@submission.grants_right?(@teacher, :grade)).to eq true end end end @@ -3630,9 +3612,10 @@ describe Submission do describe 'find_or_create_provisional_grade!' do before(:once) do - submission_spec_model + @assignment.grader_count = 1 @assignment.moderated_grading = true @assignment.save! + submission_spec_model @teacher2 = User.create(name: "some teacher 2") @context.enroll_teacher(@teacher2) @@ -3701,7 +3684,7 @@ describe Submission do end it "raises an exception if grade is not final and student does not need a provisional grade" do - @submission.find_or_create_provisional_grade!(@teacher) + @assignment.grade_student(@student, grade: 2, grader: @teacher, provisional: true) expect{ @submission.find_or_create_provisional_grade!(@teacher2, final: false) } .to raise_error(Assignment::GradeError, "Student already has the maximum number of provisional grades") @@ -3727,6 +3710,7 @@ describe Submission do context "moderated" do before(:once) do + @assignment.grader_count = 1 @assignment.moderated_grading = true @assignment.save! @submission.reload @@ -3742,7 +3726,6 @@ describe Submission do context "student in moderation set" do it "returns the student alone" do - @assignment.moderated_grading_selections.create!(student: @student) expect(@submission.moderated_grading_whitelist).to eq([@student.moderated_grading_ids]) end end @@ -3763,7 +3746,7 @@ describe Submission do context "student in moderation set" do before(:once) do - @sel = @assignment.moderated_grading_selections.create!(student: @student) + @sel = @assignment.moderated_grading_selections.find_by(student: @student) end it "returns nil if no provisional grade was published" do @@ -4072,16 +4055,10 @@ describe Submission do describe "#can_view_details" do before :each do - @assignment.root_account.enable_feature!(:anonymous_moderated_marking) @assignment.update!(anonymous_grading: true, muted: true) @submission = @assignment.submit_homework(@student, submission_type: 'online_text_entry', body: 'a body') end - it "returns true if anonymous_moderated_marking is not enabled" do - @assignment.root_account.disable_feature!(:anonymous_moderated_marking) - expect(@submission.can_view_details?(@student)).to be true - end - it "returns true for submitting student if assignment anonymous grading and muted" do expect(@submission.can_view_details?(@student)).to be true end @@ -4700,6 +4677,9 @@ describe Submission do else assignment.submissions.find_by!(user: user) end + unless assignment.grades_published? || @submission.grade_posting_in_progress || assignment.permits_moderation?(user) + opts.delete(:grade) + end @submission.update!(opts) @submission end diff --git a/spec/models/user_learning_object_scopes_spec.rb b/spec/models/user_learning_object_scopes_spec.rb index dd6602cfc2c..7dc1ca8ee1c 100644 --- a/spec/models/user_learning_object_scopes_spec.rb +++ b/spec/models/user_learning_object_scopes_spec.rb @@ -752,6 +752,7 @@ describe UserLearningObjectScopes do end end @course2.assignments.first.update_attribute(:moderated_grading, true) + @course2.assignments.first.update_attribute(:grader_count, 2) end it "should not count assignments with no provisional grades" do diff --git a/spec/presenters/grade_summary_assignment_presenter_spec.rb b/spec/presenters/grade_summary_assignment_presenter_spec.rb index ce3062007f6..fe63a39a348 100644 --- a/spec/presenters/grade_summary_assignment_presenter_spec.rb +++ b/spec/presenters/grade_summary_assignment_presenter_spec.rb @@ -167,7 +167,6 @@ describe GradeSummaryAssignmentPresenter do describe "#show_submission_details_link?" do before :each do - @assignment.root_account.enable_feature!(:anonymous_moderated_marking) @submission_stub = double() allow(@submission_stub).to receive(:originality_reports_for_display) end diff --git a/spec/requests/gradebooks_spec.rb b/spec/requests/gradebooks_spec.rb index 4a3d1f22760..3cedef1acf6 100644 --- a/spec/requests/gradebooks_spec.rb +++ b/spec/requests/gradebooks_spec.rb @@ -62,22 +62,6 @@ describe 'Access Different Gradebooks Environments', type: :request do end end - describe 'anonymous_moderated_marking_enabled' do - it 'is false when the root account does not have anonymous_moderated_marking enabled' do - get speed_grader_course_gradebook_path(course_id: @course.id), params: { assignment_id: @assignment.id } - js_env = js_env_from_response(response) - - expect(js_env.fetch('anonymous_moderated_marking_enabled')).to be false - end - - it 'is true when the root account has anonymous_moderated_marking enabled' do - @course.root_account.enable_feature!(:anonymous_moderated_marking) - get speed_grader_course_gradebook_path(course_id: @course.id), params: { assignment_id: @assignment.id } - js_env = js_env_from_response(response) - expect(js_env.fetch('anonymous_moderated_marking_enabled')).to be true - end - end - describe 'show_help_menu_item' do it 'is false when the root account does not have a support URL configured' do get speed_grader_course_gradebook_path(course_id: @course.id), params: { assignment_id: @assignment.id } @@ -109,7 +93,6 @@ describe 'Access Different Gradebooks Environments', type: :request do context 'for a moderated assignment with no grades published' do before(:once) do - @course.root_account.enable_feature!(:anonymous_moderated_marking) @assignment.update!( final_grader: @teacher, grader_count: 2, @@ -133,6 +116,7 @@ describe 'Access Different Gradebooks Environments', type: :request do it 'is set to :grader for a moderated assignment whose grades have been published' do @assignment.update!( moderated_grading: true, + grader_count: 2, grades_published_at: Time.zone.now ) expect(js_env.fetch('grading_role')).to eq 'grader' @@ -187,27 +171,4 @@ describe 'Access Different Gradebooks Environments', type: :request do end end end - - describe 'GET #show' do - describe 'js_env' do - describe 'anonymous_moderated_marking_enabled' do - before(:each) do - user_session(@teacher) - end - - it 'is false when the root account does not have anonymous_moderated_marking enabled' do - get course_gradebook_path(course_id: @course.id) - js_env = js_env_from_response(response) - expect(js_env.dig('GRADEBOOK_OPTIONS', 'anonymous_moderated_marking_enabled')).to be false - end - - it 'is true when the root account has anonymous_moderated_marking enabled' do - @course.root_account.enable_feature!(:anonymous_moderated_marking) - get course_gradebook_path(course_id: @course.id) - js_env = js_env_from_response(response) - expect(js_env.dig('GRADEBOOK_OPTIONS', 'anonymous_moderated_marking_enabled')).to be true - end - end - end - end end diff --git a/spec/selenium/assignments/assignments_anonymous_moderated_spec.rb b/spec/selenium/assignments/assignments_anonymous_moderated_spec.rb index e9f5aa83c03..7715398fdba 100644 --- a/spec/selenium/assignments/assignments_anonymous_moderated_spec.rb +++ b/spec/selenium/assignments/assignments_anonymous_moderated_spec.rb @@ -22,8 +22,6 @@ describe 'Anonymous Moderated Marking' do include_context 'in-process server selenium tests' before(:each) do - Account.default.enable_feature!(:anonymous_moderated_marking) - # create a course with a teacher course_with_teacher(course_name: 'Course1') end diff --git a/spec/selenium/assignments/assignments_group_spec.rb b/spec/selenium/assignments/assignments_group_spec.rb index d5eb4582701..da757f61189 100644 --- a/spec/selenium/assignments/assignments_group_spec.rb +++ b/spec/selenium/assignments/assignments_group_spec.rb @@ -187,7 +187,7 @@ describe "assignment groups" do replace_content(f("#ag_#{ag.id}_assignment_name"), "Disappear") fj('.create_assignment:visible').click wait_for_ajaximations - + refresh_page expect(fj("#assignment_group_#{ag.id} .assignment:eq(1) .ig-title").text).to match "Disappear" f("#assignment_group_#{ag.id} .al-trigger").click @@ -264,6 +264,7 @@ describe "assignment groups" do replace_content(f("#ag_#{ag.id}_assignment_points"), assignment_points) fj('.create_assignment:visible').click wait_for_ajaximations + refresh_page # Checks for correct values in back end. a = ag.reload.assignments.last diff --git a/spec/selenium/assignments/assignments_moderated_spec.rb b/spec/selenium/assignments/assignments_moderated_spec.rb index 0df79d7e013..8547fbe6129 100644 --- a/spec/selenium/assignments/assignments_moderated_spec.rb +++ b/spec/selenium/assignments/assignments_moderated_spec.rb @@ -22,10 +22,12 @@ describe "moderated grading assignments" do include_context "in-process server selenium tests" before do + Account.default.enable_feature!(:moderated_grading) @course = course_model @course.offer! @assignment = @course.assignments.create!(submission_types: 'online_text_entry', title: 'Test Assignment') @assignment.update_attribute :moderated_grading, true + @assignment.update_attribute :grader_count, 2 @assignment.update_attribute :workflow_state, 'published' @student = User.create! @course.enroll_student(@student) @@ -33,35 +35,9 @@ describe "moderated grading assignments" do @course.enroll_ta(@user) end - it "publishes grades from the moderate screen" do - sub = @assignment.submit_homework(@student, :submission_type => 'online_text_entry', :body => 'hallo') - sub.find_or_create_provisional_grade!(@user, score: 80) - - course_with_teacher_logged_in course: @course - get "/courses/#{@course.id}/assignments/#{@assignment.id}/moderate" - f('.ModeratedGrading__Header-PublishBtn').click - driver.switch_to.alert.accept - assert_flash_notice_message("Success! Grades were published to the grade book") - end - - context "student tray" do - before(:each) do - @account = Account.default - @account.enable_feature!(:student_context_cards) - end - - it "moderated assignment should display student name in tray", priority: "1", test_id: 3022071 do - course_with_teacher_logged_in course: @course - get "/courses/#{@course.id}/assignments/#{@assignment.id}/moderate" - f("a[data-student_id='#{@student.id}']").click - expect(f(".StudentContextTray-Header__Name h2 a")).to include_text("User") - end - end - context "with assignment moderation setting" do before(:each) do # turn on the moderation flag - Account.default.enable_feature!(:anonymous_moderated_marking) Account.default.enable_feature!(:anonymous_marking) Account.default.enable_feature!(:moderated_grading) @moderated_assignment = @course.assignments.create!( @@ -105,7 +81,6 @@ describe "moderated grading assignments" do context "with moderator selected" do before(:each) do # turn on the moderation flag - Account.default.enable_feature!(:anonymous_moderated_marking) Account.default.enable_feature!(:anonymous_marking) # create 2 teachers diff --git a/spec/selenium/assignments/assignments_quizzes_spec.rb b/spec/selenium/assignments/assignments_quizzes_spec.rb index a3cf7dde46a..842d104ca04 100644 --- a/spec/selenium/assignments/assignments_quizzes_spec.rb +++ b/spec/selenium/assignments/assignments_quizzes_spec.rb @@ -31,6 +31,7 @@ describe "quizzes assignments" do ag = @course.assignment_groups.create!(:name => "Quiz group") get "/courses/#{@course.id}/assignments" build_assignment_with_type("Quiz", :assignment_group_id => ag.id, :name => "New Quiz", :submit => true) + refresh_page expect_new_page_load { f("#assignment_group_#{ag.id}_assignments .ig-title").click } expect(driver.current_url).to match %r{/courses/\d+/quizzes/\d+} end diff --git a/spec/selenium/assignments/assignments_spec.rb b/spec/selenium/assignments/assignments_spec.rb index d27e82cf588..c83b1c86a4f 100644 --- a/spec/selenium/assignments/assignments_spec.rb +++ b/spec/selenium/assignments/assignments_spec.rb @@ -72,6 +72,8 @@ describe "assignments" do before do @assignment = @course.assignments.create({name: "Test Moderated Assignment"}) @assignment.update_attribute(:moderated_grading, true) + @assignment.update_attribute(:grader_count, 1) + @assignment.update_attribute(:final_grader, @teacher) @assignment.unpublish end @@ -814,15 +816,14 @@ describe "assignments" do @course.start_at = nil @course.save! @assignment = @course.assignments.create({name: "Test Moderated Assignment"}) - @assignment.update_attribute(:moderated_grading, true) + @assignment.update_attributes( + moderated_grading: true, + grader_count: 1, + final_grader: @teacher + ) @assignment.publish end - it "should show the moderated grading page for moderated grading assignments", priority: "1", test_id: 609651 do - get "/courses/#{@course.id}/assignments/#{@assignment.id}/moderate" - expect(f('#assignment_moderation')).to be_displayed - end - it "should deny access for a regular student to the moderation page", priority: "1", test_id: 609652 do course_with_student_logged_in({course: @course}) get "/courses/#{@course.id}/assignments/#{@assignment.id}/moderate" diff --git a/spec/selenium/dashboard_teacher_spec.rb b/spec/selenium/dashboard_teacher_spec.rb index 5d7918b4e15..dc7e2347b15 100644 --- a/spec/selenium/dashboard_teacher_spec.rb +++ b/spec/selenium/dashboard_teacher_spec.rb @@ -128,7 +128,12 @@ describe "dashboard" do before do @teacher = @user @student = student_in_course(:course => @course, :active_all => true).user - @assignment = @course.assignments.create!(:title => "some assignment", :submission_types => ['online_text_entry'], :moderated_grading => true) + @assignment = @course.assignments.create!( + title: "some assignment", + submission_types: ['online_text_entry'], + moderated_grading: true, + grader_count: 2 + ) @assignment.submit_homework(@student, :body => "submission") end diff --git a/spec/selenium/grades/gradebook/gradebook_anonymous_moderated_marking_spec.rb b/spec/selenium/grades/gradebook/gradebook_anonymous_moderated_marking_spec.rb index bdc1a90e443..664f78f8c0b 100644 --- a/spec/selenium/grades/gradebook/gradebook_anonymous_moderated_marking_spec.rb +++ b/spec/selenium/grades/gradebook/gradebook_anonymous_moderated_marking_spec.rb @@ -23,7 +23,6 @@ describe 'Original Gradebook' do include GradebookCommon before(:each) do - Account.default.enable_feature!(:anonymous_moderated_marking) Account.default.enable_feature!(:anonymous_grading) # create a course with a teacher @@ -61,7 +60,7 @@ describe 'Original Gradebook' do student_enrollment2.update!(workflow_state: 'active') end - context 'with Anonymous Moderated Marking ON in submission detail' do + context 'submission detail' do before(:each) do user_session(@teacher1) Gradebook::MultipleGradingPeriods.visit_gradebook(@anonymous_course) @@ -77,7 +76,7 @@ describe 'Original Gradebook' do end end - context 'with Anonymous Moderated Marking ON has grade cells', priority: '1', test_id: 3496299 do + context 'has grade cells', priority: '1', test_id: 3496299 do before(:each) do user_session(@teacher1) Gradebook::MultipleGradingPeriods.visit_gradebook(@anonymous_course) @@ -90,11 +89,5 @@ describe 'Original Gradebook' do class_attribute_fetched = grade_cell_grayed.attribute("class") expect(class_attribute_fetched).to include "grayed-out cannot_edit" end - - it 'not greyed out with grades visible when assignment is unmuted' do - refresh_page - Gradebook::MultipleGradingPeriods.toggle_assignment_mute_option(@anonymous_assignment.id) - expect(Gradebook::MultipleGradingPeriods.cell_graded?("11", 0, 0)).to be true - end end end diff --git a/spec/selenium/grades/gradebook/gradebook_grade_edit_spec.rb b/spec/selenium/grades/gradebook/gradebook_grade_edit_spec.rb index e4f81f4a187..4b7a4604d1c 100644 --- a/spec/selenium/grades/gradebook/gradebook_grade_edit_spec.rb +++ b/spec/selenium/grades/gradebook/gradebook_grade_edit_spec.rb @@ -249,7 +249,6 @@ describe "editing grades" do context "for a moderated assignment" do before(:each) do # turn on the moderation flag - Account.default.enable_feature!(:anonymous_moderated_marking) Account.default.enable_feature!(:anonymous_marking) # create 1 teacher diff --git a/spec/selenium/grades/gradezilla/gradebook_anonymous_moderated_spec.rb b/spec/selenium/grades/gradezilla/gradebook_anonymous_moderated_spec.rb index 7880ed9abdf..0b302cb17a8 100644 --- a/spec/selenium/grades/gradezilla/gradebook_anonymous_moderated_spec.rb +++ b/spec/selenium/grades/gradezilla/gradebook_anonymous_moderated_spec.rb @@ -23,8 +23,6 @@ describe 'Anonymous Moderated Marking' do include_context 'in-process server selenium tests' before(:each) do - Account.default.enable_feature!(:anonymous_moderated_marking) - # create a course with a teacher course_with_teacher(course_name: 'Course1', active_all: true) end diff --git a/spec/selenium/grades/gradezilla/gradebook_assignment_column_options_spec.rb b/spec/selenium/grades/gradezilla/gradebook_assignment_column_options_spec.rb index e8a7358516d..bc151eb8c73 100644 --- a/spec/selenium/grades/gradezilla/gradebook_assignment_column_options_spec.rb +++ b/spec/selenium/grades/gradezilla/gradebook_assignment_column_options_spec.rb @@ -133,8 +133,7 @@ describe "Gradezilla - Assignment Column" do context "with anonymous assignment" do before(:each) do - # enable anonymous flags at account level - Account.default.enable_feature!(:anonymous_moderated_marking) + # enable anonymous flag at account level Account.default.enable_feature!(:anonymous_marking) # re-use the course and student setup from the describe block up-above diff --git a/spec/selenium/grades/gradezilla/gradebook_grade_edit_spec.rb b/spec/selenium/grades/gradezilla/gradebook_grade_edit_spec.rb index 2d0b90dcad8..f6b2bc3b9b8 100644 --- a/spec/selenium/grades/gradezilla/gradebook_grade_edit_spec.rb +++ b/spec/selenium/grades/gradezilla/gradebook_grade_edit_spec.rb @@ -273,7 +273,6 @@ describe "Gradezilla editing grades" do context "for a moderated assignment" do before(:each) do # turn on the moderation flag - Account.default.enable_feature!(:anonymous_moderated_marking) Account.default.enable_feature!(:anonymous_marking) now = Time.zone.now diff --git a/spec/selenium/grades/moderation/moderated_marking_spec.rb b/spec/selenium/grades/moderation/moderated_marking_spec.rb index a8188312571..e1fe0c019a0 100644 --- a/spec/selenium/grades/moderation/moderated_marking_spec.rb +++ b/spec/selenium/grades/moderation/moderated_marking_spec.rb @@ -25,7 +25,6 @@ describe 'Moderated Marking' do include_context 'in-process server selenium tests' before(:each) do - Account.default.enable_feature!(:anonymous_moderated_marking) Account.default.enable_feature!(:moderated_grading) # create a course with two teachers diff --git a/spec/selenium/grades/pages/speedgrader_page.rb b/spec/selenium/grades/pages/speedgrader_page.rb index 85018f9b194..427bf758998 100644 --- a/spec/selenium/grades/pages/speedgrader_page.rb +++ b/spec/selenium/grades/pages/speedgrader_page.rb @@ -45,7 +45,15 @@ class Speedgrader end def settings_link - f('#settings_link') + f('#speedgrader-settings button') + end + + def options_link + fxpath('//span[text() = "Options"]') + end + + def keyboard_shortcuts_link + fxpath('//ul[@role = "menu"]//span[text() = "Keyboard Shortcuts"]') end def hide_students_chkbox @@ -194,8 +202,16 @@ class Speedgrader settings_link.click end + def click_options_link + options_link.click + end + + def click_keyboard_shortcuts_link + keyboard_shortcuts_link.click + end + def select_hide_student_names - hide_students_chkbox + hide_students_chkbox.click end def click_next_student_btn diff --git a/spec/selenium/grades/speedgrader/speedgrader_anonymous_moderated_marking_spec.rb b/spec/selenium/grades/speedgrader/speedgrader_anonymous_moderated_marking_spec.rb index 19229d783ce..c15f393ab33 100644 --- a/spec/selenium/grades/speedgrader/speedgrader_anonymous_moderated_marking_spec.rb +++ b/spec/selenium/grades/speedgrader/speedgrader_anonymous_moderated_marking_spec.rb @@ -19,12 +19,11 @@ require_relative "../../common" require_relative "../../helpers/speed_grader_common" require_relative "../pages/speedgrader_page" -describe "SpeedGrader with Anonymous Moderated Marking enabled" do +describe "SpeedGrader with Anonymous Marking enabled" do include_context "in-process server selenium tests" include SpeedGraderCommon before do - Account.default.enable_feature!(:anonymous_moderated_marking) Account.default.enable_feature!(:anonymous_marking) course_with_teacher_logged_in outcome_with_rubric diff --git a/spec/selenium/grades/speedgrader/speedgrader_comments_spec.rb b/spec/selenium/grades/speedgrader/speedgrader_comments_spec.rb index 32869051766..bd4e1d84b34 100644 --- a/spec/selenium/grades/speedgrader/speedgrader_comments_spec.rb +++ b/spec/selenium/grades/speedgrader/speedgrader_comments_spec.rb @@ -164,8 +164,9 @@ describe "speed grader" do get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" expect(f("#avatar_image")).to be_displayed - f("#settings_link").click - f('#hide_student_names').click + Speedgrader.click_settings_link + Speedgrader.click_options_link + Speedgrader.select_hide_student_names expect_new_page_load { fj('.ui-dialog-buttonset .ui-button:visible:last').click } expect(f("#avatar_image")).not_to be_displayed diff --git a/spec/selenium/grades/speedgrader/speedgrader_discussion_submissions_spec.rb b/spec/selenium/grades/speedgrader/speedgrader_discussion_submissions_spec.rb index 093e93d1647..41f5f993534 100644 --- a/spec/selenium/grades/speedgrader/speedgrader_discussion_submissions_spec.rb +++ b/spec/selenium/grades/speedgrader/speedgrader_discussion_submissions_spec.rb @@ -84,8 +84,9 @@ describe "speed grader - discussion submissions" do it "hides the name of student on discussion iframe", priority: "2", test_id: 283746 do Speedgrader.visit(@course.id, @assignment.id) - f("#settings_link").click - f('#hide_student_names').click + Speedgrader.click_settings_link + Speedgrader.click_options_link + Speedgrader.select_hide_student_names expect_new_page_load { fj('.ui-dialog-buttonset .ui-button:visible:last').click } # check for correct submissions in speed grader iframe @@ -106,8 +107,9 @@ describe "speed grader - discussion submissions" do Speedgrader.visit(@course.id, @assignment.id) - f("#settings_link").click - f('#hide_student_names').click + Speedgrader.click_settings_link + Speedgrader.click_options_link + Speedgrader.select_hide_student_names expect_new_page_load { fj('.ui-dialog-buttonset .ui-button:visible:last').click } # check for correct submissions in speed grader iframe @@ -126,8 +128,9 @@ describe "speed grader - discussion submissions" do it "hides avatars on entries on both discussion links", priority: "2", test_id: 283748 do Speedgrader.visit(@course.id, @assignment.id) - f("#settings_link").click - f('#hide_student_names').click + Speedgrader.click_settings_link + Speedgrader.click_options_link + Speedgrader.select_hide_student_names expect_new_page_load { fj('.ui-dialog-buttonset .ui-button:visible:last').click } # check for correct submissions in speed grader iframe diff --git a/spec/selenium/grades/speedgrader/speedgrader_moderated_grading_spec.rb b/spec/selenium/grades/speedgrader/speedgrader_moderated_grading_spec.rb index 254437837a7..ca2a7b474d8 100644 --- a/spec/selenium/grades/speedgrader/speedgrader_moderated_grading_spec.rb +++ b/spec/selenium/grades/speedgrader/speedgrader_moderated_grading_spec.rb @@ -24,13 +24,16 @@ describe "speed grader" do include SpeedGraderCommon before(:once) do - course_factory(active_all: true) - outcome_with_rubric - @assignment = @course.assignments.new(:name => 'assignment with rubric', :points_possible => 10) - @assignment.moderated_grading = true - @assignment.save! - @association = @rubric.associate_with(@assignment, @course, :purpose => 'grading', :use_for_grading => true) - student_submission + @course = course_factory(active_all: true) + outcome_with_rubric(course: @course) + @assignment = @course.assignments.create!( + name: 'assignment with rubric', + points_possible: 10, + moderated_grading: true, + grader_count: 1 + ) + @association = @rubric.associate_with(@assignment, @course, purpose: 'grading', use_for_grading: true) + @submission = student_submission(assignment: @assignment) end before do @@ -66,8 +69,8 @@ describe "speed grader" do replace_content f('#grading-box-extended'), "8", tab_out: true wait_for_ajaximations end - @submission.reload - expect(@submission.updated_at.to_i).to eq time.to_i # should get touched + provisional_grade = @submission.provisional_grades.find_by!(scorer: @user) + expect(provisional_grade.grade).to eq '8' time2 = 10.minutes.from_now Timecop.freeze(time2) do @@ -117,571 +120,6 @@ describe "speed grader" do end include_examples "moderated grading" - - it "should be able to see a ta's provisional grade in read-only mode" do - other_ta = course_with_ta(:course => @course, :active_all => true).user - @submission.find_or_create_provisional_grade!(other_ta, score: 7) - @submission.add_comment(commenter: other_ta, comment: 'wat', provisional: true) - - get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - tab = f('#moderation_tabs li') - expect(tab).to be_displayed - expect(tab).to include_text("1st Reviewer") - expect(tab).to include_text("7/8") - - expect(f('#moderation_tabs')).to_not include_text("Add Review") - - grade = f('#grading-box-extended') - expect(grade['readonly']).to be_present - expect(grade['value']).to eq "7" - expect(f('#discussion span.comment').text).to be_include 'wat' - expect(f('#add_a_comment')).to_not be_displayed - end - - it "should be able to two ta's provisional grades in read-only mode" do - @assignment.moderated_grading_selections.create!(:student => @student) - - other_ta1 = course_with_ta(:course => @course, :active_all => true).user - @submission.find_or_create_provisional_grade!(other_ta1, score: 7) - @submission.add_comment(commenter: other_ta1, comment: 'wat', provisional: true) - - other_ta2 = course_with_ta(:course => @course, :active_all => true).user - pg2 = @submission.find_or_create_provisional_grade!(other_ta2, score: 6) - @submission.add_comment(commenter: other_ta2, comment: 'woo', provisional: true) - - get "/" # when run by itself this test works, but when run in conjunction with the others - # if we don't navigate to speedgrader from a different page, the anchor won't work locally - - anchor_tag = CGI.escape("{\"student_id\":#{@student.id},\"provisional_grade_id\":#{pg2.id}}") - get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}##{anchor_tag}" - f('#speedgrader_iframe') - - tab = f('#moderation_tabs li.ui-state-active') - expect(tab).to be_displayed - expect(tab).to include_text("2nd Reviewer") - expect(tab).to include_text("6/8") - - #open dropdown, make sure that the "Create 2nd Mark" link is not shown - f('#moderation_bar #new_mark_dropdown_link').click - wait_for_ajaximations - expect(f('#new_mark_link')).to_not be_displayed - - grade = f('#grading-box-extended') - expect(grade['readonly']).to be_present - expect(grade['value']).to eq "6" - expect(f('#discussion span.comment').text).to be_include 'woo' - expect(f('#add_a_comment')).to_not be_displayed - - f('#moderation_tabs li').click # switch to first tab - wait_for_ajaximations - tab = f('#moderation_tabs li.ui-state-active') - expect(tab).to be_displayed - expect(tab).to include_text("1st Reviewer") - expect(tab).to include_text("7/8") - - expect(grade['value']).to eq "7" - expect(f('#discussion span.comment').text).to be_include 'wat' - expect(f('#discussion span.comment').text).to_not be_include 'woo' - end - - it "should allow a second mark to be explicitly created by the moderator when student is selected for moderation" do - other_ta = course_with_ta(:course => @course, :active_all => true).user - @submission.find_or_create_provisional_grade!(other_ta, score: 7) - @assignment.moderated_grading_selections.create!(:student => @student) - - get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - expect(f("#students_selectmenu-button")).to have_class("not_graded") - - new_mark_dd = f('#moderation_bar #new_mark_dropdown_link') - expect(new_mark_dd).to include_text("Add Review") - new_mark_dd.click - wait_for_ajaximations - - new_mark_link = f('#new_mark_link') - expect(new_mark_link).to be_displayed - expect(new_mark_link).to include_text("Add 2nd Review") - new_mark_link.click - - wait_for_ajaximations - - # should be editable now - expect(f('#grading-box-extended')['disabled']).to be_nil - expect(f('#add_a_comment')).to be_displayed - - replace_content f('#grading-box-extended'), "8", tab_out: true - - submit_comment "srsly" - - @submission.reload - expect(@submission.score).to be_nil - - pg = @submission.provisional_grade(@teacher) - expect(pg.score.to_i).to eql 8 - expect(pg.submission_comments.map(&:comment)).to be_include 'srsly' - - tab = f('#moderation_tabs li.ui-state-active') - expect(tab).to include_text("2nd Reviewer") - expect(tab).to include_text("8/8") # should sync tab state - - ff('#moderation_tabs li')[0].click # switch from 1st to 2nd mark - should preserve new comments + grade - wait_for_ajaximations - ff('#moderation_tabs li')[1].click - - grade = f('#grading-box-extended') - expect(grade['disabled']).to be_nil - expect(grade['value']).to eq "8" - expect(f('#discussion span.comment').text).to be_include 'srsly' - end - - it "should work with new rubric assessments on a second mark" do - other_ta = course_with_ta(:course => @course, :active_all => true).user - @submission.find_or_create_provisional_grade!(other_ta, score: 7) - @assignment.moderated_grading_selections.create!(:student => @student) - - get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - f('#moderation_bar #new_mark_dropdown_link').click - wait_for_ajaximations - f('#new_mark_link').click - wait_for_ajaximations - - comment = "some silly comment" - add_rubric_assessment(2, comment) - - ra = @association.rubric_assessments.first - expect(ra.artifact).to be_a(ModeratedGrading::ProvisionalGrade) - expect(ra.artifact.score).to eq 2 - expect(ra.data[0][:comments]).to eq comment - - pg = @submission.provisional_grade(@teacher) - expect(pg.score.to_i).to eql 2 - - tab = f('#moderation_tabs li.ui-state-active') - expect(tab).to include_text("2nd Reviewer") - expect(tab).to include_text("2/8") # should sync tab state - - ff('#moderation_tabs li')[0].click # switch from 1st to 2nd mark - should preserve new comments + grade - wait_for_ajaximations - expect(f('#rubric_summary_container')).to_not include_text(comment) - ff('#moderation_tabs li')[1].click - wait_for_ajaximations - - grade = f('#grading-box-extended') - expect(grade['disabled']).to be_nil - expect(grade['value']).to eq "2" - expect(f('#rubric_summary_container')).to include_text(comment) - end - - it "should be able to see and edit a final mark given by another teacher" do - other_ta = course_with_ta(:course => @course, :active_all => true).user - @submission.find_or_create_provisional_grade!(other_ta, score: 7) - @assignment.moderated_grading_selections.create!(:student => @student) - - other_teacher = course_with_teacher(:course => @course, :active_all => true).user - final_pg = @submission.find_or_create_provisional_grade!(other_teacher, score: 3, final: true) - - get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - tabs = ff('#moderation_tabs > ul > li') - expect(tabs[1]).to_not be_displayed # no second mark - expect(tabs[1]).to have_class 'ui-state-disabled' - final_tab = tabs[2] - expect(final_tab).to be_displayed - expect(final_tab).to include_text("Moderator") - expect(final_tab).to include_text("3/8") - final_tab.click - wait_for_ajaximations - - grade = f('#grading-box-extended') - expect(grade['disabled']).to be_nil - expect(grade['value']).to eq "3" - replace_content grade, "8", tab_out: true - - submit_comment "srsly" - - @submission.reload - expect(@submission.score).to be_nil - - # shouldn't have created a prov grade for teacher - expect(@submission.provisional_grade(@moderator)).to be_a(ModeratedGrading::NullProvisionalGrade) - - final_pg.reload - expect(final_pg.score.to_i).to eql 8 - expect(final_pg.submission_comments.map(&:comment)).to be_include 'srsly' - expect(final_tab).to include_text("8/8") # should sync tab state - end - - it "should be able to add a rubric assessment to a final mark given by another teacher" do - other_ta = course_with_ta(:course => @course, :active_all => true).user - @submission.find_or_create_provisional_grade!(other_ta, score: 7) - @assignment.moderated_grading_selections.create!(:student => @student) - - other_teacher = course_with_teacher(:course => @course, :active_all => true).user - final_pg = @submission.find_or_create_provisional_grade!(other_teacher, score: 2, final: true) - - get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - tabs = ff('#moderation_tabs > ul > li') - final_tab = tabs[2] - final_tab.click - wait_for_ajaximations - - comment = "some silly comment" - add_rubric_assessment(3, comment) - - @submission.reload - expect(@submission.score).to be_nil - - # shouldn't have created a prov grade for teacher - expect(@submission.provisional_grade(@moderator)).to be_a(ModeratedGrading::NullProvisionalGrade) - - final_pg.reload - expect(final_pg.score.to_i).to eql 3 - expect(final_tab).to include_text("3/8") # should sync tab state - - ra = @association.rubric_assessments.first - expect(ra.artifact).to eq final_pg - expect(ra.data[0][:comments]).to eq comment - end - - it "should be able to create a new final mark" do - other_ta = course_with_ta(:course => @course, :active_all => true).user - @submission.find_or_create_provisional_grade!(other_ta, score: 7) - @assignment.moderated_grading_selections.create!(:student => @student) - - get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - f('#moderation_bar #new_mark_dropdown_link').click - wait_for_ajaximations - new_mark_final = f('#new_mark_final_link') - expect(new_mark_final).to be_displayed - new_mark_final.click - wait_for_ajaximations - - comment = "some silly comment" - add_rubric_assessment(3, comment) - - @submission.reload - expect(@submission.score).to be_nil - - # shouldn't have created a prov grade for teacher - expect(@submission.provisional_grade(@moderator)).to be_a(ModeratedGrading::NullProvisionalGrade) - - final_pg = @submission.find_or_create_provisional_grade!(@moderator, final: true) - expect(final_pg.score.to_i).to eql 3 - expect(ff('#moderation_tabs > ul > li')[2]).to include_text("3/8") # should sync tab state - - ra = @association.rubric_assessments.first - expect(ra.artifact).to eq final_pg - expect(ra.data[0][:comments]).to eq comment - end - - it "should be able to copy a 1st mark to the final mark" do - other_ta = course_with_ta(:course => @course, :active_all => true).user - @submission.find_or_create_provisional_grade!(other_ta, score: 7) - @assignment.moderated_grading_selections.create!(:student => @student) - - get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - f('#moderation_bar #new_mark_dropdown_link').click - wait_for_ajaximations - expect(f('#new_mark_copy_link2')).to_not be_displayed # since there is no 2nd mark to copy yet - copy_link = f('#new_mark_copy_link1') - expect(copy_link).to be_displayed - copy_link.click - wait_for_ajaximations - - @submission.reload - expect(@submission.score).to be_nil - expect(@submission.provisional_grade(@moderator)).to be_a(ModeratedGrading::NullProvisionalGrade) - - final_pg = @submission.find_or_create_provisional_grade!(@moderator, final: true) - expect(final_pg.score.to_i).to eql 7 - expect(ff('#moderation_tabs > ul > li')[2]).to include_text("7/8") - end - - it "should be able to copy a 2nd mark to the final mark" do - other_ta = course_with_ta(:course => @course, :active_all => true).user - @submission.find_or_create_provisional_grade!(other_ta, score: 7) - @assignment.moderated_grading_selections.create!(:student => @student) - - get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - f('#moderation_bar #new_mark_dropdown_link').click - wait_for_ajaximations - # make a 2nd mark to copy with a rubric assessment and comments - make sure they get copied - f('#new_mark_link').click - wait_for_ajaximations - - comment = "some silly comment" - add_rubric_assessment(3, comment) - - f('#speedgrader_comment_textarea').send_keys('srsly') - f('#add_a_comment button[type="submit"]').click - wait_for_ajaximations - - f('#moderation_bar #new_mark_dropdown_link').click - wait_for_ajaximations - f('#new_mark_copy_link2').click - wait_for_ajaximations - - final_tab = f('#moderation_tabs li.ui-state-active') # should be active tab - expect(final_tab).to include_text("Moderator") - expect(final_tab).to include_text("3/8") # should sync tab state - - expect(f('#rubric_summary_container')).to include_text(@rubric.title) - expect(f('#rubric_summary_container')).to include_text(comment) - - final_pg = @submission.find_or_create_provisional_grade!(@moderator, final: true) - expect(final_pg.score.to_i).to eql 3 - expect(final_pg.submission_comments.map(&:comment)).to be_include 'srsly' - - ra = @association.rubric_assessments.detect{|ra_local| ra_local.artifact == final_pg} - expect(ra.data[0][:comments]).to eq comment - end - - it "should be able to re-copy a mark to the final mark" do - other_ta = course_with_ta(:course => @course, :active_all => true).user - @submission.find_or_create_provisional_grade!(other_ta, score: 7) - @assignment.moderated_grading_selections.create!(:student => @student) - - other_teacher = course_with_teacher(:course => @course, :active_all => true).user - final_pg = @submission.find_or_create_provisional_grade!(other_teacher, score: 2, final: true) - - get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - f('#moderation_bar #new_mark_dropdown_link').click - wait_for_ajaximations - f('#new_mark_copy_link1').click - driver.switch_to.alert.accept # should get a warning that it will overwrite the current final mark - wait_for_ajaximations - - @submission.reload - expect(@submission.score).to be_nil - expect(@submission.provisional_grade(@moderator)).to be_a(ModeratedGrading::NullProvisionalGrade) - - final_pg.reload - expect(final_pg.score.to_i).to eql 7 - expect(ff('#moderation_tabs > ul > li')[2]).to include_text("7/8") - end - - context "grade reloading" do - it "should load the current provisional grades while switching students if it changed in the background" do - other_ta = course_with_ta(:course => @course, :active_all => true).user - original_sub = @submission - student_submission - - get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - f('#speedgrader_iframe') - - # doesn't show any tabs because there are no marks - expect(f('#moderation_tabs')).to_not be_displayed - - # go to next student - f('#next-student-button').click - wait_for_ajaximations - - Timecop.freeze(original_sub.updated_at) do - # create a mark for the first student, but don't cause the submission's updated_at to change just yet - original_sub.find_or_create_provisional_grade!(other_ta, score: 7) - end - - # go back - f('#prev-student-button').click - wait_for_ajaximations - - # should still not have loaded the new provisional grades - expect(f('#moderation_tabs')).to_not be_displayed - - f('#next-student-button').click - wait_for_ajaximations - - Timecop.freeze(5.minutes.from_now) do - original_sub.touch # now touch the submission as it would have been in the first place - end - - f('#prev-student-button').click - wait_for_ajaximations - - expect(f('#moderation_tabs')).to be_displayed - - tab = f('#moderation_tabs li.ui-state-active') - expect(tab).to include_text("1st Reviewer") - expect(tab).to include_text("7/8") - - grade = f('#grading-box-extended') - expect(grade['readonly']).to be_present - expect(grade['value']).to eq "7" - end - - it "should load the current provisional grades selection while switching students if it changed in the background" do - @other_ta = course_with_ta(:course => @course, :active_all => true).user - @pg1 = @submission.find_or_create_provisional_grade!(@other_ta, score: 7) - @selection = @assignment.moderated_grading_selections.create!(:student => @student) - - @other_ta2 = course_with_ta(:course => @course, :active_all => true).user - @pg2 = @submission.find_or_create_provisional_grade!(@other_ta2, score: 6) - - @final_pg = @submission.find_or_create_provisional_grade!(@moderator, score: 2, final: true) - - @selection.provisional_grade = @pg1 - @selection.save! - - original_sub = @submission - student_submission - - get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - f('#speedgrader_iframe') - - icons = ff('#moderation_tabs .selected_icon') - expect(icons[0]).to be_displayed - expect(icons[1]).to_not be_displayed - expect(icons[2]).to_not be_displayed - - f('#next-student-button').click - wait_for_ajaximations - - Timecop.freeze(5.minutes.from_now) do - @selection.provisional_grade = @pg2 - @selection.save! - original_sub.touch - end - - f('#prev-student-button').click - wait_for_ajaximations - - expect(icons[0]).to_not be_displayed - expect(icons[1]).to be_displayed - expect(icons[2]).to_not be_displayed - end - - it "should load the current provisional grade while switching students even if its from the same moderator" do - # why am I doing this... I guess just because I can - other_student = course_with_student(:course => @course, :active_all => true).user - - get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - f('#speedgrader_iframe') - - f('#next-student-button').click - wait_for_ajaximations - - expect(f('#this_student_does_not_have_a_submission')).to be_displayed - - f('#prev-student-button').click - wait_for_ajaximations - - @assignment.grade_student(other_student, grade: 5, grader: @moderator, provisional: true) - - f('#next-student-button').click - wait_for_ajaximations - - expect(f('#moderation_tabs')).to_not be_displayed # still should not show any tabs, since they own the one grade - grade = f('#grading-box-extended') - expect(grade['disabled']).to be_blank - expect(grade['value']).to eq "5" - end - end - - context "moderated grade selection" do - before :once do - @other_ta = course_with_ta(:course => @course, :active_all => true).user - @pg1 = @submission.find_or_create_provisional_grade!(@other_ta, score: 7) - @selection = @assignment.moderated_grading_selections.create!(:student => @student) - end - - it "should be able to select a provisional grade" do - @other_ta2 = course_with_ta(:course => @course, :active_all => true).user - @pg2 = @submission.find_or_create_provisional_grade!(@other_ta2, score: 6) - - @final_pg = @submission.find_or_create_provisional_grade!(@moderator, score: 2, final: true) - - @selection.provisional_grade = @pg1 - @selection.save! - - get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - - tabs = ff('#moderation_tabs > ul > li') - icons = ff('#moderation_tabs .selected_icon') - buttons = ff('#moderation_tabs button') - - # should show the 1st mark as selected on load - expect(icons[0]).to be_displayed - expect(icons[1]).to_not be_displayed - expect(icons[2]).to_not be_displayed - - expect(buttons[0]).to_not be_displayed # don't show the select button if already selected - expect(buttons[1]).to_not be_displayed - - tabs[2].click # show the final mark - wait_for_ajaximations - - expect(buttons[2]).to be_displayed - buttons[2].click - wait_for_ajaximations - check_element_has_focus(tabs[2]) - - expect(buttons[2]).to_not be_displayed - expect(icons[0]).to_not be_displayed - expect(icons[2]).to be_displayed # should show the final mark as selected - - @selection.reload - expect(@selection.provisional_grade).to eq @final_pg # should actually be selected - - # now repeat for the 2nd mark - tabs[1].click - wait_for_ajaximations - - expect(buttons[1]).to be_displayed - buttons[1].click - wait_for_ajaximations - - expect(buttons[1]).to_not be_displayed - expect(icons[0]).to_not be_displayed - expect(icons[1]).to be_displayed - expect(icons[2]).to_not be_displayed - - @selection.reload - expect(@selection.provisional_grade).to eq @pg2 # should actually be selected - end - - it "should be able to select a newly created provisional grade (once it's saved)" do - get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - f('#moderation_bar #new_mark_dropdown_link').click - wait_for_ajaximations - f('#new_mark_link').click - wait_for_ajaximations - - # should not show the select button until we have a real provisional grade - mark_tab2 = ff('#moderation_tabs > ul > li')[1] - mark_tab2_button = mark_tab2.find('button') - expect(mark_tab2_button).to_not be_displayed - - replace_content f('#grading-box-extended'), "8", tab_out: true - wait_for_ajaximations - - expect(mark_tab2_button).to be_displayed - mark_tab2_button.click # select the provisional grade - wait_for_ajaximations - - expect(mark_tab2_button).to_not be_displayed - expect(mark_tab2.find('.selected_icon')).to be_displayed - - @selection.reload - expect(@selection.provisional_grade).to eq @submission.provisional_grade(@moderator) - end - - it "should automatically select the copied final grade" do - @selection.provisional_grade = @pg1 - @selection.save! - - get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - - f('#moderation_bar #new_mark_dropdown_link').click - wait_for_ajaximations - f('#new_mark_copy_link1').click - wait_for_ajaximations - - @selection.reload - expect(@selection.provisional_grade).to eq @submission.provisional_grade(@moderator, final: true) - - icons = ff('#moderation_tabs .selected_icon') - expect(icons[0]).to_not be_displayed - expect(icons[2]).to be_displayed - end - end end context "as a provisional grader" do @@ -693,6 +131,7 @@ describe "speed grader" do include_examples "moderated grading" it "should not lock a provisional grader out if graded by self" do + @assignment.moderation_graders.create!(user: @ta, anonymous_id: '12345') @submission.find_or_create_provisional_grade!(@ta, score: 7) get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" @@ -700,13 +139,13 @@ describe "speed grader" do expect(f('#not_gradeable_message')).to_not be_displayed end - it "should lock a provisional grader out if graded by someone else (and not up for moderation)" do + it "should lock a provisional grader out if graded by someone else" do other_ta = course_with_ta(:course => @course, :active_all => true).user + @assignment.moderation_graders.create!(user: other_ta, anonymous_id: '12345') @submission.find_or_create_provisional_grade!(other_ta, score: 7) get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - expect(f('#grading-box-extended')).to_not be_displayed - expect(f('#not_gradeable_message')).to be_displayed + expect(driver.current_url).to_not match %r{/courses/#{@course.id}/gradebook/speed_grader} end it "should lock a provisional grader out if graded by someone else while switching students" do @@ -725,6 +164,7 @@ describe "speed grader" do wait_for_ajaximations # create a mark for the first student + @assignment.moderation_graders.create!(user: other_ta, anonymous_id: '12345') original_sub.find_or_create_provisional_grade!(other_ta, score: 7) # go back @@ -736,9 +176,10 @@ describe "speed grader" do expect(f('#not_gradeable_message')).to be_displayed end - it "should not lock a provisional grader out if someone else graded but the student is selected for moderation" do - @assignment.moderated_grading_selections.create!(:student => @student) + it "should not lock a provisional grader out if someone else graded but more grader slots are available" do + @assignment.update_attribute :grader_count, 2 other_ta = course_with_ta(:course => @course, :active_all => true).user + @assignment.moderation_graders.create!(user: other_ta, anonymous_id: '12345') @submission.find_or_create_provisional_grade!(other_ta, score: 7) get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" @@ -746,16 +187,15 @@ describe "speed grader" do expect(f('#not_gradeable_message')).to_not be_displayed end - it "should lock a provisional grader out the student is selected for moderation but two people have marked it" do - @assignment.moderated_grading_selections.create!(:student => @student) - other_ta1 = course_with_ta(:course => @course, :active_all => true).user - @submission.find_or_create_provisional_grade!(other_ta1, score: 7) - other_ta2 = course_with_ta(:course => @course, :active_all => true).user - @submission.find_or_create_provisional_grade!(other_ta2, score: 6) + it "should not lock a provisional grader out if someone else graded but grader is final grader" do + @assignment.update_attribute :final_grader, @ta + other_ta = course_with_ta(:course => @course, :active_all => true).user + @assignment.moderation_graders.create!(user: other_ta, anonymous_id: '12345') + @submission.find_or_create_provisional_grade!(other_ta, score: 7) get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - expect(f('#grading-box-extended')).to_not be_displayed - expect(f('#not_gradeable_message')).to be_displayed + expect(f('#grading-box-extended')).to be_displayed + expect(f('#not_gradeable_message')).to_not be_displayed end end end diff --git a/spec/selenium/grades/speedgrader/speedgrader_quiz_submissions_spec.rb b/spec/selenium/grades/speedgrader/speedgrader_quiz_submissions_spec.rb index 201fa838a68..bd107eb518b 100644 --- a/spec/selenium/grades/speedgrader/speedgrader_quiz_submissions_spec.rb +++ b/spec/selenium/grades/speedgrader/speedgrader_quiz_submissions_spec.rb @@ -16,6 +16,7 @@ # with this program. If not, see . require_relative "../../common" +require_relative "../pages/speedgrader_page" describe "speed grader - quiz submissions" do include_context "in-process server selenium tests" @@ -65,8 +66,9 @@ describe "speed grader - quiz submissions" do it "hides student's name from quiz if hide student names is enabled", priority: "1", test_id: 283744 do get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" - f("#settings_link").click - f('#hide_student_names').click + Speedgrader.click_settings_link + Speedgrader.click_options_link + Speedgrader.select_hide_student_names expect_new_page_load { fj('.ui-dialog-buttonset .ui-button:visible:last').click } wait_for_ajaximations in_frame 'speedgrader_iframe', '.quizzes-speedgrader' do diff --git a/spec/selenium/grades/speedgrader/speedgrader_spec.rb b/spec/selenium/grades/speedgrader/speedgrader_spec.rb index 33b34061a47..6c7b76af1f5 100644 --- a/spec/selenium/grades/speedgrader/speedgrader_spec.rb +++ b/spec/selenium/grades/speedgrader/speedgrader_spec.rb @@ -477,16 +477,16 @@ describe 'Speedgrader' do end it 'list all students', priority: "1", test_id: 164206 do - validate_speedgrader_student_list + validate_speedgrader_student_list(false) end it 'list alias when hide student name is selected', priority: "2", test_id: 164208 do Speedgrader.click_settings_link + Speedgrader.click_options_link Speedgrader.select_hide_student_names expect_new_page_load { fj('.ui-dialog-buttonset .ui-button:visible:last').click } - - validate_speedgrader_student_list + validate_speedgrader_student_list(true) end # speedgrader student dropdown shows assignment submission status symbols next to student names @@ -602,12 +602,12 @@ describe 'Speedgrader' do it 'opens and closes keyboard shortcut modal via blue info icon', priority: "2", test_id: 759319 do user_session(teacher) get "/courses/#{test_course.id}/gradebook/speed_grader?assignment_id=#{assignment.id}" - keyboard_shortcut_icon = f('#keyboard-shortcut-info-icon') - keyboard_modal = f('#keyboard_navigation') - expect(keyboard_shortcut_icon).to be_displayed + Speedgrader.click_settings_link + expect(Speedgrader.keyboard_shortcuts_link).to be_displayed # Open shortcut modal - keyboard_shortcut_icon.click + Speedgrader.click_keyboard_shortcuts_link + keyboard_modal = f('#keyboard_navigation') expect(keyboard_modal).to be_displayed # Close shortcut modal @@ -704,8 +704,12 @@ describe 'Speedgrader' do @assignment.grade_student @students[1], grade: grade2, grader: @teacher end - def validate_speedgrader_student_list + def validate_speedgrader_student_list(hide) Speedgrader.click_students_dropdown - (0..2).each{|num| expect(Speedgrader.student_dropdown_menu).to include_text(@students[num].name)} + if hide + (1..3).each{|num| expect(Speedgrader.student_dropdown_menu).to include_text("Student #{num}")} + else + (0..2).each{|num| expect(Speedgrader.student_dropdown_menu).to include_text(@students[num].name)} + end end end diff --git a/spec/selenium/grades/speedgrader/speedgrader_teacher_spec.rb b/spec/selenium/grades/speedgrader/speedgrader_teacher_spec.rb index f7fe932fbb6..7703ac276c4 100644 --- a/spec/selenium/grades/speedgrader/speedgrader_teacher_spec.rb +++ b/spec/selenium/grades/speedgrader/speedgrader_teacher_spec.rb @@ -20,6 +20,7 @@ require_relative "../../helpers/speed_grader_common" require_relative "../../helpers/gradebook_common" require_relative "../../helpers/quizzes_common" require_relative "../../helpers/groups_common" +require_relative "../pages/speedgrader_page" describe "speed grader" do include_context "in-process server selenium tests" @@ -183,8 +184,9 @@ describe "speed grader" do get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" Speedgrader.click_settings_link + Speedgrader.click_options_link click_option('#eg_sort_by', 'submitted_at', :value) - Speedgrader.select_hide_student_names.click + Speedgrader.select_hide_student_names expect_new_page_load do Speedgrader.submit_settings_form @@ -206,6 +208,7 @@ describe "speed grader" do get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" Speedgrader.click_settings_link + Speedgrader.click_options_link click_option('#eg_sort_by', 'submission_status', :value) Speedgrader.select_hide_student_names.click @@ -272,25 +275,29 @@ describe "speed grader" do get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" # sort by submission date - f("#settings_link").click + Speedgrader.click_settings_link + Speedgrader.click_options_link f('select#eg_sort_by option[value="submitted_at"]').click expect_new_page_load { fj('.ui-dialog-buttonset .ui-button:visible:last').click } expect(f('#combo_box_container .ui-selectmenu .ui-selectmenu-item-header')).to include_text @student.name # hide student names - f("#settings_link").click + Speedgrader.click_settings_link + Speedgrader.click_options_link f('#hide_student_names').click expect_new_page_load { fj('.ui-dialog-buttonset .ui-button:visible:last').click } expect(f('#combo_box_container .ui-selectmenu .ui-selectmenu-item-header')).to include_text "Student 1" # make sure it works a second time too - f("#settings_link").click + Speedgrader.click_settings_link + Speedgrader.click_options_link f('select#eg_sort_by option[value="alphabetically"]').click expect_new_page_load { fj('.ui-dialog-buttonset .ui-button:visible:last').click } expect(f('#combo_box_container .ui-selectmenu .ui-selectmenu-item-header')).to include_text "Student 1" # unselect the hide option - f("#settings_link").click + Speedgrader.click_settings_link + Speedgrader.click_options_link f('#hide_student_names').click expect_new_page_load { fj('.ui-dialog-buttonset .ui-button:visible:last').click } expect(f('#combo_box_container .ui-selectmenu .ui-selectmenu-item-header')).to include_text @student.name diff --git a/spec/selenium/help_dialog_spec.rb b/spec/selenium/help_dialog_spec.rb index 58994c5cc4f..57e6540d585 100644 --- a/spec/selenium/help_dialog_spec.rb +++ b/spec/selenium/help_dialog_spec.rb @@ -119,7 +119,7 @@ describe "help dialog" do expect(f("#help_tray")).not_to contain_css("a[href='#teacher_feedback']") end - it "should show the Help dialog on the speedGrader when help is clicked and feedback is enabled" do + it "shows the Help item in the SpeedGrader settings menu when feedback is enabled" do @course.enroll_student(User.create).accept! @assignment = @course.assignments.create @@ -130,14 +130,14 @@ describe "help dialog" do Setting.set('show_feedback_link', 'true') get "/courses/#{@course.id}/gradebook/speed_grader?assignment_id=#{@assignment.id}" wait_for_ajaximations - trigger = f('#gradebook_header .help_dialog_trigger') + + settings_menu = f('#speedgrader-settings') + settings_menu.click + + trigger = f('ul[role=menu] span[name=help][role=menuitem]') make_full_screen trigger.location_once_scrolled_into_view expect(trigger).to be_displayed - trigger.click - wait_for_ajaximations - expect(f("#help-dialog")).to be_displayed - expect(f("#help-dialog a[href='#create_ticket']")).to be_displayed end end diff --git a/spec/shared_examples/anonymous_moderated_marking/authorization.rb b/spec/shared_examples/anonymous_moderated_marking/authorization.rb index eee4aa731f8..f53d2243750 100644 --- a/spec/shared_examples/anonymous_moderated_marking/authorization.rb +++ b/spec/shared_examples/anonymous_moderated_marking/authorization.rb @@ -16,10 +16,9 @@ # with this program. If not, see . # -RSpec.shared_examples 'authorization when Anonymous Moderated Marking is enabled' do |http_verb| - before(:once) { @course.root_account.enable_feature!(:anonymous_moderated_marking) } - +RSpec.shared_examples 'authorization for provisional final grade selection' do |http_verb| it 'is unauthorized if the user is not the assigned final grader' do + @assignment.update_attribute(:final_grader_id, nil) api_call_as_user(@teacher, http_verb, @path, @params, {}, {}, expected_status: 401) end diff --git a/spec/shared_examples/provisional_grades.rb b/spec/shared_examples/provisional_grades.rb index 4bf52ea5807..e765ca56b2a 100644 --- a/spec/shared_examples/provisional_grades.rb +++ b/spec/shared_examples/provisional_grades.rb @@ -22,7 +22,7 @@ RSpec.shared_examples 'a provisional grades status action' do |controller| course_with_teacher(active_all: true) ta_in_course(active_all: true) @student = student_in_course(active_all: true).user - @assignment = @course.assignments.create!(moderated_grading: true) + @assignment = @course.assignments.create!(moderated_grading: true, grader_count: 2) @submission = @assignment.submit_homework @student, body: 'EHLO' @path = "/api/v1/courses/#{@course.id}/assignments/#{@assignment.id}/#{controller}/status" @resource_pair = if controller == :anonymous_provisional_grades @@ -49,29 +49,6 @@ RSpec.shared_examples 'a provisional grades status action' do |controller| expect(json.fetch('errors')).to include({'message' => 'user not authorized to perform that action'}) end - it 'when given a TA, it needs a provisional grade' do - json = api_call_as_user(@ta, :get, @path, @params, {}, {}, { expected_status: 200 }) - expect(json['needs_provisional_grade']).to be true - end - - it 'when given a TA and a selection exists, it needs a provisional grade' do - @assignment.moderated_grading_selections.create!(student: @student) - json = api_call_as_user(@ta, :get, @path, @params, {}, {}, { expected_status: 200 }) - expect(json['needs_provisional_grade']).to be true - end - - it 'when given a TA and a teacher-created provisional grade exists, it does not need a provisional grade' do - @submission.find_or_create_provisional_grade!(@teacher) - json = api_call_as_user(@ta, :get, @path, @params, {}, {}, { expected_status: 200 }) - expect(json['needs_provisional_grade']).to be false - end - - it 'when given a TA and a TA-created provisional grade, it does not need a provisional grade' do - @submission.find_or_create_provisional_grade!(@ta) - json = api_call_as_user(@ta, :get, @path, @params, {}, {}, { expected_status: 200 }) - expect(json['needs_provisional_grade']).to be false - end - it 'when called as a student, error message is not found' do @params[@resource_pair.flatten.first] = nil json = api_call_as_user(@ta, :get, @path, @params, {}, {}, { expected_status: 404 }) @@ -85,7 +62,6 @@ RSpec.shared_examples 'a provisional grades status action' do |controller| end before(:once) do - @assignment.root_account.enable_feature!(:anonymous_moderated_marking) @assignment.update!(grader_count: 1, final_grader: @teacher) @ta.update!(name: 'Nobody Important') diff --git a/spec/shared_examples/update_submission.rb b/spec/shared_examples/update_submission.rb index a601667b842..356a6647430 100644 --- a/spec/shared_examples/update_submission.rb +++ b/spec/shared_examples/update_submission.rb @@ -296,7 +296,7 @@ RSpec.shared_examples 'a submission update action' do |controller| before :once do course_with_student(active_all: true) @assignment = @course.assignments.create!(title: "some assignment", - submission_types: "online_url,online_upload", moderated_grading: true) + submission_types: "online_url,online_upload", moderated_grading: true, grader_count: 2) @submission = @assignment.submit_homework(@user) end @@ -343,7 +343,6 @@ RSpec.shared_examples 'a submission update action' do |controller| before(:once) do course_with_student(active_all: true) teacher_in_course(active_all: true) - @course.root_account.enable_feature!(:anonymous_moderated_marking) @assignment = @course.assignments.create!( title: 'yet another assignment', diff --git a/spec/views/courses/_to_do_list.html.erb_spec.rb b/spec/views/courses/_to_do_list.html.erb_spec.rb index 2e08cfd1295..ded9faccd1a 100644 --- a/spec/views/courses/_to_do_list.html.erb_spec.rb +++ b/spec/views/courses/_to_do_list.html.erb_spec.rb @@ -135,7 +135,8 @@ describe "courses/_to_do_list.html.erb" do submission_types: "online_text_entry", points_possible: 15, title: "ModerateMe", - moderated_grading: true) + moderated_grading: true, + grader_count: 2) allow_any_instance_of(Assignments::NeedsGradingCountQuery).to receive(:manual_count).and_return(1) @submission = submission_model(assignment: @assignment, body: "my submission") @submission.find_or_create_provisional_grade!(@teacher, grade: 5) diff --git a/spec/views/gradebooks/grade_summary.html.erb_spec.rb b/spec/views/gradebooks/grade_summary.html.erb_spec.rb index 73f9008df9b..6c1c9d5ac26 100644 --- a/spec/views/gradebooks/grade_summary.html.erb_spec.rb +++ b/spec/views/gradebooks/grade_summary.html.erb_spec.rb @@ -84,13 +84,12 @@ describe "/gradebooks/grade_summary" do expect(response.body).to match(/Test Student scores are not included in grade statistics./) end - describe "submission details link when anonymous_moderated_marking enabled" do + describe "submission details link" do before(:each) do course_with_teacher student_in_course @assignment = @course.assignments.create!(title: 'Moderated Assignment', anonymous_grading: true, muted: true) @assignment.submit_homework @student, :submission_type => "online_text_entry", :body => "o hai" - @assignment.root_account.enable_feature!(:anonymous_moderated_marking) @submission_details_url = context_url(@course, :context_assignment_submission_url, @assignment, @student.id) end