spec/utility/elasticsearch/text_analysis_settings_spec.rb (75 lines of code) (raw):
# frozen_string_literal: true
#
# Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
# or more contributor license agreements. Licensed under the Elastic License;
# you may not use this file except in compliance with the Elastic License.
#
require 'spec_helper'
require 'utility/elasticsearch/index/text_analysis_settings'
describe Utility::Elasticsearch::Index::TextAnalysisSettings do
describe '#initialize' do
it 'creates an TextAnalysisSettings object' do
expect(described_class.new).to be_kind_of(Utility::Elasticsearch::Index::TextAnalysisSettings)
end
it 'accept symbols as language_code' do
expect { described_class.new(language_code: :de) }.not_to raise_error(
Utility::Elasticsearch::Index::TextAnalysisSettings::UnsupportedLanguageCode
)
end
it 'accept strings as language_code' do
expect { described_class.new(language_code: 'de') }.not_to raise_error(
Utility::Elasticsearch::Index::TextAnalysisSettings::UnsupportedLanguageCode
)
end
end
describe '#to_h' do
let(:language_code) { Utility::Elasticsearch::Index::TextAnalysisSettings::DEFAULT_LANGUAGE }
let(:subject) { described_class.new(language_code: language_code, analysis_icu: analysis_icu).to_h }
let(:expected_analyzer_keys) { %i(i_prefix q_prefix iq_text_base iq_text_stem iq_text_delimiter i_text_bigram q_text_bigram) }
let(:non_icu_filters) { Utility::Elasticsearch::Index::TextAnalysisSettings::NON_ICU_ANALYSIS_SETTINGS[:folding_filters] }
let(:icu_filters) { Utility::Elasticsearch::Index::TextAnalysisSettings::ICU_ANALYSIS_SETTINGS[:folding_filters] }
let(:filters) { subject[:analysis][:analyzer].values.flat_map { |v| v[:filter] }.uniq }
context 'when analysis_icu is false' do
let(:analysis_icu) { false }
it { is_expected.to be_kind_of(Hash) }
it { is_expected.to include(analysis: include(:analyzer => hash_including(*expected_analyzer_keys))) }
it 'has non icu folding filters' do
expect(filters).to include(*non_icu_filters)
end
it 'does not have icu folding filters' do
expect(filters).not_to include(*icu_filters)
end
end
context 'when analysis_icu is true' do
let(:analysis_icu) { true }
it { is_expected.to be_kind_of(Hash) }
it { is_expected.to include(analysis: include(analyzer: hash_including(*expected_analyzer_keys))) }
it 'does not have non icu folding filters' do
expect(filters).not_to include(*non_icu_filters)
end
it 'has icu folding filters' do
expect(filters).to include(*icu_filters)
end
end
context 'when the language_code is not supported' do
let(:language_code) { :unsupported_language_code }
let(:analysis_icu) { false }
it 'raises an error' do
expect { described_class.new(language_code: language_code, analysis_icu: analysis_icu) }.to raise_error(
Utility::Elasticsearch::Index::TextAnalysisSettings::UnsupportedLanguageCode
)
end
end
context 'when the language_code is supported' do
let(:language_code) { :fr }
let(:analysis_icu) { false }
let(:subject) { described_class.new(language_code: language_code, analysis_icu: analysis_icu).to_h[:analysis][:filter] }
it { is_expected.to have_key(:"#{language_code}-stem-filter") }
it { is_expected.to have_key(:"#{language_code}-stop-words-filter") }
it { is_expected.to have_key(:"#{language_code}-elision") }
end
context 'when language_code is nil' do
let(:language_code) { nil }
let(:analysis_icu) { false }
let(:subject) { described_class.new(language_code: language_code, analysis_icu: analysis_icu).to_h }
it 'fallbacks to english' do
english_settings = described_class.new(language_code: :en, analysis_icu: analysis_icu)
expect(subject).to eq(english_settings.to_h)
end
end
end
end