diff --git a/backend/AGENTS.md b/backend/AGENTS.md index e476fbd..cedf8f3 100644 --- a/backend/AGENTS.md +++ b/backend/AGENTS.md @@ -424,7 +424,7 @@ races according to the target constraint's business meaning. and JSON keys are generally snake_case. - Preserve existing HTTP status conventions: `:unauthorized` for no user, `:forbidden` for insufficient role or banned - user, `:not_found` for missing records, and `:unprocessable_entity` for + user, `:not_found` for missing records, and `:unprocessable_content` for validation failures. - For diagnostic or internal helper JSON, prefer a deliberately light response shape over full representation classes when callers only need identifiers, diff --git a/backend/app/controllers/application_controller.rb b/backend/app/controllers/application_controller.rb index 3e9305a..38b3fe2 100644 --- a/backend/app/controllers/application_controller.rb +++ b/backend/app/controllers/application_controller.rb @@ -95,7 +95,7 @@ class ApplicationController < ActionController::API render_validation_error base: ['すでに存在してゐます.'] end - def render_validation_error record = nil, fields: { }, base: [], status: :unprocessable_entity + def render_validation_error record = nil, fields: { }, base: [], status: :unprocessable_content errors = { } if record diff --git a/backend/app/controllers/counts_exports_controller.rb b/backend/app/controllers/counts_exports_controller.rb index dff8f05..6bb15fb 100644 --- a/backend/app/controllers/counts_exports_controller.rb +++ b/backend/app/controllers/counts_exports_controller.rb @@ -18,7 +18,7 @@ class CountsExportsController < ApplicationController render json: { error: 'private_condition' }, status: :forbidden rescue CountsTableQuery::TooManyColumns render json: { error: 'too_many_columns', max_columns: CountsTableQuery::MAX_COLUMNS }, - status: :unprocessable_entity + status: :unprocessable_content rescue ActiveRecord::StatementTimeout render json: { error: 'counts_query_timeout' }, status: :service_unavailable rescue ArgumentError, TypeError, KeyError, JSON::ParserError @@ -63,7 +63,7 @@ class CountsExportsController < ApplicationController render json: { error: 'private_condition' }, status: :forbidden rescue CountsTableQuery::TooManyColumns render json: { error: 'too_many_columns', max_columns: CountsTableQuery::MAX_COLUMNS }, - status: :unprocessable_entity + status: :unprocessable_content rescue ActiveRecord::StatementTimeout render json: { error: 'counts_query_timeout' }, status: :service_unavailable rescue ArgumentError, TypeError, KeyError, JSON::ParserError @@ -107,7 +107,7 @@ class CountsExportsController < ApplicationController render json: { error: 'private_condition' }, status: :forbidden rescue CountsTableQuery::TooManyColumns render json: { error: 'too_many_columns', max_columns: CountsTableQuery::MAX_COLUMNS }, - status: :unprocessable_entity + status: :unprocessable_content rescue ActiveRecord::StatementTimeout render json: { error: 'counts_query_timeout' }, status: :service_unavailable rescue ArgumentError, TypeError, KeyError, JSON::ParserError diff --git a/backend/app/controllers/counts_tables_controller.rb b/backend/app/controllers/counts_tables_controller.rb index 6a6f5bb..df30e97 100644 --- a/backend/app/controllers/counts_tables_controller.rb +++ b/backend/app/controllers/counts_tables_controller.rb @@ -24,7 +24,7 @@ class CountsTablesController < ApplicationController render json: { error: 'private_condition' }, status: :forbidden rescue CountsTableQuery::TooManyColumns render json: { error: 'too_many_columns', max_columns: CountsTableQuery::MAX_COLUMNS }, - status: :unprocessable_entity + status: :unprocessable_content rescue CountsPivotTotals::TimedOut Rails.logger.warn('counts_query_timeout: pivot_totals') render json: { error: 'counts_query_timeout', stage: 'totals', diff --git a/backend/app/controllers/gekanator_games_controller.rb b/backend/app/controllers/gekanator_games_controller.rb index ad3aebf..0f887c8 100644 --- a/backend/app/controllers/gekanator_games_controller.rb +++ b/backend/app/controllers/gekanator_games_controller.rb @@ -15,7 +15,7 @@ class GekanatorGamesController < ApplicationController answers:) if game.invalid? - render json: { errors: game.errors.full_messages }, status: :unprocessable_entity + render json: { errors: game.errors.full_messages }, status: :unprocessable_content return end @@ -31,7 +31,7 @@ class GekanatorGamesController < ApplicationController learned_example_count: }, status: :created rescue ActiveRecord::RecordInvalid => e - render json: { errors: e.record.errors.full_messages }, status: :unprocessable_entity + render json: { errors: e.record.errors.full_messages }, status: :unprocessable_content end def extra_questions diff --git a/backend/app/controllers/materials_controller.rb b/backend/app/controllers/materials_controller.rb index 93b2fbe..3f2440d 100644 --- a/backend/app/controllers/materials_controller.rb +++ b/backend/app/controllers/materials_controller.rb @@ -536,7 +536,7 @@ class MaterialsController < ApplicationController errors: { }, base_errors: ['ZIP export に必要な素材ファイルが欠損しています.'], missing_files: }, - status: :unprocessable_entity + status: :unprocessable_content end def build_uploaded_material_blob! file, file_sha256 diff --git a/backend/app/controllers/posts_controller.rb b/backend/app/controllers/posts_controller.rb index ba15e99..d721046 100644 --- a/backend/app/controllers/posts_controller.rb +++ b/backend/app/controllers/posts_controller.rb @@ -429,7 +429,7 @@ class PostsController < ApplicationController filters = literals.map do |literal| internal, = source_ids.fetch(literal[:name]) name = internal.empty? ? literal[:name] : names[internal.first] - return head :unprocessable_entity unless name && internal.length <= 1 + return head :unprocessable_content unless name && internal.length <= 1 literal[:negative] ? "not:#{ name }" : name end @@ -438,7 +438,7 @@ class PostsController < ApplicationController literals.zip(translated).each do |literal, translation| unless (source_ids.fetch(literal[:name]).map(&:sort) == target_ids.fetch(translation[:name]).map(&:sort)) - return head :unprocessable_entity + return head :unprocessable_content end end index = 0 diff --git a/backend/app/controllers/theatres_controller.rb b/backend/app/controllers/theatres_controller.rb index 10f4455..a289739 100644 --- a/backend/app/controllers/theatres_controller.rb +++ b/backend/app/controllers/theatres_controller.rb @@ -55,7 +55,7 @@ class TheatresController < ApplicationController theatre = Theatre.find_by(id: params[:id]) return head :not_found unless theatre requested_post_id = params[:post_id].to_i - return head :unprocessable_entity if requested_post_id <= 0 + return head :unprocessable_content if requested_post_id <= 0 skipped = false conflicted = false @@ -95,7 +95,7 @@ class TheatresController < ApplicationController theatre = Theatre.find_by(id: params[:id]) return head :not_found unless theatre requested_post_id = params[:post_id].to_i - return head :unprocessable_entity if requested_post_id <= 0 + return head :unprocessable_content if requested_post_id <= 0 conflicted = false diff --git a/backend/spec/requests/counts_table_spec.rb b/backend/spec/requests/counts_table_spec.rb index 234092c..cb8118f 100644 --- a/backend/spec/requests/counts_table_spec.rb +++ b/backend/spec/requests/counts_table_spec.rb @@ -262,7 +262,7 @@ RSpec.describe 'Counts table API', type: :request do tags: '', tags_json: [], parent_post_ids: '', created_at: Time.utc(2024, 3)) end get '/counts/query', params: base.merge(mode: 'summary', rows: '', cols: 'title', sort: '') - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(response.parsed_body).to eq('error' => 'too_many_columns', 'max_columns' => 100) end diff --git a/backend/spec/requests/error_responses_spec.rb b/backend/spec/requests/error_responses_spec.rb index 81c3ab9..1482dcb 100644 --- a/backend/spec/requests/error_responses_spec.rb +++ b/backend/spec/requests/error_responses_spec.rb @@ -20,7 +20,7 @@ RSpec.describe 'error responses', type: :request do patch "/tags/#{ tag.id }", params: { category: 'nico' } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json).to include( 'type' => 'validation_error', 'message' => '入力内容を確認してください.', @@ -37,7 +37,7 @@ RSpec.describe 'error responses', type: :request do put "/users/#{ user.id }", params: { name: 'a' * 256 } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json).to include( 'type' => 'validation_error', 'message' => '入力内容を確認してください.') diff --git a/backend/spec/requests/gekanator_games_spec.rb b/backend/spec/requests/gekanator_games_spec.rb index 236f23e..d1ec35a 100644 --- a/backend/spec/requests/gekanator_games_spec.rb +++ b/backend/spec/requests/gekanator_games_spec.rb @@ -49,7 +49,7 @@ RSpec.describe 'Gekanator games API', type: :request do question_count: 4, answers: [{ question_id: 'tag:1', answer: 'no' }] } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) end it 'returns unauthorized without a user' do diff --git a/backend/spec/requests/gekanator_learning_spec.rb b/backend/spec/requests/gekanator_learning_spec.rb index 7154683..a6bd044 100644 --- a/backend/spec/requests/gekanator_learning_spec.rb +++ b/backend/spec/requests/gekanator_learning_spec.rb @@ -126,7 +126,7 @@ RSpec.describe 'Gekanator learning API', type: :request do } }.not_to change { GekanatorGame.count } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) end it 'stores a game result for a non-admin user' do @@ -785,7 +785,7 @@ RSpec.describe 'Gekanator learning API', type: :request do } }.not_to change { GekanatorQuestionExample.count } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) end it 'rejects non-accepted questions' do @@ -805,7 +805,7 @@ RSpec.describe 'Gekanator learning API', type: :request do ] } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) end it 'rejects non-post_similarity questions' do @@ -829,7 +829,7 @@ RSpec.describe 'Gekanator learning API', type: :request do ] } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) end it 'allows a non-admin user to answer extra questions for their own game' do diff --git a/backend/spec/requests/locale_write_paths_spec.rb b/backend/spec/requests/locale_write_paths_spec.rb index ab5e75a..b8d8991 100644 --- a/backend/spec/requests/locale_write_paths_spec.rb +++ b/backend/spec/requests/locale_write_paths_spec.rb @@ -55,7 +55,7 @@ RSpec.describe 'Locale propagation on write paths', type: :request do deprecated: false, aliases: 'other_primary', parent_tags: '' } aggregate_failures do - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(other_primary.reload).to have_attributes(tag_id: other_tag.id, primary_flg: true) expect(TagName.where(tag: other_tag, language_code: 'ja', primary_flg: true)) .to contain_exactly(other_primary) @@ -289,7 +289,7 @@ RSpec.describe 'Locale propagation on write paths', type: :request do aliases: 'other_ainu_primary', parent_tags: '' } aggregate_failures do - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(other_primary.reload).to have_attributes( tag_id: other_tag.id, language_code: 'ain', primary_flg: true) expect(TagName.where(tag: other_tag, language_code: 'ain', primary_flg: true)) diff --git a/backend/spec/requests/materials_spec.rb b/backend/spec/requests/materials_spec.rb index 093a8f1..20995cd 100644 --- a/backend/spec/requests/materials_spec.rb +++ b/backend/spec/requests/materials_spec.rb @@ -289,7 +289,7 @@ RSpec.describe 'Materials API', type: :request do it 'returns 422 when tag is blank' do post '/materials', params: { tag: ' ', file: dummy_upload } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'tag' => ['タグは必須です.']) end @@ -297,7 +297,7 @@ RSpec.describe 'Materials API', type: :request do it 'returns 422 when both file and url are blank' do post '/materials', params: { tag: 'material_create_blank' } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'file' => ['ファイルまたは URL は必須です.'], 'url' => ['ファイルまたは URL は必須です.']) @@ -381,7 +381,7 @@ RSpec.describe 'Materials API', type: :request do file: dummy_upload } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) end it 'persists url-only material' do @@ -424,7 +424,7 @@ RSpec.describe 'Materials API', type: :request do } end.not_to change(Material, :count) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'file' => ['抑止された素材です: copyright_high_risk'] ) @@ -484,7 +484,7 @@ RSpec.describe 'Materials API', type: :request do file: dummy_upload } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'tag' => ['タグは必須です.']) end @@ -695,7 +695,7 @@ RSpec.describe 'Materials API', type: :request do file: dummy_upload(filename: 'blocked.png', body: 'blocked-update') } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(material.reload.file.blob.filename.to_s).to eq('old.png') end end diff --git a/backend/spec/requests/nico_tags_spec.rb b/backend/spec/requests/nico_tags_spec.rb index a554d26..917a847 100644 --- a/backend/spec/requests/nico_tags_spec.rb +++ b/backend/spec/requests/nico_tags_spec.rb @@ -218,7 +218,7 @@ RSpec.describe 'NicoTags', type: :request do patch "/tags/nico/#{nico_tag.id}", params: { tags: 'nico:linked_ng' } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'tags' => ['ニコニコ・タグ同士は連携できません.']) end @@ -239,7 +239,7 @@ RSpec.describe 'NicoTags', type: :request do expect([Tag.count, TagName.count, TagVersion.count]).to eq(before_counts) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors').fetch('tags')).to include( a_string_including('タグ名 “invalid”:', '名前に使用できない文字が含まれてゐます.')) end diff --git a/backend/spec/requests/post_locale_filter_identity_spec.rb b/backend/spec/requests/post_locale_filter_identity_spec.rb index 1b55e1e..0feca87 100644 --- a/backend/spec/requests/post_locale_filter_identity_spec.rb +++ b/backend/spec/requests/post_locale_filter_identity_spec.rb @@ -48,7 +48,7 @@ RSpec.describe 'Post filter identity across locales', type: :request do primary_tag_name_for(tag, 'ja').update_columns(name: 'nico:shared') get '/posts/tag_filters', params: { locale: 'ja', target_locale: 'ain-Kana', tags: 'nico:shared' } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) end it 'rejects removed reference parameters instead of overriding the name' do diff --git a/backend/spec/requests/posts_spec.rb b/backend/spec/requests/posts_spec.rb index aa5f7c1..f0c5787 100644 --- a/backend/spec/requests/posts_spec.rb +++ b/backend/spec/requests/posts_spec.rb @@ -1042,7 +1042,7 @@ RSpec.describe 'Posts API', type: :request do get '/posts/metadata', params: { url: 'file:///etc/passwd' } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to have_key('url') end end @@ -1180,7 +1180,7 @@ RSpec.describe 'Posts API', type: :request do ) }.not_to change(Post, :count) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'thumbnail' => ['サムネイル画像の変換に失敗しました.'] ) @@ -1219,7 +1219,7 @@ RSpec.describe 'Posts API', type: :request do thumbnail: dummy_upload ) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'tags' => ['廃止済みタグがあります: deprecated_direct_tag'] ) @@ -1265,7 +1265,7 @@ RSpec.describe 'Posts API', type: :request do thumbnail: dummy_upload ) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json).to include( 'type' => 'validation_error', 'message' => '入力内容を確認してください.' @@ -1333,7 +1333,7 @@ RSpec.describe 'Posts API', type: :request do thumbnail: dummy_upload ) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'video_ms' => ['タグ区間の終端が動画時間を超えてゐます.'] ) @@ -1444,7 +1444,7 @@ RSpec.describe 'Posts API', type: :request do thumbnail: dummy_upload ) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'video_ms' => ['タグ区間の開始が動画時間以上です.'] ) @@ -1465,7 +1465,7 @@ RSpec.describe 'Posts API', type: :request do thumbnail: dummy_upload ) - expect(response).to have_http_status(:unprocessable_entity), response.body + expect(response).to have_http_status(:unprocessable_content), response.body expect(json).to include( 'type' => 'validation_error', 'message' => '入力内容を確認してください.', @@ -1485,7 +1485,7 @@ RSpec.describe 'Posts API', type: :request do tags: 'spec_tag', # 既存タグ名を投げる thumbnail: dummy_upload) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) end end @@ -1499,7 +1499,7 @@ RSpec.describe 'Posts API', type: :request do tags: 'spec_tag', # 既存タグ名を投げる thumbnail: dummy_upload) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) end end @@ -1601,7 +1601,7 @@ RSpec.describe 'Posts API', type: :request do thumbnail: dummy_upload } }.not_to change(Post, :count) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to be_present end end @@ -1620,7 +1620,7 @@ RSpec.describe 'Posts API', type: :request do ) }.not_to change(Post, :count) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to be_present end end @@ -1639,7 +1639,7 @@ RSpec.describe 'Posts API', type: :request do ) }.not_to change(PostImplication, :count) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to be_present end end @@ -1770,7 +1770,7 @@ RSpec.describe 'Posts API', type: :request do tags: 'deprecated_update_tag' ) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'tags' => ['廃止済みタグは付与できません.'] ) @@ -1789,7 +1789,7 @@ RSpec.describe 'Posts API', type: :request do title: 'updated title', tags: 'nico:nico_tag') - expect(response).to have_http_status(:unprocessable_entity), response.body + expect(response).to have_http_status(:unprocessable_content), response.body expect(json).to include( 'type' => 'validation_error', 'message' => '入力内容を確認してください.', @@ -1896,7 +1896,7 @@ RSpec.describe 'Posts API', type: :request do title: 'updated title', tags: 'spec_tag' } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to be_present end end @@ -1922,7 +1922,7 @@ RSpec.describe 'Posts API', type: :request do parent_post_ids: 'abc' ) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(post_record.reload.parent_posts.pluck(:id)).to eq([parent_post.id]) end end @@ -1948,7 +1948,7 @@ RSpec.describe 'Posts API', type: :request do parent_post_ids: '999999999' ) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(post_record.reload.parent_posts.pluck(:id)).to eq([parent_post.id]) end end @@ -1964,7 +1964,7 @@ RSpec.describe 'Posts API', type: :request do parent_post_ids: post_record.id.to_s ) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(PostImplication.exists?( post_id: post_record.id, @@ -2669,7 +2669,7 @@ RSpec.describe 'Posts API', type: :request do thumbnail: dummy_upload) end.not_to change(PostVersion, :count) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) end it 'does not create a version when PUT /posts/:id is invalid' do @@ -2685,7 +2685,7 @@ RSpec.describe 'Posts API', type: :request do original_created_before: Time.zone.local(2020, 1, 1, 0, 0, 0).iso8601) end.not_to change(PostVersion, :count) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) end it 'rejects second-bearing original created timestamps on POST /posts' do @@ -2698,7 +2698,7 @@ RSpec.describe 'Posts API', type: :request do thumbnail: dummy_upload, original_created_from: '2020-01-01T00:00:01Z') - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'original_created_from' => ['オリジナルの作成日時は分単位で入力してください.'] ) @@ -2715,7 +2715,7 @@ RSpec.describe 'Posts API', type: :request do thumbnail: dummy_upload, original_created_before: '2020-01-01T00:00:00.123Z') - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'original_created_before' => ['オリジナルの作成日時は分単位で入力してください.'] ) @@ -2733,7 +2733,7 @@ RSpec.describe 'Posts API', type: :request do original_created_from: '2020-01-01T00:00Z', original_created_before: '2020-01-01T00:00Z') - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'original_created_at' => ['オリジナルの作成日時の順番がをかしぃです.'] ) @@ -2767,7 +2767,7 @@ RSpec.describe 'Posts API', type: :request do tags: 'spec_tag', original_created_from: 'not-a-time') - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'original_created_from' => ['オリジナルの作成日時の形式が不正です.'] ) diff --git a/backend/spec/requests/tag_children_spec.rb b/backend/spec/requests/tag_children_spec.rb index dd22144..42ca542 100644 --- a/backend/spec/requests/tag_children_spec.rb +++ b/backend/spec/requests/tag_children_spec.rb @@ -64,7 +64,7 @@ RSpec.describe "TagChildren", type: :request do do_request }.not_to change(TagImplication, :count) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(TagImplication.where(tag: child, parent_tag: parent)).not_to exist end end diff --git a/backend/spec/requests/tag_descriptions_spec.rb b/backend/spec/requests/tag_descriptions_spec.rb index ceff8fd..7b30222 100644 --- a/backend/spec/requests/tag_descriptions_spec.rb +++ b/backend/spec/requests/tag_descriptions_spec.rb @@ -303,7 +303,7 @@ RSpec.describe 'Tag description native API', type: :request do headers before_state = stored_state native_write(body: '') - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json).to include('type' => 'validation_error', 'errors' => include('body' => a_kind_of(Array))) expect(stored_state).to eq(before_state) diff --git a/backend/spec/requests/tag_group_locale_spec.rb b/backend/spec/requests/tag_group_locale_spec.rb index 23df55b..260cc88 100644 --- a/backend/spec/requests/tag_group_locale_spec.rb +++ b/backend/spec/requests/tag_group_locale_spec.rb @@ -84,7 +84,7 @@ RSpec.describe 'Tag group locale contracts', type: :request do put "/wiki/#{ group.id }", params: { locale: 'ain-Kana', title: 'タググループ:partial rename', body: '- japanese_member' }, headers: headers - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(group_state).to eq(before_state) end @@ -117,7 +117,7 @@ RSpec.describe 'Tag group locale contracts', type: :request do expect(representation.fetch('members').sole.fetch('tag').fetch('name')).to be_nil expect(representation.fetch('placements').sole.fetch('tag').fetch('name')).to be_nil get "/wiki/#{ old_group.id }", params: { locale: 'ain-Kana', version: version.id } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(response.body).not_to include('historical_japanese', 'current_ainu') end end diff --git a/backend/spec/requests/tag_group_markdown_spec.rb b/backend/spec/requests/tag_group_markdown_spec.rb index 894c9f5..87de33a 100644 --- a/backend/spec/requests/tag_group_markdown_spec.rb +++ b/backend/spec/requests/tag_group_markdown_spec.rb @@ -133,7 +133,7 @@ RSpec.describe 'Tag group Markdown round trips through the Wiki facade', type: : get group_title_path('混在構造') - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(group_rows('tag_groups', id:).sole.fetch('id')).to eq(id) end @@ -142,7 +142,7 @@ RSpec.describe 'Tag group Markdown round trips through the Wiki facade', type: : get group_title_path('未配置構造') - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(group_rows('tag_groups', id:).sole.fetch('id')).to eq(id) end end diff --git a/backend/spec/requests/tag_group_wiki_write_spec.rb b/backend/spec/requests/tag_group_wiki_write_spec.rb index 26c63aa..7a45652 100644 --- a/backend/spec/requests/tag_group_wiki_write_spec.rb +++ b/backend/spec/requests/tag_group_wiki_write_spec.rb @@ -21,7 +21,7 @@ RSpec.describe 'Tag group Wiki facade writes', type: :request do before_state = group_state yield aggregate_failures do - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(group_state).to eq(before_state) expect(response.media_type).to eq('application/json') expect(response.body).not_to be_empty diff --git a/backend/spec/requests/tag_group_write_integrity_spec.rb b/backend/spec/requests/tag_group_write_integrity_spec.rb index 2a9c82a..f0a60bf 100644 --- a/backend/spec/requests/tag_group_write_integrity_spec.rb +++ b/backend/spec/requests/tag_group_write_integrity_spec.rb @@ -27,7 +27,7 @@ RSpec.describe 'Tag group write integrity', type: :request do def expect_no_writes before_state = group_state yield - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(group_state).to eq(before_state) end diff --git a/backend/spec/requests/tag_groups_spec.rb b/backend/spec/requests/tag_groups_spec.rb index 091d919..b8e7f29 100644 --- a/backend/spec/requests/tag_groups_spec.rb +++ b/backend/spec/requests/tag_groups_spec.rb @@ -148,7 +148,7 @@ RSpec.describe 'Tag group native API', type: :request do before_state = group_state native_write(operation, payload.merge(invalid)) aggregate_failures do - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(group_state).to eq(before_state) end end @@ -158,7 +158,7 @@ RSpec.describe 'Tag group native API', type: :request do before_state = group_state invalid = [{ tag_id: tag.id, section_name: '不正', children: [] }] native_write(operation, payload.merge(placements: invalid)) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(group_state).to eq(before_state) end @@ -167,7 +167,7 @@ RSpec.describe 'Tag group native API', type: :request do before_state = group_state native_write(operation, payload.merge( members: [{ tag_id: missing }], placements: [{ tag_id: missing, children: [] }])) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(group_state).to eq(before_state) end @@ -177,7 +177,7 @@ RSpec.describe 'Tag group native API', type: :request do native_write(operation, payload.merge( members: [{ tag_group_id: missing }], placements: [{ tag_group_id: missing, children: [] }])) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(group_state).to eq(before_state) end @@ -186,7 +186,7 @@ RSpec.describe 'Tag group native API', type: :request do 6.times { nodes = [{ tag_id: tag.id, children: nodes }] } before_state = group_state native_write(operation, payload.merge(placements: nodes)) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(group_state).to eq(before_state) end end @@ -206,7 +206,7 @@ RSpec.describe 'Tag group native API', type: :request do before_state = group_state native_write(:update, payload.merge( members: [{ tag_group_id: parent }], placements: [])) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(group_state).to eq(before_state) end @@ -214,7 +214,7 @@ RSpec.describe 'Tag group native API', type: :request do before_state = group_state native_write(:update, payload.merge( members: [{ tag_group_id: group_id }], placements: [])) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(group_state).to eq(before_state) end diff --git a/backend/spec/requests/tags_deerjikists_spec.rb b/backend/spec/requests/tags_deerjikists_spec.rb index e0c2314..a4625c7 100644 --- a/backend/spec/requests/tags_deerjikists_spec.rb +++ b/backend/spec/requests/tags_deerjikists_spec.rb @@ -297,7 +297,7 @@ RSpec.describe 'Tags deerjikists API', type: :request do do_request }.not_to change { Deerjikist.where(tag: tag).map { |d| [d.platform, d.code] } } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json).to include( 'type' => 'validation_error', 'message' => '入力内容を確認してください.', @@ -321,7 +321,7 @@ RSpec.describe 'Tags deerjikists API', type: :request do do_request }.not_to change { Deerjikist.where(tag: tag).map { |d| [d.platform, d.code] } } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'deerjikists.0.platform' => [be_present], ) @@ -352,7 +352,7 @@ RSpec.describe 'Tags deerjikists API', type: :request do do_request }.not_to change { Deerjikist.order(:platform, :code).pluck(:platform, :code, :tag_id) } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'deerjikists.1.code' => [include('existing-deerjikist')], ) diff --git a/backend/spec/requests/tags_spec.rb b/backend/spec/requests/tags_spec.rb index 7a66889..195c57f 100644 --- a/backend/spec/requests/tags_spec.rb +++ b/backend/spec/requests/tags_spec.rb @@ -696,7 +696,7 @@ RSpec.describe 'Tags API', type: :request do it 'nico category への変更は 422 を返す' do patch "/tags/#{tag.id}", params: { name: 'new', category: 'nico' } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(primary_tag_name_for(tag.reload, 'ja').name).to eq('spec_tag') expect(tag.category).to eq('general') end @@ -740,7 +740,7 @@ RSpec.describe 'Tags API', type: :request do patch "/tags/#{tag.id}", params: { category: 'nico' } }.not_to change(TagVersion, :count) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(tag.reload.category).to eq('general') end @@ -824,7 +824,7 @@ RSpec.describe 'Tags API', type: :request do patch "/tags/#{ tag.id }", params: { name: 'unknown' } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'name' => ['その名前は既に使はれてゐます.'] ) @@ -840,7 +840,7 @@ RSpec.describe 'Tags API', type: :request do patch "/tags/#{ system_tag.id }", params: { name: 'patch_system_tag_renamed' } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(primary_tag_name_for(system_tag.reload, 'ja').name).to eq('bot操作') end end @@ -1144,7 +1144,7 @@ RSpec.describe 'Tags API', type: :request do parent_tags: '', } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(primary_tag_name_for(tag.reload, 'ja').name).to eq('spec_tag') end @@ -1156,7 +1156,7 @@ RSpec.describe 'Tags API', type: :request do parent_tags: '', } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(primary_tag_name_for(tag.reload, 'ja').name).to eq('spec_tag') expect(tag.category).to eq('general') end @@ -1169,7 +1169,7 @@ RSpec.describe 'Tags API', type: :request do parent_tags: '', } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'deprecated' => ['廃止状態は必須です.'] ) @@ -1366,7 +1366,7 @@ RSpec.describe 'Tags API', type: :request do } }.not_to change(TagVersion, :count) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(primary_tag_name_for(tag.reload, 'ja').name).to eq('spec_tag') expect(tag.category).to eq('general') @@ -1387,7 +1387,7 @@ RSpec.describe 'Tags API', type: :request do } }.not_to change(TagVersion, :count) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(primary_tag_name_for(system_tag.reload, 'ja').name).to eq(old_name) expect(system_tag.category).to eq(old_category) @@ -1569,7 +1569,7 @@ RSpec.describe 'Tags API', type: :request do deprecated: '0', } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(TagImplication.where(tag:, parent_tag: child)).not_to exist end diff --git a/backend/spec/requests/theatre_comments_spec.rb b/backend/spec/requests/theatre_comments_spec.rb index 78295be..fa2d304 100644 --- a/backend/spec/requests/theatre_comments_spec.rb +++ b/backend/spec/requests/theatre_comments_spec.rb @@ -131,7 +131,7 @@ RSpec.describe 'TheatreComments', type: :request do post "/theatres/#{theatre.id}/comments", params: { content: ' ' } }.not_to change(TheatreComment, :count) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) end it 'theatre が存在しなければ 404 を返す' do diff --git a/backend/spec/requests/theatres_spec.rb b/backend/spec/requests/theatres_spec.rb index 60fb964..d031761 100644 --- a/backend/spec/requests/theatres_spec.rb +++ b/backend/spec/requests/theatres_spec.rb @@ -376,7 +376,7 @@ RSpec.describe 'Theatres API', type: :request do put "/theatres/#{theatre.id}/skip_vote", params: { post_id: 'invalid' } }.not_to change(TheatreSkipVote, :count) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) end it 'records a vote and returns the current vote status before majority' do diff --git a/backend/spec/requests/user_settings_spec.rb b/backend/spec/requests/user_settings_spec.rb index 74a7661..54df276 100644 --- a/backend/spec/requests/user_settings_spec.rb +++ b/backend/spec/requests/user_settings_spec.rb @@ -79,7 +79,7 @@ RSpec.describe 'user settings', type: :request do patch '/users/settings', params: { theme: 1 }, as: :json - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json).to include('type' => 'validation_error') expect(json.fetch('errors')).to include( 'theme' => ['値の型が不正です.']) @@ -90,7 +90,7 @@ RSpec.describe 'user settings', type: :request do patch '/users/settings', params: { theme: 'neon' }, as: :json - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json).to include('type' => 'validation_error') expect(json.fetch('errors').fetch('theme')).to be_present end diff --git a/backend/spec/requests/user_theme_slots_spec.rb b/backend/spec/requests/user_theme_slots_spec.rb index 404cde9..3ae984c 100644 --- a/backend/spec/requests/user_theme_slots_spec.rb +++ b/backend/spec/requests/user_theme_slots_spec.rb @@ -84,7 +84,7 @@ RSpec.describe 'user theme slots', type: :request do params: { tokens: 'not-object' }, as: :json - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'base_theme' => ['値が不正です.']) end @@ -96,7 +96,7 @@ RSpec.describe 'user theme slots', type: :request do params: { tokens: 'not-object' }, as: :json - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'tokens' => ['JSON object で指定してください.']) end diff --git a/backend/spec/requests/users_spec.rb b/backend/spec/requests/users_spec.rb index fb088d4..f8f9e7e 100644 --- a/backend/spec/requests/users_spec.rb +++ b/backend/spec/requests/users_spec.rb @@ -119,7 +119,7 @@ RSpec.describe 'Users', type: :request do params: { name: ' ' }, headers: auth_headers(user) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json.fetch('errors')).to include( 'name' => ['名前は必須です.']) end diff --git a/backend/spec/requests/wiki_creation_freeze_spec.rb b/backend/spec/requests/wiki_creation_freeze_spec.rb index 028cb12..51450a4 100644 --- a/backend/spec/requests/wiki_creation_freeze_spec.rb +++ b/backend/spec/requests/wiki_creation_freeze_spec.rb @@ -39,7 +39,7 @@ RSpec.describe 'Wiki creation freeze', type: :request do it "rejects invalid description body #{ body.inspect } atomically" do before_state = group_state put "/wiki/#{ page.id }", params: { title: tag.name('ja'), body: }, headers: headers - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(group_state).to eq(before_state) end end diff --git a/backend/spec/requests/wiki_spec.rb b/backend/spec/requests/wiki_spec.rb index 9c8fb4e..68380c2 100644 --- a/backend/spec/requests/wiki_spec.rb +++ b/backend/spec/requests/wiki_spec.rb @@ -100,12 +100,12 @@ RSpec.describe 'Wiki API', type: :request do context 'when params invalid' do it 'returns 422 when title blank' do post endpoint, params: { title: '', body: 'Hello' }, headers: auth_headers(member) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) end it 'returns 422 when body blank' do post endpoint, params: { title: 'Test', body: '' }, headers: auth_headers(member) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) end end @@ -160,7 +160,7 @@ RSpec.describe 'Wiki API', type: :request do put "/wiki/#{page.id}", params: { title: 'TestPage', body: '' }, headers: auth_headers(member) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) end end diff --git a/backend/spec/requests/wiki_title_collision_spec.rb b/backend/spec/requests/wiki_title_collision_spec.rb index 81f9435..eb344f1 100644 --- a/backend/spec/requests/wiki_title_collision_spec.rb +++ b/backend/spec/requests/wiki_title_collision_spec.rb @@ -34,7 +34,7 @@ RSpec.describe 'Wiki title collision', type: :request do }, headers: auth_headers(user) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) source.reload diff --git a/backend/spec/requests/wiki_unmigrated_contract_spec.rb b/backend/spec/requests/wiki_unmigrated_contract_spec.rb index 300c858..f0d511a 100644 --- a/backend/spec/requests/wiki_unmigrated_contract_spec.rb +++ b/backend/spec/requests/wiki_unmigrated_contract_spec.rb @@ -18,7 +18,7 @@ RSpec.describe 'Removed standalone Wiki resources', type: :request do before_state = group_state post '/wiki', params: { title:, body: 'body' }, headers: cookie_headers(user) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(group_state).to eq(before_state) end end