Files
old-holivud2/spec/features/user_performs_video_analysis_spec.rb

1726 lines
57 KiB
Ruby
Raw Normal View History

2020-05-31 22:38:19 +02:00
require "rails_helper"
feature "User performs video analysis" do
let(:current_user) { create(:user, :admin) } # Only admin users can see the VideoAnalysis button now
let(:project) { create(:project, account: current_user.primary_account) }
let(:video) { create(:video, :with_graphics_only_edl_file, project: project, analysis_status: :pending) }
let(:edl_event) do
BrayniacAI::EdlParseResult.new({
"channel" => "V",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
})
end
before :each do
VideoAnalysis.use_overlay_video = false
allow(BrayniacAI::EdlParse).to receive(:create).and_return(
BrayniacAI::EdlParse.new({ results: [edl_event], edl_timecode_start: "00:00:10:00" })
)
end
scenario "does not see Back to Projects" do
sign_in current_user
visit video_video_analyses_path(video)
expect(page).not_to have_content("Back to Project")
end
scenario "sees video name with project name" do
sign_in current_user
visit video_video_analyses_path(video)
expect(page).to have_content("#{video.name} (#{project.name})")
end
scenario "sees EDLs dropdown's downlod options" do
sign_in current_user
visit video_video_analyses_path(video)
expect(page).to have_css("a.dropdown-item", text: "Download EDL")
expect(page).to have_css("a.dropdown-item", text: "Download Graphics Only EDL")
expect(page).to have_css("a.dropdown-item", text: "Download Audio Only EDL")
end
scenario "sees download report button" do
sign_in current_user
visit video_video_analyses_path(video)
click_on "Reports"
expect(page).to have_link("Production Elements Log")
expect(page).to have_link("GFX Cue List")
expect(page).to have_link("Music Cue Sheet", href: video_audio_reports_path(video, { format: "xlsx", type: "discovery" }))
expect(page).to have_link("BiG Music Cue Sheet", href: video_audio_reports_path(video, { format: "xlsx", type: "big" }))
expect(page).to have_link("Issues and Concerns Report")
end
scenario "adding a bookmark", js: true do
sign_in current_user
visit video_video_analyses_path(video)
create_bookmark(video, notes: "Test notes")
expect(page).to have_bookmark(notes: "Test notes")
end
scenario "searching for releases", js: true do
robert, chris = [
create(:appearance_release, project: project, person_first_name: "Robert", person_last_name: "Downey Jr."),
create(:appearance_release, project: project, person_first_name: "Chris", person_last_name: "Evans")
]
cheers, cipriani = [
create(:location_release_with_photo, project: project, name: "Cheers"),
create(:location_release_with_photo, project: project, name: "Cipriani")
]
mac, pc = [
create(:material_release, name: "Apple MacBook Air", project: project),
create(:material_release, name: "Microsoft Surface Pro", project: project)
]
acquired_media = create(:acquired_media_release, project: project)
acquired_file_info_1, acquired_file_info_2 = [
create(:file_info, filename: "Still Image", releasable: acquired_media),
create(:file_info, filename: "Artwork", releasable: acquired_media)
]
music_release = create(:music_release, project: project)
music_file_info_1, music_file_info_2 = [
create(:file_info, filename: "I'm not afraid", releasable: music_release),
create(:file_info, filename: "Lose yourself", releasable: music_release)
]
sign_in current_user
visit video_video_analyses_path(video)
within "#appearance_releases_section" do
search_for(:appearance_release, text: "Robert")
expect(page).to have_content("Robert")
expect(page).not_to have_content("Chris")
end
within "#location_releases_section" do
search_for(:location_release, text: "Cheers")
expect(page).to have_content("Cheers")
expect(page).not_to have_content("Cipriani")
end
within "#material_releases_section" do
search_for(:material_release, text: "Apple")
expect(page).to have_content("Apple")
expect(page).not_to have_content("Microsoft")
end
within "#acquired_media_releases_section" do
search_for(:acquired_media_releases, text: "till")
expect(page).to have_content("Still Image")
expect(page).not_to have_content("Artwork")
end
within "#music_releases_section" do
search_for(:music_releases, text: "not")
expect(page).to have_content("I'm not afraid")
expect(page).not_to have_content("Lose yourself")
end
end
scenario "viewing EDL information", js: true do
video_event = BrayniacAI::EdlParseResult.new({
"channel" => "V",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
})
audio_event = BrayniacAI::EdlParseResult.new({
"channel" => "A1",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name.wav",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
})
allow(BrayniacAI::EdlParse).to receive(:create).and_return(
BrayniacAI::EdlParse.new({ results: [video_event, audio_event], edl_timecode_start: "00:00:00:00" })
)
sign_in current_user
visit video_video_analyses_path(video)
click_button "EDL Info"
expect(page).to have_edl_event_modal
within "#edl_events" do
expect(page).to have_content("V")
expect(page).to have_content("01:00:00:00")
expect(page).to have_content("01:00:02:00")
expect(page).to have_content("00:00:02")
expect(page).to have_content("source_file_name")
expect(page).to have_content("clip_name")
expect(page).to have_content("description")
expect(page).to have_content("A1")
expect(page).to have_content("source_file_name.wav")
end
end
scenario "seeking to a particular timecode", js: true do
sign_in current_user
visit video_video_analyses_path(video)
find("#player .container").click
find("#player .container").click
fill_in "seek", with: "00:00:03:00"
click_button "Seek"
expect(page).to have_field("seek", with: "00:00:03:00")
expect(page).to have_css(".media-control-indicator", text: "00:03", visible: :all)
by "putting in a bad timecode" do
fill_in "seek", with: "00:00:03"
click_button "Seek"
expect(page).to have_field("seek", with: "")
expect(page).to have_css(".media-control-indicator", text: "00:03", visible: :all)
end
end
scenario "views EDL events", js: true do
video_event = BrayniacAI::EdlParseResult.new({
"channel" => "V",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
})
audio_event = BrayniacAI::EdlParseResult.new({
"channel" => "A1",
"start_time" => 0,
"timecode_in" => "01:00:01:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name.wav",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
})
last_audio_event = BrayniacAI::EdlParseResult.new({
"channel" => "A1",
"start_time" => 0,
"timecode_in" => "01:00:05:00",
"timecode_out" => "01:00:07:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name.wav",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
})
edl_events = [video_event]
20.times { |_| edl_events << audio_event }
edl_events.append last_audio_event
allow(BrayniacAI::EdlParse).to receive(:create).and_return(
BrayniacAI::EdlParse.new({ results: edl_events, edl_timecode_start: "00:00:00:00" })
)
resize_window_to(1_000, 1_000) do
sign_in current_user
visit video_video_analyses_path(video)
within "#edl_events_list" do
expect(page).to have_content "Channel"
expect(page).to have_content "Source"
expect(page).to have_content "Clip"
expect(page).to have_content "TC In"
expect(page).to have_content "TC Out"
expect(page).to have_content "V"
expect(page).to have_content "source_file_name"
expect(page).to have_content "clip_name"
expect(page).to have_content "01:00:00:00"
expect(page).to have_content "01:00:02:00"
expect(page).to have_content "A1"
expect(page).to have_content "source_file_name.wav"
end
by "jumping to a specific EDL event using timecode in" do
expect(find("[data-timecode-in='01:00:00:00']")).not_to be_obscured
fill_in "go_to", with: "01:00:05:00"
click_on "Go"
expect(find("[data-timecode-in='01:00:00:00']")).to be_obscured
end
and_by "putting in a bad timecode" do
fill_in "go_to", with: "bob"
click_on "Go"
expect(page).to have_field("go_to", with: "")
end
end
end
context "for Video tab" do
scenario "video analysis is not complete", js: true do
appearance_release = create(:appearance_release, project: project)
bookmark = create(:bookmark, video: video, notes: "Test notes")
unreleased_appearance = create(:unreleased_appearance, video: video, notes: "Test notes")
sign_in current_user
visit video_video_analyses_path(video)
expect(page).to have_content("Video is still being analyzed")
expect(page).to have_bookmark(notes: bookmark.notes)
expect(page).to have_unreleased_appearance(notes: unreleased_appearance.notes)
end
2020-07-21 13:12:27 +00:00
scenario "confirming a talent release", js: true do
2020-05-31 22:38:19 +02:00
talent_release = create(:talent_release, project: project)
sign_in current_user
visit video_video_analyses_path(video)
expect(page).to have_unconfirmed_release(talent_release)
2020-07-21 13:12:27 +00:00
confirm_first_release_using_edl_modal(video, talent_release)
2020-05-31 22:38:19 +02:00
expect(page).to have_confirmed_release(talent_release)
expect(page).not_to have_unconfirmed_release(talent_release)
unconfirm_release(VideoReleaseConfirmation.last)
expect(page).not_to have_confirmed_release(talent_release)
expect(page).to have_unconfirmed_release(talent_release)
end
scenario "confirming an appearance release", js: true do
appearance_release = create(:appearance_release, project: project)
sign_in current_user
visit video_video_analyses_path(video)
expect(page).to have_unconfirmed_release(appearance_release)
confirm_first_release_using_edl_modal(video, appearance_release)
expect(page).to have_confirmed_release(appearance_release)
expect(page).not_to have_unconfirmed_release(appearance_release)
unconfirm_release(VideoReleaseConfirmation.last)
expect(page).not_to have_confirmed_release(appearance_release)
expect(page).to have_unconfirmed_release(appearance_release)
end
scenario "confirming a location release", js: true do
location_release = create(:location_release_with_photo, project: project)
sign_in current_user
visit video_video_analyses_path(video)
expect(page).to have_unconfirmed_release(location_release)
confirm_first_release_using_edl_modal(video, location_release)
expect(page).to have_confirmed_release(location_release)
expect(page).not_to have_unconfirmed_release(location_release)
unconfirm_release(VideoReleaseConfirmation.last)
expect(page).not_to have_confirmed_release(location_release)
expect(page).to have_unconfirmed_release(location_release)
end
scenario "confirming an acquired media release", js: true do
acquired_media_release = create(:acquired_media_release_with_file_infos, project: project)
acquired_media_release.file_infos.first.update(filename: "shark jumping")
acquired_media_release.file_infos.second.update(filename: "pig flying")
acquired_media_release.file_infos.third.update(filename: "panda sneezing")
sign_in current_user
visit video_video_analyses_path(video)
expect(page).to have_unconfirmed_file_info_release(acquired_media_release, "shark jumping", count: 1)
expect(page).to have_unconfirmed_file_info_release(acquired_media_release, "pig flying", count: 1)
expect(page).to have_unconfirmed_file_info_release(acquired_media_release, "panda sneezing", count: 1)
confirm_first_release_using_edl_modal(video, acquired_media_release, text: "shark jumping")
expect(page).to have_confirmed_release(acquired_media_release, text: "shark jumping")
expect(page).to have_unconfirmed_file_info_release(acquired_media_release, "pig flying", count: 1)
expect(page).to have_unconfirmed_file_info_release(acquired_media_release, "panda sneezing", count: 1)
unconfirm_release(VideoReleaseConfirmation.last)
expect(page).not_to have_confirmed_release(acquired_media_release, text: "shark jumping")
expect(page).to have_unconfirmed_file_info_release(acquired_media_release, "shark jumping", count: 1)
expect(page).to have_unconfirmed_file_info_release(acquired_media_release, "pig flying", count: 1)
expect(page).to have_unconfirmed_file_info_release(acquired_media_release, "panda sneezing", count: 1)
end
scenario "confirming a material release", js: true do
material_release = create(:material_release, project: project)
sign_in current_user
visit video_video_analyses_path(video)
expect(page).to have_unconfirmed_release(material_release)
confirm_first_release_using_edl_modal(video, material_release)
expect(page).to have_confirmed_release(material_release)
expect(page).not_to have_unconfirmed_release(material_release)
unconfirm_release(VideoReleaseConfirmation.last)
expect(page).not_to have_confirmed_release(material_release)
expect(page).to have_unconfirmed_release(material_release)
end
scenario "confirming an appearance release match", js: true do
video.analysis_success!
appearance_release = create(:appearance_release, project: project)
allow(BrayniacAI::FacialRecognition).to receive(:find).and_return(
BrayniacAI::FacialRecognition.new({
bucket_name: "",
overlay_video_url: nil,
first_appearances: [
BrayniacAI::FacialRecognitionResult.new({
"start_time": 0,
"end_time": 100,
"external_image_id": "appearance_release_#{appearance_release.id}",
})
],
})
)
sign_in current_user
visit video_video_analyses_path(video)
find("#player .container").click
find("#player .container").click
expect(page).to have_suggested_match(appearance_release, text: "Jane Doe")
within "#suggested_matches" do
expect(page).not_to have_css(".fa-check-circle")
end
confirm_suggested_match(video, appearance_release)
within "#suggested_matches" do
expect(page).to have_css(".fa-check-circle")
end
expect(page).to have_confirmed_release(appearance_release, text: "")
unconfirm_release(VideoReleaseConfirmation.last)
within "#suggested_matches" do
expect(page).not_to have_css(".fa-check-circle")
end
end
scenario "confirming a talent release match", js: true do
video.analysis_success!
2020-07-21 13:12:27 +00:00
talent_release = create(:talent_release, project: project, person_name: "Jane Doe")
2020-05-31 22:38:19 +02:00
allow(BrayniacAI::FacialRecognition).to receive(:find).and_return(
BrayniacAI::FacialRecognition.new({
bucket_name: "",
overlay_video_url: nil,
first_appearances: [
BrayniacAI::FacialRecognitionResult.new({
"start_time": 0,
"end_time": 100,
"external_image_id": "talent_release_#{talent_release.id}",
})
],
})
)
sign_in current_user
visit video_video_analyses_path(video)
find("#player .container").click
find("#player .container").click
expect(page).to have_suggested_match(talent_release, text: "Jane Doe")
within "#suggested_matches" do
expect(page).not_to have_css(".fa-check-circle")
end
2020-07-21 13:12:27 +00:00
confirm_suggested_match(video, talent_release)
2020-05-31 22:38:19 +02:00
within "#suggested_matches" do
expect(page).to have_css(".fa-check-circle")
end
expect(page).to have_confirmed_release(talent_release, text: "")
unconfirm_release(VideoReleaseConfirmation.last)
within "#suggested_matches" do
expect(page).not_to have_css(".fa-check-circle")
end
end
scenario "copying data from multiple EDL events ", js: true do
edl_events = [
BrayniacAI::EdlParseResult.new({
"channel" => "V",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name1",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
}),
BrayniacAI::EdlParseResult.new({
"channel" => "V",
"start_time" => 15,
"timecode_in" => "01:00:15:00",
"timecode_out" => "01:00:18:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name2",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
})
]
allow(BrayniacAI::EdlParse).to receive(:create).and_return(
BrayniacAI::EdlParse.new({ results: edl_events, edl_timecode_start: "00:00:00:00" })
)
release = create(:appearance_release, project: project)
sign_in current_user
visit video_video_analyses_path(video)
new_path = polymorphic_path([:new, video, release, :video_release_confirmation])
first("form[action='#{new_path}']").click_button
2020-06-10 11:19:35 +02:00
expect(page).to have_content "Timecode In"
expect(page).to have_content "Source File Name"
2020-05-31 22:38:19 +02:00
click_on "Show/Hide EDL Events"
within "#edl_events" do
expect(page).to have_content("V")
expect(page).to have_content("source_file_name2")
end
click_on_edl_event(2)
expect(page).to have_field("video_release_confirmation[timecode_in]", with: "01:00:15:00")
expect(page).to have_field("video_release_confirmation[source_file_name]", with: "source_file_name2")
end
scenario "filters out non-video EDL events", js: true do
edl_events = [
BrayniacAI::EdlParseResult.new({
"channel" => "V",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
}),
BrayniacAI::EdlParseResult.new({
"channel" => "A1",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name.wav",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
}),
]
allow(BrayniacAI::EdlParse).to receive(:create).and_return(
BrayniacAI::EdlParse.new({ results: edl_events, edl_timecode_start: "00:00:00:00" })
)
release = create(:appearance_release, project: project)
sign_in current_user
visit video_video_analyses_path(video)
new_path = polymorphic_path([:new, video, release, :video_release_confirmation])
first("form[action='#{new_path}']").click_button
2020-06-10 11:19:35 +02:00
expect(page).to have_content "Timecode In"
expect(page).to have_content "Source File Name"
2020-05-31 22:38:19 +02:00
click_on "Show/Hide EDL Events"
within "#edl_events" do
expect(page).not_to have_content("A1")
expect(page).to have_content("V")
expect(page).to have_content("source_file_name")
end
end
end
context "for Graphics tab" do
scenario "confirming graphics element match", js: true do
video.analysis_success!
allow(BrayniacAI::FacialRecognition).to receive(:find).and_return(
BrayniacAI::FacialRecognition.new({
bucket_name: "",
overlay_video_url: nil,
first_appearances: [],
})
)
allow(BrayniacAI::EdlParse).to receive(:create).and_return(
BrayniacAI::EdlParse.new({
results: [
BrayniacAI::EdlParseResult.new({
"channel" => "V",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
}),
],
edl_timecode_start: "00:00:00:00",
})
)
sign_in current_user
visit video_video_analyses_path(video)
click_link "Graphics"
expect(page).not_to have_graphics_element_match(text: "source_file_name")
by "verifying a graphics element displays after video starts" do
find("#player .container").click
find("#player .container").click
expect(page).to have_graphics_element_match(text: "source_file_name")
end
and_by "adding a graphics match to the report" do
confirm_graphics_element_match
expect(page.find("#matched_file_name").value).to eq "source_file_name"
expect(page).to have_field("Source EDL", with: "Graphics")
create_graphics_element(video, text: "MTV")
expect(page).to have_graphics_element(text: "01:00:00:00")
expect(page).to have_confirmed_graphics_match(text: "source_file_name")
end
and_by "verifying checkmark gets removed if graphics removed from report" do
delete_graphics_element(GraphicsElement.last)
expect(page).not_to have_confirmed_graphics_match(text: "source_file_name")
expect(page).not_to have_graphics_element(text: "01:00:00:00")
end
end
scenario "managing a graphics element", js: true do
sign_in current_user
visit video_video_analyses_path(video)
click_link "Graphics"
open_graphics_element_modal(video)
click_on "Show/Hide EDL Events"
within '#edl_events' do
expect(page).to have_content "V"
expect(page).to have_content "00:00:00"
expect(page).to have_content "00:00:02"
expect(page).to have_content "00:00:02"
expect(page).to have_content "source_file_name"
expect(page).to have_content "clip_name"
expect(page).to have_content "description"
end
expect(page).to have_field("Source EDL", with: "All Tracks")
expect(page).to have_field("Timecode in", with: "01:00:00:00")
expect(page).to have_field("Timecode out", with: "01:00:02:00")
expect(page).to have_field("Duration", with: "00:00:02")
expect(page).to have_field("Source file name", with: "source_file_name")
expect(page).to have_field("Clip name", with: "clip_name")
expect(page).to have_field("Description", with: "description")
create_graphics_element(video, text: "MTV")
expect(page).to have_graphics_element(text: "01:00:00:00")
open_edit_graphics_modal
expect(page).to have_field("Source EDL", with: "All Tracks")
edit_graphics_element(text: "Nickelodeon")
expect(page).to have_graphics_element(text: "01:00:00:00")
end
scenario "has new layout" do
sign_in current_user
visit video_video_analyses_path(video)
click_link "Graphics"
expect(page).to have_content("EDL #")
expect(page).to have_content("EDL TC")
expect(page).to have_content("VID TC")
expect(page).to have_content("Filename")
end
scenario "adding a graphics element requires text", js: true do
sign_in current_user
visit video_video_analyses_path(video)
open_graphics_element_modal(video)
create_graphics_element(video, text: "")
expect(page).to have_graphics_element_modal
end
scenario "copying data from multiple EDL events ", js: true do
edl_events = [
BrayniacAI::EdlParseResult.new({
"channel" => "V",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name1",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
}),
BrayniacAI::EdlParseResult.new({
"channel" => "V",
"start_time" => 15,
"timecode_in" => "01:00:15:00",
"timecode_out" => "01:00:18:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name2",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
})
]
allow(BrayniacAI::EdlParse).to receive(:create).and_return(
BrayniacAI::EdlParse.new({ results: edl_events, edl_timecode_start: "00:00:00:00" })
)
sign_in current_user
visit video_video_analyses_path(video)
find("#player .container").click
find("#player .container").click
open_graphics_element_modal(video)
2020-06-10 11:19:35 +02:00
expect(page).to have_content "Timecode In"
expect(page).to have_content "Source File Name"
2020-05-31 22:38:19 +02:00
click_on "Show/Hide EDL Events"
within "#edl_events" do
expect(page).to have_content("V")
expect(page).to have_content("source_file_name2")
end
click_on_edl_event(2)
expect(page).to have_field("graphics_element[timecode_in]", with: "01:00:15:00")
expect(page).to have_field("graphics_element[source_file_name]", with: "source_file_name2")
end
scenario "filters out non-video EDL events", js: true do
edl_events = [
BrayniacAI::EdlParseResult.new({
"channel" => "V",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
}),
BrayniacAI::EdlParseResult.new({
"channel" => "A1",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name.wav",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
}),
]
allow(BrayniacAI::EdlParse).to receive(:create).and_return(
BrayniacAI::EdlParse.new({ results: edl_events, edl_timecode_start: "00:00:00:00" })
)
sign_in current_user
visit video_video_analyses_path(video)
open_graphics_element_modal(video)
2020-06-10 11:19:35 +02:00
expect(page).to have_content "Timecode In"
expect(page).to have_content "Source File Name"
2020-05-31 22:38:19 +02:00
click_on "Show/Hide EDL Events"
within "#edl_events" do
expect(page).to have_content("V")
expect(page).to have_content("source_file_name")
expect(page).not_to have_content("A1")
expect(page).not_to have_content("source_file_name.wav")
end
end
end
context "for Audio tab" do
before :each do
video.analysis_success!
allow(BrayniacAI::FacialRecognition).to receive(:find).and_return(
BrayniacAI::FacialRecognition.new({
bucket_name: "",
overlay_video_url: nil,
first_appearances: [],
})
)
end
scenario "confirming an acquired media match", js: true do
skip "TODO: Finish implementing this functionality"
video.audio_analysis_success!
acquired_media_release = create(:acquired_media_release,
project: project,
file_infos: create_list(:file_info, 1, filename: "acquired_file_name"))
allow(BrayniacAI::AudioRecognition).to receive(:find).and_return(
OpenStruct.new({
results: [
OpenStruct.new(
uid: acquired_media_release.file_infos.first.id,
requested_filename: acquired_media_release.file_infos.first.filename,
type: "acquired_media",
audio_data: OpenStruct.new(
filename: acquired_media_release.file_infos.first.filename,
composers: [],
publishers: [],
catalog: "",
title: "",
),
edl: [
OpenStruct.new(
start_time: 0,
timecode_in: "01:00:00:00",
),
]
)
]
})
)
allow(BrayniacAI::EdlParse).to receive(:create).and_return(
BrayniacAI::EdlParse.new({
results: [
BrayniacAI::EdlParseResult.new({
"channel" => "A1",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => acquired_media_release.file_infos.first.filename,
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
}),
],
edl_timecode_start: "00:00:00:00",
fps: 29.97,
edl_offset_seconds: 0,
})
)
sign_in current_user
visit video_video_analyses_path(video)
click_link "Audio"
expect(page).not_to have_audio_match(text: "(A) acquired_file_name")
by "verifying a music match displays after video starts" do
find("#player .container").click
find("#player .container").click
expect(page).to have_audio_match(text: "(A) acquired_file_name")
end
within "#audio_matches" do
expect(page).not_to have_css(".fa-check-circle")
end
confirm_acquired_media_match(video)
sleep(1)
within "#audio_matches" do
expect(page).to have_css(".fa-check-circle")
match_text = page.find(".fa-check-circle").find(:xpath, "../..").text
expect(match_text).to include("(A) acquired_file_name")
end
expect(page).to have_confirmed_audio("acquired_file_name")
and_by "verifying checkmark gets removed if confirmation removed from report" do
unconfirm_audio(AudioConfirmation.last)
expect(page).not_to have_confirmed_audio("acquired_file_name")
within "#audio_matches" do
expect(page).not_to have_css(".fa-check-circle")
end
end
end
scenario "confirming an original music match", js: true do
video.audio_analysis_success!
music_release = create(:music_release,
project: project,
file_infos: build_list(:file_info, 1, filename: "original_music_file_name.wav"))
allow(BrayniacAI::AudioRecognition).to receive(:find).and_return(
OpenStruct.new(
results: [
OpenStruct.new(
uid: music_release.file_infos.first.id,
requested_filename: music_release.file_infos.first.filename,
type: "original_music",
audio_data: OpenStruct.new(
filename: music_release.file_infos.first.filename,
composers: [],
publishers: [],
catalog: "",
title: "",
),
edl: [
OpenStruct.new(
start_time: 0,
timecode_in: "01:00:00:00",
),
]
),
]
)
)
allow(BrayniacAI::EdlParse).to receive(:create).and_return(
BrayniacAI::EdlParse.new({
results: [
BrayniacAI::EdlParseResult.new({
"channel" => "A1",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => music_release.file_infos.first.filename,
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
}),
],
edl_timecode_start: "00:00:00:00",
fps: 29.97,
edl_offset_seconds: 0,
})
)
sign_in current_user
visit video_video_analyses_path(video)
click_link "Audio"
expect(page).not_to have_audio_match(text: "(O) original_music_file_name")
by "verifying a music match displays after video starts" do
find("#player .container").click
find("#player .container").click
expect(page).to have_audio_match(text: "(O) original_music_file_name")
end
within "#audio_matches" do
expect(page).not_to have_css(".fa-check-circle")
end
confirm_original_music_match(video, "original_music_file_name")
sleep(1)
within "#audio_matches" do
expect(page).to have_css(".fa-check-circle")
match_text = page.find(".fa-check-circle").find(:xpath, "../..").text
expect(match_text).to include("(O) original_music_file_name")
end
expect(page).to have_confirmed_audio("original_music_file_name")
and_by "verifying checkmark gets removed if confirmation removed from report" do
unconfirm_audio(AudioConfirmation.last)
expect(page).not_to have_confirmed_audio("original_music_file_name.wav")
within "#audio_matches" do
expect(page).not_to have_css(".fa-check-circle")
end
end
end
scenario "confirming a library music match", js: true do
video.audio_analysis_success!
allow(BrayniacAI::AudioRecognition).to receive(:find).and_return(
OpenStruct.new(
results: [
OpenStruct.new(
uid: "abc123",
requested_filename: "library_file_name.wav",
type: "library_music",
audio_data: OpenStruct.new(
filename: "library_file_name.wav",
composers: [],
publishers: [],
catalog: "",
title: "",
),
edl: [
OpenStruct.new(
start_time: 0,
timecode_in: "01:00:00:00",
),
]
),
]
)
)
allow(BrayniacAI::EdlParse).to receive(:create).and_return(
BrayniacAI::EdlParse.new({
results: [
BrayniacAI::EdlParseResult.new({
"channel" => "A1",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "library_file_name.wav",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
}),
],
edl_timecode_start: "00:00:00:00",
fps: 29.97,
edl_offset_seconds: 0,
})
)
sign_in current_user
visit video_video_analyses_path(video)
click_link "Audio"
expect(page).not_to have_audio_match(text: "(L) library_file_name.wav")
by "verifying a music match displays after video starts" do
find("#player .container").click
find("#player .container").click
expect(page).to have_audio_match(text: "(L) library_file_name.wav")
end
within "#audio_matches" do
expect(page).not_to have_css(".fa-check-circle")
end
confirm_library_music_match(video)
sleep(1)
within "#audio_matches" do
expect(page).to have_css(".fa-check-circle")
match_text = page.find(".fa-check-circle").find(:xpath, "../..").text
expect(match_text).to include("(L) library_file_name.wav")
end
expect(page).to have_confirmed_audio("library_file_name.wav")
and_by "verifying checkmark gets removed if confirmation removed from report" do
unconfirm_audio(AudioConfirmation.last)
expect(page).not_to have_confirmed_audio("library_file_name.wav")
within "#audio_matches" do
expect(page).not_to have_css(".fa-check-circle")
end
end
end
scenario "confirming a music release", js: true do
music_release = create(:music_release,
project: project,
file_infos: [
build(:file_info, filename: "shark jumping"),
build(:file_info, filename: "pig flying"),
build(:file_info, filename: "panda sneezing"),
]
)
allow(BrayniacAI::EdlParse).to receive(:create).and_return(
BrayniacAI::EdlParse.new({
results: [
BrayniacAI::EdlParseResult.new({
"channel" => "A1",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "shark jumping.wav",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
}),
],
edl_timecode_start: "00:00:00:00",
})
)
sign_in current_user
visit video_video_analyses_path(video)
click_link "Audio"
find("#player .container").click
find("#player .container").click
expect(page).to have_unconfirmed_file_info_release(music_release, "shark jumping", count: 1)
expect(page).to have_unconfirmed_file_info_release(music_release, "pig flying", count: 1)
expect(page).to have_unconfirmed_file_info_release(music_release, "panda sneezing", count: 1)
confirm_first_music_release_using_edl_modal(video, text: "shark jumping")
expect(page).not_to have_unconfirmed_file_info_release(music_release, "shark jumping", count: 1)
expect(page).to have_unconfirmed_file_info_release(music_release, "pig flying", count: 1)
expect(page).to have_unconfirmed_file_info_release(music_release, "panda sneezing", count: 1)
expect(page).to have_confirmed_audio("shark jumping")
unconfirm_audio(AudioConfirmation.last)
expect(page).not_to have_confirmed_audio("shark jumping")
expect(page).to have_unconfirmed_file_info_release(music_release, "shark jumping", count: 1)
expect(page).to have_unconfirmed_file_info_release(music_release, "pig flying", count: 1)
expect(page).to have_unconfirmed_file_info_release(music_release, "panda sneezing", count: 1)
end
scenario "filters out non-audio EDL events", js: true do
skip "TODO: Fix this test"
edl_events = [
BrayniacAI::EdlParseResult.new({
"channel" => "V",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
}),
BrayniacAI::EdlParseResult.new({
"channel" => "A1",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name.wav",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
}),
]
allow(BrayniacAI::EdlParse).to receive(:create).and_return(
BrayniacAI::EdlParse.new({ results: edl_events, edl_timecode_start: "00:00:00:00" })
)
video = create(:video, :with_audio_only_edl_file, project: project, analysis_status: :success)
sign_in current_user
visit video_video_analyses_path(video)
open_audio_confirmation_modal
expect(page).to have_field("Origin", with: "Original Music")
2020-06-10 11:19:35 +02:00
expect(page).to have_content "Timecode In"
expect(page).to have_content "Source File Name"
2020-05-31 22:38:19 +02:00
expect(page).to have_field("Source EDL", with: "Audio")
click_on "Show/Hide EDL Events"
within "#edl_events" do
expect(page).not_to have_content("V")
expect(page).to have_content("A1")
expect(page).to have_content("source_file_name.wav")
end
end
scenario "manually creating an audio confirmation", js: true do
skip "TODO: Fix this test"
sign_in current_user
visit video_video_analyses_path(video)
click_link "Audio"
click_button "Add to Music Cue Sheet"
expect(page).to have_content "Confirm Audio"
within "#new_audio_confirmation_modal" do
fill_in "Title", with: "Two Waves"
select "Vocal", from: "Music type"
select "Feature", from: "Music category"
expect(page).to have_field("Source EDL", with: "All Tracks")
expect(page).to have_field("Channel", with: "A1")
expect(page).to have_field("Origin", with: "Library Music")
2020-06-10 11:19:35 +02:00
expect(page).to have_field("Timecode In", with: "01:00:00:00")
2020-05-31 22:38:19 +02:00
expect(page).to have_field("Timecode out", with: "01:00:02:00")
expect(page).to have_field("Duration", with: "00:00:02")
2020-06-10 11:19:35 +02:00
expect(page).to have_field("Source File Name", with: "source_file_name.wav")
2020-05-31 22:38:19 +02:00
expect(page).to have_field("Clip name", with: "clip_name")
expect(page).to have_field("Description", with: "description")
click_on "Confirm Audio"
end
expect(page).to have_confirmed_audio("source_file_name.wav")
end
scenario "has new layout" do
sign_in current_user
visit video_video_analyses_path(video)
click_link "Audio"
expect(page).to have_content("EDL #")
expect(page).to have_content("EDL TC")
expect(page).to have_content("VID TC")
expect(page).to have_content("Filename")
end
end
context "for Issues and Concerns" do
scenario "manages Unreleased appearances", js: true do
sign_in current_user
visit video_video_analyses_path(video)
click_link "Issues & Concerns"
by "adding an issues and concerns item" do
open_unreleased_modal(video)
expect(page).to have_selector("#unreleased_appearance_note_category")
select_option("#unreleased_appearance_note_category","Missing talent release")
expect(page).not_to have_selector("#unreleased_appearance_notes")
select_option("#unreleased_appearance_note_category","Other")
expect(page).to have_selector("#unreleased_appearance_notes")
create_unreleased_appearance(video, notes: "Many issues present")
expect(page).to have_selector("#issues_and_concerns_list", text: "Many issues present")
expect(page).to have_selector("#issues_and_concerns_list", text: "Channel")
expect(page).to have_selector("#issues_and_concerns_list", text: "EDL TC")
expect(page).to have_selector("#issues_and_concerns_list", text: "Video TC")
end
and_by "editing an issues and concerns item" do
edit_issues_and_concerns_item(text: "Many more issues present")
expect(page).to have_selector("#issues_and_concerns_list", text: "Many more issues present")
end
by "adding an issues and concerns item with predefined note" do
open_unreleased_modal(video)
select_option("#unreleased_appearance_note_category","Missing talent release")
click_button "Create Issue/Concern"
expect(page).to have_selector("#issues_and_concerns_list", text: "Missing talent release")
end
and_by "removing an issues and concerns item" do
delete_issues_and_concerns(UnreleasedAppearance.last)
expect(page).not_to have_selector("#issues_and_concerns_list", text: "Missing talent release")
end
end
scenario "copying data from multiple EDL events ", js: true do
edl_events = [
BrayniacAI::EdlParseResult.new({
"channel" => "V",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name1",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
}),
BrayniacAI::EdlParseResult.new({
"channel" => "V",
"start_time" => 15,
"timecode_in" => "01:00:15:00",
"timecode_out" => "01:00:18:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name2",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
})
]
allow(BrayniacAI::EdlParse).to receive(:create).and_return(
BrayniacAI::EdlParse.new({ results: edl_events, edl_timecode_start: "00:00:00:00" })
)
sign_in current_user
visit video_video_analyses_path(video)
open_unreleased_modal(video)
2020-06-10 11:19:35 +02:00
expect(page).to have_content "Timecode In"
expect(page).to have_content "Source File Name"
2020-05-31 22:38:19 +02:00
click_on "Show/Hide EDL Events"
within "#edl_events" do
expect(page).to have_content("V")
expect(page).to have_content("source_file_name2")
end
click_on_edl_event(2)
expect(page).to have_field("unreleased_appearance[timecode_in]", with: "01:00:15:00")
expect(page).to have_field("unreleased_appearance[source_file_name]", with: "source_file_name2")
end
scenario "does not filter EDL events", js: true do
edl_events = [
BrayniacAI::EdlParseResult.new({
"channel" => "V",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
}),
BrayniacAI::EdlParseResult.new({
"channel" => "A1",
"start_time" => 0,
"timecode_in" => "01:00:00:00",
"timecode_out" => "01:00:02:00",
"duration" => "00:00:02",
"source_file_name" => "source_file_name.wav",
"clip_name" => "clip_name",
"description" => "description",
"matches" => [],
}),
]
allow(BrayniacAI::EdlParse).to receive(:create).and_return(
BrayniacAI::EdlParse.new({ results: edl_events, edl_timecode_start: "00:00:00:00" })
)
sign_in current_user
visit video_video_analyses_path(video)
open_unreleased_modal(video)
2020-06-10 11:19:35 +02:00
expect(page).to have_content "Timecode In"
expect(page).to have_content "Source File Name"
2020-05-31 22:38:19 +02:00
click_on "Show/Hide EDL Events"
within "#edl_events" do
expect(page).to have_content("V")
expect(page).to have_content("source_file_name")
expect(page).to have_content("A1")
expect(page).to have_content("source_file_name.wav")
end
end
scenario "clicking video TC in issues & concerns tab seeks video to TC", js: true do
create(:unreleased_appearance, video: video, notes: "Test issue", time_elapsed: 2)
sign_in current_user
visit video_video_analyses_path(video)
find("#player .container").click
find("#player .container").click
click_link "Issues & Concerns"
TC_time_selector = "[data-behavior=seekable-timecode]"
expect(page).to have_content "Test issue"
expect(page).to have_css(TC_time_selector, text: "00:00:02:00")
find(TC_time_selector).click
expect(page).to have_css(".media-control-indicator", text: "00:02", visible: :all)
end
end
context "for Notes tab" do
scenario "clicking video TC seeks video to TC", js: true do
bookmark = create(:bookmark, video: video, notes: "Test notes", time_elapsed: 5)
sign_in current_user
visit video_video_analyses_path(video)
find("#player .container").click
find("#player .container").click
click_link "Notes"
expect(page).to have_content "Test notes"
expect(page).to have_css("#bookmark_#{bookmark.id} > td:nth-child(3)", text: "00:00:05:00")
find("#bookmark_#{bookmark.id} > td:nth-child(3)").click
expect(page).to have_css(".media-control-indicator", text: "00:05", visible: :all)
end
end
private
def confirm_release(video, release)
action = polymorphic_path([video, release, :video_release_confirmations])
form = find("form[action='#{action}']")
confirm_button = "Add to Report"
within form do
click_button confirm_button
end
end
def confirm_suggested_match(video, release)
new_path = polymorphic_path([:new, video, release, :video_release_confirmation])
create_path = polymorphic_path([video, release, :video_release_confirmations])
first("#suggested_matches form[action='#{new_path}']").click_button
2020-06-10 11:19:35 +02:00
expect(page).to have_content "Timecode In"
2020-05-31 22:38:19 +02:00
within "form[action='#{create_path}']" do
click_button "Confirm Release"
end
end
def confirm_original_music_match(video, filename)
open_audio_confirmation_modal
create_audio_confirmation(video, filename: "original_music_file_name")
end
def open_audio_confirmation_modal
page.execute_script <<-JS
$("#audio_matches .releasable-match button")[0].click()
JS
2020-06-10 11:19:35 +02:00
expect(page).to have_content "Timecode In"
2020-05-31 22:38:19 +02:00
end
def select_option(select_id, text)
page.find(select_id).find(:option, text).select_option
end
def create_audio_confirmation(video, filename: "source_file_name")
create_path = video_video_analyses_audio_confirmations_path(video)
within "form[action='#{create_path}']" do
expect(page).to have_selector("#matched_file_name", text: filename)
click_button "Confirm Audio"
end
end
def confirm_library_music_match(video)
create_path = video_video_analyses_audio_confirmations_path(video)
page.execute_script <<-JS
$("#audio_matches .releasable-match button")[0].click()
JS
expect(page).to have_field("Origin", with: "Library Music")
2020-06-10 11:19:35 +02:00
expect(page).to have_content "Timecode In"
2020-05-31 22:38:19 +02:00
within "form[action='#{create_path}']" do
expect(page).to have_selector("#matched_file_name", text: "library_file_name")
click_button "Confirm Audio"
end
end
def confirm_suggested_talent_match(video, release)
create_path = polymorphic_path([video, release, :video_release_confirmations])
first("#suggested_matches form[action='#{create_path}']").click_button
end
def unconfirm_release(confirmation)
url = polymorphic_path([confirmation.video, confirmation.releasable, confirmation])
click_link "", href: url, visible: false
end
def unconfirm_audio(confirmation)
path = audio_confirmation_path(confirmation)
find("#audio_confirmations a[href='#{path}']").click
end
def confirm_first_release_using_edl_modal(video, release, text: "")
new_path = polymorphic_path([:new, video, release, :video_release_confirmation])
create_path = polymorphic_path([video, release, :video_release_confirmations])
first("form[action='#{new_path}']", text: text).click_button
2020-06-10 11:19:35 +02:00
expect(page).to have_content "Timecode In"
2020-05-31 22:38:19 +02:00
within "form[action='#{create_path}']" do
click_button "Confirm Release"
end
end
def confirm_first_music_release_using_edl_modal(video, text: "")
new_path = new_video_video_analyses_audio_confirmation_path(video)
create_path = video_video_analyses_audio_confirmations_path(video)
page.execute_script <<-JS
$("[data-ujs-target=audio-confirmation-form] input[name='audio_confirmation[time_elapsed]']").attr("value", "0")
JS
first("#music_releases form[action='#{new_path}']", text: text).click_button
expect(page).to have_field("Origin", with: "Original Music")
2020-06-10 11:19:35 +02:00
expect(page).to have_content "Timecode In"
2020-05-31 22:38:19 +02:00
within "form[action='#{create_path}']" do
select "Vocal", from: "Music type"
select "Feature", from: "Music category"
fill_in "Source file name", with: text
click_button "Confirm Audio"
end
end
def click_on_edl_event(index)
all("[data-behavior=fillable-fields]")[index - 1].click
end
def create_bookmark(video, notes:)
new_path = new_video_bookmark_path(video)
create_path = video_bookmarks_path(video)
# Opens the new bookmark form
within "form[action='#{new_path}']" do
click_button
end
# Fills out and submits the bookmark form
within "form[action='#{create_path}']" do
fill_in "Notes", with: notes
click_button "Create"
end
end
def open_graphics_element_modal(video)
new_path = new_video_video_analyses_graphics_element_path(video)
page.execute_script("document.querySelector(\"input[name='graphics_element[time_elapsed]']\").setAttribute(\"value\", 0)")
within "form[action='#{new_path}']" do
click_button
end
end
def confirm_graphics_element_match
page.execute_script <<-JS
$("#graphics_elements_matches .graphics-match button")[0].click()
JS
end
def create_graphics_element(video, text:)
create_path = video_video_analyses_graphics_elements_path(video)
within "form[action='#{create_path}']" do
select "Subtitle", from: "Graphic type"
fill_in "Text", with: text
click_button "Create GFX Element"
end
end
def open_edit_graphics_modal
within "#graphics_elements_list" do
find(".fa-pencil").click
end
end
def edit_graphics_element(text:)
within "#edit_graphics_element_modal" do
select "Logo", from: "Graphic type"
fill_in "Text", with: text
click_button "Update GFX Element"
end
end
def delete_graphics_element(graphics_element)
path = graphics_element_path(graphics_element)
find("#graphics_elements_list a[href='#{path}']").click
end
def open_unreleased_modal(video)
new_path = new_video_video_analyses_unreleased_appearance_path(video)
within "form[action='#{new_path}']" do
click_button
end
end
def create_unreleased_appearance(video, notes:)
create_path = video_video_analyses_unreleased_appearances_path(video)
# Fills out and submits the unreleased appearance form
within "form[action='#{create_path}']" do
if notes
select "Other", from: "Note"
fill_in "Notes", with: notes
end
click_button "Create"
end
end
def edit_issues_and_concerns_item(text:)
within "#issues_and_concerns_list" do
click_link "Edit"
end
within "#edit_unreleased_appearance_modal" do
fill_in "Notes", with: text
click_button "Update Issue/Concern"
end
end
def delete_issues_and_concerns(unreleased_appearance)
path = unreleased_appearance_path(unreleased_appearance)
find("#issues_and_concerns_list a[href='#{path}']").click
end
def have_unconfirmed_file_info_release(release, text, count: 1)
scope = "#" + release.class.to_s.tableize
have_selector("#{scope} [data-confirmed='false'][data-hidden='false']", text: text, count: count)
end
def have_acquired_media_release_suggested_match(release, file_info_id, text:)
have_selector("#suggested_matches [data-ujs-target=#{dom_id(release, "file_info_#{file_info_id}")}]", text: text)
end
def have_suggested_match(release, text:)
have_selector("#suggested_matches ##{dom_id(release)}", text: text)
end
def have_graphics_element_match(text:)
have_selector("#graphics_elements_matches", text: text)
end
def have_audio_match(text:)
have_selector("#audio_matches", text: text)
end
def have_unconfirmed_release(release, count: 1)
scope = "#" + release.class.to_s.tableize
have_selector("#{scope} ##{dom_id(release)}[data-confirmed='false'][data-hidden='false']", count: count)
end
def have_confirmed_release(release, text: "00:00:00:00", scope: "#video_release_confirmations")
have_selector("#{scope} [data-releasable-id='#{release.id}']", text: text)
end
def have_confirmed_audio(text)
have_selector("#audio_confirmations", text: text)
end
def have_bookmark(notes:)
have_selector(".standard-marker.bookmark-marker", visible: false) &&
have_selector(".standard-tooltip", text: notes, visible: false)
end
def have_graphics_element(text:)
have_selector(".graphics-elements .graphics-element", text: text)
end
def have_confirmed_graphics_match(text:)
have_selector("#graphics_elements_matches [data-confirmed='true']", text: text)
end
def have_graphics_element_modal
have_selector("#new_graphics_element_modal")
end
def have_edl_event_modal
have_selector("#edl_event_modal")
end
def have_unreleased_appearance(notes:)
have_selector(".standard-marker.unreleased-appearance-marker", visible: false) &&
have_selector(".standard-tooltip", text: notes, visible: false)
end
def search_for(type, text: "")
action = "video_analyses/#{type.to_s}"
within "form[action*='#{action}']" do
fill_in "query", with: text
click_button "Search"
end
end
def dom_id(record, prefix = nil)
ActionController::Base.helpers.dom_id(record, prefix)
end
end