このコミットが含まれているのは:
2026-10-01 23:21:03 +09:00
コミット 860cd82175
17個のファイルの変更、485行の追加、79行の削除
+36
ファイルの表示
@@ -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
+91
ファイルの表示
@@ -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