このコミットが含まれているのは:
@@ -0,0 +1,60 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe NicoTagVersionRecorder do
|
||||
let(:external_tag) { create(:external_tag, name: 'raw tag[]') }
|
||||
let(:member) { create(:user, :member) }
|
||||
|
||||
def record event_type
|
||||
described_class.record!(external_tag:, event_type:, created_by_user: member)
|
||||
end
|
||||
|
||||
it 'records the external association and platform-qualified name' do
|
||||
version = record(:create)
|
||||
|
||||
expect(version).to have_attributes(
|
||||
external_tag:, version_no: 1, event_type: 'create',
|
||||
name: 'nico:raw tag[]', linked_tags: '', created_by_user: member)
|
||||
expect(external_tag.reload.nico_tag_versions).to contain_exactly(version)
|
||||
end
|
||||
|
||||
it 'uses the latest history number when the record has no version_no column' do
|
||||
first = record(:create)
|
||||
external_tag.update!(name: 'changed')
|
||||
second = record(:update)
|
||||
|
||||
expect(second).to have_attributes(version_no: 2, name: 'nico:changed')
|
||||
expect(first.reload.name).to eq('nico:raw tag[]')
|
||||
expect(external_tag.reload.has_attribute?(:version_no)).to be(false)
|
||||
end
|
||||
|
||||
it 'returns the latest version without appending an unchanged snapshot' do
|
||||
first = record(:create)
|
||||
|
||||
expect { expect(record(:update)).to eq(first) }
|
||||
.not_to change(NicoTagVersion, :count)
|
||||
end
|
||||
|
||||
it 'still requires a create event before any update' do
|
||||
expect { record(:update) }
|
||||
.to raise_error(RuntimeError, 'NicoTagVersion first event must be create')
|
||||
expect(external_tag.nico_tag_versions).to be_empty
|
||||
end
|
||||
|
||||
it 'still rejects a second create event' do
|
||||
first = record(:create)
|
||||
|
||||
expect { record(:create) }
|
||||
.to raise_error(RuntimeError, 'NicoTagVersion create event already exists')
|
||||
expect(external_tag.nico_tag_versions).to contain_exactly(first)
|
||||
end
|
||||
|
||||
it 'records sorted linked internal names and later link removal' do
|
||||
tags = ['z_link', 'a_link'].map { |name| Tag.create!(name:, category: :general) }
|
||||
tags.each { |tag| NicoTagRelation.create!(nico_tag: external_tag, tag:) }
|
||||
|
||||
expect(record(:create).linked_tags).to eq('a_link z_link')
|
||||
external_tag.linked_tags = [tags.first]
|
||||
|
||||
expect(record(:update)).to have_attributes(version_no: 2, linked_tags: 'z_link')
|
||||
end
|
||||
end
|
||||
@@ -50,6 +50,19 @@ RSpec.describe PostCreatePlan do
|
||||
expect(plan[:video_ms]).to eq(60_000)
|
||||
end
|
||||
|
||||
it 'rejects direct external tag input without creating internal records' do
|
||||
create(:external_tag, name: 'reserved')
|
||||
counts = [Tag.count, TagName.count, ExternalTag.count]
|
||||
|
||||
expect {
|
||||
described_class.new(attributes: { tags: 'NiCo:reserved' }).build!
|
||||
}.to raise_error(ActiveRecord::RecordInvalid) { |error|
|
||||
expect(error.record.errors[:tags]).to be_present
|
||||
}
|
||||
|
||||
expect([Tag.count, TagName.count, ExternalTag.count]).to eq(counts)
|
||||
end
|
||||
|
||||
it 'validates a new tag name without persisting it' do
|
||||
long_name = 'a' * 256
|
||||
counts = [TagName.count, Tag.count]
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする