spec/connectors/base/connector_spec.rb (229 lines of code) (raw):
#
# 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.
#
# frozen_string_literal: true
require 'connectors/base/connector'
require 'core/filtering/filter_validator'
require 'spec_helper'
describe Connectors::Base::Connector do
subject { described_class.new(configuration: connector_configuration, job_description: job_description) }
let(:advanced_snippet) {
{
:find => {
:filter => {
:$text => {
:$search => 'garden',
:$caseSensitive => false
}
},
:options => {
:skip => 10,
:limit => 1000
}
}
}
}
let(:rules) {
[
{
:id => '90owilfksdoifuw',
:policy => 'exclude',
:field => 'url',
:rule => 'regex',
:value => '.*/sample/.*\.pdf',
:order => 0,
:created_at => '2022-10-10T00:00:00Z',
:updated_at => '2022-10-10T00:00:00Z'
}
]
}
let(:filtering) {
{
:advanced_snippet => advanced_snippet,
:rules => rules
}
}
let(:filter_validator) { double }
let(:job_description) { double }
let(:job_configuration) { { :job_key => 'value' } }
let(:connector_configuration) { { :connector_key => 'value' } }
before(:each) do
allow(job_description).to receive(:dup).and_return(job_description)
allow(job_description).to receive(:configuration).and_return(job_configuration)
allow(job_description).to receive(:filtering).and_return(filtering)
allow(Core::Filtering::FilterValidator).to receive(:new).and_return(filter_validator)
end
describe '.initialize' do
let(:key) { 'key' }
let(:value) { 'value' }
let(:advanced_snippet) {
{
key => value
}
}
shared_examples_for 'advanced snippet is accessible with strings and symbols' do
it '' do
expect(subject.advanced_filter_config[:key]).to eq(value)
expect(subject.advanced_filter_config['key']).to eq(value)
end
end
it 'uses job configuration' do
expect(subject.instance_variable_get('@configuration')).to eq(job_configuration)
end
context 'when job configuration is not provided' do
let(:job_configuration) { nil }
it 'uses connector configuration' do
expect(subject.instance_variable_get('@configuration')).to eq(connector_configuration)
end
end
context 'when advanced snippet contains key as string' do
it_behaves_like 'advanced snippet is accessible with strings and symbols'
end
context 'when advanced snippet contains key as symbol' do
let(:key) { :key }
it_behaves_like 'advanced snippet is accessible with strings and symbols'
end
end
describe '#advanced_filter_config' do
shared_examples_for 'advanced_filter_config is not present' do
it 'returns empty object' do
expect(subject.advanced_filter_config).to be_empty
end
end
context 'advanced filter config is present' do
let(:advanced_snippet) {
{
'some_field' => 'some_value'
}
}
it 'returns advanced filter config' do
expect(subject.advanced_filter_config).to eq(advanced_snippet)
end
end
context 'advanced filter config is nil' do
let(:advanced_snippet) {
nil
}
it_behaves_like 'advanced_filter_config is not present'
end
context 'advanced filter config is empty' do
let(:advanced_snippet) {
{}
}
it_behaves_like 'advanced_filter_config is not present'
end
end
describe '#rules' do
shared_examples_for 'rules are not present' do
it 'returns empty array' do
expect(subject.rules).to be_empty
end
end
context 'rules are present' do
it 'returns true' do
expect(subject.rules).to eq(rules)
end
end
context 'rules are nil' do
let(:rules) {
nil
}
it_behaves_like 'rules are not present'
end
context 'rules are empty' do
let(:rules) {
[]
}
it_behaves_like 'rules are not present'
end
end
describe '.rules' do
let(:rules) {
[
{
:id => '90owilfksdoifuw',
:policy => 'exclude',
:field => 'url',
:rule => 'regex',
:value => '.*/sample/.*\.pdf',
:order => 0,
:created_at => '2022-10-10T00:00:00Z',
:updated_at => '2022-10-10T00:00:00Z'
},
{
:id => '09wuekwisdfjslk',
:policy => 'include',
:field => 'id',
:rule => 'regex',
:value => '.*',
:order => 1,
:created_at => '2022-10-10T00:00:00Z',
:updated_at => '2022-10-10T00:00:00Z'
}
]
}
context 'two rules are present' do
it 'should extract three rules from job description' do
extracted_rules = subject.rules
expect(extracted_rules).to_not be_nil
expect(extracted_rules.size).to eq(2)
expect(extracted_rules[0]).to eq(rules[0])
expect(extracted_rules[1]).to eq(rules[1])
end
end
shared_examples_for 'has default rules value' do
it 'defaults to an empty array' do
extracted_rules = subject.rules
expect(extracted_rules).to_not be_nil
expect(extracted_rules.size).to eq(0)
end
end
context 'no rules are present' do
let(:rules) {
[]
}
it_behaves_like 'has default rules value'
end
context 'rules are nil' do
let(:rules) {
nil
}
it_behaves_like 'has default rules value'
end
context 'advanced filter config is present' do
it 'extracts the advanced filter config' do
advanced_filter_config = subject.advanced_filter_config
expect(advanced_filter_config).to eq(advanced_snippet.with_indifferent_access)
end
end
shared_examples_for 'has default filter config value' do
it 'defaults to an empty hash' do
advanced_filter_config = subject.advanced_filter_config
expect(advanced_filter_config).to_not be_nil
expect(advanced_filter_config).to eq({})
end
end
context 'filter config is nil' do
let(:advanced_snippet) {
nil
}
it_behaves_like 'has default filter config value'
end
context 'filter config is empty' do
let(:advanced_snippet) {
{}
}
it_behaves_like 'has default filter config value'
end
end
describe '.validate_filtering' do
context 'when filtering is valid' do
before do
allow(filter_validator).to receive(:is_filter_valid).with(filtering).and_return({ :state => Core::Filtering::ValidationStatus::VALID, :errors => [] })
end
it_behaves_like 'filtering is valid'
end
context 'when filtering is invalid' do
before do
allow(filter_validator).to receive(:is_filter_valid).with(filtering).and_return({ :state => Core::Filtering::ValidationStatus::INVALID, :errors => [{ :ids => ['error-id'], :messages => ['error-message'] }] })
end
it_behaves_like 'filtering is invalid'
end
end
end