# frozen_string_literal: true require 'rails_helper' RSpec.describe SchedulePipeline::ProcessSchedule, type: :service do let(:in_queue) { double(subscribe: nil) } let(:out_queue) { double(push: nil) } let(:errors) { double(push: nil) } let(:service) { described_class.new(in_queue, out_queue, errors) } let(:player) { 'fake-player-id' } let(:vendor) { 'fake-vendor' } let(:presigned_url) { SecureRandom.uuid } let(:transformed_schedule) { {} } let(:vendor_transform) { double(call: transformed_schedule) } before do allow(service).to receive(:create_asset).and_return({ asset: { meta: { presigned_url: presigned_url } } }) allow(service).to receive(:ingest_content) {} allow(service).to receive(:for_vendor).and_return(vendor_transform) end describe '#start' do it 'subscribes to the in_queue' do service.start expect(in_queue).to have_received(:subscribe) end end describe '#process_msg' do let(:vendor_schedule) { JSON.parse(File.read('spec/services/vendors/broad_sign/broad_sign_player_schedule.json')).with_indifferent_access } let(:msg) { SchedulePipeline::Models::ScheduleProcessMsg.new(vendor, player, vendor_schedule) } let(:content_count) { vendor_schedule[:contents].count } context 'when successful' do before { service.process_msg(msg) } it 'processes the player schedule from the vendor' do expect(vendor_transform).to have_received(:call).with(vendor, player, vendor_schedule, anything).once end it 'pushes schedule to out_queue' do expect(out_queue).to have_received(:push).with(transformed_schedule).once end it 'creates each content asset' do expect(service).to have_received(:create_asset).exactly(content_count).times end it 'ingests each content' do expect(service).to have_received(:ingest_content).exactly(content_count).times end it('raises no errors') { expect(errors).not_to have_received(:push) } end context 'when the vendor is unknown' do before do allow(service).to receive(:for_vendor).and_return(nil) service.process_msg(msg) end it('raises an error') { expect(errors).to have_received(:push).once } end end end