100 lines
3.2 KiB
Ruby
100 lines
3.2 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe DataImport do
|
|
describe 'associations' do
|
|
it { is_expected.to belong_to(:account) }
|
|
end
|
|
|
|
describe 'validations' do
|
|
it 'returns false for invalid data type' do
|
|
expect(build(:data_import, data_type: 'Xyc').valid?).to be false
|
|
end
|
|
end
|
|
|
|
describe 'access token encryption' do
|
|
it 'encrypts the Intercom access token at rest' do
|
|
skip('encryption keys missing; see run_mfa_spec workflow') unless Chatwoot.encryption_configured?
|
|
|
|
data_import = create(:data_import, :intercom, access_token: 'intercom-secret')
|
|
stored_value = data_import.reload.read_attribute_before_type_cast(:access_token).to_s
|
|
|
|
expect(stored_value).not_to include('intercom-secret')
|
|
expect(data_import.access_token).to eq('intercom-secret')
|
|
end
|
|
end
|
|
|
|
describe 'callbacks' do
|
|
let(:data_import) { build(:data_import) }
|
|
|
|
it 'schedules a job after creation' do
|
|
expect do
|
|
data_import.save
|
|
end.to have_enqueued_job(DataImportJob).with(data_import).on_queue('low')
|
|
end
|
|
end
|
|
|
|
describe '#abandon!' do
|
|
let(:account) { create(:account) }
|
|
let(:data_import) do
|
|
create(
|
|
:data_import, :intercom,
|
|
account: account,
|
|
status: :processing
|
|
)
|
|
end
|
|
|
|
before do
|
|
account.enable_features!('data_import')
|
|
end
|
|
|
|
it 'abandons active Intercom imports', :aggregate_failures do
|
|
data_import.abandon!
|
|
|
|
expect(data_import).to be_abandoned
|
|
expect(data_import.abandoned_at).to be_present
|
|
end
|
|
|
|
it 'does not overwrite terminal status from a stale instance', :aggregate_failures do
|
|
stale_import = described_class.find(data_import.id)
|
|
data_import.update!(status: :completed, completed_at: 1.minute.ago)
|
|
|
|
stale_import.abandon!
|
|
|
|
expect(data_import.reload).to be_completed
|
|
expect(data_import.abandoned_at).to be_nil
|
|
end
|
|
end
|
|
|
|
describe '#stalled?' do
|
|
let(:account) { create(:account) }
|
|
|
|
it 'identifies active Intercom imports without updates for fifteen minutes', :aggregate_failures do
|
|
freeze_time do
|
|
processing_import = create(:data_import, :intercom, account: account, status: :processing)
|
|
pending_import = create(:data_import, :intercom, account: account, status: :pending)
|
|
processing_import.update!(updated_at: 15.minutes.ago)
|
|
pending_import.update!(updated_at: 15.minutes.ago)
|
|
|
|
expect(processing_import.reload).to be_stalled
|
|
expect(pending_import.reload).to be_stalled
|
|
end
|
|
end
|
|
|
|
it 'does not identify recent or terminal Intercom imports as stalled', :aggregate_failures do
|
|
recent_import = create(:data_import, :intercom, account: account, status: :processing)
|
|
completed_import = create(:data_import, :intercom, account: account, status: :completed)
|
|
completed_import.update!(updated_at: 1.hour.ago)
|
|
|
|
expect(recent_import).not_to be_stalled
|
|
expect(completed_import.reload).not_to be_stalled
|
|
end
|
|
|
|
it 'does not identify legacy imports as stalled' do
|
|
legacy_import = create(:data_import, account: account, status: :processing)
|
|
legacy_import.update!(updated_at: 1.hour.ago)
|
|
|
|
expect(legacy_import.reload).not_to be_stalled
|
|
end
|
|
end
|
|
end
|