このコミットが含まれているのは:
@@ -0,0 +1,36 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe 'TagName database invariants' do
|
||||
def insert_name!(**attributes)
|
||||
TagName.insert_all!([{ name: 'constraint_name', language_code: 'ja',
|
||||
script_code: 'Jpan', primary_flg: true,
|
||||
created_at: Time.current, updated_at: Time.current,
|
||||
**attributes }])
|
||||
end
|
||||
|
||||
it 'defaults persisted names to human-confirmed provenance' do
|
||||
insert_name!
|
||||
|
||||
expect(TagName.find_by!(name: 'constraint_name').auto_generated).to be(false)
|
||||
end
|
||||
|
||||
[[true, true], [true, false], [false, false]].each do |primary_flg, auto_generated|
|
||||
it "allows primary=#{ primary_flg }, auto_generated=#{ auto_generated }" do
|
||||
expect { insert_name!(primary_flg:, auto_generated:) }
|
||||
.to change(TagName, :count).by(1)
|
||||
end
|
||||
end
|
||||
|
||||
it 'rejects auto-generated aliases at the database boundary' do
|
||||
expect { insert_name!(primary_flg: false, auto_generated: true) }
|
||||
.to raise_error(ActiveRecord::StatementInvalid, /check constraint/i)
|
||||
end
|
||||
|
||||
it 'rejects a second primary for the same tag and language' do
|
||||
tag = create(:tag)
|
||||
|
||||
expect { insert_name!(tag_id: tag.id, auto_generated: false) }
|
||||
.to raise_error(ActiveRecord::RecordNotUnique)
|
||||
expect(TagName.where(tag:, language_code: 'ja', primary_flg: true).count).to eq(1)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,91 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe 'TagVersion names database constraint' do
|
||||
let(:tag) { create(:tag) }
|
||||
let(:names) do
|
||||
{ 'ja' => { 'name' => 'snapshot_name', 'script_code' => 'Jpan',
|
||||
'auto_generated' => false, 'aliases' => [] } }
|
||||
end
|
||||
let(:alias_name) { { 'name' => 'snapshot_alias', 'script_code' => 'Jpan' } }
|
||||
|
||||
def insert_snapshot!(snapshot)
|
||||
TagVersion.insert_all!([{ tag_id: tag.id, version_no: 1, event_type: 'create',
|
||||
name: 'snapshot_name', category: 'general',
|
||||
aliases: '', parent_tag_ids: '', names: snapshot,
|
||||
created_at: Time.current }])
|
||||
end
|
||||
|
||||
it 'accepts grouped Nipponese names with an empty alias list' do
|
||||
expect { insert_snapshot!(names) }.to change(TagVersion, :count).by(1)
|
||||
expect(TagVersion.find_by!(tag_id: tag.id).names).to eq(names)
|
||||
end
|
||||
|
||||
it 'accepts aliases containing only their name and script' do
|
||||
names['ja']['aliases'] = [alias_name]
|
||||
|
||||
expect { insert_snapshot!(names) }.to change(TagVersion, :count).by(1)
|
||||
end
|
||||
|
||||
it 'rejects a flat array root' do
|
||||
expect { insert_snapshot!([names.fetch('ja')]) }
|
||||
.to raise_error(ActiveRecord::StatementInvalid, /check constraint/i)
|
||||
end
|
||||
|
||||
it 'rejects an empty object root' do
|
||||
expect { insert_snapshot!({ }) }
|
||||
.to raise_error(ActiveRecord::StatementInvalid, /check constraint/i)
|
||||
end
|
||||
|
||||
it 'rejects a language entry that is not an object' do
|
||||
expect { insert_snapshot!({ 'ja' => 'not an object' }) }
|
||||
.to raise_error(ActiveRecord::StatementInvalid, /check constraint/i)
|
||||
end
|
||||
|
||||
['name', 'script_code', 'auto_generated', 'aliases'].each do |field|
|
||||
it "rejects a primary entry missing #{ field }" do
|
||||
names['ja'].delete(field)
|
||||
|
||||
expect { insert_snapshot!(names) }
|
||||
.to raise_error(ActiveRecord::StatementInvalid, /check constraint/i)
|
||||
end
|
||||
end
|
||||
|
||||
it 'rejects an empty primary name' do
|
||||
names['ja']['name'] = ''
|
||||
|
||||
expect { insert_snapshot!(names) }
|
||||
.to raise_error(ActiveRecord::StatementInvalid, /check constraint/i)
|
||||
end
|
||||
|
||||
it 'rejects incorrect script casing' do
|
||||
names['ja']['script_code'] = 'JPAN'
|
||||
|
||||
expect { insert_snapshot!(names) }
|
||||
.to raise_error(ActiveRecord::StatementInvalid, /check constraint/i)
|
||||
end
|
||||
|
||||
['unknown', 'primary_flg', 'language_code'].each do |field|
|
||||
it "rejects the extra primary field #{ field }" do
|
||||
names['ja'][field] = true
|
||||
|
||||
expect { insert_snapshot!(names) }
|
||||
.to raise_error(ActiveRecord::StatementInvalid, /check constraint/i)
|
||||
end
|
||||
end
|
||||
|
||||
['unknown', 'primary_flg', 'auto_generated'].each do |field|
|
||||
it "rejects the extra alias field #{ field }" do
|
||||
names['ja']['aliases'] = [alias_name.merge(field => true)]
|
||||
|
||||
expect { insert_snapshot!(names) }
|
||||
.to raise_error(ActiveRecord::StatementInvalid, /check constraint/i)
|
||||
end
|
||||
end
|
||||
|
||||
it 'rejects duplicate alias objects' do
|
||||
names['ja']['aliases'] = [alias_name, alias_name.deep_dup]
|
||||
|
||||
expect { insert_snapshot!(names) }
|
||||
.to raise_error(ActiveRecord::StatementInvalid, /check constraint/i)
|
||||
end
|
||||
end
|
||||
新しいイシューから参照
ユーザーをブロックする