Files
old-holivud2/spec/models/pending_analysis_spec.rb
2020-05-31 22:38:19 +02:00

382 lines
13 KiB
Ruby

require 'rails_helper'
describe PendingAnalysis do
describe '.poll' do
it 'polls videos with pending video analysis' do
allow(PendingAnalysis::PendingVideoAnalysis).to receive(:poll)
PendingAnalysis.poll
expect(PendingAnalysis::PendingVideoAnalysis).to have_received(:poll)
end
it 'polls videos with pending audio analysis' do
allow(PendingAnalysis::PendingAudioAnalysis).to receive(:poll)
PendingAnalysis.poll
expect(PendingAnalysis::PendingAudioAnalysis).to have_received(:poll)
end
end
describe '.expire' do
let(:age_threshold) { 2.days.ago }
it 'expires videos with pending video analysis' do
allow(PendingAnalysis::PendingVideoAnalysis).to receive(:expire)
PendingAnalysis.expire(age_threshold)
expect(PendingAnalysis::PendingVideoAnalysis).to have_received(:expire).with(age_threshold)
end
it 'expires videos with pending audio analysis' do
allow(PendingAnalysis::PendingAudioAnalysis).to receive(:expire)
PendingAnalysis.expire(age_threshold)
expect(PendingAnalysis::PendingAudioAnalysis).to have_received(:expire).with(age_threshold)
end
end
describe PendingAnalysis::PendingVideoAnalysis do
describe '.poll' do
it 'polls all videos with pending analysis' do
pending_analysis = create(:video, analysis_status: :pending, analysis_uid: "pending_uid")
not_pending_analysis = create(:video, analysis_status: :success, analysis_uid: "not_pending_uid")
allow(described_class).to receive(:new).and_return(spy)
described_class.poll
expect(described_class).to have_received(:new).with("pending_uid")
expect(described_class).not_to have_received(:new).with("not_pending_uid")
end
end
describe '.expire' do
it 'expires all videos with pending analysis older than a given time' do
pending_analysis_inside_range = create(:video,
analysis_status: :pending,
analysis_uid: "pending_inside_uid",
analysis_started_at: 1.week.ago)
pending_analysis_outside_range = create(:video,
analysis_status: :pending,
analysis_uid: "pending_outside_uid",
analysis_started_at: 1.minute.ago)
not_pending_analysis = create(:video,
analysis_status: :success,
analysis_uid: "not_pending_uid")
allow(described_class).to receive(:new).and_return(spy)
described_class.expire(1.day.ago)
expect(described_class).to have_received(:new).with("pending_inside_uid")
expect(described_class).not_to have_received(:new).with("pending_outside_uid")
expect(described_class).not_to have_received(:new).with("not_pending_uid")
end
end
describe '#poll' do
let(:video) { create(:video, analysis_status: :pending, analysis_uid: "analysis_uid") }
subject { PendingAnalysis::PendingVideoAnalysis.new(video.analysis_uid) }
context 'when API results are present' do
it 'updates the video analysis status to success' do
allow(BrayniacAI::FacialRecognition).to(
receive(:find).and_return(BrayniacAI::FacialRecognition.new({ results: {} }))
)
subject.poll
expect(video.reload).to be_analysis_success
end
end
context 'when API results are not present' do
it 'does nothing' do
allow(BrayniacAI::FacialRecognition).to receive(:find).and_return(BrayniacAI::FacialRecognition.new)
subject.poll
expect(video.reload).to be_analysis_pending
end
end
context 'when API resource is not found' do
it 'does nothing' do
error = ActiveResource::ResourceNotFound.new('')
allow(BrayniacAI::FacialRecognition).to receive(:find).and_raise(error)
subject.poll
expect(video.reload).to be_analysis_pending
end
end
context 'when API server error occurs' do
before do
allow(Rails.logger).to receive(:error)
allow(subject).to receive(:puts)
end
it 'does nothing' do
error = ActiveResource::ServerError.new('')
allow(BrayniacAI::FacialRecognition).to receive(:find).and_raise(error)
subject.poll
expect(video.reload).to be_analysis_pending
end
it 'prints error message to logger' do
error = ActiveResource::ServerError.new('')
allow(BrayniacAI::FacialRecognition).to receive(:find).and_raise(error)
subject.poll
expect(Rails.logger).to have_received(:error)
expect(subject).to have_received(:puts)
end
end
end
describe '#expire' do
let(:video) { create(:video, analysis_status: :pending, analysis_uid: "analysis_uid") }
subject { PendingAnalysis::PendingVideoAnalysis.new(video.analysis_uid) }
context 'when API results are present' do
it 'updates the video analysis status to success' do
allow(BrayniacAI::FacialRecognition).to(
receive(:find).and_return(BrayniacAI::FacialRecognition.new({ results: {} }))
)
subject.expire
expect(video.reload).to be_analysis_success
end
end
context 'when API results are not present' do
it 'updates the video analysis status to failure' do
allow(BrayniacAI::FacialRecognition).to receive(:find).and_return(BrayniacAI::FacialRecognition.new)
subject.expire
expect(video.reload).to be_analysis_failure
end
end
context 'when API resource is not found' do
it 'updates the video analysis status to failure' do
error = ActiveResource::ResourceNotFound.new('')
allow(BrayniacAI::FacialRecognition).to receive(:find).and_raise(error)
subject.expire
expect(video.reload).to be_analysis_failure
end
end
context 'when API server error occurs' do
before do
allow(Rails.logger).to receive(:error)
allow(subject).to receive(:puts)
end
it 'does nothing' do
error = ActiveResource::ServerError.new('')
allow(BrayniacAI::FacialRecognition).to receive(:find).and_raise(error)
subject.poll
expect(video.reload).to be_analysis_pending
end
it 'prints error message to logger' do
error = ActiveResource::ServerError.new('')
allow(BrayniacAI::FacialRecognition).to receive(:find).and_raise(error)
subject.poll
expect(Rails.logger).to have_received(:error)
expect(subject).to have_received(:puts)
end
end
end
end
describe PendingAnalysis::PendingAudioAnalysis do
describe '.poll' do
it 'polls all videos with pending audio analysis' do
pending_analysis = create(:video, audio_analysis_status: :pending, audio_analysis_uid: "pending_uid")
not_pending_analysis = create(:video, audio_analysis_status: :success, audio_analysis_uid: "not_pending_uid")
allow(described_class).to receive(:new).and_return(spy)
described_class.poll
expect(described_class).to have_received(:new).with("pending_uid")
expect(described_class).not_to have_received(:new).with("not_pending_uid")
end
end
describe '.expire' do
it 'expires all videos with pending analysis older than a given time' do
pending_analysis_inside_range = create(:video,
audio_analysis_status: :pending,
audio_analysis_uid: "pending_inside_uid",
audio_analysis_started_at: 1.week.ago)
pending_analysis_outside_range = create(:video,
audio_analysis_status: :pending,
audio_analysis_uid: "pending_outside_uid",
audio_analysis_started_at: 1.minute.ago)
not_pending_analysis = create(:video,
analysis_status: :success,
analysis_uid: "not_pending_uid")
allow(described_class).to receive(:new).and_return(spy)
described_class.expire(1.day.ago)
expect(described_class).to have_received(:new).with("pending_inside_uid")
expect(described_class).not_to have_received(:new).with("pending_outside_uid")
expect(described_class).not_to have_received(:new).with("not_pending_uid")
end
end
describe '#poll' do
let(:video) { create(:video, audio_analysis_status: :pending, audio_analysis_uid: "analysis_uid") }
subject { PendingAnalysis::PendingAudioAnalysis.new(video.audio_analysis_uid) }
context 'when API results are present' do
it 'updates the audio analysis status to success' do
allow(BrayniacAI::AudioRecognition).to(
receive(:find).and_return(OpenStruct.new({ results: {} }))
)
subject.poll
expect(video.reload).to be_audio_analysis_success
end
end
context 'when API results are not present' do
it 'does nothing' do
allow(BrayniacAI::AudioRecognition).to receive(:find).and_return(BrayniacAI::AudioRecognition.new)
subject.poll
expect(video.reload).to be_audio_analysis_pending
end
end
context 'when API resource is not found' do
it 'does nothing' do
error = ActiveResource::ResourceNotFound.new('')
allow(BrayniacAI::AudioRecognition).to receive(:find).and_raise(error)
subject.poll
expect(video.reload).to be_audio_analysis_pending
end
end
context 'when API server error occurs' do
before do
allow(Rails.logger).to receive(:error)
allow(subject).to receive(:puts)
end
it 'does nothing' do
error = ActiveResource::ServerError.new('')
allow(BrayniacAI::AudioRecognition).to receive(:find).and_raise(error)
subject.poll
expect(video.reload).to be_audio_analysis_pending
end
it 'prints error message to logger' do
error = ActiveResource::ServerError.new('')
allow(BrayniacAI::AudioRecognition).to receive(:find).and_raise(error)
subject.poll
expect(Rails.logger).to have_received(:error)
expect(subject).to have_received(:puts)
end
end
end
describe '#expire' do
let(:video) { create(:video, audio_analysis_status: :pending, audio_analysis_uid: "analysis_uid") }
subject { PendingAnalysis::PendingAudioAnalysis.new(video.audio_analysis_uid) }
context 'when API results are present' do
it 'updates the audio analysis status to success' do
allow(BrayniacAI::AudioRecognition).to(
receive(:find).and_return(BrayniacAI::AudioRecognition.new({ results: {} }))
)
subject.expire
expect(video.reload).to be_audio_analysis_success
end
end
context 'when API results are not present' do
it 'updates the audio analysis status to failure' do
allow(BrayniacAI::AudioRecognition).to receive(:find).and_return(BrayniacAI::AudioRecognition.new)
subject.expire
expect(video.reload).to be_audio_analysis_failure
end
end
context 'when API resource is not found' do
it 'updates the audio analysis status to failure' do
error = ActiveResource::ResourceNotFound.new('')
allow(BrayniacAI::AudioRecognition).to receive(:find).and_raise(error)
subject.expire
expect(video.reload).to be_audio_analysis_failure
end
end
context 'when API server error occurs' do
before do
allow(Rails.logger).to receive(:error)
allow(subject).to receive(:puts)
end
it 'does nothing' do
error = ActiveResource::ServerError.new('')
allow(BrayniacAI::AudioRecognition).to receive(:find).and_raise(error)
subject.poll
expect(video.reload).to be_audio_analysis_pending
end
it 'prints error message to logger' do
error = ActiveResource::ServerError.new('')
allow(BrayniacAI::AudioRecognition).to receive(:find).and_raise(error)
subject.poll
expect(Rails.logger).to have_received(:error)
expect(subject).to have_received(:puts)
end
end
end
end
end