From f985f36bda1c5b1725e2c1474a4e41dceeb3ec84 Mon Sep 17 00:00:00 2001 From: Armin Kirchner Date: Wed, 21 May 2025 10:57:15 +0200 Subject: [PATCH 1/4] Allow reporting of malicious content RfCs are user generated content that can be reviewed by other users. This feature can be misused. A simple email based reporting mechanism has been added allow users to report this malicious content. The UI for the RfC comment are part of a separate change. Relates to #2715 --- .../request_for_comments_controller.rb | 11 +- app/mailers/report_mailer.rb | 11 ++ app/policies/request_for_comment_policy.rb | 8 ++ .../report_mailer/report_content.html.slim | 4 + .../report_mailer/report_content.text.slim | 7 ++ .../request_for_comments/_report.html.slim | 5 + app/views/request_for_comments/show.html.slim | 1 + config/code_ocean.yml.example | 9 ++ config/locales/de/report.yml | 7 ++ config/locales/de/request_for_comment.yml | 4 + config/locales/en/report.yml | 7 ++ config/locales/en/request_for_comment.yml | 4 + config/routes.rb | 1 + spec/controllers/comments_controller_spec.rb | 4 +- spec/factories/comment.rb | 10 ++ spec/factories/request_for_comment.rb | 2 +- .../mailers/previews/report_mailer_preview.rb | 9 ++ spec/mailers/report_mailer_spec.rb | 27 +++++ .../request_for_comment_policy_spec.rb | 100 ++++++++++++++++++ spec/request/request_for_comments_spec.rb | 19 ++++ ...report_request_for_comments_system_spec.rb | 36 +++++++ 21 files changed, 282 insertions(+), 4 deletions(-) create mode 100644 app/mailers/report_mailer.rb create mode 100644 app/views/report_mailer/report_content.html.slim create mode 100644 app/views/report_mailer/report_content.text.slim create mode 100644 app/views/request_for_comments/_report.html.slim create mode 100644 config/locales/de/report.yml create mode 100644 config/locales/en/report.yml create mode 100644 spec/factories/comment.rb create mode 100644 spec/mailers/previews/report_mailer_preview.rb create mode 100644 spec/mailers/report_mailer_spec.rb create mode 100644 spec/request/request_for_comments_spec.rb create mode 100644 spec/system/report_request_for_comments_system_spec.rb diff --git a/app/controllers/request_for_comments_controller.rb b/app/controllers/request_for_comments_controller.rb index f446148c0..514f42ebc 100644 --- a/app/controllers/request_for_comments_controller.rb +++ b/app/controllers/request_for_comments_controller.rb @@ -2,7 +2,7 @@ class RequestForCommentsController < ApplicationController include CommonBehavior - before_action :set_request_for_comment, only: %i[show mark_as_solved set_thank_you_note clear_question] + before_action :set_request_for_comment, only: %i[show mark_as_solved set_thank_you_note clear_question report] before_action :set_study_group_grouping, only: %i[index my_comment_requests rfcs_with_my_comments rfcs_for_exercise] @@ -162,6 +162,15 @@ def create authorize! end + # POST /request_for_comments/1/report + def report + authorize! + + ReportMailer.with(reported_content: @request_for_comment).report_content.deliver_later + + redirect_to(@request_for_comment, notice: t('.report.reported')) + end + private # Use callbacks to share common setup or constraints between actions. diff --git a/app/mailers/report_mailer.rb b/app/mailers/report_mailer.rb new file mode 100644 index 000000000..62ef953b5 --- /dev/null +++ b/app/mailers/report_mailer.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class ReportMailer < ApplicationMailer + default to: CodeOcean::Config.new(:code_ocean).read.dig(:content_moderation, :report_emails) + + def report_content + @reported_content = params.fetch(:reported_content) + + mail(subject: I18n.t('report_mailer.report_content.subject', content_name: @reported_content.model_name.human)) + end +end diff --git a/app/policies/request_for_comment_policy.rb b/app/policies/request_for_comment_policy.rb index 908794256..03ef8dcde 100644 --- a/app/policies/request_for_comment_policy.rb +++ b/app/policies/request_for_comment_policy.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class RequestForCommentPolicy < ApplicationPolicy + REPORT_RECEIVER_CONFIGURED = CodeOcean::Config.new(:code_ocean).read.dig(:content_moderation, :report_emails).present? + def create? everyone end @@ -41,6 +43,12 @@ def rfcs_with_my_comments? everyone end + def report? + REPORT_RECEIVER_CONFIGURED && show? && !author? + end + + private + def rfc_visibility # The consumer with the most restricted visibility determines the visibility of the RfC case [@user.consumer.rfc_visibility, @record.author.consumer.rfc_visibility] diff --git a/app/views/report_mailer/report_content.html.slim b/app/views/report_mailer/report_content.html.slim new file mode 100644 index 000000000..4f5f9f5e1 --- /dev/null +++ b/app/views/report_mailer/report_content.html.slim @@ -0,0 +1,4 @@ +h3 = t('.prolog') +blockquote style="white-space: pre-wrap;" = @reported_content.question +p = t('.take_action') +p = link_to(request_for_comment_url(@reported_content), request_for_comment_url(@reported_content)) diff --git a/app/views/report_mailer/report_content.text.slim b/app/views/report_mailer/report_content.text.slim new file mode 100644 index 000000000..6acaf5402 --- /dev/null +++ b/app/views/report_mailer/report_content.text.slim @@ -0,0 +1,7 @@ +== t('.prolog') +== "\n\n" +== @reported_content.question.lines.map { "> #{it}" }.join +== "\n\n" +== t('.take_action') +== "\n\n" +== request_for_comment_url(@reported_content) diff --git a/app/views/request_for_comments/_report.html.slim b/app/views/request_for_comments/_report.html.slim new file mode 100644 index 000000000..88662ca5c --- /dev/null +++ b/app/views/request_for_comments/_report.html.slim @@ -0,0 +1,5 @@ +- if policy(request_for_comment).report? + .text-end + = button_to t('.report'), report_request_for_comment_path(request_for_comment), + data: {confirm: t('.confirm')}, + class: 'btn btn-light btn-sm' diff --git a/app/views/request_for_comments/show.html.slim b/app/views/request_for_comments/show.html.slim index e80eae1de..29c07b910 100644 --- a/app/views/request_for_comments/show.html.slim +++ b/app/views/request_for_comments/show.html.slim @@ -28,6 +28,7 @@ .text - question = @request_for_comment.question = question.presence || t('request_for_comments.no_question') + = render('report', request_for_comment: @request_for_comment) - if policy(@request_for_comment).mark_as_solved? && !@request_for_comment.solved? = render('mark_as_solved') diff --git a/config/code_ocean.yml.example b/config/code_ocean.yml.example index 3da08cec8..d50e55071 100644 --- a/config/code_ocean.yml.example +++ b/config/code_ocean.yml.example @@ -55,6 +55,12 @@ default: &default # be truly greater than any permitted execution time of an execution environment. unused_runner_expiration_time: 180 + content_moderation: + # Learners can report inappropriate content, such as offensive RfCs or comments. + # For each report, an email is sent to all addresses listed below. If no address is + # configured, learners cannot report user-generated content. + report_emails: + # - report@example.com development: <<: *default @@ -62,6 +68,9 @@ development: enabled: true codeharbor: enabled: true + content_moderation: + report_emails: + - report@example.com production: diff --git a/config/locales/de/report.yml b/config/locales/de/report.yml new file mode 100644 index 000000000..fe2851b06 --- /dev/null +++ b/config/locales/de/report.yml @@ -0,0 +1,7 @@ +--- +de: + report_mailer: + report_content: + prolog: 'Die folgenden Inhalte wurden als unangemessen gemeldet:' + subject: 'Spam Report: Ein %{content_name} in CodeOcean wurde als unangemessen markiert.' + take_action: Bitte ergreifen Sie gegebenenfalls Maßnahmen. diff --git a/config/locales/de/request_for_comment.yml b/config/locales/de/request_for_comment.yml index 3750fe803..5e961aaf2 100644 --- a/config/locales/de/request_for_comment.yml +++ b/config/locales/de/request_for_comment.yml @@ -42,6 +42,10 @@ de: no_output: Keine Ausgabe. no_question: Der/die Autor:in hat keine Frage zu dieser Anfrage gestellt. passed: Erfolgreich + report: + confirm: Möchten Sie diesen Inhalt melden? + report: Melden + reported: Vielen Dank, dass Sie uns auf dieses Problem aufmerksam gemacht haben. Wir werden uns in Kürze darum kümmern. runtime_output: Programmausgabe send_thank_you_note: Senden show_all: Alle Anfragen anzeigen diff --git a/config/locales/en/report.yml b/config/locales/en/report.yml new file mode 100644 index 000000000..48e08f387 --- /dev/null +++ b/config/locales/en/report.yml @@ -0,0 +1,7 @@ +--- +en: + report_mailer: + report_content: + prolog: 'The following content has been reported as inappropriate:' + subject: 'Spam Report: A %{content_name} on CodeOcean has been marked as inappropriate.' + take_action: Please take action if required. diff --git a/config/locales/en/request_for_comment.yml b/config/locales/en/request_for_comment.yml index 4faf5c4b9..85201cbb6 100644 --- a/config/locales/en/request_for_comment.yml +++ b/config/locales/en/request_for_comment.yml @@ -42,6 +42,10 @@ en: no_output: No output. no_question: The author did not enter a question for this request. passed: Passed + report: + confirm: Do you want to report this content? + report: Report + reported: Thank you for letting us know about this issue. We will look into the matter shortly. runtime_output: Runtime Output send_thank_you_note: Send show_all: All requests diff --git a/config/routes.rb b/config/routes.rb index 156a449f8..d12d3e5c0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -21,6 +21,7 @@ get :mark_as_solved, defaults: {format: :json} post :set_thank_you_note, defaults: {format: :json} post :clear_question + post :report end end resources :comments, defaults: {format: :json} diff --git a/spec/controllers/comments_controller_spec.rb b/spec/controllers/comments_controller_spec.rb index 610ee4d21..a33698c98 100644 --- a/spec/controllers/comments_controller_spec.rb +++ b/spec/controllers/comments_controller_spec.rb @@ -5,8 +5,8 @@ RSpec.describe CommentsController do render_views - let(:user) { create(:learner) } - let(:rfc_with_comment) { create(:rfc_with_comment, user:) } + let(:user) { comment.user } + let(:rfc_with_comment) { create(:rfc_with_comment) } let(:comment) { rfc_with_comment.comments.first } let(:updated_comment) { comment.reload } let(:perform_request) { proc { put :update, format: :json, params: {id: comment.id, comment: comment_params} } } diff --git a/spec/factories/comment.rb b/spec/factories/comment.rb new file mode 100644 index 000000000..b6fc86b36 --- /dev/null +++ b/spec/factories/comment.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :comment do + file { create(:rfc).file } + user factory: :learner + row { 1 } + text { "comment on file #{file.id} on #{row}" } + end +end diff --git a/spec/factories/request_for_comment.rb b/spec/factories/request_for_comment.rb index 14c8c67f4..4c2720272 100644 --- a/spec/factories/request_for_comment.rb +++ b/spec/factories/request_for_comment.rb @@ -12,7 +12,7 @@ factory :rfc_with_comment, class: 'RequestForComment' do after(:create) do |rfc| - Comment.create(file: rfc.file, user: rfc.user, row: 1, text: "comment for rfc #{rfc.question}") + create(:comment, file: rfc.file) end end end diff --git a/spec/mailers/previews/report_mailer_preview.rb b/spec/mailers/previews/report_mailer_preview.rb new file mode 100644 index 000000000..331cd4de5 --- /dev/null +++ b/spec/mailers/previews/report_mailer_preview.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class ReportMailerPreview < ActionMailer::Preview + def report + rfc = FactoryBot.build_stubbed(:rfc) + + ReportMailer.with(reported_content: rfc).report_content + end +end diff --git a/spec/mailers/report_mailer_spec.rb b/spec/mailers/report_mailer_spec.rb new file mode 100644 index 000000000..65b14f51a --- /dev/null +++ b/spec/mailers/report_mailer_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe ReportMailer do + describe '#report_content' do + subject(:mail) { described_class.with(reported_content:).report_content } + + context 'when an RfC is reported' do + let(:question) { 'Inappropriate content for RfC.' } + let(:reported_content) { create(:rfc, question:) } + + it 'sets the correct sender' do + expect(mail.from).to include('codeocean@openhpi.de') + end + + it 'sets the correct subject' do + expect(mail.subject).to eq(I18n.t('report_mailer.report_content.subject', content_name: RequestForComment.model_name.human)) + end + + it 'includes the reported content' do + expect(mail.text_part.body).to include(question) + expect(mail.html_part.body).to include(question) + end + end + end +end diff --git a/spec/policies/request_for_comment_policy_spec.rb b/spec/policies/request_for_comment_policy_spec.rb index 9925d8396..5ec21715b 100644 --- a/spec/policies/request_for_comment_policy_spec.rb +++ b/spec/policies/request_for_comment_policy_spec.rb @@ -5,6 +5,12 @@ RSpec.describe RequestForCommentPolicy do subject(:policy) { described_class } + let(:reports_enabled) { false } + + before do + stub_const('RequestForCommentPolicy::REPORT_RECEIVER_CONFIGURED', reports_enabled) + end + context 'when the RfC visibility is not considered' do let(:submission) { create(:submission, study_group: create(:study_group)) } let(:rfc) { create(:rfc, submission:, user: submission.contributor) } @@ -46,6 +52,27 @@ end end end + + permissions(:report?) do + context 'when report emails are configured' do + let(:reports_enabled) { true } + + it 'allows anyone to report RfCs expect the author' do + %i[admin external_user teacher].each do |factory_name| + expect(policy).to permit(create(factory_name), rfc) + end + expect(policy).not_to permit(rfc.author, rfc) + end + end + + context 'when no report email is configured' do + it 'does not allow reports from anyone' do + %i[admin external_user teacher].each do |factory_name| + expect(policy).not_to permit(create(factory_name), rfc) + end + end + end + end end context 'when the RfC visibility is considered' do @@ -66,6 +93,24 @@ end end + shared_examples 'grants report permissions to everyone but the author' do + permissions(:report?) do + let(:reports_enabled) { true } + + it 'grants report permissions to everyone but the author' do + %i[external_user teacher admin].each do |factory_name| + expect(policy).to permit(create(factory_name, consumer: viewer_consumer, study_groups: viewer_study_groups), rfc) + end + expect(policy).not_to permit(rfc.author, rfc) + end + + it 'grants report permissions to other authors of the programming group' do + rfc.submission.update(contributor: programming_group) + expect(policy).to permit(viewer_other_group_member, rfc) + end + end + end + shared_examples 'grants access to admins and authors only' do it 'grants access to admins' do expect(policy).to permit(create(:admin, consumer: viewer_consumer, study_groups: viewer_study_groups), rfc) @@ -87,6 +132,31 @@ end end + shared_examples 'grants report permissions to admins and other authors only' do + permissions(:report?) do + let(:reports_enabled) { true } + + it 'grants report permissions to admins' do + expect(policy).to permit(create(:admin, consumer: viewer_consumer, study_groups: viewer_study_groups), rfc) + end + + it 'does not grant report permissions to authors' do + expect(policy).not_to permit(rfc.author, rfc) + end + + it 'grant report permissions to other authors of the programming group' do + rfc.submission.update(contributor: programming_group) + expect(policy).to permit(viewer_other_group_member, rfc) + end + + it 'does not grant report permissions to all other users' do + %i[external_user teacher].each do |factory_name| + expect(policy).not_to permit(create(factory_name, consumer: viewer_consumer, study_groups: viewer_study_groups), rfc) + end + end + end + end + let(:rfc_author) { create(:learner, consumer: author_consumer, study_groups: author_study_groups) } let(:author_study_groups) { create_list(:study_group, 1, consumer: author_consumer) } let(:rfc) { create(:rfc, user: rfc_author) } @@ -111,6 +181,8 @@ it_behaves_like 'grants access to admins and authors only' end end + + it_behaves_like 'grants report permissions to everyone but the author' end context "when the viewer's rfc_visibility is set to consumer" do @@ -122,6 +194,8 @@ it_behaves_like 'grants access to admins and authors only' end end + + it_behaves_like 'grants report permissions to admins and other authors only' end context "when the viewer's rfc_visibility is set to study_group" do @@ -133,6 +207,8 @@ it_behaves_like 'grants access to admins and authors only' end end + + it_behaves_like 'grants report permissions to admins and other authors only' end end @@ -151,6 +227,8 @@ it_behaves_like 'grants access to admins and authors only' end end + + it_behaves_like 'grants report permissions to everyone but the author' end context 'when the viewer is from the same study group' do @@ -165,6 +243,8 @@ it_behaves_like 'grants access to admins and authors only' end end + + it_behaves_like 'grants report permissions to everyone but the author' end end end @@ -182,6 +262,8 @@ it_behaves_like 'grants access to admins and authors only' end end + + it_behaves_like 'grants report permissions to admins and other authors only' end context "when the viewer's rfc_visibility is set to consumer" do @@ -193,6 +275,8 @@ it_behaves_like 'grants access to admins and authors only' end end + + it_behaves_like 'grants report permissions to admins and other authors only' end context "when the viewer's rfc_visibility is set to study_group" do @@ -204,6 +288,8 @@ it_behaves_like 'grants access to admins and authors only' end end + + it_behaves_like 'grants report permissions to admins and other authors only' end end @@ -222,6 +308,8 @@ it_behaves_like 'grants access to admins and authors only' end end + + it_behaves_like 'grants report permissions to everyone but the author' end context 'when the viewer is from the same study group' do @@ -236,6 +324,8 @@ it_behaves_like 'grants access to admins and authors only' end end + + it_behaves_like 'grants report permissions to everyone but the author' end end end @@ -253,6 +343,8 @@ it_behaves_like 'grants access to admins and authors only' end end + + it_behaves_like 'grants report permissions to admins and other authors only' end context "when the viewer's rfc_visibility is set to consumer" do @@ -264,6 +356,8 @@ it_behaves_like 'grants access to admins and authors only' end end + + it_behaves_like 'grants report permissions to admins and other authors only' end context "when the viewer's rfc_visibility is set to study_group" do @@ -275,6 +369,8 @@ it_behaves_like 'grants access to admins and authors only' end end + + it_behaves_like 'grants report permissions to admins and other authors only' end end @@ -289,6 +385,8 @@ it_behaves_like 'grants access to admins and authors only' end end + + it_behaves_like 'grants report permissions to admins and other authors only' end context 'when the viewer is from the same study group' do @@ -303,6 +401,8 @@ it_behaves_like 'grants access to admins and authors only' end end + + it_behaves_like 'grants report permissions to everyone but the author' end end end diff --git a/spec/request/request_for_comments_spec.rb b/spec/request/request_for_comments_spec.rb new file mode 100644 index 000000000..b8c553aa1 --- /dev/null +++ b/spec/request/request_for_comments_spec.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'POST /request_for_comments/:rfc_id/report', type: :request do + let(:user) { create(:learner) } + let(:rfc) { create(:rfc) } + + before do + stub_const('RequestForCommentPolicy::REPORT_RECEIVER_CONFIGURED', true) + allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(user) + end + + it 'sends an email to let admins know about the report' do + expect { post(report_request_for_comment_path(rfc)) } + .to have_enqueued_mail(ReportMailer, :report_content) + .with(params: {reported_content: rfc}, args: []) + end +end diff --git a/spec/system/report_request_for_comments_system_spec.rb b/spec/system/report_request_for_comments_system_spec.rb new file mode 100644 index 000000000..0c812b182 --- /dev/null +++ b/spec/system/report_request_for_comments_system_spec.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Report RfCs for unapprporiat content' do + let(:user) { create(:teacher) } + + before do + stub_const('RequestForCommentPolicy::REPORT_RECEIVER_CONFIGURED', reports_enabled) + visit(sign_in_path) + fill_in('email', with: user.email) + fill_in('password', with: attributes_for(:teacher)[:password]) + click_button(I18n.t('sessions.new.link')) + visit(request_for_comment_path(create(:rfc))) + end + + context 'when reporting is enabled' do + let(:reports_enabled) { true } + + it 'allows reporting of RfCs', :js do + accept_confirm do + click_on I18n.t('request_for_comments.report.report') + end + + expect(page).to have_text(I18n.t('request_for_comments.report.reported')) + end + end + + context 'when reporting is disabled' do + let(:reports_enabled) { false } + + it 'does not display the report button' do + expect(page).to have_no_button(I18n.t('request_for_comments.report.report')) + end + end +end From 92a6a7f7a9e44df2d4ee1ae4d3997c57f5962abd Mon Sep 17 00:00:00 2001 From: Armin Kirchner Date: Tue, 1 Jul 2025 12:48:36 +0200 Subject: [PATCH 2/4] View design fix --- app/views/request_for_comments/_report.html.slim | 10 ++++++---- app/views/request_for_comments/show.html.slim | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/views/request_for_comments/_report.html.slim b/app/views/request_for_comments/_report.html.slim index 88662ca5c..9f316445f 100644 --- a/app/views/request_for_comments/_report.html.slim +++ b/app/views/request_for_comments/_report.html.slim @@ -1,5 +1,7 @@ +/# locals: (request_for_comment:) + - if policy(request_for_comment).report? - .text-end - = button_to t('.report'), report_request_for_comment_path(request_for_comment), - data: {confirm: t('.confirm')}, - class: 'btn btn-light btn-sm' + = button_to t('.report'), report_request_for_comment_path(request_for_comment), + data: {confirm: t('.confirm')}, + class: 'btn btn-light btn-sm', + form: {class: 'd-inline float-end'} diff --git a/app/views/request_for_comments/show.html.slim b/app/views/request_for_comments/show.html.slim index 29c07b910..7b530d4e7 100644 --- a/app/views/request_for_comments/show.html.slim +++ b/app/views/request_for_comments/show.html.slim @@ -25,10 +25,10 @@ .question h5.mt-4 = RequestForComment.human_attribute_name('question') + = render('report', request_for_comment: @request_for_comment) .text - question = @request_for_comment.question = question.presence || t('request_for_comments.no_question') - = render('report', request_for_comment: @request_for_comment) - if policy(@request_for_comment).mark_as_solved? && !@request_for_comment.solved? = render('mark_as_solved') From 00356fd6c6e12d8b2a9f9acebea6fa572b85724a Mon Sep 17 00:00:00 2001 From: Armin Kirchner Date: Tue, 1 Jul 2025 13:16:23 +0200 Subject: [PATCH 3/4] Test reporting as learner --- spec/system/report_request_for_comments_system_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/system/report_request_for_comments_system_spec.rb b/spec/system/report_request_for_comments_system_spec.rb index 0c812b182..ddaf32aab 100644 --- a/spec/system/report_request_for_comments_system_spec.rb +++ b/spec/system/report_request_for_comments_system_spec.rb @@ -3,13 +3,13 @@ require 'rails_helper' RSpec.describe 'Report RfCs for unapprporiat content' do - let(:user) { create(:teacher) } + let(:user) { create(:learner) } before do stub_const('RequestForCommentPolicy::REPORT_RECEIVER_CONFIGURED', reports_enabled) visit(sign_in_path) fill_in('email', with: user.email) - fill_in('password', with: attributes_for(:teacher)[:password]) + fill_in('password', with: attributes_for(:learner)[:password]) click_button(I18n.t('sessions.new.link')) visit(request_for_comment_path(create(:rfc))) end From c0856541e9445ef523d961bb3828753d4a073efb Mon Sep 17 00:00:00 2001 From: Armin Kirchner Date: Tue, 1 Jul 2025 15:21:15 +0200 Subject: [PATCH 4/4] Update spec/system/report_request_for_comments_system_spec.rb Co-authored-by: Nele Sina Noack --- spec/system/report_request_for_comments_system_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/system/report_request_for_comments_system_spec.rb b/spec/system/report_request_for_comments_system_spec.rb index ddaf32aab..204bb96cd 100644 --- a/spec/system/report_request_for_comments_system_spec.rb +++ b/spec/system/report_request_for_comments_system_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe 'Report RfCs for unapprporiat content' do +RSpec.describe 'Report RfCs for inappropriate content' do let(:user) { create(:learner) } before do