require 'rails_helper' RSpec.describe 'API locale resolution', type: :request do let!(:tag) { create(:tag, primary_name: '日本語正本') } it 'defaults an omitted locale to Japanese' do get "/tags/#{ tag.id }" expect(response).to have_http_status(:ok) expect(json.fetch('name')).to eq('日本語正本') end it 'accepts an explicitly requested active Japanese locale' do get "/tags/#{ tag.id }", params: { locale: 'ja' } expect(response).to have_http_status(:ok) expect(json.fetch('name')).to eq('日本語正本') end ['', 'en', 'ain', 'Jpan', 'JA', 'unknown', ['ja']].each do |code| it "rejects invalid locale #{ code.inspect } instead of defaulting to Japanese" do get "/tags/#{ tag.id }", params: { locale: code } expect(response).to have_http_status(:not_found) expect(response.body).not_to include('日本語正本') end end it 'rejects a supported locale that has not been registered' do get "/tags/#{ tag.id }", params: { locale: 'ain-Kana' } expect(response).to have_http_status(:not_found) end it 'rejects an inactive locale' do Locale.nipponese.update!(deprecated_at: Time.current) get "/tags/#{ tag.id }", params: { locale: 'ja' } expect(response).to have_http_status(:not_found) end it 'does not write posts or tag names under an invalid locale' do sign_in_as(create_member_user!) expect do post '/posts', params: { locale: 'en', title: 'invalid locale', url: 'https://example.com/invalid-locale', tags: 'unwritten_tag' } end.to change(Post, :count).by(0).and change(TagName, :count).by(0) expect(response).to have_http_status(:not_found) end end