require 'rails_helper' RSpec.describe Locale, type: :model do def prepare_french_reference! Language.find_or_create_by!(code: 'fr') { _1.name = 'French' } Script.find_or_create_by!(code: 'Latn') { _1.name = 'Latin' } end def create_french_locale! prepare_french_reference! described_class.create!(code: 'fr', language_code: 'fr', script_code: 'Latn', name: 'French') end it 'generates a primary name for every existing tag using the name generator' do first = create(:tag, name: 'first_existing_tag') second = create(:tag, name: 'second_existing_tag') allow(TagName).to receive(:generate_name).and_call_original allow(TagName).to receive(:generate_name) .with(kind_of(described_class), first, first.name) .and_return('name_from_generator') locale = create_french_locale! expect(TagName).to have_received(:generate_name).with(locale, first, first.name) expect(TagName).to have_received(:generate_name).with(locale, second, second.name) expect(first.tag_names.find_by!(language_code: 'fr', primary_flg: true)) .to have_attributes(name: 'name_from_generator', tag_id: first.id, language_code: 'fr', script_code: 'Latn', primary_flg: true) expect(second.tag_names.find_by!(language_code: 'fr', primary_flg: true)) .to have_attributes(tag_id: second.id, language_code: 'fr', script_code: 'Latn', primary_flg: true) expect(TagName.where(language_code: 'fr', primary_flg: true, tag_id: [first.id, second.id]).count).to eq(2) end it 'does not duplicate an existing primary name in the new language' do prepare_french_reference! tag = create(:tag, name: 'already_named') existing = create(:tag_name, name: 'nom_existant', tag:, language_code: 'fr', script_code: 'Latn') create_french_locale! expect(TagName.where(tag_id: tag.id, language_code: 'fr', primary_flg: true)) .to contain_exactly(existing) expect(existing.reload).to have_attributes( tag_id: tag.id, language_code: 'fr', script_code: 'Latn', primary_flg: true) end it 'creates a primary name when the language has only an alias' do prepare_french_reference! tag = create(:tag, name: 'alias_only_tag') alias_name = create(:tag_name, :alias, name: 'alias_fr', tag:, language_code: 'fr', script_code: 'Latn') create_french_locale! expect(alias_name.reload).to have_attributes( tag_id: tag.id, language_code: 'fr', script_code: 'Latn', primary_flg: false) generated = TagName.find_by!(tag_id: tag.id, language_code: 'fr', primary_flg: true) expect(generated).to have_attributes(tag_id: tag.id, language_code: 'fr', script_code: 'Latn', primary_flg: true) expect(TagName.where(tag_id: tag.id, language_code: 'fr', primary_flg: true).count).to eq(1) end end