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
########