このコミットが含まれているのは:
2026-10-01 23:21:03 +09:00
コミット 860cd82175
17個のファイルの変更、485行の追加、79行の削除
+86 -5
ファイルの表示
@@ -17,12 +17,51 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
tag_name.tag
end
it 'confirms a generated Nipponese primary when a human renames it' do
tag = create(:tag, primary_name: 'generated_source')
primary = primary_tag_name_for(tag, 'ja')
primary.update!(name: "Tag_##{ tag.id }", auto_generated: true)
patch "/tags/#{ tag.id }", params: { locale: 'ja', name: '人間が確定した名称' }
expect(response).to have_http_status(:ok), response.body
expect(primary.reload).to have_attributes(
name: '人間が確定した名称', auto_generated: false)
end
it 'rolls back Nipponese edits when an alias conflicts with another primary' do
tag = create(:tag, primary_name: 'target_before_collision')
create(:tag_name, :alias, tag:, name: 'existing_alias')
other_tag = create(:tag, primary_name: 'other_primary')
other_primary = primary_tag_name_for(other_tag, 'ja')
primary_name_before = primary_tag_name_for(tag, 'ja').name
aliases_before = tag.tag_names.where(primary_flg: false).order(:name).pluck(:name)
category_before = tag.category
put "/tags/#{ tag.id }", params: {
locale: 'ja', name: 'renamed_before_collision', category: 'character',
deprecated: false, aliases: 'other_primary', parent_tags: '' }
aggregate_failures do
expect(response).to have_http_status(:unprocessable_entity)
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)
expect(primary_tag_name_for(tag.reload, 'ja').name).to eq(primary_name_before)
expect(tag.category).to eq(category_before)
expect(tag.tag_names.where(primary_flg: false).order(:name).pluck(:name))
.to eq(aliases_before)
end
end
['en', nil].each do |requested_locale|
context "with locale #{ requested_locale.inspect }" do
let(:locale_params) { requested_locale ? { locale: requested_locale } : { } }
let(:expected_locale) { requested_locale ? locale : Locale.nipponese }
it 'creates post tags in the requested language or Nipponese fallback' do
pending '日本語以外の Locale 有効化は別課題で実装する' if requested_locale
locale if requested_locale
post '/posts', params: locale_params.merge(
title: 'Locale post', url: 'https://example.com/locale-post',
tags: 'locale_post_tag', parent_post_ids: '')
@@ -33,6 +72,8 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
it 'updates post tags in the requested language or Nipponese fallback' do
pending '日本語以外の Locale 有効化は別課題で実装する' if requested_locale
locale if requested_locale
record = create(:post)
PostVersionRecorder.record!(post: record, event_type: :create, created_by_user: member)
@@ -46,6 +87,8 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
it 'passes the resolved locale to bulk creation' do
pending '日本語以外の Locale 有効化は別課題で実装する' if requested_locale
locale if requested_locale
# Worker propagation is exercised in post_bulk_creator_spec.
expect_any_instance_of(PostBulkCreator).to receive(:run)
.with(expected_locale).and_return(results: [])
@@ -59,6 +102,8 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
it 'creates materials with tags in the resolved locale' do
pending '日本語以外の Locale 有効化は別課題で実装する' if requested_locale
locale if requested_locale
post '/materials', params: locale_params.merge(
tag: 'locale_material', url: 'https://example.com/material')
@@ -68,6 +113,8 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
it 'updates materials with tags in the resolved locale' do
pending '日本語以外の Locale 有効化は別課題で実装する' if requested_locale
locale if requested_locale
tag = create(:tag, category: :material)
material = Material.create!(tag:, url: 'https://example.com/material')
@@ -80,6 +127,8 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
it 'links Nico external tags to internal tags in the resolved locale' do
pending '日本語以外の Locale 有効化は別課題で実装する' if requested_locale
locale if requested_locale
external = create(:external_tag)
NicoTagVersionRecorder.record!(
external_tag: external, event_type: :create, created_by_user: member)
@@ -92,6 +141,8 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
it 'creates parent tags in the resolved locale' do
pending '日本語以外の Locale 有効化は別課題で実装する' if requested_locale
locale if requested_locale
tag = create(:tag)
put "/tags/#{ tag.id }", params: locale_params.merge(
@@ -106,11 +157,11 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
context 'with existing names in both languages' do
let!(:english_name) do
let(:english_name) do
create(:tag_name, name: 'shared_name', language_code: 'en', script_code: 'Latn')
end
let!(:english_tag) { create(:tag, primary_tag_name: english_name, category: :material) }
let!(:nipponese_tag) do
let(:english_tag) { create(:tag, primary_tag_name: english_name, category: :material) }
let(:nipponese_tag) do
create(:tag, primary_name: 'temporary_nipponese', category: :general).tap do |tag|
# Isolate lookup from the separately tested uniqueness validation.
primary_tag_name_for(tag, 'ja').update_columns(name: 'shared_name')
@@ -118,6 +169,10 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
it 'plans and creates the post using the English identity and category' do
pending '日本語以外の Locale 有効化は別課題で実装する'
locale
english_tag
nipponese_tag
post '/posts', params: {
locale: 'en', title: 'English identity',
url: 'https://example.com/english-identity', tags: 'shared_name', parent_post_ids: '' }
@@ -131,6 +186,10 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
it 'updates the post using the English identity' do
pending '日本語以外の Locale 有効化は別課題で実装する'
locale
english_tag
nipponese_tag
record = create(:post)
PostVersionRecorder.record!(post: record, event_type: :create, created_by_user: member)
@@ -144,6 +203,10 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
it 'resolves the English material tag' do
pending '日本語以外の Locale 有効化は別課題で実装する'
locale
english_tag
nipponese_tag
post '/materials', params: {
locale: 'en', tag: 'shared_name', url: 'https://example.com/english-material' }
@@ -153,6 +216,10 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
it 'resolves the English parent tag' do
pending '日本語以外の Locale 有効化は別課題で実装する'
locale
english_tag
nipponese_tag
child = create(:tag)
put "/tags/#{ child.id }", params: {
@@ -165,6 +232,10 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
it 'resolves the English internal tag for a Nico link' do
pending '日本語以外の Locale 有効化は別課題で実装する'
locale
english_tag
nipponese_tag
external = create(:external_tag)
NicoTagVersionRecorder.record!(
external_tag: external, event_type: :create, created_by_user: member)
@@ -177,12 +248,14 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
context 'when renaming or updating aliases in English' do
let!(:english_name) do
let(:english_name) do
create(:tag_name, name: 'english_original', language_code: 'en', script_code: 'Latn')
end
let!(:tag) { create(:tag, primary_tag_name: english_name) }
let(:tag) { create(:tag, primary_tag_name: english_name) }
it 'marks a human-renamed generated primary as no longer auto-generated' do
pending '日本語以外の Locale 有効化は別課題で実装する'
locale
generated_tag = create(:tag, primary_name: 'rename_generated_source')
generated_name = primary_tag_name_for(generated_tag, 'en')
expect(generated_name.auto_generated).to be(true)
@@ -196,6 +269,8 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
it 'does not steal another tag primary for an alias' do
pending '日本語以外の Locale 有効化は別課題で実装する'
locale
other_tag = create(:tag, primary_name: 'other_nipponese')
other_primary = primary_tag_name_for(other_tag, 'en')
other_primary.update!(name: 'other_english_primary', auto_generated: false)
@@ -228,6 +303,8 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
it 'allows a rename to a name already used in Nipponese' do
pending '日本語以外の Locale 有効化は別課題で実装する'
locale
nipponese = create(:tag, primary_name: 'rename_target')
patch "/tags/#{ tag.id }", params: { locale: 'en', name: 'rename_target' }
@@ -240,6 +317,8 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
it 'creates aliases in the requested language' do
pending '日本語以外の Locale 有効化は別課題で実装する'
locale
put "/tags/#{ tag.id }", params: {
locale: 'en', name: english_name.name,
category: tag.category, deprecated: false,
@@ -255,6 +334,8 @@ RSpec.describe 'Locale propagation on write paths', type: :request do
end
it 'does not take an alias from another language' do
pending '日本語以外の Locale 有効化は別課題で実装する'
locale
nipponese = create(:tag, primary_name: 'nipponese_owner')
nipponese_alias = create(:tag_name, :alias, name: 'shared_alias',
tag: nipponese)
+4 -6
ファイルの表示
@@ -36,12 +36,10 @@ RSpec.describe 'TagVersions API', type: :request do
category: category,
deprecated_at: deprecated_at,
aliases: Array(aliases).join(' '),
names: [{ language_code: 'ja', name:, script_code: 'Jpan',
primary_flg: true,
auto_generated: false }] + Array(aliases).map { |alias_name|
{ language_code: 'ja', name: alias_name, script_code: 'Jpan',
primary_flg: false, auto_generated: false }
},
names: { ja: { name:, script_code: 'Jpan', auto_generated: false,
aliases: Array(aliases).sort.map { |alias_name|
{ name: alias_name, script_code: 'Jpan' }
} } },
parent_tag_ids: Array(parent_tags).map(&:id).join(' '),
created_by_user: created_by_user,
created_at: created_at)
+2 -6
ファイルの表示
@@ -19,15 +19,11 @@ RSpec.describe 'Tags API', type: :request do
end
def version_primary_name(version, language_code)
version.names.find { |name|
name['language_code'] == language_code && name['primary_flg']
}.fetch('name')
version.names.fetch(language_code).fetch('name')
end
def version_alias_names(version, language_code)
version.names.filter_map { |name|
name['name'] if name['language_code'] == language_code && !name['primary_flg']
}
version.names.fetch(language_code).fetch('aliases').pluck('name')
end
def dummy_material_upload(filename: 'dummy.png', type: 'image/png', body: 'dummy')