diff --git a/app/controllers/api/solutions_controller.rb b/app/controllers/api/solutions_controller.rb index 4c7273c7ed..6e62ed5491 100644 --- a/app/controllers/api/solutions_controller.rb +++ b/app/controllers/api/solutions_controller.rb @@ -102,13 +102,7 @@ def unpublish def diff files = Git::Exercise::GenerateDiffBetweenVersions.(@solution.exercise, @solution.git_slug, @solution.git_sha) - # TODO: (Optional): Change this to always be a 200 and handle the empty files in React - if files.present? - status = 200 - else - status = 400 - Sentry.capture_exception(RuntimeError.new("No files were found during solution diff")) - end + Solution::UpdateToLatestExerciseVersion.(@solution) if files.blank? render json: { diff: { @@ -121,7 +115,7 @@ def diff update: Exercism::Routes.sync_api_solution_url(@solution.uuid) } } - }, status: + }, status: :ok end def sync diff --git a/app/css/modals/update-exercise.css b/app/css/modals/update-exercise.css index e48513ddad..332d05d8bc 100644 --- a/app/css/modals/update-exercise.css +++ b/app/css/modals/update-exercise.css @@ -5,6 +5,9 @@ @apply flex flex-col; width: 80%; } + &:has(.auto-updated-notice) .--modal-content { + max-width: 500px; + } & .header { @apply mb-16; & h2 { diff --git a/app/javascript/components/modals/ExerciseUpdateModal.tsx b/app/javascript/components/modals/ExerciseUpdateModal.tsx index ffd2322c27..ee0fbdd738 100644 --- a/app/javascript/components/modals/ExerciseUpdateModal.tsx +++ b/app/javascript/components/modals/ExerciseUpdateModal.tsx @@ -3,7 +3,7 @@ import React from 'react' import { FetchingBoundary } from '../FetchingBoundary' import { Modal, ModalProps } from './Modal' -import { Icon } from '../common' +import { Icon, GraphicalIcon } from '../common' import { useRequestQuery } from '../../hooks/request-query' import { ExerciseUpdateForm } from './exercise-update-modal/ExerciseUpdateForm' import { Exercise } from '../types' @@ -43,13 +43,47 @@ export const ExerciseUpdateModal = ({ defaultError={DEFAULT_ERROR} > {data ? ( - + data.diff.files.length > 0 ? ( + + ) : ( + + ) ) : null} ) } +const AutoUpdatedNotice = ({ onClose }: { onClose: () => void }) => { + const { t } = useAppTranslation('components/modals/ExerciseUpdateModal.tsx') + return ( +
+ +

+ {t('exerciseUpdateModal.autoUpdatedTitle')} +

+

+ {t('exerciseUpdateModal.autoUpdatedBody')} +

+ +
+ ) +} + const LoadingComponent = () => { const { t } = useAppTranslation('components/modals/ExerciseUpdateModal.tsx') return ( diff --git a/app/javascript/i18n/en/components-modals-ExerciseUpdateModal.tsx.ts b/app/javascript/i18n/en/components-modals-ExerciseUpdateModal.tsx.ts index 0fcd4b842b..9948551cc5 100644 --- a/app/javascript/i18n/en/components-modals-ExerciseUpdateModal.tsx.ts +++ b/app/javascript/i18n/en/components-modals-ExerciseUpdateModal.tsx.ts @@ -1,6 +1,8 @@ // namespace: components/modals/ExerciseUpdateModal.tsx export default { 'exerciseUpdateModal.loadingExerciseDiff': 'Loading exercise diff', - 'exerciseUpdateModal.sorryCantWorkOutWhatNeedsUpdating': - "Sorry - it seems that we can't work out what needs updating for this exercise. We've been alerted and will have a look.", + 'exerciseUpdateModal.autoUpdatedTitle': 'Exercise Updated', + 'exerciseUpdateModal.autoUpdatedBody': + 'This exercise has been automatically updated to the latest version. There are no file changes to review.', + 'exerciseUpdateModal.continue': 'Continue', } diff --git a/test/controllers/api/solutions_controller_test.rb b/test/controllers/api/solutions_controller_test.rb index dc9798dd85..c1c0c89785 100644 --- a/test/controllers/api/solutions_controller_test.rb +++ b/test/controllers/api/solutions_controller_test.rb @@ -173,22 +173,17 @@ class API::SolutionsControllerTest < API::BaseTestCase assert_equal expected, actual end - test "Diff returns 400 if diff does not contain files" do + test "Diff auto-syncs and returns 200 when diff does not contain files" do user = create :user setup_user(user) solution = create(:concept_solution, user:) - get diff_api_solution_path(solution.uuid), headers: @headers, as: :json - - assert_response :bad_request - end - - test "Sentry is alerted if diff does not contain files" do - user = create :user - setup_user(user) - solution = create(:concept_solution, user:) - Sentry.expects(:capture_exception).with(RuntimeError.new("No files were found during solution diff")) + Solution::UpdateToLatestExerciseVersion.expects(:call).with(solution) get diff_api_solution_path(solution.uuid), headers: @headers, as: :json + + assert_response :ok + response_body = JSON.parse(response.body) + assert_empty response_body.dig("diff", "files") end ########