spec/core/connector_job_spec.rb (130 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 'core'
describe Core::ConnectorJob do
subject do
described_class.new({})
end
describe '.fetch_by_id' do
let(:job_id) { '123' }
let(:es_response) do
{
:found => found
}
end
before(:each) do
allow(Core::ElasticConnectorActions).to receive(:get_job).and_return(es_response)
end
context 'when the job does not exist' do
let(:found) { false }
it 'returns nil' do
expect(described_class.fetch_by_id(job_id)).to be_nil
end
end
context 'when the job exists' do
let(:found) { true }
it 'returns a job entity' do
expect(described_class.fetch_by_id(job_id)).to be_kind_of(described_class)
end
end
end
describe '.pending_jobs' do
let(:jobs) do
[
{ '_id' => '123', '_source' => { 'something' => 'something', 'status' => Connectors::SyncStatus::PENDING } }.with_indifferent_access,
{ '_id' => '456', '_source' => { 'something' => 'something', 'status' => Connectors::SyncStatus::SUSPENDED } }.with_indifferent_access
]
end
before(:each) do
allow(Core::ElasticConnectorActions).to receive(:search_jobs).and_return({
'hits' => {
'hits' => jobs,
'total' => {
'value' => jobs.size
}
}
})
end
it 'returns job entities' do
results = described_class.pending_jobs
actual_job_ids = results.map(&:id)
expected_job_ids = jobs.map { |c| c['_id'] }
expect(expected_job_ids).to eq(actual_job_ids)
end
end
# TODO: #done! example should be made as a shared example and tested by #done!, #cancel! and #error!, with only status and error set differently in each example.
describe '#done!' do
let(:status) { Connectors::SyncStatus::COMPLETED }
let(:error) { nil }
let(:id) { 'id' }
let(:index_name) { 'index_name' }
let(:ingestion_stats) { nil }
let(:connector_metadata) { nil }
let(:total_document_count) { 100 }
before(:each) do
allow(subject).to receive(:id).and_return(id)
allow(subject).to receive(:index_name).and_return(index_name)
allow(Core::ElasticConnectorActions).to receive(:document_count).and_return(total_document_count)
allow(Core::ElasticConnectorActions).to receive(:update_job_fields)
end
it 'updates the job as completed' do
expect(Core::ElasticConnectorActions).to receive(:update_job_fields).with(
id,
hash_including(
:last_seen => anything,
:completed_at => anything,
:status => status,
:error => error,
:total_document_count => total_document_count
)
)
subject.done!(ingestion_stats, connector_metadata)
end
context 'with ingestion stats' do
let(:ingestion_stats) do
{
:indexed_document_count => 1,
:indexed_document_volume => 13,
:deleted_document_count => 0
}
end
it 'updates ingestion stats' do
expect(Core::ElasticConnectorActions).to receive(:update_job_fields).with(
id, hash_including(ingestion_stats)
)
subject.done!(ingestion_stats, connector_metadata)
end
end
context 'with connector metadata' do
let(:connector_metadata) do
{
:foo => 'bar'
}
end
it 'updates connector metadata' do
expect(Core::ElasticConnectorActions).to receive(:update_job_fields).with(
id, hash_including(:metadata => connector_metadata)
)
subject.done!(ingestion_stats, connector_metadata)
end
end
end
# The only additional test for #cancel! is that it updates canceled_at
describe '#cancel!' do
let(:status) { Connectors::SyncStatus::CANCELED }
let(:error) { nil }
let(:id) { 'id' }
let(:index_name) { 'index_name' }
let(:ingestion_stats) { nil }
let(:connector_metadata) { nil }
let(:total_document_count) { 100 }
before(:each) do
allow(subject).to receive(:id).and_return(id)
allow(subject).to receive(:index_name).and_return(index_name)
allow(Core::ElasticConnectorActions).to receive(:document_count).and_return(total_document_count)
allow(Core::ElasticConnectorActions).to receive(:update_job_fields)
end
it 'updates canceled_at' do
expect(Core::ElasticConnectorActions).to receive(:update_job_fields).with(
id, hash_including(:canceled_at => anything)
)
subject.cancel!(ingestion_stats, connector_metadata)
end
end
end