このコミットが含まれているのは:
@@ -2,7 +2,7 @@ require 'rails_helper'
|
||||
|
||||
RSpec.describe PostCreatePlan do
|
||||
def create_tag! name, category
|
||||
Tag.create!(name:, category:)
|
||||
create(:tag, name:, category:)
|
||||
end
|
||||
|
||||
before do
|
||||
@@ -10,6 +10,56 @@ RSpec.describe PostCreatePlan do
|
||||
create_tag!('ニジラー情報不詳', :meta)
|
||||
end
|
||||
|
||||
context 'with an explicit locale' do
|
||||
include_context 'English locale'
|
||||
|
||||
it 'resolves the matching language identity and its parents' do
|
||||
english_name = create(:tag_name, name: 'shared_name',
|
||||
language_code: 'en', script_code: 'Latn')
|
||||
english = create(:tag, tag_name: english_name, category: :character)
|
||||
japanese = create(:tag, name: 'temporary_japanese', category: :general)
|
||||
# The DB permits this identity; validation has its own contract spec.
|
||||
japanese.tag_name.update_columns(name: 'shared_name')
|
||||
english_parent = create(:tag, name: 'english_parent', category: :material)
|
||||
japanese_parent = create(:tag, name: 'japanese_parent', category: :general)
|
||||
TagImplication.create!(tag: english, parent_tag: english_parent)
|
||||
TagImplication.create!(tag: japanese, parent_tag: japanese_parent)
|
||||
|
||||
plan = described_class.new(attributes: { tags: 'shared_name' }).build!(locale)
|
||||
|
||||
expect(plan[:direct_tag_specs]).to eq(
|
||||
[{ name: 'shared_name', category: :character }])
|
||||
expect(plan[:post_tag_specs]).to include(
|
||||
{ name: english_parent.name, category: :material })
|
||||
expect(plan[:post_tag_specs].pluck(:name)).not_to include(japanese_parent.name)
|
||||
end
|
||||
|
||||
it 'resolves aliases within the requested language' do
|
||||
japanese = create(:tag, name: 'japanese_canonical')
|
||||
english_name = create(:tag_name, name: 'english_canonical',
|
||||
language_code: 'en', script_code: 'Latn')
|
||||
english = create(:tag, tag_name: english_name, category: :character)
|
||||
japanese_alias = create(:tag_name, :alias, name: 'shared_alias',
|
||||
canonical: japanese.tag_name)
|
||||
english_alias = create(:tag_name, :alias, name: 'temporary_alias',
|
||||
canonical: english_name,
|
||||
language_code: 'en', script_code: 'Latn')
|
||||
english_alias.update_columns(name: 'shared_alias')
|
||||
|
||||
expect(japanese_alias.reload).to have_attributes(
|
||||
canonical_id: japanese.tag_name_id, tag_id: japanese.id,
|
||||
primary_flg: false, language_code: 'ja')
|
||||
expect(english_alias.reload).to have_attributes(
|
||||
canonical_id: english_name.id, tag_id: english.id,
|
||||
primary_flg: false, language_code: 'en')
|
||||
|
||||
plan = described_class.new(attributes: { tags: 'shared_alias' }).build!(locale)
|
||||
|
||||
expect(plan[:direct_tag_specs]).to eq(
|
||||
[{ name: english.name, category: :character }])
|
||||
end
|
||||
end
|
||||
|
||||
it 'plans direct and existing default tags without persisting records' do
|
||||
counts = [TagName.count, Tag.count]
|
||||
|
||||
@@ -18,7 +68,7 @@ RSpec.describe PostCreatePlan do
|
||||
url: 'https://example.com/post',
|
||||
title: 'title',
|
||||
tags: 'character:new_character',
|
||||
parent_post_ids: '' }).build!
|
||||
parent_post_ids: '' }).build!(Locale.nipponese)
|
||||
|
||||
expect(plan[:tags]).to eq('new_character')
|
||||
expect(plan[:direct_tag_specs]).to eq(
|
||||
@@ -31,7 +81,7 @@ RSpec.describe PostCreatePlan do
|
||||
|
||||
it 'resolves aliases and keeps tag sections separate from canonical names' do
|
||||
canonical = create_tag!('虹夏', :character)
|
||||
TagName.create!(name: 'にじか', canonical: canonical.tag_name)
|
||||
create(:tag_name, :alias, name: 'にじか', canonical: canonical.tag_name)
|
||||
create_tag!('動画', :meta)
|
||||
|
||||
plan = described_class.new(
|
||||
@@ -40,7 +90,7 @@ RSpec.describe PostCreatePlan do
|
||||
title: 'video',
|
||||
tags: '動画 にじか[0:10-0:20]',
|
||||
duration: '1:00',
|
||||
parent_post_ids: '' }).build!
|
||||
parent_post_ids: '' }).build!(Locale.nipponese)
|
||||
|
||||
expect(plan[:tags].split).to include('動画', '虹夏[0:10-0:20]')
|
||||
expect(plan[:display_tags]).to include(
|
||||
@@ -55,7 +105,7 @@ RSpec.describe PostCreatePlan do
|
||||
counts = [Tag.count, TagName.count, ExternalTag.count]
|
||||
|
||||
expect {
|
||||
described_class.new(attributes: { tags: 'NiCo:reserved' }).build!
|
||||
described_class.new(attributes: { tags: 'NiCo:reserved' }).build!(Locale.nipponese)
|
||||
}.to raise_error(ActiveRecord::RecordInvalid) { |error|
|
||||
expect(error.record.errors[:tags]).to be_present
|
||||
}
|
||||
@@ -73,7 +123,7 @@ RSpec.describe PostCreatePlan do
|
||||
url: 'https://example.com/post',
|
||||
title: 'title',
|
||||
tags: long_name,
|
||||
parent_post_ids: '' }).build!
|
||||
parent_post_ids: '' }).build!(Locale.nipponese)
|
||||
}.to raise_error(ActiveRecord::RecordInvalid) { |error|
|
||||
expect(error.record.errors[:tags]).not_to be_empty
|
||||
}
|
||||
@@ -87,7 +137,7 @@ RSpec.describe PostCreatePlan do
|
||||
title: 'title',
|
||||
tags: 'ordinary_tag',
|
||||
duration: 'invalid',
|
||||
parent_post_ids: '' }).build!
|
||||
parent_post_ids: '' }).build!(Locale.nipponese)
|
||||
|
||||
expect(plan[:duration]).to eq('invalid')
|
||||
expect(plan[:video_ms]).to be_nil
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする