add specs and use i18n
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
class BroadcastsController < ApplicationController
|
class BroadcastsController < ApplicationController
|
||||||
require 'microsoft_graph'
|
|
||||||
layout "project"
|
layout "project"
|
||||||
|
|
||||||
before_action :set_project
|
before_action :set_project
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
class ConferenceMeetingsController < ApplicationController
|
class ConferenceMeetingsController < ApplicationController
|
||||||
|
require 'microsoft_graph'
|
||||||
|
|
||||||
def show
|
def show
|
||||||
authorize broadcast = Broadcast.find(params[:broadcast_id])
|
authorize broadcast = Broadcast.find(params[:broadcast_id])
|
||||||
case broadcast.conference_option
|
case broadcast.conference_option
|
||||||
@@ -18,6 +20,7 @@ class ConferenceMeetingsController < ApplicationController
|
|||||||
subject = "#{broadcast.name} Online Meeting"
|
subject = "#{broadcast.name} Online Meeting"
|
||||||
teams_meeting = graph_api.create_teams_meeting(subject)
|
teams_meeting = graph_api.create_teams_meeting(subject)
|
||||||
join_url = teams_meeting['joinUrl']
|
join_url = teams_meeting['joinUrl']
|
||||||
|
|
||||||
if join_url.present?
|
if join_url.present?
|
||||||
broadcast.conference_join_url = join_url
|
broadcast.conference_join_url = join_url
|
||||||
broadcast.save
|
broadcast.save
|
||||||
@@ -26,17 +29,17 @@ class ConferenceMeetingsController < ApplicationController
|
|||||||
end
|
end
|
||||||
rescue ActionController::InvalidAuthenticityToken => e
|
rescue ActionController::InvalidAuthenticityToken => e
|
||||||
Rails.logger.error(e.message)
|
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
|
return
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Rails.logger.error(e.message)
|
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
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
redirect_to broadcast.conference_join_url
|
redirect_to broadcast.conference_join_url
|
||||||
else
|
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
|
end
|
||||||
end
|
end
|
||||||
@@ -1557,3 +1557,9 @@ en:
|
|||||||
edit: Edit
|
edit: Edit
|
||||||
report: Report
|
report: Report
|
||||||
generating: Generating...
|
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
|
||||||
|
|||||||
@@ -633,3 +633,11 @@ es:
|
|||||||
production_elements_logs: Production Elements Logs, and more (ES)
|
production_elements_logs: Production Elements Logs, and more (ES)
|
||||||
reduces_labor_cost: Reduces labor costs (ES)
|
reduces_labor_cost: Reduces labor costs (ES)
|
||||||
simplifies_cue_sheets: Simplifies Music Cue Sheets, Graphic Cue Sheets (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)
|
||||||
|
|||||||
@@ -131,16 +131,25 @@ RSpec.describe BroadcastsController, type: :controller do
|
|||||||
expect(response.body).to have_xpath "//input[@readonly][@value='#{broadcast_url(broadcast.token)}']"
|
expect(response.body).to have_xpath "//input[@readonly][@value='#{broadcast_url(broadcast.token)}']"
|
||||||
end
|
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 }
|
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
|
end
|
||||||
|
|
||||||
it "assigns required variables" do
|
it "assigns required variables" do
|
||||||
get :show, params: { project_id: project.id, id: broadcast.id }
|
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
|
expect(assigns(:broadcast)).to eq broadcast
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
76
spec/controllers/conference_meetings_controller_spec.rb
Normal file
76
spec/controllers/conference_meetings_controller_spec.rb
Normal file
@@ -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
|
||||||
@@ -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
|
|
||||||
@@ -2,11 +2,16 @@ FactoryBot.define do
|
|||||||
factory :broadcast do
|
factory :broadcast do
|
||||||
association :project
|
association :project
|
||||||
name "My Live Stream"
|
name "My Live Stream"
|
||||||
|
conference_option "zoom"
|
||||||
|
|
||||||
transient do
|
transient do
|
||||||
skip_create_callback false
|
skip_create_callback false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
trait :ms_teams_conference do
|
||||||
|
conference_option "ms_teams"
|
||||||
|
end
|
||||||
|
|
||||||
trait :with_stream do
|
trait :with_stream do
|
||||||
stream_uid "mux_stream"
|
stream_uid "mux_stream"
|
||||||
stream_key "mux_key"
|
stream_key "mux_key"
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ feature 'User managing broadcasts' do
|
|||||||
|
|
||||||
by 'filling out the form' do
|
by 'filling out the form' do
|
||||||
fill_in broadcast_name_field, with: 'My Broadcast'
|
fill_in broadcast_name_field, with: 'My Broadcast'
|
||||||
|
select_conference_option('Zoom')
|
||||||
select_time_zone("New Delhi")
|
select_time_zone("New Delhi")
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -267,6 +268,12 @@ feature 'User managing broadcasts' do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def select_conference_option(value)
|
||||||
|
if value.present?
|
||||||
|
select value, from: "broadcast[conference_option]"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def click_checkboxes
|
def click_checkboxes
|
||||||
all('input[type="checkbox"]')[0].click
|
all('input[type="checkbox"]')[0].click
|
||||||
all('input[type="checkbox"]')[1].click
|
all('input[type="checkbox"]')[1].click
|
||||||
|
|||||||
Reference in New Issue
Block a user