diff --git a/app/controllers/broadcasts_controller.rb b/app/controllers/broadcasts_controller.rb index bc7c561..af38f6d 100644 --- a/app/controllers/broadcasts_controller.rb +++ b/app/controllers/broadcasts_controller.rb @@ -1,5 +1,4 @@ class BroadcastsController < ApplicationController - require 'microsoft_graph' layout "project" before_action :set_project diff --git a/app/controllers/conference_meetings_controller.rb b/app/controllers/conference_meetings_controller.rb index 2515ea7..40b85dc 100644 --- a/app/controllers/conference_meetings_controller.rb +++ b/app/controllers/conference_meetings_controller.rb @@ -1,4 +1,6 @@ class ConferenceMeetingsController < ApplicationController + require 'microsoft_graph' + def show authorize broadcast = Broadcast.find(params[:broadcast_id]) case broadcast.conference_option @@ -18,6 +20,7 @@ class ConferenceMeetingsController < ApplicationController subject = "#{broadcast.name} Online Meeting" teams_meeting = graph_api.create_teams_meeting(subject) join_url = teams_meeting['joinUrl'] + if join_url.present? broadcast.conference_join_url = join_url broadcast.save @@ -26,17 +29,17 @@ class ConferenceMeetingsController < ApplicationController end rescue ActionController::InvalidAuthenticityToken => e Rails.logger.error(e.message) - redirect_to project_broadcast_url(broadcast.project, broadcast), alert: 'You are not authenticated via Microsoft, please authenticate and try again' + redirect_to project_broadcast_url(broadcast.project, broadcast), alert: t('.alerts.not_authenticated') return rescue StandardError => e Rails.logger.error(e.message) - redirect_to project_broadcast_url(broadcast.project, broadcast), alert: 'Failed to join conference' + redirect_to project_broadcast_url(broadcast.project, broadcast), alert: t('.alerts.failed_to_join') return end end redirect_to broadcast.conference_join_url else - redirect_to project_broadcast_url(broadcast.project, broadcast), alert: 'Unknown conference option' + redirect_to project_broadcast_url(broadcast.project, broadcast), alert: t('.alerts.unknown_conference_option') end end end \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index ae6cbb9..af6396a 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1557,3 +1557,9 @@ en: edit: Edit report: Report generating: Generating... + conference_meetings: + show: + alerts: + not_authenticated: You are not authenticated via Microsoft, please authenticate and try again + failed_to_join: Failed to join conference + unknown_conference_option: Unknown conference option diff --git a/config/locales/es.yml b/config/locales/es.yml index 530909f..9f9c267 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -633,3 +633,11 @@ es: production_elements_logs: Production Elements Logs, and more (ES) reduces_labor_cost: Reduces labor costs (ES) simplifies_cue_sheets: Simplifies Music Cue Sheets, Graphic Cue Sheets (ES) + conference_meetings: + show: + alert: + not_authenticated: "" + alerts: + not_authenticated: You are not authenticated via Microsoft, please authenticate and try again (ES) + failed_to_join: Failed to join conference (ES) + unknown_conference_option: Unknown conference option (ES) diff --git a/spec/controllers/broadcasts_controller_spec.rb b/spec/controllers/broadcasts_controller_spec.rb index ed37ad2..072ad00 100644 --- a/spec/controllers/broadcasts_controller_spec.rb +++ b/spec/controllers/broadcasts_controller_spec.rb @@ -131,16 +131,25 @@ RSpec.describe BroadcastsController, type: :controller do expect(response.body).to have_xpath "//input[@readonly][@value='#{broadcast_url(broadcast.token)}']" end - it "displays zoom meeting button" do + it "displays zoom meeting button for zoom conference option" do get :show, params: { project_id: project.id, id: broadcast.id } - expect(response.body).to have_link("Video Conference", href: project_broadcast_zoom_meeting_url(project, broadcast)) + expect(response.body).to have_content 'Zoom' + expect(response.body).to have_link("Video Conference", href: project_broadcast_conference_meeting_url(project, broadcast)) + end + + it "displays microsoft teams meeting button for MS Teams conference option" do + ms_teams_broadcast = create(:broadcast, :ms_teams_conference, project: project ) + get :show, params: { project_id: project.id, id: ms_teams_broadcast.id } + + expect(response.body).to have_content 'MS Teams' + expect(response.body).to have_link 'Video Conference', href: project_broadcast_conference_meeting_url(project, ms_teams_broadcast) end it "assigns required variables" do get :show, params: { project_id: project.id, id: broadcast.id } - expect(assigns(:conference_url)).to eq project_broadcast_zoom_meeting_url(project, broadcast) + expect(assigns(:conference_url)).to eq project_broadcast_conference_meeting_url(project, broadcast) expect(assigns(:broadcast)).to eq broadcast end diff --git a/spec/controllers/conference_meetings_controller_spec.rb b/spec/controllers/conference_meetings_controller_spec.rb new file mode 100644 index 0000000..9b9167a --- /dev/null +++ b/spec/controllers/conference_meetings_controller_spec.rb @@ -0,0 +1,76 @@ +require 'rails_helper' + +RSpec.describe ConferenceMeetingsController, type: :controller do + let(:user) { create(:user) } + let(:account) { user.primary_account } + let(:project) { create(:project, account: user.primary_account) } + let(:broadcast) { create(:broadcast, name: "Broadcast", project: project) } + let(:ms_teams_broadcast) { create(:broadcast, :ms_teams_conference, project: project) } + let(:unknown_option_broadcast) { create(:broadcast, project: project, conference_option: 'google') } + + let(:meeting_start_url) { "http://meeting_start_url" } + let(:meeting_hash) { HashWithIndifferentAccess.new(start_url: meeting_start_url) } + let(:user_create_response) { {"id" => "new_host_id"} } + let(:roles_assign_response) { {"ids" => ["new_host_id"]} } + let(:roles_list_response) { {"roles" => [{"name" => "directme-host"}]} } + + before :each do + allow_any_instance_of(ZoomGateway).to receive(:find_meeting).and_return(meeting_hash) + allow_any_instance_of(ZoomGateway).to receive(:create_meeting).and_return("meeting_id") + allow_any_instance_of(ZoomGateway).to receive(:create_host).and_return("host_id") + allow(MuxLiveStream).to receive(:new).and_return OpenStruct.new(id: 'id', key: 'key', playback_id: 'playback_id') + end + + describe "#show" do + before { sign_in user } + + it "redirects to meeting start url with Zoom conference option" do + get :show, params: { project_id: project.id, broadcast_id: broadcast.id } + expect(response).to redirect_to(meeting_start_url) + end + + it "redirects to the broadcast show page with alert if user is not authenticated via microsoft and tries to create MS Teams meeting" do + get :show, params: { project_id: project.id, broadcast_id: ms_teams_broadcast.id } + expect(response).to redirect_to project_broadcast_path(project, ms_teams_broadcast) + expect(flash.alert).to eq not_authenticated_alert + end + + it "redirects to the broadcast show page with alert if user is authenticated via microsoft and tries to create MS Teams meeting but Graph API fails to create meeting" do + allow_any_instance_of(MicrosoftGraph).to receive(:create_teams_meeting).and_return(nil) + get :show, params: { project_id: project.id, broadcast_id: ms_teams_broadcast.id } + expect(response).to redirect_to project_broadcast_path(project, ms_teams_broadcast) + expect(flash.alert).to eq failed_to_join_alert + end + + it "redirects to the broadcast show page with alert if conference option is not reckognized" do + get :show, params: { project_id: project.id, broadcast_id: unknown_option_broadcast.id } + expect(response).to redirect_to project_broadcast_path(project, unknown_option_broadcast) + expect(flash.alert).to eq unknown_conference_option_alert + end + + it "redirects to meeting start url with MS Teams conference option" do + new_ms_teams_meeting = JSON.parse({ + joinUrl: meeting_start_url + }.to_json) + + allow_any_instance_of(MicrosoftGraph).to receive(:create_teams_meeting).and_return(new_ms_teams_meeting) + + get :show, params: { project_id: project.id, broadcast_id: ms_teams_broadcast.id } + expect(response).to redirect_to(meeting_start_url) + end + end + + private + + def not_authenticated_alert + t 'conference_meetings.show.alerts.not_authenticated' + end + + def failed_to_join_alert + t 'conference_meetings.show.alerts.failed_to_join' + end + + def unknown_conference_option_alert + t 'conference_meetings.show.alerts.unknown_conference_option' + end +end diff --git a/spec/controllers/zoom_meetings_controller_spec.rb b/spec/controllers/zoom_meetings_controller_spec.rb deleted file mode 100644 index ca1ab04..0000000 --- a/spec/controllers/zoom_meetings_controller_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -require 'rails_helper' - -RSpec.describe ZoomMeetingsController, type: :controller do - let(:user) { create(:user) } - let(:account) { user.primary_account } - let(:project) { create(:project, account: user.primary_account) } - let(:broadcast) { create(:broadcast, name: "Broadcast", project: project) } - - let(:meeting_start_url) { "http://meeting_start_url" } - let(:meeting_hash) { HashWithIndifferentAccess.new(start_url: meeting_start_url) } - let(:user_create_response) { {"id" => "new_host_id"} } - let(:roles_assign_response) { {"ids" => ["new_host_id"]} } - let(:roles_list_response) { {"roles" => [{"name" => "directme-host"}]} } - - before :each do - allow_any_instance_of(ZoomGateway).to receive(:find_meeting).and_return(meeting_hash) - allow_any_instance_of(ZoomGateway).to receive(:create_meeting).and_return("meeting_id") - allow_any_instance_of(ZoomGateway).to receive(:create_host).and_return("host_id") - allow(MuxLiveStream).to receive(:new).and_return OpenStruct.new(id: 'id', key: 'key', playback_id: 'playback_id') - end - - describe "#show" do - before { sign_in user } - - it "redirects to meeting start url" do - get :show, params: { project_id: project.id, broadcast_id: broadcast.id } - expect(response).to redirect_to(meeting_start_url) - end - end -end diff --git a/spec/factories/broadcasts.rb b/spec/factories/broadcasts.rb index 4148242..33da96c 100644 --- a/spec/factories/broadcasts.rb +++ b/spec/factories/broadcasts.rb @@ -2,11 +2,16 @@ FactoryBot.define do factory :broadcast do association :project name "My Live Stream" + conference_option "zoom" transient do skip_create_callback false end + trait :ms_teams_conference do + conference_option "ms_teams" + end + trait :with_stream do stream_uid "mux_stream" stream_key "mux_key" diff --git a/spec/features/user_managing_broadcasts_spec.rb b/spec/features/user_managing_broadcasts_spec.rb index b4acf4e..6e2fa6a 100644 --- a/spec/features/user_managing_broadcasts_spec.rb +++ b/spec/features/user_managing_broadcasts_spec.rb @@ -24,6 +24,7 @@ feature 'User managing broadcasts' do by 'filling out the form' do fill_in broadcast_name_field, with: 'My Broadcast' + select_conference_option('Zoom') select_time_zone("New Delhi") end @@ -267,6 +268,12 @@ feature 'User managing broadcasts' do end end + def select_conference_option(value) + if value.present? + select value, from: "broadcast[conference_option]" + end + end + def click_checkboxes all('input[type="checkbox"]')[0].click all('input[type="checkbox"]')[1].click