From cfb241efb20c2c354097c56fd6894a034cc9772a Mon Sep 17 00:00:00 2001 From: Kieran Eglin Date: Tue, 26 Nov 2024 11:37:52 -0800 Subject: [PATCH] Added tests for media downloader module --- lib/pinchflat/downloading/media_downloader.ex | 2 - .../downloading/media_downloader_test.exs | 39 +++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/lib/pinchflat/downloading/media_downloader.ex b/lib/pinchflat/downloading/media_downloader.ex index e94665d..5425932 100644 --- a/lib/pinchflat/downloading/media_downloader.ex +++ b/lib/pinchflat/downloading/media_downloader.ex @@ -37,7 +37,6 @@ defmodule Pinchflat.Downloading.MediaDownloader do {:ok, parsed_json} -> update_media_item_from_parsed_json(media_with_preloads, parsed_json) - # TODO: test {:error, :unsuitable_for_download} -> Logger.warning( "Media item ##{media_with_preloads.id} isn't suitable for download yet. May be an active or processing live stream" @@ -116,7 +115,6 @@ defmodule Pinchflat.Downloading.MediaDownloader do {:ok, options} = DownloadOptionBuilder.build(item_with_preloads, override_opts) runner_opts = [output_filepath: output_filepath, use_cookies: item_with_preloads.source.use_cookies] - # TODO: test case YtDlpMedia.get_downloadable_status(url) do {:ok, :downloadable} -> YtDlpMedia.download(url, options, runner_opts) {:ok, :ignorable} -> {:error, :unsuitable_for_download} diff --git a/test/pinchflat/downloading/media_downloader_test.exs b/test/pinchflat/downloading/media_downloader_test.exs index 70ab6fe..a09e0c5 100644 --- a/test/pinchflat/downloading/media_downloader_test.exs +++ b/test/pinchflat/downloading/media_downloader_test.exs @@ -16,6 +16,7 @@ defmodule Pinchflat.Downloading.MediaDownloaderTest do ) stub(HTTPClientMock, :get, fn _url, _headers, _opts -> {:ok, ""} end) + stub(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> {:ok, "{}"} end) stub(YtDlpRunnerMock, :run, fn _url, _opts, _ot, _addl_args -> {:ok, ""} end) {:ok, %{media_item: media_item}} @@ -49,6 +50,14 @@ defmodule Pinchflat.Downloading.MediaDownloaderTest do assert updated_media_item.metadata.thumbnail_filepath =~ "media_items/#{media_item.id}/thumbnail.jpg" end + test "errors for non-downloadable media are passed through", %{media_item: media_item} do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> + {:ok, Phoenix.json_library().encode!(%{"live_status" => "is_live"})} + end) + + assert {:error, :unsuitable_for_download} = MediaDownloader.download_for_media_item(media_item) + end + test "non-recoverable errors are passed through", %{media_item: media_item} do expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot, _addl -> {:error, :some_error, 1} @@ -67,6 +76,36 @@ defmodule Pinchflat.Downloading.MediaDownloaderTest do end end + describe "download_for_media_item/3 when testing non-downloadable media" do + test "calls the download runner if the media is currently downloadable", %{media_item: media_item} do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> + {:ok, Phoenix.json_library().encode!(%{"live_status" => "was_live"})} + end) + + expect(YtDlpRunnerMock, :run, 2, fn _url, _opts, _ot, _addl -> + {:ok, render_metadata(:media_metadata)} + end) + + assert {:ok, _} = MediaDownloader.download_for_media_item(media_item) + end + + test "does not call the download runner if the media is not downloadable", %{media_item: media_item} do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> + {:ok, Phoenix.json_library().encode!(%{"live_status" => "is_live"})} + end) + + expect(YtDlpRunnerMock, :run, 0, fn _url, _opts, _ot, _addl -> {:ok, ""} end) + + assert {:error, :unsuitable_for_download} = MediaDownloader.download_for_media_item(media_item) + end + + test "returns unexpected errors from the download status determination method", %{media_item: media_item} do + expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot -> {:error, :what_tha} end) + + assert {:error, "Unknown error: {:error, :what_tha}"} = MediaDownloader.download_for_media_item(media_item) + end + end + describe "download_for_media_item/3 when testing override options" do test "includes override opts if specified", %{media_item: media_item} do expect(YtDlpRunnerMock, :run, 1, fn _url, opts, _ot, _addl ->