# frozen_string_literal: true require 'rails_helper' feature 'User managing broadcasts' do let(:current_user) { create(:user, :manager) } let(:project) { create(:project, members: current_user, account: current_user.primary_account) } context 'managing broadcasts' do before do sign_in current_user allow(MuxLiveStream).to receive(:new).and_return(double(id: 'id', key: 'key', playback_id: 'playback_id')) end scenario "splash page is shown if there are no existing streams" do visit project_broadcasts_path(project) expect(page).to have_content schedule_demo expect(page).to have_content create_stream end scenario 'creating and deleting a broadcast', js: true do visit new_project_broadcast_path(project) by 'filling out the form' do fill_in broadcast_name_field, with: 'My Broadcast' end click_button 'Create Live Stream' expect(page).to have_content('A live stream has been created') click_on 'Manage' expect(page).to have_link('Copy Stream URL', exact: true) expect(page).to have_link('Copy Stream Key', exact: true) expect(page).to have_link('View', exact: true) expect(page).to have_link('Delete', exact: true) it_also 'Deletes the broadcast' do allow_any_instance_of(Broadcast).to receive(:destroy_mux_live_stream).and_return(true) accept_alert do click_link 'Delete' end expect(page).to have_content('A live stream has been deleted') expect(page).not_to have_content('My Broadcast') end end scenario 'visit show page of broadcast', js: true do broadcast = create(:broadcast, :with_stream, :with_files, project: project) recording = create(:broadcast_recording, broadcast: broadcast) visit project_broadcast_path(project, broadcast) expect(page).to have_content('Live stream is waiting to begin.') expect(page).to have_content('Copy URL') within '#files' do expect(page).to have_content('contract.pdf') end click_on 'Previous Sessions' expect(page).to have_content(recording.download_file_name) end scenario 'user can go back and forth between live session and previous sessions', js: true do broadcast = create(:broadcast, :with_stream, :with_files, project: project) recording = create(:broadcast_recording, broadcast: broadcast) visit project_broadcast_path(project, broadcast) expect(page).to have_content broadcast.name.titleize, count: 1 expect(page).to have_content recording.download_file_name, count: 0 click_on switch_view_dropdown expect(page).to have_content broadcast.name.titleize, count: 2 expect(page).to have_content recording.download_file_name, count: 1 live_stream_nav_item = page.find('.dropdown-item', text: broadcast.name.titleize) recording_nav_item = page.find('.dropdown-item', text: recording.download_file_name) expect(live_stream_nav_item[:class].include?('active')).to eq true expect(recording_nav_item[:class].include?('active')).to eq false click_on recording.download_file_name expect(page).to have_content broadcast.name.titleize, count: 1 expect(page).to have_content recording.download_file_name, count: 0 expect(live_stream_nav_item[:class].include?('active')).to eq false expect(recording_nav_item[:class].include?('active')).to eq true click_on switch_view_dropdown click_on broadcast.name.titleize expect(page).to have_content broadcast.name.titleize, count: 1 expect(page).to have_content recording.download_file_name, count: 0 # Page is reloaded, we need to get dropdown items again live_stream_nav_item = page.find('.dropdown-item', text: broadcast.name.titleize, visible: :all) recording_nav_item = page.find('.dropdown-item', text: recording.download_file_name, visible: :all) expect(live_stream_nav_item[:class].include?('active')).to eq true expect(recording_nav_item[:class].include?('active')).to eq false end scenario 'form will not submit if user clicks Add files without selected files', js: true do broadcast = create(:broadcast, :with_stream, :with_files, project: project) visit project_broadcast_path(project, broadcast) expect(page).to have_content('Live stream is waiting to begin.') expect(page).to have_content add_file_button click_on add_file_button end scenario 'visit multi-view broadcast page', js: true do broadcast_one = create(:broadcast, :with_stream, :with_files, name: 'Broadcast 1', project: project) broadcast_two = create(:broadcast, :with_stream, :with_files, name: 'Broadcast 2', project: project) visit project_broadcasts_path(project) click_checkboxes new_window = window_opened_by { click_link 'Multi-View' } within_window new_window do expect(page).to have_content switch_view_dropdown click_on switch_view_dropdown expect(page).to have_link('Broadcast 1') expect(page).to have_link('Broadcast 2') within '#files' do click_on 'Broadcast 1' expect(page).to have_content('contract.pdf') click_on 'Broadcast 2' expect(page).to have_content('contract.pdf') end end end context 'When the user is associate' do let(:current_user) { create(:user, :associate) } it 'does not show button to create new live stream' do visit project_broadcasts_path(project) expect(page).to have_content schedule_demo expect(page).not_to have_content create_stream end end context 'When the user is account manager' do let(:current_user) { create(:user, :account_manager) } it 'does show button to create new live stream' do visit project_broadcasts_path(project) expect(page).to have_content schedule_demo expect(page).to have_content create_stream end end end private def add_file_button 'Add File' end def broadcast_name_field 'broadcast[name]' end def click_checkboxes all('input[type="checkbox"]')[0].click all('input[type="checkbox"]')[1].click end def switch_view_dropdown 'Switch View' end def schedule_demo t 'broadcasts.splash.actions.book_demo' end def create_stream t 'broadcasts.splash.actions.create_stream' end end