diff --git a/.env.sample b/.env.sample index 578cac9..93c5cb8 100644 --- a/.env.sample +++ b/.env.sample @@ -29,3 +29,6 @@ MUX_TEST_MODE_DISABLED= # Required for creating user through API CUSTOM_API_TOKEN= +# Required for simulcasting to Millicast for director mode +MILLICAST_API_SECRET= +MILLICAST_ACCOUNT_ID= diff --git a/app/controllers/acquired_media_releases_controller.rb b/app/controllers/acquired_media_releases_controller.rb index fc233ba..7793511 100644 --- a/app/controllers/acquired_media_releases_controller.rb +++ b/app/controllers/acquired_media_releases_controller.rb @@ -18,7 +18,6 @@ class AcquiredMediaReleasesController < ApplicationController @acquired_media_release = build_acquired_media_release(acquired_media_release_params) if @acquired_media_release.save - log_create_analytics SetTagsForReleasableJob.perform_later(@acquired_media_release) redirect_to [@project, :acquired_media_releases], notice: t(".notice") else @@ -119,11 +118,8 @@ class AcquiredMediaReleasesController < ApplicationController :term_id, :term_text, :restriction_id, :restriction_text, categories: [], - file_infos_attributes: %i[ - filename - content_type - byte_size - ]) + files: [] + ) end def build_acquired_media_release(attrs = {}) @@ -139,8 +135,4 @@ class AcquiredMediaReleasesController < ApplicationController results end - - def log_create_analytics - TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_non_native_release, release_type: AcquiredMediaRelease.to_s, user_agent: request.user_agent, user_ip: request.remote_ip) - end end diff --git a/app/controllers/admin/broadcasts_controller.rb b/app/controllers/admin/broadcasts_controller.rb index 8e37c18..c186d93 100644 --- a/app/controllers/admin/broadcasts_controller.rb +++ b/app/controllers/admin/broadcasts_controller.rb @@ -19,6 +19,11 @@ class Admin::BroadcastsController < Admin::ApplicationController end def broadcast_update_params - params.require(:broadcast).permit(:stream_url_override, :stream_key_override, :director_mode_video_embed) + params.require(:broadcast).permit( + :video_conference_url_override, + :stream_url_override, + :stream_key_override, + :director_mode_video_embed + ) end end diff --git a/app/controllers/api/releases_controller.rb b/app/controllers/api/releases_controller.rb index 29e2ecb..0bff7bb 100644 --- a/app/controllers/api/releases_controller.rb +++ b/app/controllers/api/releases_controller.rb @@ -21,7 +21,6 @@ class Api::ReleasesController < Api::ApiController release.contract_template_id = @contract_template.id handle_attachments(release, release_create_params[:photos]) release.save!(context: :native) - log_create_analytics after_create(release) handle_response(release, :created) end @@ -181,8 +180,4 @@ class Api::ReleasesController < Api::ApiController parameters = parameters.slice(*keys).except(:created_at, :updated_at, :id, :user_id, :signature) parameters end - - def log_create_analytics - TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_native_release, release_type: model_constant.to_s, account: @account, user_agent: request.user_agent, user_ip: request.remote_ip, application: :ios) - end end diff --git a/app/controllers/appearance_releases_controller.rb b/app/controllers/appearance_releases_controller.rb index 16440ac..9659b03 100644 --- a/app/controllers/appearance_releases_controller.rb +++ b/app/controllers/appearance_releases_controller.rb @@ -18,7 +18,6 @@ class AppearanceReleasesController < ApplicationController @appearance_release = build_appearance_release(appearance_release_params) if @appearance_release.save(context: :non_native) - log_create_analytics AddHeadshotCollectionUidToProjectJob.perform_later(@project) SetTagsForReleasableJob.perform_later(@appearance_release) redirect_to [@project, :appearance_releases], notice: "The release has been imported. #{link_to_import_another}" @@ -127,8 +126,4 @@ class AppearanceReleasesController < ApplicationController def link_to_import_another view_context.link_to "Import Another", [:new, @project, :appearance_release] end - - def log_create_analytics - TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_non_native_release, release_type: AppearanceRelease.to_s, user_agent: request.user_agent, user_ip: request.remote_ip) - end end diff --git a/app/controllers/broadcasts_controller.rb b/app/controllers/broadcasts_controller.rb index 22d59bc..e6249cc 100644 --- a/app/controllers/broadcasts_controller.rb +++ b/app/controllers/broadcasts_controller.rb @@ -23,10 +23,13 @@ class BroadcastsController < ApplicationController else render :new end + rescue MuxRuby::ApiError, ActiveResource::ConnectionError => e + Raven.capture_exception(e) + redirect_to [@project, :broadcasts], alert: t(".alert") end def show - @conference_url = url_for [@broadcast.project, @broadcast, :zoom_meeting] + @conference_url = conference_url_for(@broadcast) @recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page]) @files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page]) render layout: 'application' @@ -109,6 +112,10 @@ class BroadcastsController < ApplicationController results end + def conference_url_for(broadcast) + broadcast.video_conference_url_override || url_for([broadcast.project, broadcast, :zoom_meeting]) + end + def log_create_analytics TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_live_stream, user_agent: request.user_agent, user_ip: request.remote_ip) end diff --git a/app/controllers/contract_templates_controller.rb b/app/controllers/contract_templates_controller.rb index eabc95a..49abc3c 100644 --- a/app/controllers/contract_templates_controller.rb +++ b/app/controllers/contract_templates_controller.rb @@ -26,6 +26,7 @@ class ContractTemplatesController < ApplicationController contract = Contract.new releasable_instance, true send_file contract.to_pdf, download_attributes elsif @contract_template.save + log_create_analytics redirect_to [@project, :contract_templates], notice: t('.notice') else @release_type = contract_template_params[:release_type] @@ -94,7 +95,9 @@ class ContractTemplatesController < ApplicationController :question_9_text, :question_10_text, :question_11_text, :question_12_text, :question_13_text, :question_14_text, - :question_15_text) + :question_15_text, :questionnaire_legal_text, + :exhibit_a_legal_text, :exhibit_a_question_text, + :exhibit_b_legal_text, :exhibit_b_question_text) end def download_attributes @@ -104,4 +107,8 @@ class ContractTemplatesController < ApplicationController type: 'application/pdf' } end + + def log_create_analytics + TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_contract_template, user_agent: request.user_agent, user_ip: request.remote_ip) + end end diff --git a/app/controllers/file_infos_controller.rb b/app/controllers/files_controller.rb similarity index 75% rename from app/controllers/file_infos_controller.rb rename to app/controllers/files_controller.rb index 7d06c72..1fbc4bd 100644 --- a/app/controllers/file_infos_controller.rb +++ b/app/controllers/files_controller.rb @@ -1,4 +1,4 @@ -class FileInfosController < ApplicationController +class FilesController < ApplicationController before_action :set_releasable layout "project" @@ -16,7 +16,7 @@ class FileInfosController < ApplicationController if @releasable.update(releasable_params) SetTagsForReleasableJob.perform_later(@releasable) - redirect_to [@project, @releasable.model_name.plural], notice: t(".notice") + redirect_to [@project, @releasable.model_name.plural], notice: "Files added successfully to the release." else render :edit end @@ -29,16 +29,10 @@ class FileInfosController < ApplicationController end def set_releasable - @releasable = authorize policy_scope(releasable_param.type).find(releasable_param.id), :"#{action_name}_file_infos?" + @releasable = authorize policy_scope(releasable_param.type).find(releasable_param.id), :edit_files? end def releasable_params - params.fetch(releasable_param.name, {}).permit( - file_infos_attributes: [ - :filename, - :content_type, - :byte_size - ], - ) + params.fetch(releasable_param.name, {}).permit(files: []) end end diff --git a/app/controllers/location_releases_controller.rb b/app/controllers/location_releases_controller.rb index 898032a..5c993ae 100644 --- a/app/controllers/location_releases_controller.rb +++ b/app/controllers/location_releases_controller.rb @@ -18,7 +18,6 @@ class LocationReleasesController < ApplicationController @location_release = build_location_release(location_release_params) if @location_release.save - log_create_analytics SetTagsForReleasableJob.perform_later(@location_release) redirect_to [@project, :location_releases], notice: t(".notice") else @@ -90,8 +89,4 @@ class LocationReleasesController < ApplicationController results end - - def log_create_analytics - TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_non_native_release, release_type: LocationRelease.to_s, user_agent: request.user_agent, user_ip: request.remote_ip) - end end diff --git a/app/controllers/material_releases_controller.rb b/app/controllers/material_releases_controller.rb index 3a83b4a..5e6c285 100644 --- a/app/controllers/material_releases_controller.rb +++ b/app/controllers/material_releases_controller.rb @@ -18,7 +18,6 @@ class MaterialReleasesController < ApplicationController @material_release = build_material_release(material_release_params) if @material_release.save - log_create_analytics SetTagsForReleasableJob.perform_later(@material_release) redirect_to [@project, :material_releases], notice: t(".notice") else @@ -136,8 +135,4 @@ class MaterialReleasesController < ApplicationController results end - - def log_create_analytics - TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_non_native_release, release_type: MaterialRelease.to_s, user_agent: request.user_agent, user_ip: request.remote_ip) - end end diff --git a/app/controllers/music_releases_controller.rb b/app/controllers/music_releases_controller.rb index 0fde705..77b2500 100644 --- a/app/controllers/music_releases_controller.rb +++ b/app/controllers/music_releases_controller.rb @@ -22,7 +22,6 @@ class MusicReleasesController < ApplicationController @music_release = build_music_release(music_release_params) if @music_release.save - log_create_analytics SetTagsForReleasableJob.perform_later(@music_release) redirect_to [@project, :music_releases], notice: t(".notice") else @@ -111,8 +110,4 @@ class MusicReleasesController < ApplicationController results end - - def log_create_analytics - TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_non_native_release, release_type: MusicRelease.to_s, user_agent: request.user_agent, user_ip: request.remote_ip) - end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index c02708d..3a97f33 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -6,7 +6,7 @@ class ProjectsController < ApplicationController before_action :set_project, only: [:show, :edit, :update, :destroy] def index - @projects = policy_scope(Current.account.projects).order_by_name + @projects = filtered_projects.order_by_name end def new @@ -46,6 +46,20 @@ class ProjectsController < ApplicationController private + def filtered_projects + results = projects + + if params[:query].present? + results = results.search(params[:query]) + end + + results + end + + def projects + authorize policy_scope(Current.account.projects) + end + def set_project @project = authorize projects.find(params[:id]) end diff --git a/app/controllers/public/acquired_media_releases_controller.rb b/app/controllers/public/acquired_media_releases_controller.rb index 9554c08..df88090 100644 --- a/app/controllers/public/acquired_media_releases_controller.rb +++ b/app/controllers/public/acquired_media_releases_controller.rb @@ -10,7 +10,6 @@ class Public::AcquiredMediaReleasesController < Public::BaseController @acquired_media_release = build_acquired_media_release(acquired_media_release_params_with_locale_and_contract_template) if @acquired_media_release.save(context: :native) - log_create_analytics after_create(@acquired_media_release) else render :new @@ -100,11 +99,8 @@ class Public::AcquiredMediaReleasesController < Public::BaseController :signature_base64, :locale, :contract_template, categories: [], - file_infos_attributes: %i[ - filename - content_type - byte_size - ]) + files: [] + ) end def acquired_media_release_params_with_locale @@ -114,8 +110,4 @@ class Public::AcquiredMediaReleasesController < Public::BaseController def acquired_media_release_params_with_locale_and_contract_template acquired_media_release_params_with_locale.merge(contract_template: @contract_template) end - - def log_create_analytics - TrackAnalyticsJob.perform_later(nil, nil, :track_create_native_release, release_type: AcquiredMediaRelease.to_s, account: @account, user_agent: request.user_agent, user_ip: request.remote_ip) - end end diff --git a/app/controllers/public/appearance_releases_controller.rb b/app/controllers/public/appearance_releases_controller.rb index 17d5464..e4abc9d 100644 --- a/app/controllers/public/appearance_releases_controller.rb +++ b/app/controllers/public/appearance_releases_controller.rb @@ -10,7 +10,6 @@ class Public::AppearanceReleasesController < Public::BaseController @appearance_release = build_appearance_release(appearance_release_params_with_locale_and_contract_template) if @appearance_release.save(context: :native) - log_create_analytics after_create(@appearance_release) else render :new @@ -87,12 +86,35 @@ class Public::AppearanceReleasesController < Public::BaseController ] end + def questionnaire_params + [ + :question_1_answer, + :question_2_answer, + :question_3_answer, + :question_4_answer, + :question_5_answer, + :question_6_answer, + :question_7_answer, + :question_8_answer, + :question_9_answer, + :question_10_answer, + :question_11_answer, + :question_12_answer, + :question_13_answer, + :question_14_answer, + :question_15_answer, + ] + end + def appearance_release_params params.require(:appearance_release).permit(person_params, guardian_params, second_guardian_params, + questionnaire_params, :minor, :signature_base64, :person_date_of_birth, - :locale, :contract_template) + :locale, :contract_template, + :exhibit_a_answer, :exhibit_b_answer + ) end def appearance_release_params_with_locale @@ -102,8 +124,4 @@ class Public::AppearanceReleasesController < Public::BaseController def appearance_release_params_with_locale_and_contract_template appearance_release_params_with_locale.merge(contract_template: @contract_template) end - - def log_create_analytics - TrackAnalyticsJob.perform_later(nil, nil, :track_create_native_release, release_type: AppearanceRelease.to_s, account: @account, user_agent: request.user_agent, user_ip: request.remote_ip) - end end diff --git a/app/controllers/public/broadcasts_controller.rb b/app/controllers/public/broadcasts_controller.rb index aca8f57..47c28e5 100644 --- a/app/controllers/public/broadcasts_controller.rb +++ b/app/controllers/public/broadcasts_controller.rb @@ -3,7 +3,7 @@ class Public::BroadcastsController < Public::BaseController before_action :set_broadcast, only: [:show, :update] def show - @conference_url = broadcast_zoom_meeting_url(@broadcast.token) + @conference_url = conference_url_for(@broadcast) @multi_view_broadcasts = multi_view_broadcasts @recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page]) @files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page]) @@ -43,6 +43,10 @@ class Public::BroadcastsController < Public::BaseController end end + def conference_url_for(broadcast) + broadcast.video_conference_url_override || broadcast_zoom_meeting_url(broadcast.token) + end + class MultiViewBroadcast include Rails.application.routes.url_helpers diff --git a/app/controllers/public/location_releases_controller.rb b/app/controllers/public/location_releases_controller.rb index 536406d..0e3eebb 100644 --- a/app/controllers/public/location_releases_controller.rb +++ b/app/controllers/public/location_releases_controller.rb @@ -10,7 +10,6 @@ class Public::LocationReleasesController < Public::BaseController @location_release = build_location_release(location_release_params_with_locale_and_contract_template) if @location_release.save(context: :native) - log_create_analytics after_create(@location_release) else render :new @@ -76,8 +75,4 @@ class Public::LocationReleasesController < Public::BaseController def location_release_params_with_locale_and_contract_template location_release_params_with_locale.merge(contract_template: @contract_template) end - - def log_create_analytics - TrackAnalyticsJob.perform_later(nil, nil, :track_create_native_release, release_type: LocationRelease.to_s, account: @account, user_agent: request.user_agent, user_ip: request.remote_ip) - end end diff --git a/app/controllers/public/material_releases_controller.rb b/app/controllers/public/material_releases_controller.rb index 2cfcf14..dfcc5be 100644 --- a/app/controllers/public/material_releases_controller.rb +++ b/app/controllers/public/material_releases_controller.rb @@ -10,7 +10,6 @@ class Public::MaterialReleasesController < Public::BaseController @material_release = build_material_release(material_release_params_with_locale_and_contract_template) if @material_release.save(context: :native) - log_create_analytics after_create(@material_release) else render :new @@ -104,8 +103,4 @@ class Public::MaterialReleasesController < Public::BaseController def material_release_params_with_locale_and_contract_template material_release_params_with_locale.merge(contract_template: @contract_template) end - - def log_create_analytics - TrackAnalyticsJob.perform_later(nil, nil, :track_create_native_release, release_type: MaterialRelease.to_s, account: @account, user_agent: request.user_agent, user_ip: request.remote_ip) - end end diff --git a/app/controllers/public/medical_releases_controller.rb b/app/controllers/public/medical_releases_controller.rb index 084298c..12857e8 100644 --- a/app/controllers/public/medical_releases_controller.rb +++ b/app/controllers/public/medical_releases_controller.rb @@ -12,7 +12,6 @@ class Public::MedicalReleasesController < Public::BaseController if @medical_release.contract_template.present? AttachContractToReleasableJob.perform_later(@medical_release) end - log_create_analytics else render :new end @@ -116,8 +115,4 @@ class Public::MedicalReleasesController < Public::BaseController def medical_release_params_with_locale_and_contract_template medical_release_params_with_locale.merge(contract_template: @contract_template) end - - def log_create_analytics - TrackAnalyticsJob.perform_later(nil, nil, :track_create_native_release, release_type: MedicalRelease.to_s, account: @account, user_agent: request.user_agent, user_ip: request.remote_ip) - end end diff --git a/app/controllers/public/misc_releases_controller.rb b/app/controllers/public/misc_releases_controller.rb index 6e31889..d512328 100644 --- a/app/controllers/public/misc_releases_controller.rb +++ b/app/controllers/public/misc_releases_controller.rb @@ -12,7 +12,6 @@ class Public::MiscReleasesController < Public::BaseController if @misc_release.contract_template.present? AttachContractToReleasableJob.perform_later(@misc_release) end - log_create_analytics else render :new end @@ -50,6 +49,14 @@ class Public::MiscReleasesController < Public::BaseController :signature_base64, :locale, :contract_template, + :applicable_medium_id, + :applicable_medium_text, + :territory_id, + :territory_text, + :term_id, + :term_text, + :restriction_id, + :restriction_text, photos: [], ) end @@ -113,8 +120,4 @@ class Public::MiscReleasesController < Public::BaseController def misc_release_params_with_locale_and_contract_template misc_release_params_with_locale.merge(contract_template: @contract_template) end - - def log_create_analytics - TrackAnalyticsJob.perform_later(nil, nil, :track_create_native_release, release_type: MiscRelease.to_s, account: @account, user_agent: request.user_agent, user_ip: request.remote_ip) - end end diff --git a/app/controllers/public/talent_releases_controller.rb b/app/controllers/public/talent_releases_controller.rb index 4c6fd3e..72b98f8 100644 --- a/app/controllers/public/talent_releases_controller.rb +++ b/app/controllers/public/talent_releases_controller.rb @@ -10,7 +10,6 @@ class Public::TalentReleasesController < Public::BaseController @talent_release = build_talent_release(talent_release_params_with_locale_and_contract_template) if @talent_release.save(context: :native) - log_create_analytics after_create(@talent_release) else render :new @@ -108,8 +107,4 @@ class Public::TalentReleasesController < Public::BaseController def talent_release_params_with_locale_and_contract_template talent_release_params_with_locale.merge(contract_template: @contract_template) end - - def log_create_analytics - TrackAnalyticsJob.perform_later(nil, nil, :track_create_native_release, release_type: TalentRelease.to_s, account: @account, user_agent: request.user_agent, user_ip: request.remote_ip) - end end diff --git a/app/controllers/talent_releases_controller.rb b/app/controllers/talent_releases_controller.rb index e2255c2..63ebb14 100644 --- a/app/controllers/talent_releases_controller.rb +++ b/app/controllers/talent_releases_controller.rb @@ -18,7 +18,6 @@ class TalentReleasesController < ApplicationController @talent_release = build_talent_release(talent_release_params) if @talent_release.save - log_create_analytics AddHeadshotCollectionUidToProjectJob.perform_later(@project) SetTagsForReleasableJob.perform_later(@talent_release) redirect_to [@project, :talent_releases], notice: t(".notice") @@ -137,8 +136,4 @@ class TalentReleasesController < ApplicationController results end - - def log_create_analytics - TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_non_native_release, release_type: TalentRelease.to_s, user_agent: request.user_agent, user_ip: request.remote_ip) - end end diff --git a/app/helpers/mail_helper.rb b/app/helpers/mail_helper.rb index 6c431b2..0b05aaf 100644 --- a/app/helpers/mail_helper.rb +++ b/app/helpers/mail_helper.rb @@ -6,6 +6,6 @@ module MailHelper "1. Tell us the name of the video: \n\n" \ "2. Attach each EDL to this email. Please make sure to indicate whether the EDL is a Video Only, Graphics Only, or Audio Only EDL." - mail_to "info@bigmedia.ai", content, subject: subject, body: body + mail_to "info@mesuite.ai", content, subject: subject, body: body end end diff --git a/app/javascript/packs/active_storage_dropzone.js b/app/javascript/packs/active_storage_dropzone.js index 7cb6cfe..74b7fbe 100644 --- a/app/javascript/packs/active_storage_dropzone.js +++ b/app/javascript/packs/active_storage_dropzone.js @@ -67,6 +67,23 @@ class ActiveStorageDropzone { var upload = new that.UploaderClass(file, url, delegate); createUpload(this, upload); }); + + this.on("addedfile", function(file) { + // Show download link in dropzone previews + + let div = document.createElement("div"); + let anchor = document.createElement("a"); + let download_icon = " Download"; + + anchor.innerHTML = download_icon; + anchor.href = file.dataURL; + anchor.setAttribute('target', '_blank'); + anchor.setAttribute('style', 'background-color: rgba(255, 255, 255, 0.4); padding: 0 0.4em; border: 1px solid transparent; text-decoration: none;'); + div.append(anchor); + div.setAttribute('class', 'dz-download-link') + div.setAttribute('style', 'margin-top: 1em;') + $(file.previewElement.childNodes[3]).append(div); + }); }, }); diff --git a/app/mailers/admin_mailer.rb b/app/mailers/admin_mailer.rb index 7df03b1..575e12c 100644 --- a/app/mailers/admin_mailer.rb +++ b/app/mailers/admin_mailer.rb @@ -1,5 +1,5 @@ class AdminMailer < ApplicationMailer - default to: %w(bray@bigmedia.ai lee@bigmedia.ai) + default to: %w[bray@mesuite.ai] def new_video(video) @video = video diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb index 625168f..defd59f 100644 --- a/app/mailers/application_mailer.rb +++ b/app/mailers/application_mailer.rb @@ -1,4 +1,4 @@ class ApplicationMailer < ActionMailer::Base - default from: ENV.fetch("MAILER_FROM_ADDRESS") { "support@bigmedia.ai" } + default from: ENV.fetch("MAILER_FROM_ADDRESS") { "support@mesuite.ai" } layout "mailer" end diff --git a/app/models/acquired_media_release.rb b/app/models/acquired_media_release.rb index 0c6d2cf..d0aae53 100644 --- a/app/models/acquired_media_release.rb +++ b/app/models/acquired_media_release.rb @@ -18,13 +18,14 @@ class AcquiredMediaRelease < ApplicationRecord class << self def custom_csv_exportable_headers - %i[name file_infos_count] + %i[name files_count owner_info] end end + # This association needs to be removed after changing the API. Removing it right now will cause failure in API specs. has_many :file_infos, as: :releasable, dependent: :destroy - accepts_nested_attributes_for :file_infos + has_many_attached :files composed_of :person_address, class_name: "Address", @@ -102,7 +103,19 @@ class AcquiredMediaRelease < ApplicationRecord true end - def file_infos_count - file_infos.any? ? file_infos.size : I18n.t('acquired_media_releases.acquired_media_release.no_media') + def files_count + files.any? ? files.size : I18n.t('acquired_media_releases.acquired_media_release.no_media') + end + + def image_files + files_blobs.where("content_type ILIKE ?", "%image%") + end + + def video_files + files_blobs.where("content_type ILIKE ?", "%video%") + end + + def other_files + files_blobs.where("NOT content_type ILIKE ANY (array[?])", ["%image%", "%video%"]) end end diff --git a/app/models/app_host.rb b/app/models/app_host.rb index 3ea8747..6cb1b1c 100644 --- a/app/models/app_host.rb +++ b/app/models/app_host.rb @@ -40,7 +40,7 @@ class AppHost use_ssl: false, }, production: { - host: "bigmedia.ai", + host: "mesuite.ai", use_ssl: true, } } diff --git a/app/models/appearance_release.rb b/app/models/appearance_release.rb index 00576e1..c1888f6 100644 --- a/app/models/appearance_release.rb +++ b/app/models/appearance_release.rb @@ -17,6 +17,9 @@ class AppearanceRelease < ApplicationRecord include SecondGuardianName include CsvExportable include Approvable + include Amendmenable + + NUMBER_OF_CUSTOM_FIELDS = 15 class << self def custom_csv_exportable_headers diff --git a/app/models/broadcast.rb b/app/models/broadcast.rb index 349ea65..a27d801 100644 --- a/app/models/broadcast.rb +++ b/app/models/broadcast.rb @@ -49,11 +49,13 @@ class Broadcast < ApplicationRecord private def create_mux_live_stream - stream = MuxLiveStream.new + stream = MuxLiveStream.create_with_simulcast self.stream_uid = stream.id self.stream_key = stream.key self.stream_playback_uid = stream.playback_id + self.simulcast_uid = stream.simulcast_id + self.director_mode_video_embed ||= stream.simulcast_destination.try(:playback_embed) self.save! end diff --git a/app/models/concerns/csv_exportable.rb b/app/models/concerns/csv_exportable.rb index 3b03f59..69ac758 100644 --- a/app/models/concerns/csv_exportable.rb +++ b/app/models/concerns/csv_exportable.rb @@ -3,8 +3,8 @@ module CsvExportable extend ActiveSupport::Concern - COMMON_HEADERS = %i[approved? notes tags signed_at].freeze - COMMON_VALUES = %w[clean_notes clean_tags signed_on].freeze + COMMON_HEADERS = %i[approved notes tags signed_at].freeze + COMMON_VALUES = %w[approved? clean_notes clean_tags signed_on].freeze included do class << self @@ -29,11 +29,20 @@ module CsvExportable private + def owner_info + compact_contact_info(name: person_name, address: person_address, phone: person_phone, email: person_email) + end + def contact_info + owner_info + end + + def compact_contact_info(name: nil, address: nil, phone: nil, email: nil) contact_info = '' - contact_info += "#{person_address}; " if person_address.present? - contact_info += "P: #{person_phone}; " if person_phone.present? - contact_info += "E: #{person_email}" if person_email.present? + contact_info += "#{name}; " if name.present? + contact_info += "#{address}; " if address.present? + contact_info += "P: #{phone}; " if phone.present? + contact_info += "E: #{email}" if email.present? contact_info.delete_suffix '; ' end diff --git a/app/models/contract_template.rb b/app/models/contract_template.rb index a607b88..2c39275 100644 --- a/app/models/contract_template.rb +++ b/app/models/contract_template.rb @@ -23,6 +23,9 @@ class ContractTemplate < ApplicationRecord has_rich_text :guardian_clause has_rich_text :signature_legal_text has_rich_text :amendment_clause + has_rich_text :exhibit_a_legal_text + has_rich_text :exhibit_b_legal_text + has_rich_text :questionnaire_legal_text validates :name, presence: true validates :release_type, presence: true @@ -70,6 +73,14 @@ class ContractTemplate < ApplicationRecord (1..NUMBER_OF_CUSTOM_FIELDS).any? { |n| public_send("question_#{n}_text").presence } end + def has_exhibit_a? + exhibit_a_legal_text.present? + end + + def has_exhibit_b? + exhibit_b_legal_text.present? + end + def editable? releases.size.zero? end diff --git a/app/models/location_release.rb b/app/models/location_release.rb index 266ea07..fa17056 100644 --- a/app/models/location_release.rb +++ b/app/models/location_release.rb @@ -16,7 +16,7 @@ class LocationRelease < ApplicationRecord class << self def custom_csv_exportable_headers - %i[name address] + %i[location_info owner_info amendment_signed_column] end end @@ -67,6 +67,18 @@ class LocationRelease < ApplicationRecord true end + def location_info + compact_contact_info(name: name, address: address) + end + + def amendment_signed_column + if amendment_signable? + amendment_signed? + else + I18n.t('location_releases.csv.no_amendment_clause') + end + end + private def end_date_after_start_date diff --git a/app/models/material_release.rb b/app/models/material_release.rb index 258a33a..4e41649 100644 --- a/app/models/material_release.rb +++ b/app/models/material_release.rb @@ -20,7 +20,7 @@ class MaterialRelease < ApplicationRecord class << self def custom_csv_exportable_headers - %i[name] + %i[name owner_info] end end diff --git a/app/models/millicast_destination.rb b/app/models/millicast_destination.rb new file mode 100644 index 0000000..fbdf5c9 --- /dev/null +++ b/app/models/millicast_destination.rb @@ -0,0 +1,41 @@ +class MillicastDestination + attr_reader :name, :token + + def self.create + token_stream_name = SecureRandom.urlsafe_base64 + + publish_token = Millicast::PublishToken.create( + label: SecureRandom.urlsafe_base64, + streams: [ + { streamName: token_stream_name } + ] + ) + + new(token_stream_name, publish_token.data.token) + end + + def initialize(name, token) + @name = name + @token = token + end + + def account_id + ENV["MILLICAST_ACCOUNT_ID"] + end + + def key + "#{name}?token=#{token}" + end + + def url + "rtmp://live-rtmp-pub.millicast.com:1935/v2/pub" + end + + def playback_url + "https://viewer.millicast.com/v2?streamId=#{account_id}/#{name}" + end + + def playback_embed + "" + end +end diff --git a/app/models/misc_release.rb b/app/models/misc_release.rb index f59dbec..6ff6424 100644 --- a/app/models/misc_release.rb +++ b/app/models/misc_release.rb @@ -11,6 +11,7 @@ class MiscRelease < ApplicationRecord include GuardianPhotoable include CsvExportable include Approvable + include Exploitable class << self def custom_csv_exportable_headers diff --git a/app/models/mux_live_stream.rb b/app/models/mux_live_stream.rb index ba12677..f62b214 100644 --- a/app/models/mux_live_stream.rb +++ b/app/models/mux_live_stream.rb @@ -1,4 +1,15 @@ class MuxLiveStream + attr_accessor :simulcast_id, :simulcast_destination + + def self.create_with_simulcast(destination = nil) + destination ||= MillicastDestination.create + + MuxLiveStream.new.tap do |stream| + stream.id # force the live stream to be created by calling for its id + stream.create_simulcast(destination) + end + end + def id live_stream.data.id end @@ -15,6 +26,15 @@ class MuxLiveStream client.delete_live_stream(stream_uid) end + def create_simulcast(destination) + return if test_mode_enabled? + + request = MuxRuby::CreateSimulcastTargetRequest.new(stream_key: destination.key, url: destination.url) + result = client.create_live_stream_simulcast_target(id, request) + self.simulcast_destination = destination + self.simulcast_id = result.data.id + end + private def live_stream diff --git a/app/models/project.rb b/app/models/project.rb index b720b32..38bfff3 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -2,6 +2,7 @@ class Project < ApplicationRecord include Archivable include Filterable include Syncable + include PgSearch SIGNABLE_RELEASE_TYPES = %w(talent appearance acquired_media location material medical misc) AVAILABLE_RELEASE_TYPES = %w(appearance location material acquired_media talent music medical misc) @@ -42,6 +43,15 @@ class Project < ApplicationRecord } end + pg_search_scope :search, { + against: [:name], + using: { + tsearch: {any_word: true, prefix: true}, + trigram: {}, + dmetaphone: {any_word: true} + } + } + validates :name, presence: true, uniqueness: { scope: :account_id } filterable_by :active, :inactive, :archived diff --git a/app/policies/acquired_media_release_policy.rb b/app/policies/acquired_media_release_policy.rb index 9d59ba8..0fb3900 100644 --- a/app/policies/acquired_media_release_policy.rb +++ b/app/policies/acquired_media_release_policy.rb @@ -19,11 +19,7 @@ class AcquiredMediaReleasePolicy < ApplicationPolicy true end - def edit_file_infos? - true - end - - def update_file_infos? + def edit_files? true end diff --git a/app/policies/appearance_release_policy.rb b/app/policies/appearance_release_policy.rb index dd58643..5001fea 100644 --- a/app/policies/appearance_release_policy.rb +++ b/app/policies/appearance_release_policy.rb @@ -34,4 +34,8 @@ class AppearanceReleasePolicy < ReleasePolicy def approve? review? end + + def sign_amendment? + user.manager? || user.account_manager? + end end diff --git a/app/serializers/serializable_acquired_media_release.rb b/app/serializers/serializable_acquired_media_release.rb index 3a522ce..a05b181 100644 --- a/app/serializers/serializable_acquired_media_release.rb +++ b/app/serializers/serializable_acquired_media_release.rb @@ -16,5 +16,5 @@ class SerializableAcquiredMediaRelease < JSONAPI::Serializable::Resource meta do { count: @object.file_infos.size } end - end + end end diff --git a/app/telemetry/analytics.rb b/app/telemetry/analytics.rb index 11b2db0..ecac529 100644 --- a/app/telemetry/analytics.rb +++ b/app/telemetry/analytics.rb @@ -169,6 +169,24 @@ class Analytics ) end end + + def track_create_contract_template(user_agent:, user_ip:) + if analytics_enabled? + identify + track( + { + user_id: user.id, + event: "Contract Template Created", + properties: { + account: account.try(:name), + account_id: account.try(:id), + user_agent: user_agent, + ip: user_ip, + }, + } + ) + end + end private diff --git a/app/views/acquired_media_releases/_acquired_media_release.html.erb b/app/views/acquired_media_releases/_acquired_media_release.html.erb index ab0f400..7b64068 100644 --- a/app/views/acquired_media_releases/_acquired_media_release.html.erb +++ b/app/views/acquired_media_releases/_acquired_media_release.html.erb @@ -12,8 +12,8 @@ <%= acquired_media_release.name %>
<%= t ".heading.#{releasable.model_name.param_key}" %>
+<%= releasable.contract_template.exhibit_a_legal_text %>
+<% if releasable.contract_template.exhibit_a_question_text.present? %> +<%= releasable.contract_template.exhibit_a_question_text %>
+<%= releasable.exhibit_a_answer %>
+<% end %> \ No newline at end of file diff --git a/app/views/contracts/_exhibit_b_page.html.erb b/app/views/contracts/_exhibit_b_page.html.erb new file mode 100644 index 0000000..3290381 --- /dev/null +++ b/app/views/contracts/_exhibit_b_page.html.erb @@ -0,0 +1,8 @@ +<%= t ".heading.#{releasable.model_name.param_key}" %>
+<%= releasable.contract_template.exhibit_b_legal_text %>
+<% if releasable.contract_template.exhibit_b_question_text.present? %> +<%= releasable.contract_template.exhibit_b_question_text %>
+<%= releasable.exhibit_b_answer %>
+<% end %> \ No newline at end of file diff --git a/app/views/contracts/_files.html.erb b/app/views/contracts/_files.html.erb index 19ce468..1b96202 100644 --- a/app/views/contracts/_files.html.erb +++ b/app/views/contracts/_files.html.erb @@ -8,38 +8,37 @@ Description: <%= release.description %> <% end %> - - <% photos = release.file_infos.photo %> + <% photos = release.image_files %> <% unless photos.empty? %><%= releasable.public_send("question_#{n}_answer") %>
<% end %> <% end %> + +<%= contract_template.questionnaire_legal_text %> diff --git a/app/views/contracts/pdf.html.erb b/app/views/contracts/pdf.html.erb index edeab19..9600641 100644 --- a/app/views/contracts/pdf.html.erb +++ b/app/views/contracts/pdf.html.erb @@ -16,7 +16,8 @@ <%= contract_template.guardian_clause %> <% end %> -<% if releasable.model_name.in? %w(MedicalRelease MiscRelease) %> +<%# if releasable.model_name.in? %w(MedicalRelease MiscRelease AppearanceRelease) %> +<% if releasable.respond_to?(:question_1_answer) %><%= @contract_template.exhibit_a_legal_text %>
+ <% if @contract_template.exhibit_a_question_text.present? %> +<%= @contract_template.exhibit_b_legal_text %>
+ <% if @contract_template.exhibit_b_question_text.present? %> +<%= @contract_template.body %>
+ <%= @contract_template.body %> <% if @contract_template.fee? %>Fee <%= number_to_currency @contract_template.fee %> @@ -34,6 +34,9 @@
- If you have questions about how to use the software, please visit <%= link_to "BiGMedia.ai", "https://www.bigmedia.ai/contact" %>. + If you have questions about how to use the software, please visit <%= link_to "MESuite.ai", "https://www.mesuite.ai/contact" %>.
diff --git a/app/views/user_mailer/project_invitation.text.erb b/app/views/user_mailer/project_invitation.text.erb index 217fbd7..48bc963 100644 --- a/app/views/user_mailer/project_invitation.text.erb +++ b/app/views/user_mailer/project_invitation.text.erb @@ -7,4 +7,4 @@ Please click below to set your password. <%= edit_password_reset_url(id: @user.password_reset_token, host: AppHost.new.domain_with_port) %> <% end %> -If you have questions about how to use the software, please visit https://www.bigmedia.ai/contact. +If you have questions about how to use the software, please visit https://www.mesuite.ai/contact. diff --git a/config/environments/test.rb b/config/environments/test.rb index 62c0971..e42c379 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -49,4 +49,5 @@ Rails.application.configure do ENV["ENABLE_ANALYTICS"] = "true" ENV["BRAYNIAC_AI_API_ENDPOINT"] ||= "" + ENV["MILLICAST_API_SECRET"] ||= "" end diff --git a/config/initializers/millicast.rb b/config/initializers/millicast.rb new file mode 100644 index 0000000..e8128ca --- /dev/null +++ b/config/initializers/millicast.rb @@ -0,0 +1,2 @@ +require "millicast" + diff --git a/config/locales/en.yml b/config/locales/en.yml index fd67d6c..ac5c824 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -62,12 +62,12 @@ en: empty: Acquired Media Releases will appear here table_headers: approved: Approved - file_infos_count: No. Files + files_count: No. Files name: Name notes: Notes + owner_info: Owner Info signed_at: Date Signed tags: Tags - owner_info: Owner Info new: heading: Import Acquired Media Release update: @@ -141,7 +141,10 @@ en: actions: manage: Manage review: Review + sign_amendment: Sign Additional Clause messages: + amendment_not_signed_tooltip: Additional Clause Not Yet Signed + amendment_signed_tooltip: Additional Clause Signed approved_tooltip: Approved by %{user} on %{timestamp} no_photos: Needs Photo create: @@ -174,6 +177,7 @@ en: empty: Appearance Releases will appear here imported_appearance_release_missing_attachment: Person photo or contract missing for imported appearance release table_headers: + amendment_signed: Additional Clause approved: Approved contact_info: Contact info name: Name @@ -227,6 +231,7 @@ en: broadcast_recordings: confirm_hide: Are you sure you want to hide this recording from everyone? create: + alert: A live stream could not be created. Please try again later or contact support. notice: A live stream has been created destroy: alert: A live stream has been deleted @@ -307,6 +312,10 @@ en: custom_fields: heading: Questionnaire instructions: Please list the questions you wish the signer to answer. Any unused question fields will be hidden. + exhibits: + heading: Exhibits + help: + option_field: Leave blank if not required for this contract. exploitable_rights: heading: Exploitable Rights legal: @@ -347,10 +356,16 @@ en: contracts: amendment_page: description_labels: - amendment_clause: Amendment Clause - amendment_signature: Amendment Signature - amendment_signer_name: Amendment Signer Name - heading: Amendment + amendment_clause: Clause + amendment_signature: Clause Signature + amendment_signer_name: Clause Signer Name + heading: Additional Clause + exhibit_a_page: + heading: + appearance_release: Exhibit A + exhibit_b_page: + heading: + appearance_release: Exhibit B for_office_use_only: description_labels: date_issued: Date Issued @@ -370,6 +385,7 @@ en: other: Minor photos questionnaire: heading: + appearance_release: Questionnaire medical_release: Medical Questionnaire misc_release: Questionnaire signature_page: @@ -431,17 +447,16 @@ en: download_type: Type errors_helper: failure_message: "The following errors have prevented this %{model_name} from being submitted:" - file_infos: + files: edit: - heading: Add Media - update: - notice: The release has been updated + heading: Media helpers: help: contract_template: amendment_clause: Leave blank if not required for this contract fee: Leave at $0.00 for no-fee guardian_clause: Leave blank if not required for this contract + questionnaire_legal_text: Leave blank if not required for this contract signature_legal_text: Leave blank if not required for this contract task_request: time_allowed: Minimum of 2 hours, no partial hours allowed @@ -829,6 +844,8 @@ en: location_releases: create: notice: The location release has been created + csv: + no_amendment_clause: No additional contract clause destroy: alert: The location release has been deleted edit: @@ -853,6 +870,7 @@ en: table_headers: address: Address amendment_signed: Additional Clause + amendment_signed_column: Additional Clause approved: Approved location_info: Location Info notes: Notes @@ -865,8 +883,8 @@ en: review: Review sign_amendment: Sign Additional Clause messages: - amendment_not_signed_tooltip: Amendment not yet signed - amendment_signed_tooltip: Amendment Signed + amendment_not_signed_tooltip: Additional clause not yet signed + amendment_signed_tooltip: Additional clause signed approved_tooltip: Approved by %{user} on %{timestamp} no_photos: Needs Photo new: @@ -932,7 +950,6 @@ en: empty: Medical releases will appear here table_headers: approved: Approved - approved?: Approved contact_info: Contact info name: Person name notes: Notes @@ -1082,9 +1099,13 @@ en: actions: folder: Add Folder new: Create New Project + search: Search heading: Open Projects new: heading: Create New Project + new_project_button: + actions: + new: Create New Project project: actions: delete: Delete @@ -1142,12 +1163,12 @@ en: heading: Signature amendments: create: - amendment_already_signed_message: Release amendment is already signed! - amendment_signed_message: Release amendment signed successfully! Thank you + amendment_already_signed_message: Release additional clause is already signed! + amendment_signed_message: Release additional clause signed successfully! Thank you new: amendment: heading: Additional Clause - copy_url: Copy sign amendment URL + copy_url: Copy sign additional clause URL signature: heading: Signature signed_contract_preview: Signed Contract Preview @@ -1156,6 +1177,11 @@ en: notice: Your release has been signed. Thank you! new: cancel: Cancel + exhibits: + exhibit_a: + heading: Exhibit A + exhibit_b: + heading: Exhibit B guardian_2_info: heading: Second Guardian Information (if company requires) guardian_2_photo: @@ -1185,6 +1211,8 @@ en: no_photo: No photo yet take_photo: Take Photo warning: If your photo appears sideways, it will be autocorrected when you submit your release. + questionnaire: + heading: Questionnaire signature: heading: Sign Below broadcasts: diff --git a/config/locales/es.yml b/config/locales/es.yml index fca74aa..3383633 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -16,12 +16,13 @@ es: heading: Guardian Photo index: table_headers: + approved: Appproved (ES) file_infos_count: No. Files (ES) name: Name (ES) notes: Notes (ES) + owner_info: Owner Info (ES) signed_at: Date Signed (ES) tags: Tags (ES) - owner_info: Owner Info (ES) activerecord: attributes: appearance_release: @@ -46,6 +47,13 @@ es: models: appearance_release: Autorización de Aparacimiento appearance_releases: + appearance_release: + actions: + manage: Manage (ES) + sign_amendment: Sign Additional Clause (ES) + messages: + amendment_not_signed_tooltip: Amendment not yet signed (ES) + amendment_signed_tooltip: Amendment signed (ES) create: failed_import: Failed to create appearance release for files listed below (ES) matching_started: Matching started (ES) @@ -65,6 +73,8 @@ es: index: imported_appearance_release_missing_attachment: Person photo or contract missing for imported appearance release (ES) table_headers: + amendment_signed: Additional Clause (ES) + approved: Approved (ES) contact_info: "" name: "" notes: "" @@ -170,7 +180,7 @@ es: amendment_clause: Amendment Clause (ES) amendment_signature: Amendment Signature (ES) amendment_signer_name: Amendment Signer Name (ES) - heading: Amendment (ES) + heading: Secondary Clause (ES) for_office_use_only: description_labels: date_issued: Date Issued (ES) @@ -405,6 +415,8 @@ es: update: Approve (ES) update: 'Actualizar %{model}' location_releases: + csv: + no_amendment_clause: No amendment clause (ES) form: photos: dropzone_label: Tap to take a photo of the Property (optional) (ES) @@ -412,6 +424,8 @@ es: table_headers: address: Address (ES) amendment_signed: Additional Clause (ES) + amendment_signed_column: Amendment signed (ES) + approved: Approved (ES) notes: Notes (ES) signed_at: Date Signed (ES) tags: Tags (ES) @@ -437,6 +451,7 @@ es: heading: Guardian Photo index: table_headers: + approved: Approved (ES) name: Name (ES) notes: Notes (ES) owner_info: Owner Info @@ -448,7 +463,6 @@ es: index: table_headers: approved: Approved (ES) - approved?: Approved (ES) contact_info: Contact info (ES) name: Person name (ES) notes: Notes (ES) @@ -462,6 +476,7 @@ es: misc_releases: index: table_headers: + approved: Approved (ES) contact_info: Contact info (ES) name: Person name (ES) notes: Notes (ES) @@ -470,6 +485,7 @@ es: music_releases: index: table_headers: + approved: Approved (ES) composers_count: No. Composers (ES) file_infos_count: No. Files (ES) name: Name (ES) @@ -631,6 +647,7 @@ es: heading: Guardian Photo (ES) index: table_headers: + approved: Approved (ES) email: Email (ES) name: Name (ES) notes: Notes (ES) diff --git a/config/routes.rb b/config/routes.rb index 534fa25..79bb52d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -19,8 +19,8 @@ Rails.application.routes.draw do concern :taggable do resources :acts_as_taggable_on_tags, only: [:new, :create, :destroy], controller: "tags" end - concern :file_infoable do - resource :file_infos, only: [:edit, :update] + concern :file_uploadable do + resource :files, only: [:edit, :update] end concern :approvable do resource :approvals, only: [:new, :create] @@ -51,7 +51,7 @@ Rails.application.routes.draw do resource :account, only: [:new, :create, :update] resources :account_auths, only: [:index, :create, :update, :destroy] resources :projects, shallow: true do - resources :acquired_media_releases, except: [:show], concerns: [:contractable, :notable, :file_infoable] + resources :acquired_media_releases, except: [:show], concerns: [:contractable, :notable, :file_uploadable] resources :appearance_releases, except: [:show], concerns: [:contractable, :notable] resources :appearance_release_imports, only: [:create] resources :location_releases, except: [:show], concerns: [:contractable, :notable, :photoable] @@ -131,7 +131,9 @@ Rails.application.routes.draw do resources :projects, only: [] do resources :contract_templates, only: [:index] do resources :talent_releases, only: [:new, :create] - resources :appearance_releases, only: [:new, :create] + resources :appearance_releases, only: [:new, :create] do + resources :amendments, only: [:new, :create] + end resources :acquired_media_releases, only: [:new, :create] resources :location_releases, only: [:new, :create] do resources :amendments, only: [:new, :create] diff --git a/db/migrate/20200804093409_add_amendment_signer_details_to_appearance_releases.rb b/db/migrate/20200804093409_add_amendment_signer_details_to_appearance_releases.rb new file mode 100644 index 0000000..20695fd --- /dev/null +++ b/db/migrate/20200804093409_add_amendment_signer_details_to_appearance_releases.rb @@ -0,0 +1,5 @@ +class AddAmendmentSignerDetailsToAppearanceReleases < ActiveRecord::Migration[6.0] + def change + add_column :appearance_releases, :amendment_signer_name, :string + end +end diff --git a/db/migrate/20200807190607_add_simulcast_uid_to_broadcasts.rb b/db/migrate/20200807190607_add_simulcast_uid_to_broadcasts.rb new file mode 100644 index 0000000..2be023d --- /dev/null +++ b/db/migrate/20200807190607_add_simulcast_uid_to_broadcasts.rb @@ -0,0 +1,5 @@ +class AddSimulcastUidToBroadcasts < ActiveRecord::Migration[6.0] + def change + add_column :broadcasts, :simulcast_uid, :string + end +end diff --git a/db/migrate/20200811102720_add_exhibit_fields_to_contract_templates.rb b/db/migrate/20200811102720_add_exhibit_fields_to_contract_templates.rb new file mode 100644 index 0000000..0fc7959 --- /dev/null +++ b/db/migrate/20200811102720_add_exhibit_fields_to_contract_templates.rb @@ -0,0 +1,11 @@ +class AddExhibitFieldsToContractTemplates < ActiveRecord::Migration[6.0] + def change + add_column :contract_templates, :exhibit_a_legal_text, :text + add_column :contract_templates, :exhibit_a_question_text, :text + add_column :contract_templates, :exhibit_b_legal_text, :text + add_column :contract_templates, :exhibit_b_question_text, :text + + add_column :appearance_releases, :exhibit_a_answer, :text + add_column :appearance_releases, :exhibit_b_answer, :text + end +end diff --git a/db/migrate/20200812060406_add_question_answers_to_appearance_releases.rb b/db/migrate/20200812060406_add_question_answers_to_appearance_releases.rb new file mode 100644 index 0000000..65e3bde --- /dev/null +++ b/db/migrate/20200812060406_add_question_answers_to_appearance_releases.rb @@ -0,0 +1,19 @@ +class AddQuestionAnswersToAppearanceReleases < ActiveRecord::Migration[6.0] + def change + add_column :appearance_releases, :question_1_answer, :text + add_column :appearance_releases, :question_2_answer, :text + add_column :appearance_releases, :question_3_answer, :text + add_column :appearance_releases, :question_4_answer, :text + add_column :appearance_releases, :question_5_answer, :text + add_column :appearance_releases, :question_6_answer, :text + add_column :appearance_releases, :question_7_answer, :text + add_column :appearance_releases, :question_8_answer, :text + add_column :appearance_releases, :question_9_answer, :text + add_column :appearance_releases, :question_10_answer, :text + add_column :appearance_releases, :question_11_answer, :text + add_column :appearance_releases, :question_12_answer, :text + add_column :appearance_releases, :question_13_answer, :text + add_column :appearance_releases, :question_14_answer, :text + add_column :appearance_releases, :question_15_answer, :text + end +end diff --git a/db/migrate/20200819070738_add_video_conference_url_override_to_broadcasts.rb b/db/migrate/20200819070738_add_video_conference_url_override_to_broadcasts.rb new file mode 100644 index 0000000..8ac323c --- /dev/null +++ b/db/migrate/20200819070738_add_video_conference_url_override_to_broadcasts.rb @@ -0,0 +1,5 @@ +class AddVideoConferenceUrlOverrideToBroadcasts < ActiveRecord::Migration[6.0] + def change + add_column :broadcasts, :video_conference_url_override, :string + end +end diff --git a/db/structure.sql b/db/structure.sql index 6a85008..6fa0d3d 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -379,7 +379,25 @@ CREATE TABLE public.appearance_releases ( guardian_2_address_country character varying, approved_by_user_name text, approved_by_user_email text, - approved_at timestamp without time zone + approved_at timestamp without time zone, + amendment_signer_name character varying, + exhibit_a_answer text, + exhibit_b_answer text, + question_1_answer text, + question_2_answer text, + question_3_answer text, + question_4_answer text, + question_5_answer text, + question_6_answer text, + question_7_answer text, + question_8_answer text, + question_9_answer text, + question_10_answer text, + question_11_answer text, + question_12_answer text, + question_13_answer text, + question_14_answer text, + question_15_answer text ); @@ -580,7 +598,9 @@ CREATE TABLE public.broadcasts ( full_live_stream_playback_uid character varying, stream_url_override character varying, stream_key_override character varying, - director_mode_video_embed text + director_mode_video_embed text, + simulcast_uid character varying, + video_conference_url_override character varying ); @@ -678,7 +698,11 @@ CREATE TABLE public.contract_templates ( question_13_text text, question_14_text text, question_15_text text, - accessibility integer DEFAULT 0 + accessibility integer DEFAULT 0, + exhibit_a_legal_text text, + exhibit_a_question_text text, + exhibit_b_legal_text text, + exhibit_b_question_text text ); @@ -4007,6 +4031,11 @@ INSERT INTO "schema_migrations" (version) VALUES ('20200727143209'), ('20200730050903'), ('20200803145912'), -('20200803150138'); +('20200803150138'), +('20200804093409'), +('20200807190607'), +('20200811102720'), +('20200812060406'), +('20200819070738'); diff --git a/lib/millicast.rb b/lib/millicast.rb new file mode 100644 index 0000000..82f0a7d --- /dev/null +++ b/lib/millicast.rb @@ -0,0 +1,2 @@ +require_relative "./millicast/base" +require_relative "./millicast/publish_token" diff --git a/lib/millicast/base.rb b/lib/millicast/base.rb new file mode 100644 index 0000000..044008f --- /dev/null +++ b/lib/millicast/base.rb @@ -0,0 +1,14 @@ +module Millicast + class Base < ActiveResource::Base + self.site = 'https://api.millicast.com/api' + self.connection.auth_type = :bearer + self.connection.bearer_token = ENV.fetch("MILLICAST_API_SECRET") + self.include_format_in_path = false + + def self.enable_logging + ActiveSupport::Notifications.subscribe('request.active_resource') do |name, start, finish, id, payload| + puts payload + end + end + end +end diff --git a/lib/millicast/publish_token.rb b/lib/millicast/publish_token.rb new file mode 100644 index 0000000..9dcdae0 --- /dev/null +++ b/lib/millicast/publish_token.rb @@ -0,0 +1,5 @@ +module Millicast + class PublishToken < Base + self.collection_name = "publish_token" + end +end diff --git a/spec/controllers/acquired_media_releases_controller_spec.rb b/spec/controllers/acquired_media_releases_controller_spec.rb index 4fe5f31..9249f7b 100644 --- a/spec/controllers/acquired_media_releases_controller_spec.rb +++ b/spec/controllers/acquired_media_releases_controller_spec.rb @@ -87,26 +87,10 @@ RSpec.describe AcquiredMediaReleasesController, type: :controller do }.to have_enqueued_job(SetTagsForReleasableJob).with(AcquiredMediaRelease.last) end - it "creates nested file info records" do - expect { - post :create, params: { - project_id: project, - acquired_media_release: acquired_media_release_params.merge( - file_infos_attributes: { - 0 => attributes_for(:file_info) - } - ) - } - }.to change(FileInfo, :count).by(1) - expect(AcquiredMediaRelease.last.file_infos.size).to eq(1) - end + it "adds files to release" do + post :create, params: { project_id: project, acquired_media_release: acquired_media_release_params.merge(file_params) } - it "logs analytics" do - expect { - post :create, params: { project_id: project, acquired_media_release: acquired_media_release_params } - }.to( - have_enqueued_job(TrackAnalyticsJob).with(user, account, :track_create_non_native_release, release_type: "AcquiredMediaRelease", user_agent: "Rails Testing", user_ip: "0.0.0.0") - ) + expect(AcquiredMediaRelease.last.files.size).to eq(1) end context "when the record would be invalid" do @@ -206,4 +190,11 @@ RSpec.describe AcquiredMediaReleasesController, type: :controller do restriction_text: "restrictions", } end + + def file_params + path = Rails.root.join("spec", "fixtures", "files", "contract.pdf") + contract_file = Rack::Test::UploadedFile.new(path, "application/pdf") + + { files: [contract_file] } + end end diff --git a/spec/controllers/admin/accounts_controller_spec.rb b/spec/controllers/admin/accounts_controller_spec.rb index da854b8..de34163 100644 --- a/spec/controllers/admin/accounts_controller_spec.rb +++ b/spec/controllers/admin/accounts_controller_spec.rb @@ -117,7 +117,7 @@ RSpec.describe Admin::AccountsController, type: :controller do end it "paginates the broadcast list" do - allow(MuxLiveStream).to receive(:new).and_return(double(id: "id", key: "key", playback_id: "playback_id")) + stub_mux_live_stream project = create(:project, account: current_user.primary_account) create_list(:broadcast, 20, project: project ) diff --git a/spec/controllers/admin/broadcasts_controller_spec.rb b/spec/controllers/admin/broadcasts_controller_spec.rb index db240dc..c1a5608 100644 --- a/spec/controllers/admin/broadcasts_controller_spec.rb +++ b/spec/controllers/admin/broadcasts_controller_spec.rb @@ -7,7 +7,7 @@ RSpec.describe Admin::BroadcastsController, type: :controller do before do sign_in(current_user) - allow(MuxLiveStream).to receive(:new).and_return(double(id: "id", key: "key", playback_id: "playback_id")) + stub_mux_live_stream end describe "#edit" do diff --git a/spec/controllers/api/broadcasts_controller_spec.rb b/spec/controllers/api/broadcasts_controller_spec.rb index 5927bca..4888258 100644 --- a/spec/controllers/api/broadcasts_controller_spec.rb +++ b/spec/controllers/api/broadcasts_controller_spec.rb @@ -7,7 +7,7 @@ RSpec.describe Api::BroadcastsController, type: :controller do describe '#index' do before do - allow(MuxLiveStream).to receive(:new).and_return(double(id: 'id', key: 'key', playback_id: 'playback_id')) + stub_mux_live_stream end it 'returns a list of all broadcasts ready for streaming in the project' do diff --git a/spec/controllers/appearance_releases_controller_spec.rb b/spec/controllers/appearance_releases_controller_spec.rb index 53e2be6..8deb4bd 100644 --- a/spec/controllers/appearance_releases_controller_spec.rb +++ b/spec/controllers/appearance_releases_controller_spec.rb @@ -152,14 +152,6 @@ RSpec.describe AppearanceReleasesController, tye: :controller do }.to have_enqueued_job(SetTagsForReleasableJob).with(AppearanceRelease.last) end - it "logs analytics" do - expect { - post :create, params: { project_id: project, appearance_release: appearance_release_params } - }.to( - have_enqueued_job(TrackAnalyticsJob).with(user, account, :track_create_non_native_release, release_type: "AppearanceRelease", user_agent: "Rails Testing", user_ip: "0.0.0.0") - ) - end - context "when the record would be invalid" do before do allow_any_instance_of(AppearanceRelease).to receive(:save).and_return(false) diff --git a/spec/controllers/broadcast_recordings_controller_spec.rb b/spec/controllers/broadcast_recordings_controller_spec.rb index 28e7ab9..0254a16 100644 --- a/spec/controllers/broadcast_recordings_controller_spec.rb +++ b/spec/controllers/broadcast_recordings_controller_spec.rb @@ -16,7 +16,7 @@ RSpec.describe BroadcastRecordingsController, type: :controller do let(:recording) { create(:broadcast_recording, broadcast: broadcast) } before do - allow(MuxLiveStream).to receive(:new).and_return(double(id: "id", key: "key", playback_id: "playback_id")) + stub_mux_live_stream end it "hides the broadcast recording" do diff --git a/spec/controllers/broadcasts_controller_spec.rb b/spec/controllers/broadcasts_controller_spec.rb index 8d08f2e..fc14c94 100644 --- a/spec/controllers/broadcasts_controller_spec.rb +++ b/spec/controllers/broadcasts_controller_spec.rb @@ -13,7 +13,7 @@ RSpec.describe BroadcastsController, type: :controller do describe "#index" do before do - allow(MuxLiveStream).to receive(:new).and_return(double(id: "id", key: "key", playback_id: "playback_id")) + stub_mux_live_stream end it "responds successfully" do @@ -79,7 +79,7 @@ RSpec.describe BroadcastsController, type: :controller do describe "#create" do before do - allow(MuxLiveStream).to receive(:new).and_return(double(id: "id", key: "key", playback_id: "playback_id")) + stub_mux_live_stream end it "responds with a redirect" do @@ -108,13 +108,39 @@ RSpec.describe BroadcastsController, type: :controller do }.not_to change(Broadcast, :count) end end + + context "when Mux API error occurs" do + it "displays an alert message" do + allow_any_instance_of(Broadcast).to receive(:create_mux_live_stream).and_raise(MuxRuby::ApiError) + + expect { + post :create, params: { project_id: project.id, broadcast: broadcast_params } + }.not_to change(Broadcast, :count) + + expect(response).to be_redirect + expect(flash.alert).not_to be_nil + end + end + + context "when ActiveResource API error occurs" do + it "displays an alert message" do + allow_any_instance_of(Broadcast).to receive(:create_mux_live_stream).and_raise(ActiveResource::ConnectionError.new("")) + + expect { + post :create, params: { project_id: project.id, broadcast: broadcast_params } + }.not_to change(Broadcast, :count) + + expect(response).to be_redirect + expect(flash.alert).not_to be_nil + end + end end describe "#show" do let(:broadcast) { create(:broadcast, project: project, name: "Another Broadcast") } before do - allow(MuxLiveStream).to receive(:new).and_return(double(id: "id", key: "key", playback_id: "playback_id")) + stub_mux_live_stream end it "responds successfully" do @@ -213,6 +239,16 @@ RSpec.describe BroadcastsController, type: :controller do end end end + + context 'when video conference url has been overriden' do + let(:broadcast) { create(:broadcast, project: project, video_conference_url_override: 'https://test.com') } + + it 'uses the override url for the video conference button' do + get :show, params: { project_id: project, id: broadcast } + + expect(response.body).to have_link("Video Conference", href: 'https://test.com') + end + end end describe "#update" do diff --git a/spec/controllers/contract_templates_controller_spec.rb b/spec/controllers/contract_templates_controller_spec.rb index b2a1af1..785ea72 100644 --- a/spec/controllers/contract_templates_controller_spec.rb +++ b/spec/controllers/contract_templates_controller_spec.rb @@ -95,7 +95,7 @@ describe ContractTemplatesController do describe '#create' do it 'redirects' do post :create, params: { project_id: project, contract_template: contract_template_params(valid: true) } - + expect(response).to redirect_to(project_contract_templates_path(project)) end @@ -112,6 +112,14 @@ describe ContractTemplatesController do end.to change(ContractTemplate, :count).by(1) end + it "logs analytics" do + expect { + post :create, params: { project_id: project, contract_template: contract_template_params } + }.to( + have_enqueued_job(TrackAnalyticsJob).with(current_user, current_user.primary_account, :track_create_contract_template, user_agent: "Rails Testing", user_ip: "0.0.0.0") + ) + end + context 'when save fails' do it 'responds ok' do post :create, params: { project_id: project, contract_template: contract_template_params(valid: false) } @@ -120,6 +128,15 @@ describe ContractTemplatesController do end end + context 'when exhibit fields are present' do + it 'saves them' do + post :create, params: { project_id: project, contract_template: contract_template_params_with_exhibit_fields } + + expect(ContractTemplate.last.has_exhibit_a?).to be_truthy + expect(ContractTemplate.last.has_exhibit_b?).to be_truthy + end + end + context 'when current user is an associate' do let(:current_user) { create(:user, :associate) } @@ -214,12 +231,21 @@ describe ContractTemplatesController do def contract_template_params(valid: true) if valid - attributes_for(:contract_template).merge(exploitable_rights_params) + attributes_for(:contract_template).merge(exploitable_rights_params).merge({exhibit_a_legal_text: "Legal Text Exhibit A"}) else attributes_for(:contract_template).except(:name) end end + def contract_template_params_with_exhibit_fields + contract_template_params(valid: true).merge({ + exhibit_a_legal_text: "Exhibit A legal text", + exhibit_b_legal_text: "Exhibit B legal text", + exhibit_a_question_text: "Exhibit A Question", + exhibit_b_question_text: "Exhibit B Question", + }) + end + def exploitable_rights_params { applicable_medium_id: ApplicableMedium.last.id, diff --git a/spec/controllers/file_infos_controller_spec.rb b/spec/controllers/file_infos_controller_spec.rb deleted file mode 100644 index aab3992..0000000 --- a/spec/controllers/file_infos_controller_spec.rb +++ /dev/null @@ -1,73 +0,0 @@ -require "rails_helper" - -RSpec.describe FileInfosController, type: :controller do - render_views - - let(:current_user) { create(:user) } - let(:project) { create(:project, account: current_user.accounts.first) } - let(:acquired_media_release) { create(:acquired_media_release, project: project) } - - before do - sign_in(current_user) - end - - shared_examples "a file infoable releases controller" do - describe "#edit" do - it "responds successfully" do - get :edit, params: { "#{subject.model_name.param_key}_id" => subject } - - expect(response).to be_successful - end - end - - describe "#update" do - context "when releasable updated successfully" do - it "responds with a redirect" do - patch :update, params: { "#{subject.model_name.param_key}_id": subject, subject.model_name.param_key => release_params } - - expect(response).to be_redirect - expect(response).to redirect_to [project, subject.model_name.plural] - expect(flash.notice).to eq(t("file_infos.update.notice")) - end - - it "enqueues tagging job" do - expect { - patch :update, params: { "#{subject.model_name.param_key}_id": subject, subject.model_name.param_key => {} } - }.to have_enqueued_job(SetTagsForReleasableJob).with(subject.class.last) - end - end - end - - context "when releasable NOT updated successfully" do - before do - allow_any_instance_of(subject.class).to receive(:update).and_return(false) - end - - it "renders edit with flash message" do - patch :update, params: { "#{subject.model_name.param_key}_id": subject, subject.model_name.param_key => release_params } - - expect(controller).to have_rendered(:edit) - end - - it "does not enqueue tagging job" do - expect { - patch :update, params: { "#{subject.model_name.param_key}_id": subject, subject.model_name.param_key => release_params } - }.not_to have_enqueued_job(SetTagsForReleasableJob) - end - end - end - - context "for acquired media releases" do - subject { create(:acquired_media_release, project: project) } - - it_behaves_like "a file infoable releases controller" - end - - private - - def release_params - files = 2.times.map { Rack::Test::UploadedFile.new(file_fixture("audio.mp3"), "audio/mp3") } - - { file_infos_attributes: files } - end -end diff --git a/spec/controllers/location_releases_controller_spec.rb b/spec/controllers/location_releases_controller_spec.rb index e4d29e7..a970b47 100644 --- a/spec/controllers/location_releases_controller_spec.rb +++ b/spec/controllers/location_releases_controller_spec.rb @@ -90,14 +90,6 @@ RSpec.describe LocationReleasesController, type: :controller do }.to have_enqueued_job(SetTagsForReleasableJob).with(LocationRelease.last) end - it "logs analytics" do - expect { - post :create, params: { project_id: project, location_release: location_release_params } - }.to( - have_enqueued_job(TrackAnalyticsJob).with(user, account, :track_create_non_native_release, release_type: "LocationRelease", user_agent: "Rails Testing", user_ip: "0.0.0.0") - ) - end - context "when the record would be invalid" do before do allow_any_instance_of(LocationRelease).to receive(:save).and_return(false) diff --git a/spec/controllers/material_releases_controller_spec.rb b/spec/controllers/material_releases_controller_spec.rb index 3272c33..2e17a19 100644 --- a/spec/controllers/material_releases_controller_spec.rb +++ b/spec/controllers/material_releases_controller_spec.rb @@ -87,14 +87,6 @@ RSpec.describe MaterialReleasesController, type: :controller do }.to have_enqueued_job(SetTagsForReleasableJob).with(MaterialRelease.last) end - it "logs analytics" do - expect { - post :create, params: { project_id: project, material_release: material_release_params } - }.to( - have_enqueued_job(TrackAnalyticsJob).with(user, account, :track_create_non_native_release, release_type: "MaterialRelease", user_agent: "Rails Testing", user_ip: "0.0.0.0") - ) - end - context "when the record would be invalid" do before do allow_any_instance_of(MaterialRelease).to receive(:save).and_return(false) diff --git a/spec/controllers/music_releases_controller_spec.rb b/spec/controllers/music_releases_controller_spec.rb index f8702c6..098b183 100644 --- a/spec/controllers/music_releases_controller_spec.rb +++ b/spec/controllers/music_releases_controller_spec.rb @@ -145,14 +145,6 @@ RSpec.describe MusicReleasesController, type: :controller do }.to have_enqueued_job(SetTagsForReleasableJob).with(MusicRelease.last) end - it "logs analytics" do - expect { - post :create, params: { project_id: project, music_release: music_release_params } - }.to( - have_enqueued_job(TrackAnalyticsJob).with(user, account, :track_create_non_native_release, release_type: "MusicRelease", user_agent: "Rails Testing", user_ip: "0.0.0.0") - ) - end - context "when the record would be invalid" do before :each do allow_any_instance_of(MusicRelease).to receive(:save).and_return(false) diff --git a/spec/controllers/public/acquired_media_releases_controller_spec.rb b/spec/controllers/public/acquired_media_releases_controller_spec.rb index eb7e9a9..9336d3c 100644 --- a/spec/controllers/public/acquired_media_releases_controller_spec.rb +++ b/spec/controllers/public/acquired_media_releases_controller_spec.rb @@ -7,17 +7,6 @@ RSpec.describe Public::AcquiredMediaReleasesController, type: :controller do render_views describe "#create" do - it "logs analytics" do - contract_template = create(:contract_template, project: project) - - expect { - post :create, params: { account_id: project.account.to_param, project_id: project, contract_template_id: contract_template, acquired_media_release: acquired_media_release_params } - }.to( - have_enqueued_job(TrackAnalyticsJob) - .with(nil, nil, :track_create_native_release, release_type: "AcquiredMediaRelease", account: project.account, user_agent: "Rails Testing", user_ip: "0.0.0.0") - ) - end - it "displays validation errors" do contract_template = create(:contract_template, project: project) sign_in(user) diff --git a/spec/controllers/public/amendments_controller_spec.rb b/spec/controllers/public/amendments_controller_spec.rb index 277212e..d49ef04 100644 --- a/spec/controllers/public/amendments_controller_spec.rb +++ b/spec/controllers/public/amendments_controller_spec.rb @@ -4,96 +4,108 @@ RSpec.describe Public::AmendmentsController, type: :controller do let(:user) { create(:user) } let(:account) { user.primary_account } let(:project) { create(:project, account: account) } - let(:contract_template) { create(:location_release_contract_template, :with_amendment_clause, project: project) } - let(:location_release) { create(:location_release, contract_template: contract_template, project: project) } render_views - describe "#new" do - it "shows amendment signing form for non-signed amendment of a release" do - expect(location_release.amendment_signed?).to be_falsey + shared_examples "amendments signing controller" do + describe "#new" do + it "shows amendment signing form for non-signed amendment of a release" do + expect(subject.amendment_signed?).to be_falsey - get :new, params: { - account_id: account, - project_id: project, - contract_template_id: location_release.contract_template, - location_release_id: location_release - } + get :new, params: { + account_id: account, + project_id: project, + contract_template_id: subject.contract_template, + "#{subject.model_name.param_key}_id": subject + } - expect(response).to be_successful + expect(response).to be_successful - body = CGI.unescape_html(response.body) - expect(body).not_to match already_signed_message + body = CGI.unescape_html(response.body) + expect(body).not_to match already_signed_message + end + + it "shows already signed message for signed amendment of a release" do + expect(signed_release.amendment_signed?).to be_truthy + + get :new, params: { + account_id: account, + project_id: project, + contract_template_id: signed_release.contract_template, + "#{signed_release.model_name.param_key}_id": signed_release + } + + expect(response).to be_successful + + body = CGI.unescape_html(response.body) + expect(body).to match already_signed_message + end end - it "shows already signed message for signed amendment of a release" do - signed_release = create(:location_release, :amendment_signed, contract_template: contract_template, project: project) + describe "#create" do + it "signs amendment" do + expect(subject.amendment_signed?).to be_falsey - expect(signed_release.amendment_signed?).to be_truthy + post :create, params: { + account_id: account, + project_id: project, + contract_template_id: subject.contract_template, + "#{subject.model_name.param_key}_id": subject, + "#{subject.model_name.param_key}": { + amendment_signer_name: "Signer Name", + amendment_signature_base64: signature_base64 + } + } - get :new, params: { - account_id: account, - project_id: project, - contract_template_id: location_release.contract_template, - location_release_id: signed_release - } + expect(response).to be_successful - expect(response).to be_successful + body = CGI.unescape_html(response.body) + expect(body).not_to match already_signed_message + expect(body).to match signed_successfully_message - body = CGI.unescape_html(response.body) - expect(body).to match already_signed_message + expect(subject.class.last.amendment_signed?).to be_truthy + expect(subject.class.last.amendment_signer_name).to eq "Signer Name" + end + + it "shows already signed message for signed amendment of a release" do + expect(signed_release.amendment_signed?).to be_truthy + + post :create, params: { + account_id: account, + project_id: project, + contract_template_id: signed_release.contract_template, + "#{signed_release.model_name.param_key}_id": signed_release, + "#{signed_release.model_name.param_key}": { + amendment_signer_name: "Signer Who", + amendment_signature_base64: signature_base64 + } + } + + expect(response).to be_successful + + body = CGI.unescape_html(response.body) + expect(body).to match already_signed_message + + expect(signed_release.amendment_signed?).to be_truthy + expect(signed_release.amendment_signer_name).to eq "Amendment Signer" + end end end - describe "#create" do - it "signs amendment" do - expect(location_release.amendment_signed?).to be_falsey + context "for location release" do + let(:contract_template) { create(:location_release_contract_template, :with_amendment_clause, project: project) } + let(:signed_release) { create(:location_release, :amendment_signed, contract_template: contract_template, project: project) } + subject { create(:location_release, contract_template: contract_template, project: project) } - post :create, params: { - account_id: account, - project_id: project, - contract_template_id: location_release.contract_template, - location_release_id: location_release, - location_release: { - amendment_signer_name: "Signer Name", - amendment_signature_base64: signature_base64 - } - } + it_behaves_like "amendments signing controller" + end - expect(response).to be_successful + context "for appearance release" do + let(:contract_template) { create(:appearance_release_contract_template, :with_amendment_clause, project: project) } + let(:signed_release) { create(:appearance_release, :amendment_signed, contract_template: contract_template, project: project) } + subject { create(:appearance_release, contract_template: contract_template, project: project) } - body = CGI.unescape_html(response.body) - expect(body).not_to match already_signed_message - expect(body).to match signed_successfully_message - - expect(LocationRelease.last.amendment_signed?).to be_truthy - expect(LocationRelease.last.amendment_signer_name).to eq "Signer Name" - end - - it "shows already signed message for signed amendment of a release" do - signed_release = create(:location_release, :amendment_signed, name: "Test Loc", amendment_signer_name: "Big Signer", contract_template: contract_template, project: project) - - expect(signed_release.amendment_signed?).to be_truthy - - post :create, params: { - account_id: account, - project_id: project, - contract_template_id: location_release.contract_template, - location_release_id: signed_release, - location_release: { - amendment_signer_name: "Signer Who", - amendment_signature_base64: signature_base64 - } - } - - expect(response).to be_successful - - body = CGI.unescape_html(response.body) - expect(body).to match already_signed_message - - expect(signed_release.amendment_signed?).to be_truthy - expect(signed_release.amendment_signer_name).to eq "Big Signer" - end + it_behaves_like "amendments signing controller" end private diff --git a/spec/controllers/public/appearance_releases_controller_spec.rb b/spec/controllers/public/appearance_releases_controller_spec.rb index 7b2ecf2..8d881a8 100644 --- a/spec/controllers/public/appearance_releases_controller_spec.rb +++ b/spec/controllers/public/appearance_releases_controller_spec.rb @@ -11,22 +11,6 @@ describe Public::AppearanceReleasesController do end describe "#create" do - it "logs analytics" do - contract_template = create(:contract_template, project: project) - - expect { - post :create, params: { - account_id: project.account.to_param, - project_id: project, - contract_template_id: contract_template, - appearance_release: appearance_release_params - } - }.to( - have_enqueued_job(TrackAnalyticsJob) - .with(nil, nil, :track_create_native_release, release_type: "AppearanceRelease", account: project.account, user_agent: "Rails Testing", user_ip: "0.0.0.0") - ) - end - it "displays validation errors" do contract_template = create(:contract_template, project: project) sign_in(user) diff --git a/spec/controllers/public/broadcasts_controller_spec.rb b/spec/controllers/public/broadcasts_controller_spec.rb index f42338d..f6efde8 100644 --- a/spec/controllers/public/broadcasts_controller_spec.rb +++ b/spec/controllers/public/broadcasts_controller_spec.rb @@ -8,7 +8,7 @@ RSpec.describe Public::BroadcastsController, type: :controller do let(:project) { create(:project, account: user.primary_account) } before do - allow(MuxLiveStream).to receive(:new).and_return(double(id: "id", key: "key", playback_id: "playback_id")) + stub_mux_live_stream end describe "#show" do @@ -81,6 +81,16 @@ RSpec.describe Public::BroadcastsController, type: :controller do expect(response.body).to have_selector(".dropdown-menu a.dropdown-item", text: recording.download_file_name) end end + + context 'when video conference url has been overriden' do + let(:broadcast) { create(:broadcast, project: project, video_conference_url_override: 'https://test.com') } + + it 'uses the override url for the video conference button' do + get :show, params: { token: broadcast.token } + + expect(response.body).to have_link("Video Conference", href: 'https://test.com') + end + end end describe "#update" do diff --git a/spec/controllers/public/location_releases_controller_spec.rb b/spec/controllers/public/location_releases_controller_spec.rb index af10c12..ac07427 100644 --- a/spec/controllers/public/location_releases_controller_spec.rb +++ b/spec/controllers/public/location_releases_controller_spec.rb @@ -16,17 +16,6 @@ describe Public::LocationReleasesController do expect(LocationRelease.last.photos.attached?).to eq true end - it "logs analytics" do - contract_template = create(:contract_template, project: project) - - expect { - post :create, params: { account_id: project.account.to_param, project_id: project, contract_template_id: contract_template, location_release: location_release_params } - }.to( - have_enqueued_job(TrackAnalyticsJob) - .with(nil, nil, :track_create_native_release, release_type: "LocationRelease", account: project.account, user_agent: "Rails Testing", user_ip: "0.0.0.0") - ) - end - it "displays validation errors" do contract_template = create(:contract_template, project: project) sign_in(user) diff --git a/spec/controllers/public/material_releases_controller_spec.rb b/spec/controllers/public/material_releases_controller_spec.rb index 6ab78be..dc7d970 100644 --- a/spec/controllers/public/material_releases_controller_spec.rb +++ b/spec/controllers/public/material_releases_controller_spec.rb @@ -16,17 +16,6 @@ describe Public::MaterialReleasesController do expect(MaterialRelease.last.photos.attached?).to eq true end - it "logs analytics" do - contract_template = create(:contract_template, project: project) - - expect { - post :create, params: { account_id: project.account.to_param, project_id: project, contract_template_id: contract_template, material_release: material_release_params } - }.to( - have_enqueued_job(TrackAnalyticsJob) - .with(nil, nil, :track_create_native_release, release_type: "MaterialRelease", account: project.account, user_agent: "Rails Testing", user_ip: "0.0.0.0") - ) - end - it "displays validation errors" do contract_template = create(:contract_template, project: project) sign_in(user) diff --git a/spec/controllers/public/medical_releases_controller_spec.rb b/spec/controllers/public/medical_releases_controller_spec.rb index d80325e..675baef 100644 --- a/spec/controllers/public/medical_releases_controller_spec.rb +++ b/spec/controllers/public/medical_releases_controller_spec.rb @@ -7,17 +7,6 @@ RSpec.describe Public::MedicalReleasesController, type: :controller do render_views describe "#create" do - it "logs analytics" do - contract_template = create(:contract_template, project: project) - - expect { - post :create, params: { account_id: project.account.to_param, project_id: project, contract_template_id: contract_template, medical_release: medical_release_params } - }.to( - have_enqueued_job(TrackAnalyticsJob) - .with(nil, nil, :track_create_native_release, release_type: "MedicalRelease", account: project.account, user_agent: "Rails Testing", user_ip: "0.0.0.0") - ) - end - it "displays validation errors" do contract_template = create(:contract_template, project: project, diff --git a/spec/controllers/public/talent_releases_controller_spec.rb b/spec/controllers/public/talent_releases_controller_spec.rb index 6c0a10f..558ecbf 100644 --- a/spec/controllers/public/talent_releases_controller_spec.rb +++ b/spec/controllers/public/talent_releases_controller_spec.rb @@ -7,17 +7,6 @@ RSpec.describe Public::TalentReleasesController, type: :controller do render_views describe "#create" do - it "logs analytics" do - contract_template = create(:contract_template, project: project) - - expect { - post :create, params: { account_id: project.account.to_param, project_id: project, contract_template_id: contract_template, talent_release: talent_release_params } - }.to( - have_enqueued_job(TrackAnalyticsJob) - .with(nil, nil, :track_create_native_release, release_type: "TalentRelease", account: project.account, user_agent: "Rails Testing", user_ip: "0.0.0.0") - ) - end - it "displays validation errors" do contract_template = create(:contract_template, project: project) sign_in(user) diff --git a/spec/controllers/public/zoom_meetings_controller_spec.rb b/spec/controllers/public/zoom_meetings_controller_spec.rb index 61f5a1c..50916d8 100644 --- a/spec/controllers/public/zoom_meetings_controller_spec.rb +++ b/spec/controllers/public/zoom_meetings_controller_spec.rb @@ -13,7 +13,7 @@ RSpec.describe Public::ZoomMeetingsController, type: :controller 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') + stub_mux_live_stream end describe "#show" do diff --git a/spec/controllers/talent_releases_controller_spec.rb b/spec/controllers/talent_releases_controller_spec.rb index 2b3b685..2f657d6 100644 --- a/spec/controllers/talent_releases_controller_spec.rb +++ b/spec/controllers/talent_releases_controller_spec.rb @@ -110,14 +110,6 @@ RSpec.describe TalentReleasesController, type: :controller do }.to have_enqueued_job(SetTagsForReleasableJob).with(TalentRelease.last) end - it "logs analytics" do - expect { - post :create, params: { project_id: project, talent_release: talent_release_params } - }.to( - have_enqueued_job(TrackAnalyticsJob).with(user, account, :track_create_non_native_release, release_type: "TalentRelease", user_agent: "Rails Testing", user_ip: "0.0.0.0") - ) - end - context "when the record would be invalid" do before do allow_any_instance_of(TalentRelease).to receive(:save).and_return(false) diff --git a/spec/controllers/zoom_meetings_controller_spec.rb b/spec/controllers/zoom_meetings_controller_spec.rb index ca1ab04..66092b4 100644 --- a/spec/controllers/zoom_meetings_controller_spec.rb +++ b/spec/controllers/zoom_meetings_controller_spec.rb @@ -16,7 +16,7 @@ RSpec.describe ZoomMeetingsController, type: :controller 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') + stub_mux_live_stream end describe "#show" do diff --git a/spec/factories/appearance_releases.rb b/spec/factories/appearance_releases.rb index 512db9e..47315c3 100644 --- a/spec/factories/appearance_releases.rb +++ b/spec/factories/appearance_releases.rb @@ -18,7 +18,9 @@ FactoryBot.define do person_address_zip "ZIP" person_address_country "Country" person_phone "123-555-6789" - + exhibit_a_answer "" + exhibit_b_answer "" + signature do path = Rails.root.join("spec", "fixtures", "files", "signature.png") Rack::Test::UploadedFile.new(path, "image/png") @@ -32,6 +34,14 @@ FactoryBot.define do end end + trait :amendment_signed do + amendment_signature do + path = Rails.root.join("spec", "fixtures", "files", "signature.png") + Rack::Test::UploadedFile.new(path, "image/png") + end + amendment_signer_name "Amendment Signer" + end + trait :minor do minor true guardian_first_name "Jamie" diff --git a/spec/factories/contract_templates.rb b/spec/factories/contract_templates.rb index 8935cd5..64757f8 100644 --- a/spec/factories/contract_templates.rb +++ b/spec/factories/contract_templates.rb @@ -8,6 +8,8 @@ FactoryBot.define do guardian_clause "Is the signer a minor?" fee "$0.00" accessibility "public_template" + exhibit_a_legal_text "" + exhibit_b_legal_text "" trait :archived do archived_at Time.zone.now diff --git a/spec/features/admin_managing_accounts_spec.rb b/spec/features/admin_managing_accounts_spec.rb index 0d8b45a..417e4f4 100644 --- a/spec/features/admin_managing_accounts_spec.rb +++ b/spec/features/admin_managing_accounts_spec.rb @@ -104,9 +104,9 @@ feature "Admin managing accounts" do visit profile_path click_link "Admin" - expect(page).to have_content /Name Plan # Projects Monthly Video Upload Minutes Total Video Upload Minutes Total Storage Created At/ - expect(page).to have_content /MGM ME Suite 1 1 minutes 2 minutes 6.74 MB/ - expect(page).to have_content /Discovery ME Suite 0 0 minutes 0 minutes 0 Bytes/ + expect(page).to have_content /Name Plan # Projects # Releases Signed Monthly Video Upload Minutes Total Video Upload Minutes Total Storage Created At/ + expect(page).to have_content /MGM ME Suite 1 0 1 minutes 2 minutes 6.74 MB/ + expect(page).to have_content /Discovery ME Suite 0 0 0 minutes 0 minutes 0 Bytes/ end scenario "Uses the search button to filter accounts", js: true do diff --git a/spec/features/admin_managing_broadcasts_spec.rb b/spec/features/admin_managing_broadcasts_spec.rb new file mode 100644 index 0000000..d09841a --- /dev/null +++ b/spec/features/admin_managing_broadcasts_spec.rb @@ -0,0 +1,35 @@ +require 'rails_helper' + +feature 'Admin managing broadcasts' do + let(:current_user) { create(:user, admin: true, email: 'user@test.com') } + let(:project) { create(:project, account: current_user.primary_account, name: 'Test Project') } + let(:broadcast) { create(:broadcast, project: project) } + + before do + stub_mux_live_stream + sign_in current_user + end + + scenario 'admin can edit a broadcast' do + visit edit_admin_broadcast_path(broadcast) + + fill_in video_conference_url_override_field, with: 'http://test.com' + click_on submit_button + + expect(page).to have_content(update_notice) + end + + private + + def video_conference_url_override_field + Broadcast.human_attribute_name(:video_conference_url_override) + end + + def submit_button + 'Save Changes' + end + + def update_notice + t 'admin.broadcasts.update.notice' + end +end diff --git a/spec/features/user_manages_contract_templates_spec.rb b/spec/features/user_manages_contract_templates_spec.rb index 6c90ff8..0c9e2c4 100644 --- a/spec/features/user_manages_contract_templates_spec.rb +++ b/spec/features/user_manages_contract_templates_spec.rb @@ -66,6 +66,30 @@ RSpec.feature 'User manages contract templates', type: :feature do expect(ContractTemplate.last.amendment_clause.body.to_s).to match /Amendment clause text/ end + scenario 'appearance release template has an amendment clause field' do + visit new_project_contract_template_path(project) + + fill_in 'Name', with: 'My Release Template' + select 'Appearance Release', from: 'Release type' + fill_hidden amendment_clause_field, with: 'Amendment clause text' + click_on create_release_template_button + + expect(page).to have_content(create_contract_template_success_message) + expect(ContractTemplate.last.amendment_clause.body.to_s).to match /Amendment clause text/ + end + + scenario 'medical release template has a questionnaire legal text field' do + visit new_project_contract_template_path(project) + + fill_in 'Name', with: 'My Release Template' + select 'Medical Release', from: 'Release type' + fill_hidden questionnaire_legal_text_field, with: 'Questionnaire legal text' + click_on create_release_template_button + + expect(page).to have_content(create_contract_template_success_message) + expect(ContractTemplate.last.questionnaire_legal_text.body.to_s).to match /Questionnaire legal text/ + end + scenario 'medical release template has a guardian clause field' do visit new_project_contract_template_path(project) @@ -484,6 +508,10 @@ RSpec.feature 'User manages contract templates', type: :feature do 'contract_template_amendment_clause_trix_input_contract_template' end + def questionnaire_legal_text_field + 'contract_template_questionnaire_legal_text_trix_input_contract_template' + end + def signature_legal_text_field 'contract_template_signature_legal_text' end diff --git a/spec/features/user_managing_acquired_media_releases_spec.rb b/spec/features/user_managing_acquired_media_releases_spec.rb index 0d4484d..69849fd 100644 --- a/spec/features/user_managing_acquired_media_releases_spec.rb +++ b/spec/features/user_managing_acquired_media_releases_spec.rb @@ -301,7 +301,7 @@ feature "User managing acquired_media releases" do end by "attaching files" do - drop_file Rails.root.join(file_fixture("video_file.mp4")), type: "file-info-dropzone" + drop_file Rails.root.join(file_fixture("video_file.mp4")), type: "dropzone" click_button create_release_button expect(page).to have_invalid_field(acquired_media_name_field) @@ -328,7 +328,7 @@ feature "User managing acquired_media releases" do expect(page).to have_filled_in_data(release_data) fill_in_release_fields name: "New name" - drop_file Rails.root.join(file_fixture("person_photo.png")), type: "file-info-dropzone" + drop_file Rails.root.join(file_fixture("person_photo.png")), type: "dropzone" click_button update_release_button expect(page).to have_content(update_release_notice) @@ -366,20 +366,7 @@ feature "User managing acquired_media releases" do email: "john.doe@test.com", created_at: DateTime.new(2020, 2, 20, 11, 0, 0), ), - ], - file_infos: - [ - build(:file_info, - filename: "aaa.jpg", - content_type: "image/jpeg"), - build(:file_info, - filename: "bbb.mp4", - content_type: "video/mp4"), - build(:file_info, - filename: "unknown.doc", - content_type: "unknown/file") ] - ) sign_in(current_user) @@ -398,12 +385,6 @@ feature "User managing acquired_media releases" do expect(pdf_body).to have_content("Woman") expect(pdf_body).to have_content("Brunette") expect(pdf_body).to have_content("FILES") - expect(pdf_body).to have_content("Photos") - expect(pdf_body).to have_content("Videos") - expect(pdf_body).to have_content("aaa.jpg") - expect(pdf_body).to have_content("bbb.mp4") - expect(pdf_body).to have_content("unknown.doc") - expect(pdf_body).to have_content("Other files") end scenario "viewing the contract PDF for a minor" do diff --git a/spec/features/user_managing_appearance_releases_spec.rb b/spec/features/user_managing_appearance_releases_spec.rb index f7bfd90..d4ae013 100644 --- a/spec/features/user_managing_appearance_releases_spec.rb +++ b/spec/features/user_managing_appearance_releases_spec.rb @@ -11,10 +11,11 @@ feature 'User managing appearance releases' do allow(BrayniacAI::Validation).to receive(:create).and_return(double(:validation, valid: true)) project = create(:project, members: current_user, account: current_user.primary_account) - contract_template = create(:contract_template, project: project) + contract_template = create(:contract_template, project: project, question_1_text: "Question 1") visit new_account_project_contract_template_appearance_release_path(project.account, project, contract_template) + expect(page).to have_content("QUESTIONNAIRE") expect(page).to have_photo_button fill_in person_first_name_field, with: 'Jane' @@ -144,6 +145,73 @@ feature 'User managing appearance releases' do expect(page).to have_content dummy_signature_legal_text end + + scenario "signing amendment for a not-signed amendment release", js: true do + contract_template = create(:appearance_release_contract_template, :with_amendment_clause, project: project) + release = create(:appearance_release, contract_template: contract_template, project: project) + + expect(release.amendment_signed?).to be_falsey + + visit new_account_project_contract_template_appearance_release_amendment_path(project.account, project, contract_template, release) + + expect(page).to have_content amendments_heading.upcase + + fill_in amendment_signer_name_field, with: 'Big Signer' + draw_signature file_fixture("signature.png"), amendment_signature_field + + click_button sign_amendment_button + + expect(page).to have_content signed_successfully_message + expect(AppearanceRelease.find(release.id).amendment_signed?).to be_truthy + end + + scenario "opening signing amendment page for a signed amendment release shows already signed message", js: true do + contract_template = create(:appearance_release_contract_template, :with_amendment_clause, project: project) + release = create(:appearance_release, :amendment_signed, contract_template: contract_template, project: project) + + expect(release.amendment_signed?).to be_truthy + + visit new_account_project_contract_template_appearance_release_amendment_path(project.account, project, contract_template, release) + + expect(page).not_to have_content amendments_heading.upcase + expect(page).not_to have_content signed_successfully_message + expect(page).to have_content already_signed_message + end + + scenario "amendment signing form has copy URL button" do + contract_template = create(:appearance_release_contract_template, :with_amendment_clause, project: project) + release = create(:appearance_release, contract_template: contract_template, project: project) + + visit new_account_project_contract_template_appearance_release_amendment_path(project.account, project, contract_template, release) + + expect(page).to have_content copy_url_button + end + + scenario 'exhibit section answers are saved to appearance release', js: true do + allow(BrayniacAI::Validation).to receive(:create).and_return(double(:validation, valid: true)) + + project = create(:project, members: current_user, account: current_user.primary_account) + contract_template = create(:contract_template, project: project, exhibit_a_legal_text: "Exhibit A legal text", exhibit_a_question_text: "Exhibit A Question text") + + visit new_account_project_contract_template_appearance_release_path(project.account, project, contract_template) + + expect(page).to have_photo_button + expect(page).to have_content("Exhibit A legal text") + expect(page).to have_content("Exhibit A Question Text") + + fill_in person_first_name_field, with: 'Jane' + fill_in person_last_name_field, with: 'Doe' + fill_in_person_address_fields + fill_in person_phone_field, with: '555-555-5555' + fill_in person_email_field, with: 'jane.doe@test.com' + fill_in person_date_of_birth, with: '01/01/1999' + fill_in exhibit_a_answer, with: 'Answer to exhibit A question' + attach_file person_photo_field, file_fixture('person_photo.png'), visible: :all + draw_signature file_fixture('signature.png'), 'appearance_release_signature_base64' + click_button submit_release_button + + expect(page).to have_content(successful_submission_message) + end end context 'when signed in' do @@ -292,13 +360,89 @@ feature 'User managing appearance releases' do expect(page).to have_content('New Name') end - scenario 'viewing the contract PDF' do - appearance_release = create(:appearance_release_with_contract_template, + scenario "signing amendment for a not-signed amendment release", js: true do + contract_template = create(:appearance_release_contract_template, :with_amendment_clause, project: project) + release = create(:appearance_release, person_first_name: "First", contract_template: contract_template, project: project) + + expect(release.amendment_signed?).to be_falsey + + visit project_appearance_releases_path(project) + + expect(page).to have_content "First" + + click_on manage_button + + expect(page).to have_link sign_amendment_link + + new_window = window_opened_by { click_link sign_amendment_link } + within_window new_window do + expect(page).to have_content amendments_heading.upcase + + fill_in amendment_signer_name_field, with: 'Big Signer' + draw_signature file_fixture("signature.png"), amendment_signature_field + + click_button sign_amendment_button + + expect(page).to have_content signed_successfully_message + expect(AppearanceRelease.find(release.id).amendment_signed?).to be_truthy + end + end + + scenario "signed amendment release does not have sign amendment option in manage dropdown", js: true do + contract_template = create(:appearance_release_contract_template, :with_amendment_clause, project: project) + release = create(:appearance_release, :amendment_signed, person_first_name: "Firstn", contract_template: contract_template, project: project) + + expect(release.amendment_signed?).to be_truthy + + visit project_appearance_releases_path(project) + + expect(page).to have_content "Firstn" + + click_on manage_button + + expect(page).not_to have_link sign_amendment_link + end + + scenario "signed amendment release have checked box in appearance releases index table", js: true do + contract_template = create(:appearance_release_contract_template, :with_amendment_clause, project: project) + not_signed_release = create(:appearance_release, person_first_name: "Firstn", contract_template: contract_template, project: project) + expect(not_signed_release.amendment_signed?).to be_falsey + + visit project_appearance_releases_path(project) + + expect(page).to have_content "Firstn" + expect(page).to have_css('i.fa.fa-square-o', count: 1) + expect(page).to have_css('i.fa.fa-check-square', count: 0) + + signed_release = create(:appearance_release, :amendment_signed, person_first_name: "Signedn", contract_template: contract_template, project: project) + expect(signed_release.amendment_signed?).to be_truthy + + visit project_appearance_releases_path(project) + + expect(page).to have_content "Signedn" + + expect(page).to have_css('i.fa.fa-square-o', count: 1) + expect(page).to have_css('i.fa.fa-check-square-o', count: 1) + end + + scenario "amendment signing form has copy URL button when user is signed in", js: true do + contract_template = create(:appearance_release_contract_template, :with_amendment_clause, project: project) + release = create(:appearance_release, contract_template: contract_template, project: project) + + visit new_account_project_contract_template_appearance_release_amendment_path(project.account, project, contract_template, release) + + expect(page).to have_content copy_url_button + end + + scenario 'viewing the contract PDF when amendment is not yet signed' do + appearance_release = create(:appearance_release, :native, + contract_template: build(:contract_template, project: project, question_1_text: 'Q1'), project: project, person_first_name: 'Jane', person_last_name: 'Doe', tag_list: 'Woman, Brunette', + question_1_answer: 'A1', notes: [ build(:note, content: 'Note 1', @@ -319,6 +463,7 @@ feature 'User managing appearance releases' do expect(content_type).to eq('application/pdf') expect(content_disposition).to include('inline') expect(pdf_filename).to include('doe-jane') + expect(pdf_body).not_to have_content amendment_page_heading expect(pdf_body).to have_content('Jane Doe') expect(pdf_body).to have_content('NOTES') expect(pdf_body).to have_content('Note 1') @@ -331,6 +476,37 @@ feature 'User managing appearance releases' do expect(pdf_body).to have_content('Woman') expect(pdf_body).to have_content('Brunette') expect(pdf_body).not_to have_content('Guardian Email') + expect(pdf_body).to have_content('Q1') + expect(pdf_body).to have_content('A1') + end + + scenario "viewing the contract PDF when amendment is signed" do + contract_template = create(:appearance_release_contract_template, :with_amendment_clause, project: project) + appearance_release = create(:appearance_release, + :amendment_signed, + :native, + contract_template: contract_template, + project: project, + person_first_name: "John", + person_last_name: "Doe") + + sign_in(current_user) + visit project_appearance_releases_path(project) + click_link *view_release_pdf_link_for(appearance_release) + + expect(content_type).to eq("application/pdf") + expect(content_disposition).to include("inline") + expect(pdf_filename).to include("doe-john") + + expect(pdf_body).to have_content("John Doe") + + expect(pdf_body).to have_content amendment_page_heading.upcase + expect(pdf_body).to have_content amendment_clause_label + expect(pdf_body).to have_content amendment_signer_name_label + expect(pdf_body).to have_content amendment_signature_label + + expect(pdf_body).to have_content contract_template.amendment_clause.to_plain_text + expect(pdf_body).to have_content appearance_release.amendment_signer_name end scenario 'viewing contract PDF for a minor without guardian photo' do @@ -368,12 +544,40 @@ feature 'User managing appearance releases' do expect(pdf_body).to have_content('Guardian Email') end + scenario "viewing the contract PDF when exhibit A is signed" do + contract_template = create(:appearance_release_contract_template, project: project, exhibit_a_legal_text: "Exhibit A legal text", exhibit_a_question_text: "Exhibit A question text") + appearance_release = create(:appearance_release, + :amendment_signed, + :native, + contract_template: contract_template, + project: project, + person_first_name: "John", + person_last_name: "Doe", + exhibit_a_answer: "Answer to exhibit A question" + ) + + sign_in(current_user) + visit project_appearance_releases_path(project) + click_link *view_release_pdf_link_for(appearance_release) + + expect(content_type).to eq("application/pdf") + expect(content_disposition).to include("inline") + expect(pdf_filename).to include("doe-john") + + expect(pdf_body).to have_content("John Doe") + + expect(pdf_body).to have_content "Exhibit A" + expect(pdf_body).to have_content "Exhibit A legal text" + expect(pdf_body).to have_content "Exhibit A question text" + expect(pdf_body).to have_content "Answer to exhibit A question" + end + scenario 'deleting a release', js: true do appearance_release = create(:appearance_release, project: project) visit project_appearance_releases_path(project) - click_on 'Manage' + click_on manage_button accept_alert do click_link *destroy_link_for(appearance_release) end @@ -576,7 +780,7 @@ feature 'User managing appearance releases' do create(:appearance_release_with_contract_template, :native, project: project) visit project_appearance_releases_path(project) - click_on "Manage" + click_on manage_button expect(page).not_to have_link(review_action, exact: true) end @@ -594,7 +798,7 @@ feature 'User managing appearance releases' do visit project_appearance_releases_path(project) - click_on 'Manage' + click_on manage_button expect(page).not_to have_link('Download', exact: true) end @@ -602,7 +806,7 @@ feature 'User managing appearance releases' do create(:appearance_release_with_contract_template, :native, project: project) visit project_appearance_releases_path(project) - click_on "Manage" + click_on manage_button expect(page).not_to have_link(review_action, exact: true) end @@ -725,6 +929,10 @@ feature 'User managing appearance releases' do t('helpers.label.appearance_release.person_last_name') end + def exhibit_a_answer + 'appearance_release[exhibit_a_answer]' + end + def fill_in_person_address_fields fill_in person_address_street1_field, with: "123 Test Lane" fill_in person_address_city_field, with: "New York" @@ -866,4 +1074,56 @@ feature 'User managing appearance releases' do def date_issued t 'contracts.for_office_use_only.description_labels.date_issued' end + + def amendments_heading + t 'public.amendments.new.amendment.heading' + end + + def amendment_signer_name_field + 'appearance_release[amendment_signer_name]' + end + + def amendment_signature_field + 'appearance_release_amendment_signature_base64' + end + + def sign_amendment_button + t 'shared.submit_release_long' + end + + def already_signed_message + t 'public.amendments.create.amendment_already_signed_message' + end + + def signed_successfully_message + t 'public.amendments.create.amendment_signed_message' + end + + def manage_button + t 'appearance_releases.appearance_release.actions.manage' + end + + def sign_amendment_link + t 'appearance_releases.appearance_release.actions.sign_amendment' + end + + def copy_url_button + t 'public.amendments.new.copy_url' + end + + def amendment_page_heading + t 'contracts.amendment_page.heading' + end + + def amendment_signer_name_label + t 'contracts.amendment_page.description_labels.amendment_signer_name' + end + + def amendment_clause_label + t 'contracts.amendment_page.description_labels.amendment_clause' + end + + def amendment_signature_label + t 'contracts.amendment_page.description_labels.amendment_signature' + end end diff --git a/spec/features/user_managing_broadcasts_spec.rb b/spec/features/user_managing_broadcasts_spec.rb index 5908096..9c40b71 100644 --- a/spec/features/user_managing_broadcasts_spec.rb +++ b/spec/features/user_managing_broadcasts_spec.rb @@ -10,7 +10,7 @@ feature 'User managing broadcasts' do 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')) + stub_mux_live_stream end scenario "splash page is shown if there are no existing streams" do diff --git a/spec/features/user_managing_location_releases_spec.rb b/spec/features/user_managing_location_releases_spec.rb index 4b3da39..74dfec5 100644 --- a/spec/features/user_managing_location_releases_spec.rb +++ b/spec/features/user_managing_location_releases_spec.rb @@ -373,7 +373,7 @@ feature "User managing location releases" do expect(pdf_body).to have_content("Test Loc") - expect(pdf_body).to have_content amendment_page_heading + expect(pdf_body).to have_content amendment_page_heading.upcase expect(pdf_body).to have_content amendment_clause_label expect(pdf_body).to have_content amendment_signer_name_label expect(pdf_body).to have_content amendment_signature_label diff --git a/spec/features/user_managing_medical_releases_spec.rb b/spec/features/user_managing_medical_releases_spec.rb index 3462ac3..9e77852 100644 --- a/spec/features/user_managing_medical_releases_spec.rb +++ b/spec/features/user_managing_medical_releases_spec.rb @@ -137,11 +137,14 @@ feature "User managing medical releases" do contract_template = create(:contract_template, project: project, question_1_text: 'Question 1', - question_2_text: 'Question 2' + question_2_text: 'Question 2', + questionnaire_legal_text: 'Questionnaire legal text', ) visit new_account_project_contract_template_medical_release_path(project.account, project, contract_template) + expect(page).to have_content 'Questionnaire legal text' + fill_in person_first_name_field, with: 'Jane' fill_in person_last_name_field, with: 'Doe' draw_signature file_fixture("signature.png"), "medical_release_signature_base64" @@ -287,6 +290,32 @@ feature "User managing medical releases" do expect(pdf_body).not_to have_content date_issued expect(pdf_body).not_to have_content 'Big Joe' end + + scenario 'viewing contract PDF with medical questionnaire' do + contract_template = create(:medical_release_contract_template, project: project, questionnaire_legal_text: "Questionnaire legal text", question_1_text: "Question 1 text") + medical_release = create(:medical_release, + :native, + contract_template: contract_template, + project: project, + person_first_name: "John", + person_last_name: "Doe", + question_1_answer: "Question 1 answer", + ) + + sign_in(current_user) + visit project_medical_releases_path(project) + click_link *view_release_pdf_link_for(medical_release) + + expect(content_type).to eq("application/pdf") + expect(content_disposition).to include("inline") + expect(pdf_filename).to include("doe-john") + + expect(pdf_body).to have_content("John Doe") + expect(pdf_body).to have_content "MEDICAL QUESTIONNAIRE" + expect(pdf_body).to have_content "Question 1 text" + expect(pdf_body).to have_content "Question 1 answer" + expect(pdf_body).to have_content "Questionnaire legal text" + end end context "when the user is manager(project manager)" do diff --git a/spec/features/user_managing_projects_spec.rb b/spec/features/user_managing_projects_spec.rb index e5cf7e3..ea63b13 100644 --- a/spec/features/user_managing_projects_spec.rb +++ b/spec/features/user_managing_projects_spec.rb @@ -34,7 +34,7 @@ feature "User managing projects" do project = create(:project, members: user, account: user.primary_account, name: "Avengers", client_name: "Marvel") visit projects_path - click_on "button" + find('button.btn-white').click click_on "Edit" it_also "requires a project name" do @@ -103,6 +103,25 @@ feature "User managing projects" do expect(page).not_to have_content("Music Releases") end + scenario 'searching for a project', js: true do + project_1 = create(:project, members: user, account: user.primary_account, name: "America's Greatest TV Show") + project_2 = create(:project, members: user, account: user.primary_account, name: "Wild Animals") + + visit projects_path + + expect(page).to have_content("America's Greatest TV Show") + expect(page).to have_content("Wild Animals") + + within 'form#search' do + fill_in 'Search', with: 'Greatest' + find('button.rounded-pill-left').click + end + + expect(page).to have_content("America's Greatest TV Show") + expect(page).not_to have_content("Wild Animals") + expect(page).to have_field('Search', with: 'Greatest') + end + # TODO: What about the welcome page when there are no existing projects? context "for a manager" do diff --git a/spec/features/user_managing_videos_spec.rb b/spec/features/user_managing_videos_spec.rb index ca5bec6..23559e8 100644 --- a/spec/features/user_managing_videos_spec.rb +++ b/spec/features/user_managing_videos_spec.rb @@ -40,7 +40,7 @@ feature "User managing videos" do expect(page).to have_selector "#video_edl_file", visible: :all expect(page).to have_selector "#video_graphics_only_edl_file", visible: :all expect(page).to have_selector "#video_audio_only_edl_file", visible: :all - expect(page).to have_link "click here", href: /mailto:info@bigmedia\.ai/ + expect(page).to have_link "click here", href: /mailto:info@mesuite\.ai/ fill_in_video_fields name: "New name", number: "99" diff --git a/spec/helpers/mail_helper_spec.rb b/spec/helpers/mail_helper_spec.rb index 6ac54d1..03c8f3d 100644 --- a/spec/helpers/mail_helper_spec.rb +++ b/spec/helpers/mail_helper_spec.rb @@ -8,7 +8,7 @@ RSpec.describe MailHelper, type: :helper do link = CGI.unescape helper.mail_to_for_multiple_edls("test content", project) expect(link).to match "test content" - expect(link).to match "info@bigmedia.ai" + expect(link).to match "info@mesuite.ai" expect(link).to match /Multiple Adobe Premiere EDLs needed for Test Account's Test Project project/ expect(link).to match "INSTRUCTIONS" end diff --git a/spec/jobs/generate_contracts_zip_job_spec.rb b/spec/jobs/generate_contracts_zip_job_spec.rb index 3d3ee5f..68bf43e 100644 --- a/spec/jobs/generate_contracts_zip_job_spec.rb +++ b/spec/jobs/generate_contracts_zip_job_spec.rb @@ -25,6 +25,31 @@ describe GenerateContractsZipJob do end describe ".perform_now" do + shared_examples "generates ZIP containig CSV file with all releases data" do + it "generates ZIP containing CSV file with all releases data for all release types" do + lowercase_plural = subject.constantize.model_name.plural + GenerateContractsZipJob.perform_now(project, download, subject, project.public_send(lowercase_plural).ids) + + generated_zip = download.file.blob.download + csv_file_name = "#{project.name.parameterize}_#{lowercase_plural.gsub('_', '-')}.csv" + Zip::InputStream.open(StringIO.new(generated_zip)) do |io| + while entry = io.get_next_entry + next unless entry.name == csv_file_name + + csv_file = entry.get_input_stream.read + + release_class = Object.const_get subject + release_headers = release_class.csv_headers + + release_headers.each do |header| + expect(csv_file).to match header + expect(csv_file).not_to match translation_missing + end + end + end + end + end + it "updates a download record and creates attachment for it" do GenerateContractsZipJob.perform_now(project, download, "AppearanceRelease", project.appearance_releases.ids) @@ -35,36 +60,60 @@ describe GenerateContractsZipJob do expect(download.file).to be_attached end - it "generates ZIP containing CSV file with all releases data for all release types" do - release_types = %w[AcquiredMediaRelease AppearanceRelease LocationRelease MaterialRelease MedicalRelease MiscRelease MusicRelease TalentRelease] - create_releases_for_all_types + context "generates ZIP for acquired media releases" do + let(:release) { create(:acquired_media_release_with_contract_template, :native, project: project) } + subject { 'AcquiredMediaRelease' } - release_types.each do |type| - lowercase_plural = type.constantize.model_name.plural - GenerateContractsZipJob.perform_now(project, download, type, project.public_send(lowercase_plural).ids) + it_behaves_like "generates ZIP containig CSV file with all releases data" + end - generated_zip = download.file.blob.download - csv_file_name = "#{project.name.parameterize}_#{lowercase_plural.gsub('_', '-')}.csv" - Zip::InputStream.open(StringIO.new(generated_zip)) do |io| - while entry = io.get_next_entry - next unless entry.name == csv_file_name + context "generates ZIP for appearance releases" do + let(:release) { create(:appearance_release_with_contract_template, :native, project: project, person_name: "John Doe") } + subject { 'AppearanceRelease' } - csv_file = entry.get_input_stream.read + it_behaves_like "generates ZIP containig CSV file with all releases data" + end - release_class = Object.const_get type - release_headers = release_class.csv_headers + context "generates ZIP for location releases" do + let(:release) { create(:location_release_with_contract_template, :native, project: project) } + subject { 'LocationRelease' } - release_headers.each do |header| - expect(csv_file).to match header - end - end + it_behaves_like "generates ZIP containig CSV file with all releases data" + end - dummy_zip_file_name = "#{project.name.parameterize}_#{lowercase_plural.gsub('_', '-')}.zip" - if File.exist?(file_fixture(dummy_zip_file_name)) - File.delete(file_fixture(dummy_zip_file_name)) - end - end - end + context "generates ZIP for material releases" do + let(:release) { create(:material_release_with_contract_template, :native, project: project) } + subject { 'MaterialRelease' } + + it_behaves_like "generates ZIP containig CSV file with all releases data" + end + + context "generates ZIP for medical releases" do + let(:release) { create(:medical_release_with_contract_template, :native, project: project) } + subject { 'MedicalRelease' } + + it_behaves_like "generates ZIP containig CSV file with all releases data" + end + + context "generates ZIP for misc releases" do + let(:release) { create(:misc_release_with_contract_template, :native, project: project) } + subject { 'MiscRelease' } + + it_behaves_like "generates ZIP containig CSV file with all releases data" + end + + context "generates ZIP for music releases" do + let(:release) { create(:music_release_with_contract_template, project: project) } + subject { 'MusicRelease' } + + it_behaves_like "generates ZIP containig CSV file with all releases data" + end + + context "generates ZIP for talent releases" do + let(:release) { create(:talent_release_with_contract_template, :native, project: project) } + subject { 'TalentRelease' } + + it_behaves_like "generates ZIP containig CSV file with all releases data" end context "When there are errors" do @@ -88,21 +137,16 @@ describe GenerateContractsZipJob do # Delete the file created in fixture. # Or the tests will fail on next run due to already existing files in existing zip. path = Rails.root.join("spec", "fixtures", "files") - if File.exists? "#{path}/my-video-project_appearance-releases.zip" - File.delete("#{path}/my-video-project_appearance-releases.zip") + releases = %w[acquired-media appearance location material medical misc music talent] + releases.each do |release| + if File.exists? "#{path}/my-video-project_#{release}-releases.zip" + File.delete("#{path}/my-video-project_#{release}-releases.zip") + end end end private - - def create_releases_for_all_types - create(:acquired_media_release_with_contract_template, :native, project: project) - create(:appearance_release_with_contract_template, :native, project: project, person_name: "John Doe") - create(:location_release_with_contract_template, :native, project: project) - create(:material_release_with_contract_template, :native, project: project) - create(:medical_release_with_contract_template, :native, project: project) - create(:misc_release_with_contract_template, :native, project: project) - create(:music_release_with_contract_template, project: project) - create(:talent_release_with_contract_template, :native, project: project) + def translation_missing + /translation missing/ end end diff --git a/spec/mailers/admin_mailer_spec.rb b/spec/mailers/admin_mailer_spec.rb index e6dd5f1..2240fcb 100644 --- a/spec/mailers/admin_mailer_spec.rb +++ b/spec/mailers/admin_mailer_spec.rb @@ -8,8 +8,8 @@ RSpec.describe AdminMailer do it "renders the headers" do expect(mail.subject).to eq("[New Video] Test Account has uploaded a new video") - expect(mail.to).to eq(["bray@bigmedia.ai", "lee@bigmedia.ai"]) - expect(mail.from).to eq(["support@bigmedia.ai"]) + expect(mail.to).to eq(["bray@mesuite.ai"]) + expect(mail.from).to eq(["support@mesuite.ai"]) end it "renders the body" do @@ -24,8 +24,8 @@ RSpec.describe AdminMailer do it "renders the headers" do expect(mail.subject).to eq("[Updated Video EDL File] Test Account has updated the EDL file for video_file.mp4") - expect(mail.to).to eq(["bray@bigmedia.ai", "lee@bigmedia.ai"]) - expect(mail.from).to eq(["support@bigmedia.ai"]) + expect(mail.to).to eq(["bray@mesuite.ai"]) + expect(mail.from).to eq(["support@mesuite.ai"]) end it "renders the body" do @@ -41,8 +41,8 @@ RSpec.describe AdminMailer do it "renders the headers" do expect(mail.subject).to eq("[Updated Video Graphics Only EDL File] Test Account has updated the Graphics Only EDL file for video_file.mp4") - expect(mail.to).to eq(["bray@bigmedia.ai", "lee@bigmedia.ai"]) - expect(mail.from).to eq(["support@bigmedia.ai"]) + expect(mail.to).to eq(["bray@mesuite.ai"]) + expect(mail.from).to eq(["support@mesuite.ai"]) end it "renders the body" do @@ -58,8 +58,8 @@ RSpec.describe AdminMailer do it "renders the headers" do expect(mail.subject).to eq("[Updated Video Audio Only EDL File] Test Account has updated the Audio Only EDL file for video_file.mp4") - expect(mail.to).to eq(["bray@bigmedia.ai", "lee@bigmedia.ai"]) - expect(mail.from).to eq(["support@bigmedia.ai"]) + expect(mail.to).to eq(["bray@mesuite.ai"]) + expect(mail.from).to eq(["support@mesuite.ai"]) end it "renders the body" do diff --git a/spec/mailers/user_mailer_spec.rb b/spec/mailers/user_mailer_spec.rb index 1fad0b8..43a97db 100644 --- a/spec/mailers/user_mailer_spec.rb +++ b/spec/mailers/user_mailer_spec.rb @@ -8,7 +8,7 @@ describe UserMailer do it "renders the headers" do expect(mail.subject).to eq("Password reset") expect(mail.to).to eq([user.email]) - expect(mail.from).to eq(["support@bigmedia.ai"]) + expect(mail.from).to eq(["support@mesuite.ai"]) end it "renders the body" do @@ -24,7 +24,7 @@ describe UserMailer do it "renders the headers" do expect(mail.subject).to eq("You've been added to a project in the ME Suite") expect(mail.to).to eq([user.email]) - expect(mail.from).to eq(["support@bigmedia.ai"]) + expect(mail.from).to eq(["support@mesuite.ai"]) end it "renders the body" do @@ -50,7 +50,7 @@ describe UserMailer do it "renders the headers" do expect(mail.subject).to eq("Welcome to BiG") expect(mail.to).to eq([user.email]) - expect(mail.from).to eq(["support@bigmedia.ai"]) + expect(mail.from).to eq(["support@mesuite.ai"]) end it "renders the body" do diff --git a/spec/models/acquired_media_release_spec.rb b/spec/models/acquired_media_release_spec.rb index c47b5c4..d1a2f12 100644 --- a/spec/models/acquired_media_release_spec.rb +++ b/spec/models/acquired_media_release_spec.rb @@ -15,14 +15,6 @@ RSpec.describe AcquiredMediaRelease do it { is_expected.to validate_attachment_of(:contract).on(:non_native) } end - describe "associations" do - it { is_expected.to have_many(:file_infos).dependent(:destroy) } - end - - describe "nested attributes" do - it { is_expected.to accept_nested_attributes_for(:file_infos) } - end - describe "validations" do it { is_expected.to validate_presence_of(:name) } diff --git a/spec/models/app_host_spec.rb b/spec/models/app_host_spec.rb index b3753cd..c03aaca 100644 --- a/spec/models/app_host_spec.rb +++ b/spec/models/app_host_spec.rb @@ -32,7 +32,7 @@ describe AppHost do app_domain = AppHost.new(env, "production") - expect(app_domain.domain).to eq("bigmedia.ai") + expect(app_domain.domain).to eq("mesuite.ai") end end end diff --git a/spec/models/broadcast_spec.rb b/spec/models/broadcast_spec.rb index 8813e47..e7906a1 100644 --- a/spec/models/broadcast_spec.rb +++ b/spec/models/broadcast_spec.rb @@ -20,6 +20,7 @@ RSpec.describe Broadcast, type: :model do let(:broadcast) { build(:broadcast, name: "My Broadcast") } let(:live_stream_data) { OpenStruct.new(data: OpenStruct.new(id: "stream_id", stream_key: "stream_key")) } let(:live_stream_playback_data) { OpenStruct.new(data: OpenStruct.new(id: "playback_id")) } + let(:simulcast_data) { OpenStruct.new(data: OpenStruct.new(id: "simulcast_id")) } it 'triggers create_mux_live_stream' do expect(broadcast).to receive(:create_mux_live_stream) @@ -28,14 +29,18 @@ RSpec.describe Broadcast, type: :model do end it 'assigns stream_id, stream_key and stream_playback_id to broadcast' do + allow(MillicastDestination).to receive(:create).and_return(OpenStruct.new(key: "123", url: "http://test.com/rtmp")) + allow_any_instance_of(MuxLiveStream).to receive(:test_mode_enabled?).and_return(false) allow_any_instance_of(MuxRuby::LiveStreamsApi).to receive(:create_live_stream).and_return(live_stream_data) allow_any_instance_of(MuxRuby::LiveStreamsApi).to receive(:create_live_stream_playback_id).and_return(live_stream_playback_data) + allow_any_instance_of(MuxRuby::LiveStreamsApi).to receive(:create_live_stream_simulcast_target).and_return(simulcast_data) broadcast.save expect(broadcast.stream_uid).to eq "stream_id" expect(broadcast.stream_key).to eq "stream_key" expect(broadcast.stream_playback_uid).to eq "playback_id" + expect(broadcast.simulcast_uid).to eq "simulcast_id" end end diff --git a/spec/models/contract_template_spec.rb b/spec/models/contract_template_spec.rb index a5553a8..4e9d2ec 100644 --- a/spec/models/contract_template_spec.rb +++ b/spec/models/contract_template_spec.rb @@ -55,4 +55,28 @@ describe ContractTemplate do expect(contract_template).to have_questionnaire end end + + describe '#has_exhibit_a?' do + it 'returns true if the legal text is present' do + contract_template = build(:contract_template) + + expect(contract_template).not_to have_exhibit_a + + contract_template.exhibit_a_legal_text = 'Exhibit A legal text' + + expect(contract_template).to have_exhibit_a + end + end + + describe '#has_exhibit_b?' do + it 'returns true if the legal text is present' do + contract_template = build(:contract_template) + + expect(contract_template).not_to have_exhibit_b + + contract_template.exhibit_b_legal_text = 'Exhibit A legal text' + + expect(contract_template).to have_exhibit_b + end + end end diff --git a/spec/models/mux_live_stream_spec.rb b/spec/models/mux_live_stream_spec.rb index e90d122..a69137e 100644 --- a/spec/models/mux_live_stream_spec.rb +++ b/spec/models/mux_live_stream_spec.rb @@ -5,6 +5,7 @@ RSpec.describe MuxLiveStream, type: :model do let(:broadcast_2) { create(:broadcast, :with_stream, skip_create_callback: true, name: "My Broadcast") } let(:live_stream_data) { OpenStruct.new(data: OpenStruct.new(id: "stream_id", stream_key: "stream_key")) } let(:live_stream_playback_data) { OpenStruct.new(data: OpenStruct.new(id: "playback_id")) } + let(:live_stream_simulcast_data) { OpenStruct.new(data: OpenStruct.new(id: "simulcast_id")) } it "creates live stream and live stream playback URL" do allow_any_instance_of(MuxRuby::LiveStreamsApi).to receive(:create_live_stream).and_return(live_stream_data) @@ -85,4 +86,51 @@ RSpec.describe MuxLiveStream, type: :model do expect(request).to have_received(:test=).with(false) end end + + describe "#create_simulcast" do + it "creates a simulcast for the live stream" do + allow(ENV).to receive(:[]).with("MUX_REDUCED_LATENCY_ENABLED").and_return("true") + allow(ENV).to receive(:[]).with("MUX_TEST_MODE_DISABLED").and_return("true") + request = instance_double(MuxRuby::CreateLiveStreamRequest) + destination = double(url: "http://test.com/rmtp", key: "123abc") + allow(request).to receive(:reduced_latency=) + allow(request).to receive(:new_asset_settings=) + allow(request).to receive(:playback_policy=) + allow(request).to receive(:test=) + allow(MuxRuby::CreateLiveStreamRequest).to receive(:new).and_return(request) + allow_any_instance_of(MuxRuby::LiveStreamsApi).to receive(:create_live_stream).and_return(live_stream_data) + allow_any_instance_of(MuxRuby::LiveStreamsApi).to receive(:create_live_stream_playback_id).and_return(live_stream_playback_data) + allow_any_instance_of(MuxRuby::LiveStreamsApi).to receive(:create_live_stream_simulcast_target).and_return(live_stream_simulcast_data) + allow(MillicastDestination).to receive(:create).and_return(destination) + + live_stream = MuxLiveStream.create_with_simulcast + + expect(live_stream.id).to eq "stream_id" + expect(live_stream.simulcast_id).to eq "simulcast_id" + expect(live_stream.simulcast_destination).to eq destination + end + + context "when test mode is enabled" do + it "does not create a simulcast" do + allow(ENV).to receive(:[]).with("MUX_TEST_MODE_DISABLED").and_return(nil) + allow(ENV).to receive(:[]).with("MUX_REDUCED_LATENCY_ENABLED").and_return("true") + request = instance_double(MuxRuby::CreateLiveStreamRequest) + destination = double(url: "http://test.com/rmtp", key: "123abc") + allow(request).to receive(:reduced_latency=) + allow(request).to receive(:new_asset_settings=) + allow(request).to receive(:playback_policy=) + allow(request).to receive(:test=) + allow(MuxRuby::CreateLiveStreamRequest).to receive(:new).and_return(request) + allow_any_instance_of(MuxRuby::LiveStreamsApi).to receive(:create_live_stream).and_return(live_stream_data) + allow_any_instance_of(MuxRuby::LiveStreamsApi).to receive(:create_live_stream_playback_id).and_return(live_stream_playback_data) + allow(MillicastDestination).to receive(:create).and_return(destination) + + live_stream = MuxLiveStream.create_with_simulcast + + expect(live_stream.id).to eq "stream_id" + expect(live_stream.simulcast_id).to be_nil + expect(live_stream.simulcast_destination).to be_nil + end + end + end end diff --git a/spec/support/mux_helper.rb b/spec/support/mux_helper.rb new file mode 100644 index 0000000..57b800d --- /dev/null +++ b/spec/support/mux_helper.rb @@ -0,0 +1,17 @@ +module MuxHelper + def stub_mux_live_stream(response_attrs = {}) + response = double({ + id: "id", + key: "key", + playback_id: "playback_id", + simulcast_id: "simulcast_id", + simulcast_destination: double("playback_embed": "playback_embed>") + }.merge(response_attrs)) + + allow(MuxLiveStream).to receive(:create_with_simulcast).and_return(response) + end +end + +RSpec.configure do |config| + config.include MuxHelper +end diff --git a/spec/telemetry/analytics_spec.rb b/spec/telemetry/analytics_spec.rb index 8ee68a3..882ff40 100644 --- a/spec/telemetry/analytics_spec.rb +++ b/spec/telemetry/analytics_spec.rb @@ -205,5 +205,22 @@ RSpec.describe Analytics do described_class.new(user, account, analytics_backend).track_create_project(user_agent: "Mozilla Firefox", user_ip: "0.0.0.0") end + + it "tracks event with user_id and 'Contract Template Created', account, account_id, user_agent, ip" do + expect(analytics_backend).to receive(:track).with( + { + user_id: user.id, + event: "Contract Template Created", + properties: { + account: "Courter Pint Brewery", + account_id: user.primary_account.id, + user_agent: "Mozilla Firefox", + ip: "0.0.0.0", + }, + } + ) + + described_class.new(user, account, analytics_backend).track_create_contract_template(user_agent: "Mozilla Firefox", user_ip: "0.0.0.0") + end end end