From dc450a2b6fe277af58d94304e61ab336e5b25677 Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Tue, 4 Nov 2025 16:40:50 +0000 Subject: [PATCH 01/15] Pass remix identifier through with lesson list --- app/controllers/api/lessons_controller.rb | 6 +++++- app/views/api/lessons/index.json.jbuilder | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/lessons_controller.rb b/app/controllers/api/lessons_controller.rb index 305b2a632..43c1b2811 100644 --- a/app/controllers/api/lessons_controller.rb +++ b/app/controllers/api/lessons_controller.rb @@ -10,7 +10,11 @@ def index archive_scope = params[:include_archived] == 'true' ? Lesson : Lesson.unarchived scope = params[:school_class_id] ? archive_scope.where(school_class_id: params[:school_class_id]) : archive_scope ordered_scope = scope.order(created_at: :asc) - @lessons_with_users = ordered_scope.accessible_by(current_ability).with_users + lessons_with_users = ordered_scope.accessible_by(current_ability).with_users + remixes = ordered_scope.map do |lesson| + lesson.project.remixes.where(user_id: current_user.id).accessible_by(current_ability).first + end + @lessons_with_users_and_remixes = lessons_with_users.zip(remixes) render :index, formats: [:json], status: :ok end diff --git a/app/views/api/lessons/index.json.jbuilder b/app/views/api/lessons/index.json.jbuilder index 74d8d0a43..0ebe700f0 100644 --- a/app/views/api/lessons/index.json.jbuilder +++ b/app/views/api/lessons/index.json.jbuilder @@ -1,6 +1,7 @@ # frozen_string_literal: true -json.array!(@lessons_with_users) do |lesson, user| +json.array!(@lessons_with_users_and_remixes) do |lesson_with_user, remix| + lesson, user = lesson_with_user # Destructure the pair json.call( lesson, :id, @@ -26,4 +27,8 @@ json.array!(@lessons_with_users) do |lesson, user| end json.user_name(user&.name) + + if remix.present? + json.remix_identifier(remix.identifier) + end end From fff6c4cf436dfaf6f054aa87d7c9ffb4e25dfdf1 Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Tue, 4 Nov 2025 17:28:00 +0000 Subject: [PATCH 02/15] add ordering to ensure it always gets the first record --- app/controllers/api/lessons_controller.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/lessons_controller.rb b/app/controllers/api/lessons_controller.rb index 43c1b2811..19c907540 100644 --- a/app/controllers/api/lessons_controller.rb +++ b/app/controllers/api/lessons_controller.rb @@ -12,7 +12,11 @@ def index ordered_scope = scope.order(created_at: :asc) lessons_with_users = ordered_scope.accessible_by(current_ability).with_users remixes = ordered_scope.map do |lesson| - lesson.project.remixes.where(user_id: current_user.id).accessible_by(current_ability).first + lesson.project.remixes + .where(user_id: current_user.id) + .accessible_by(current_ability) + .order(created_at: :asc) + .first end @lessons_with_users_and_remixes = lessons_with_users.zip(remixes) render :index, formats: [:json], status: :ok From c67e583f5f1964c10fe6095ac841fb7d2475066a Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Tue, 4 Nov 2025 17:37:20 +0000 Subject: [PATCH 03/15] rubocop fixes --- app/controllers/api/lessons_controller.rb | 8 ++++---- app/views/api/lessons/index.json.jbuilder | 4 +--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app/controllers/api/lessons_controller.rb b/app/controllers/api/lessons_controller.rb index 19c907540..ee56cbd67 100644 --- a/app/controllers/api/lessons_controller.rb +++ b/app/controllers/api/lessons_controller.rb @@ -13,10 +13,10 @@ def index lessons_with_users = ordered_scope.accessible_by(current_ability).with_users remixes = ordered_scope.map do |lesson| lesson.project.remixes - .where(user_id: current_user.id) - .accessible_by(current_ability) - .order(created_at: :asc) - .first + .where(user_id: current_user.id) + .accessible_by(current_ability) + .order(created_at: :asc) + .first end @lessons_with_users_and_remixes = lessons_with_users.zip(remixes) render :index, formats: [:json], status: :ok diff --git a/app/views/api/lessons/index.json.jbuilder b/app/views/api/lessons/index.json.jbuilder index 0ebe700f0..3f43d4123 100644 --- a/app/views/api/lessons/index.json.jbuilder +++ b/app/views/api/lessons/index.json.jbuilder @@ -28,7 +28,5 @@ json.array!(@lessons_with_users_and_remixes) do |lesson_with_user, remix| json.user_name(user&.name) - if remix.present? - json.remix_identifier(remix.identifier) - end + json.remix_identifier(remix.identifier) if remix.present? end From e27e0c73b9a0a694d7a0cf4ab3345928fd7c89f0 Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Thu, 6 Nov 2025 16:40:38 +0000 Subject: [PATCH 04/15] fixing test --- app/controllers/api/lessons_controller.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/lessons_controller.rb b/app/controllers/api/lessons_controller.rb index ee56cbd67..57fb1d44e 100644 --- a/app/controllers/api/lessons_controller.rb +++ b/app/controllers/api/lessons_controller.rb @@ -12,8 +12,9 @@ def index ordered_scope = scope.order(created_at: :asc) lessons_with_users = ordered_scope.accessible_by(current_ability).with_users remixes = ordered_scope.map do |lesson| - lesson.project.remixes - .where(user_id: current_user.id) + next nil unless lesson&.project&.remixes.any? + lesson.project&.remixes + .where(user_id: current_user?.id) .accessible_by(current_ability) .order(created_at: :asc) .first From 61f4a5571f0a85e065983d891226477df99913c4 Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Thu, 6 Nov 2025 17:04:10 +0000 Subject: [PATCH 05/15] fixing test and adding another --- app/controllers/api/lessons_controller.rb | 2 +- spec/features/lesson/listing_lessons_spec.rb | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/lessons_controller.rb b/app/controllers/api/lessons_controller.rb index 57fb1d44e..a79a501be 100644 --- a/app/controllers/api/lessons_controller.rb +++ b/app/controllers/api/lessons_controller.rb @@ -14,7 +14,7 @@ def index remixes = ordered_scope.map do |lesson| next nil unless lesson&.project&.remixes.any? lesson.project&.remixes - .where(user_id: current_user?.id) + .where(user_id: current_user.id) .accessible_by(current_ability) .order(created_at: :asc) .first diff --git a/spec/features/lesson/listing_lessons_spec.rb b/spec/features/lesson/listing_lessons_spec.rb index 8b5f6cb16..a15d47008 100644 --- a/spec/features/lesson/listing_lessons_spec.rb +++ b/spec/features/lesson/listing_lessons_spec.rb @@ -210,6 +210,17 @@ expect(data.size).to eq(1) end + it "includes the remix identifier when the user has remixed the lesson's project" do + student = create(:student, school:) + authenticated_in_hydra_as(student) + create(:class_student, school_class:, student_id: student.id) + student_project = create(:project, school:, lesson:, parent: lesson.project, user_id: student.id) + + get('/api/lessons', headers:) + data = JSON.parse(response.body, symbolize_names: true) + expect(data.first[:remix_identifier]).to eq(student_project.identifier) + end + it "does not include the lesson when the user is not a school-student within the lesson's class" do student = create(:student, school:) authenticated_in_hydra_as(student) From f882c2f220914fad823b1e9f1174f6ccf977e350 Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Thu, 6 Nov 2025 17:10:45 +0000 Subject: [PATCH 06/15] rubocop fixes --- app/controllers/api/lessons_controller.rb | 25 +++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/app/controllers/api/lessons_controller.rb b/app/controllers/api/lessons_controller.rb index a79a501be..ba74125df 100644 --- a/app/controllers/api/lessons_controller.rb +++ b/app/controllers/api/lessons_controller.rb @@ -11,14 +11,7 @@ def index scope = params[:school_class_id] ? archive_scope.where(school_class_id: params[:school_class_id]) : archive_scope ordered_scope = scope.order(created_at: :asc) lessons_with_users = ordered_scope.accessible_by(current_ability).with_users - remixes = ordered_scope.map do |lesson| - next nil unless lesson&.project&.remixes.any? - lesson.project&.remixes - .where(user_id: current_user.id) - .accessible_by(current_ability) - .order(created_at: :asc) - .first - end + remixes = user_remixes(ordered_scope) @lessons_with_users_and_remixes = lessons_with_users.zip(remixes) render :index, formats: [:json], status: :ok end @@ -83,6 +76,22 @@ def verify_school_class_belongs_to_school raise ParameterError, 'school_class_id does not correspond to school_id' end + def user_remixes(lessons) + lessons.map do |lesson| + next nil unless lesson&.project&.remixes&.any? + + user_remix(lesson) + end + end + + def user_remix(lesson) + lesson.project&.remixes + &.where(user_id: current_user.id) + &.accessible_by(current_ability) + &.order(created_at: :asc) + &.first + end + def lesson_params base_params.merge(user_id: current_user.id) end From e768ca976d5146d7a603a925d9d52d5a976c8b2f Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Fri, 7 Nov 2025 10:56:23 +0000 Subject: [PATCH 07/15] fixing --- app/controllers/api/lessons_controller.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/lessons_controller.rb b/app/controllers/api/lessons_controller.rb index ba74125df..2fcad04a5 100644 --- a/app/controllers/api/lessons_controller.rb +++ b/app/controllers/api/lessons_controller.rb @@ -10,8 +10,11 @@ def index archive_scope = params[:include_archived] == 'true' ? Lesson : Lesson.unarchived scope = params[:school_class_id] ? archive_scope.where(school_class_id: params[:school_class_id]) : archive_scope ordered_scope = scope.order(created_at: :asc) - lessons_with_users = ordered_scope.accessible_by(current_ability).with_users - remixes = user_remixes(ordered_scope) + accessible_lessons = ordered_scope.accessible_by(current_ability) + lessons_with_users = accessible_lessons.with_users + remixes = user_remixes(accessible_lessons) + pp lessons_with_users + pp remixes @lessons_with_users_and_remixes = lessons_with_users.zip(remixes) render :index, formats: [:json], status: :ok end From 0147f644ddfd8f02b41fea79c293b00d1332050b Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Fri, 7 Nov 2025 12:20:02 +0000 Subject: [PATCH 08/15] remiving puts statements --- app/controllers/api/lessons_controller.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/controllers/api/lessons_controller.rb b/app/controllers/api/lessons_controller.rb index 2fcad04a5..a992d63f8 100644 --- a/app/controllers/api/lessons_controller.rb +++ b/app/controllers/api/lessons_controller.rb @@ -13,8 +13,6 @@ def index accessible_lessons = ordered_scope.accessible_by(current_ability) lessons_with_users = accessible_lessons.with_users remixes = user_remixes(accessible_lessons) - pp lessons_with_users - pp remixes @lessons_with_users_and_remixes = lessons_with_users.zip(remixes) render :index, formats: [:json], status: :ok end From 9a991a3f6dba6cfdb1e8f5a73e07cf737140a38c Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Fri, 7 Nov 2025 15:28:04 +0000 Subject: [PATCH 09/15] trying to fix abilities --- app/controllers/api/feedback_controller.rb | 4 +--- app/models/ability.rb | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/controllers/api/feedback_controller.rb b/app/controllers/api/feedback_controller.rb index d96d362e1..00fa4eebb 100644 --- a/app/controllers/api/feedback_controller.rb +++ b/app/controllers/api/feedback_controller.rb @@ -12,9 +12,7 @@ def index end # Checks that the user is authorised to read the feedback so that if not we can return a 403 rather than an empty array - project_feedback.each do |feedback| - authorize! :read, feedback - end + can :read_feedback, project.school_project @feedback = project_feedback.accessible_by(current_ability) render :index, formats: [:json], status: :ok end diff --git a/app/models/ability.rb b/app/models/ability.rb index 5640518ab..322a448c9 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -112,8 +112,8 @@ def define_school_student_abilities(user:, school:) # Ensure no access to ClassMember resources, relationships otherwise allow access in some circumstances. can(%i[read], Lesson, school_id: school.id, visibility: 'students', school_class: { students: { student_id: user.id } }) can(%i[read create update], Project, school_id: school.id, user_id: user.id, lesson_id: nil, remixed_from_id: visible_lesson_project_ids) + can(%i[read_feedback], SchoolProject, project: { school_id: school.id, user_id: user.id, lesson_id: nil, remixed_from_id: visible_lesson_project_ids }) can(%i[read show_context], Project, lesson: { school_id: school.id, visibility: 'students', school_class: { students: { student_id: user.id } } }) - can(%i[read], Feedback, school_project: { project: { school_id: school.id, user_id: user.id, lesson_id: nil, remixed_from_id: visible_lesson_project_ids } }) can(%i[show_finished set_finished show_status unsubmit submit], SchoolProject, project: { user_id: user.id, lesson_id: nil }, school_id: school.id) end From f5d56f97a785003ae11d60ec370e0d50112354c2 Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Fri, 14 Nov 2025 10:43:34 +0000 Subject: [PATCH 10/15] reverting permission changes for now --- app/controllers/api/feedback_controller.rb | 5 ++++- app/models/ability.rb | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/feedback_controller.rb b/app/controllers/api/feedback_controller.rb index 00fa4eebb..4fa671409 100644 --- a/app/controllers/api/feedback_controller.rb +++ b/app/controllers/api/feedback_controller.rb @@ -12,7 +12,10 @@ def index end # Checks that the user is authorised to read the feedback so that if not we can return a 403 rather than an empty array - can :read_feedback, project.school_project + # can :read_feedback, project.school_project + project_feedback.each do |feedback| + authorize! :read, feedback + end @feedback = project_feedback.accessible_by(current_ability) render :index, formats: [:json], status: :ok end diff --git a/app/models/ability.rb b/app/models/ability.rb index 322a448c9..c94d0d61a 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -112,9 +112,10 @@ def define_school_student_abilities(user:, school:) # Ensure no access to ClassMember resources, relationships otherwise allow access in some circumstances. can(%i[read], Lesson, school_id: school.id, visibility: 'students', school_class: { students: { student_id: user.id } }) can(%i[read create update], Project, school_id: school.id, user_id: user.id, lesson_id: nil, remixed_from_id: visible_lesson_project_ids) - can(%i[read_feedback], SchoolProject, project: { school_id: school.id, user_id: user.id, lesson_id: nil, remixed_from_id: visible_lesson_project_ids }) + # can(%i[read_feedback], SchoolProject, project: { school_id: school.id, user_id: user.id, lesson_id: nil, remixed_from_id: visible_lesson_project_ids }) can(%i[read show_context], Project, lesson: { school_id: school.id, visibility: 'students', school_class: { students: { student_id: user.id } } }) can(%i[show_finished set_finished show_status unsubmit submit], SchoolProject, project: { user_id: user.id, lesson_id: nil }, school_id: school.id) + can(%i[read], Feedback, school_project: { project: { school_id: school.id, user_id: user.id, lesson_id: nil, remixed_from_id: visible_lesson_project_ids } }) end def define_experience_cs_admin_abilities(user) From cf254c605098d4ab8fc3457a87bd43fd1ac0051c Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Fri, 14 Nov 2025 15:15:41 +0000 Subject: [PATCH 11/15] reverting abilities change for now --- app/controllers/api/feedback_controller.rb | 1 - app/models/ability.rb | 1 - 2 files changed, 2 deletions(-) diff --git a/app/controllers/api/feedback_controller.rb b/app/controllers/api/feedback_controller.rb index 4fa671409..d96d362e1 100644 --- a/app/controllers/api/feedback_controller.rb +++ b/app/controllers/api/feedback_controller.rb @@ -12,7 +12,6 @@ def index end # Checks that the user is authorised to read the feedback so that if not we can return a 403 rather than an empty array - # can :read_feedback, project.school_project project_feedback.each do |feedback| authorize! :read, feedback end diff --git a/app/models/ability.rb b/app/models/ability.rb index c94d0d61a..f9b34a606 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -112,7 +112,6 @@ def define_school_student_abilities(user:, school:) # Ensure no access to ClassMember resources, relationships otherwise allow access in some circumstances. can(%i[read], Lesson, school_id: school.id, visibility: 'students', school_class: { students: { student_id: user.id } }) can(%i[read create update], Project, school_id: school.id, user_id: user.id, lesson_id: nil, remixed_from_id: visible_lesson_project_ids) - # can(%i[read_feedback], SchoolProject, project: { school_id: school.id, user_id: user.id, lesson_id: nil, remixed_from_id: visible_lesson_project_ids }) can(%i[read show_context], Project, lesson: { school_id: school.id, visibility: 'students', school_class: { students: { student_id: user.id } } }) can(%i[show_finished set_finished show_status unsubmit submit], SchoolProject, project: { user_id: user.id, lesson_id: nil }, school_id: school.id) can(%i[read], Feedback, school_project: { project: { school_id: school.id, user_id: user.id, lesson_id: nil, remixed_from_id: visible_lesson_project_ids } }) From 9be7484fd3ec9275442bccbc49decba20ff2de4d Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Mon, 17 Nov 2025 17:16:40 +0000 Subject: [PATCH 12/15] add show remix identifier route --- app/controllers/api/projects/remixes_controller.rb | 6 +++++- config/routes.rb | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/projects/remixes_controller.rb b/app/controllers/api/projects/remixes_controller.rb index c1e784a89..222279f7e 100644 --- a/app/controllers/api/projects/remixes_controller.rb +++ b/app/controllers/api/projects/remixes_controller.rb @@ -5,7 +5,7 @@ module Projects class RemixesController < ApiController before_action :authorize_user load_and_authorize_resource :school, only: :index - before_action :load_and_authorize_remix, only: %i[show] + before_action :load_and_authorize_remix, only: %i[show show_identifier] def index projects = Project.where(remixed_from_id: project.id).accessible_by(current_ability) @@ -17,6 +17,10 @@ def show render '/api/projects/show', formats: [:json] end + def show_identifier + render json: { identifier: @project.identifier }, status: :ok + end + def create # Ensure we have a fallback value to prevent bad requests remix_origin = request.origin || request.referer diff --git a/config/routes.rb b/config/routes.rb index affbe044d..c75fbf63e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -43,7 +43,9 @@ post :submit, on: :member, to: 'school_projects#submit' post :return, on: :member, to: 'school_projects#return' post :complete, on: :member, to: 'school_projects#complete' - resource :remix, only: %i[show create], controller: 'projects/remixes' + resource :remix, only: %i[show create], controller: 'projects/remixes' do + get :identifier, on: :member, to: 'projects/remixes#show_identifier' + end resources :remixes, only: %i[index], controller: 'projects/remixes' resource :images, only: %i[show create], controller: 'projects/images' resources :feedback, only: %i[index create], controller: 'feedback' From 0c9576717df15a10e02cd078cbd637cb14f0f1ee Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Mon, 17 Nov 2025 17:31:19 +0000 Subject: [PATCH 13/15] tidying --- app/models/ability.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/ability.rb b/app/models/ability.rb index f9b34a606..5640518ab 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -113,8 +113,8 @@ def define_school_student_abilities(user:, school:) can(%i[read], Lesson, school_id: school.id, visibility: 'students', school_class: { students: { student_id: user.id } }) can(%i[read create update], Project, school_id: school.id, user_id: user.id, lesson_id: nil, remixed_from_id: visible_lesson_project_ids) can(%i[read show_context], Project, lesson: { school_id: school.id, visibility: 'students', school_class: { students: { student_id: user.id } } }) - can(%i[show_finished set_finished show_status unsubmit submit], SchoolProject, project: { user_id: user.id, lesson_id: nil }, school_id: school.id) can(%i[read], Feedback, school_project: { project: { school_id: school.id, user_id: user.id, lesson_id: nil, remixed_from_id: visible_lesson_project_ids } }) + can(%i[show_finished set_finished show_status unsubmit submit], SchoolProject, project: { user_id: user.id, lesson_id: nil }, school_id: school.id) end def define_experience_cs_admin_abilities(user) From 079534e82865b8de509b0bdda30aa132a70852b3 Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Tue, 18 Nov 2025 12:29:01 +0000 Subject: [PATCH 14/15] adding tests for show remix identifier --- spec/requests/projects/remix_spec.rb | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/spec/requests/projects/remix_spec.rb b/spec/requests/projects/remix_spec.rb index 6e9c9d676..df3c6c8e7 100644 --- a/spec/requests/projects/remix_spec.rb +++ b/spec/requests/projects/remix_spec.rb @@ -70,6 +70,35 @@ end end + describe("#show_identifier") do + let!(:remixed_project) do + create(:project, remixed_from_id: original_project.id, user_id: authenticated_user.id) + end + + it 'returns success response' do + get("/api/projects/#{original_project.identifier}/remix/identifier", headers:) + expect(response).to have_http_status(:ok) + end + + it 'returns the project identifier' do + get("/api/projects/#{original_project.identifier}/remix/identifier", headers:) + expect(response.parsed_body['identifier']).to eq(remixed_project.identifier) + end + + it 'returns 404 response if invalid project' do + get('/api/projects/no-such-project/remix/identifier', headers:) + expect(response).to have_http_status(:not_found) + end + + it 'returns 404 if no remixed project for user' do + another_user = create(:owner, school:) + authenticated_in_hydra_as(another_user) + + get("/api/projects/#{original_project.identifier}/remix/identifier", headers:) + expect(response).to have_http_status(:not_found) + end + end + describe '#create' do it 'returns success response' do post("/api/projects/#{original_project.identifier}/remix", params: { project: project_params }, headers:) @@ -116,6 +145,13 @@ end end + describe '#show_identifier' do + it 'returns unauthorized' do + get "/api/projects/#{original_project.identifier}/remix/identifier" + expect(response).to have_http_status(:unauthorized) + end + end + describe '#create' do it 'returns unauthorized' do post "/api/projects/#{original_project.identifier}/remix" From 4eeafa51ebd292ad6bd361090b5190d30adb8320 Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Tue, 18 Nov 2025 12:34:06 +0000 Subject: [PATCH 15/15] rubocop fix --- spec/requests/projects/remix_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/requests/projects/remix_spec.rb b/spec/requests/projects/remix_spec.rb index df3c6c8e7..1443deca5 100644 --- a/spec/requests/projects/remix_spec.rb +++ b/spec/requests/projects/remix_spec.rb @@ -70,7 +70,7 @@ end end - describe("#show_identifier") do + describe('#show_identifier') do let!(:remixed_project) do create(:project, remixed_from_id: original_project.id, user_id: authenticated_user.id) end