[Housekeeping] Improve test stability (#232)

* Ensured all tests use at least the DataCase module

* addressed one flakey test

* More flakey tests

* Consolidated Mox usage
This commit is contained in:
Kieran 2024-05-08 09:57:36 -07:00 committed by GitHub
parent b5d2ba4191
commit 933daf8c78
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
39 changed files with 51 additions and 83 deletions

View file

@ -18,7 +18,9 @@
</div>
<div class="no-scrollbar flex flex-col overflow-y-auto duration-300 ease-linear">
<nav class="mt-3 px-4 py-4 lg:px-6">
<h3 class="mb-4 ml-4 text-sm font-medium text-bodydark2">MENU</h3>
<h3 class="mb-4 ml-4 text-sm font-medium text-bodydark2">
<span>MENU</span>
</h3>
<div class="flex flex-col justify-between">
<ul class="mb-6 flex flex-col gap-1.5">
<.sidebar_item icon="hero-home" text="Home" href={~p"/"} />

View file

@ -1,7 +1,6 @@
defmodule Pinchflat.Boot.PreJobStartupTasksTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.JobFixtures
alias Pinchflat.Settings

View file

@ -1,7 +1,6 @@
defmodule Pinchflat.Downloading.DownloadingHelpersTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.MediaFixtures
import Pinchflat.SourcesFixtures
import Pinchflat.ProfilesFixtures
@ -10,8 +9,6 @@ defmodule Pinchflat.Downloading.DownloadingHelpersTest do
alias Pinchflat.Downloading.DownloadingHelpers
alias Pinchflat.Downloading.MediaDownloadWorker
setup :verify_on_exit!
describe "enqueue_pending_download_tasks/1" do
test "it enqueues a job for each pending media item" do
source = source_fixture()

View file

@ -1,7 +1,6 @@
defmodule Pinchflat.Downloading.MediaDownloadWorkerTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.MediaFixtures
alias Pinchflat.Media
@ -9,8 +8,6 @@ defmodule Pinchflat.Downloading.MediaDownloadWorkerTest do
alias Pinchflat.Utils.FilesystemUtils
alias Pinchflat.Downloading.MediaDownloadWorker
setup :verify_on_exit!
setup do
stub(UserScriptRunnerMock, :run, fn _event_type, _data -> :ok end)
stub(HTTPClientMock, :get, fn _url, _headers, _opts -> {:ok, ""} end)

View file

@ -1,14 +1,12 @@
defmodule Pinchflat.Downloading.MediaDownloaderTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.MediaFixtures
import Pinchflat.SourcesFixtures
import Pinchflat.ProfilesFixtures
alias Pinchflat.Downloading.MediaDownloader
setup :verify_on_exit!
setup do
media_item =
Repo.preload(

View file

@ -1,15 +1,12 @@
defmodule Pinchflat.Downloading.MediaRetentionWorkerTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.MediaFixtures
import Pinchflat.SourcesFixtures
alias Pinchflat.Media
alias Pinchflat.Downloading.MediaRetentionWorker
setup :verify_on_exit!
describe "perform/1" do
setup do
stub(UserScriptRunnerMock, :run, fn _event_type, _data -> :ok end)

View file

@ -1,5 +1,5 @@
defmodule Pinchflat.Downloading.OutputPath.ParserTest do
use ExUnit.Case, async: false
use Pinchflat.DataCase
alias Pinchflat.Downloading.OutputPath.Parser

View file

@ -1,7 +1,6 @@
defmodule Pinchflat.FastIndexing.FastIndexingHelpersTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.MediaFixtures
import Pinchflat.SourcesFixtures
import Pinchflat.ProfilesFixtures
@ -11,8 +10,6 @@ defmodule Pinchflat.FastIndexing.FastIndexingHelpersTest do
alias Pinchflat.Downloading.MediaDownloadWorker
alias Pinchflat.FastIndexing.FastIndexingHelpers
setup :verify_on_exit!
describe "kickoff_download_tasks_from_youtube_rss_feed/1" do
setup do
stub(YtDlpRunnerMock, :run, fn _url, _opts, _ot ->

View file

@ -1,15 +1,12 @@
defmodule Pinchflat.FastIndexing.FastIndexingWorkerTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.SourcesFixtures
alias Pinchflat.Settings
alias Pinchflat.Sources.Source
alias Pinchflat.FastIndexing.FastIndexingWorker
setup :verify_on_exit!
describe "kickoff_with_task/2" do
test "starts the worker" do
source = source_fixture(fast_index: true)

View file

@ -1,12 +1,10 @@
defmodule Pinchflat.FastIndexing.YoutubeRssTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.SourcesFixtures
alias Pinchflat.FastIndexing.YoutubeRss
setup :verify_on_exit!
setup do
source = source_fixture()

View file

@ -1,5 +1,5 @@
defmodule Pinchflat.Lifecycle.Notifications.CommandRunnerTest do
use ExUnit.Case, async: false
use Pinchflat.DataCase
alias Pinchflat.Lifecycle.Notifications.CommandRunner, as: Runner

View file

@ -1,7 +1,6 @@
defmodule Pinchflat.Lifecycle.Notifications.SourceNotificationsTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.MediaFixtures
import Pinchflat.SourcesFixtures
@ -9,8 +8,6 @@ defmodule Pinchflat.Lifecycle.Notifications.SourceNotificationsTest do
@apprise_servers ["server_1", "server_2"]
setup :verify_on_exit!
describe "wrap_new_media_notification/3" do
test "sends a notification when the pending count changes" do
source = source_fixture()

View file

@ -1,5 +1,5 @@
defmodule Pinchflat.Lifecycle.UserScripts.CommandRunnerTest do
use ExUnit.Case, async: false
use Pinchflat.DataCase
alias Pinchflat.Utils.FilesystemUtils
alias Pinchflat.Lifecycle.UserScripts.CommandRunner, as: Runner
@ -15,11 +15,12 @@ defmodule Pinchflat.Lifecycle.UserScripts.CommandRunnerTest do
test "runs the provided lifecycle file if present" do
# We *love* indirectly testing side effects
tmp_dir = Application.get_env(:pinchflat, :tmpfile_directory)
File.write(filepath(), "#!/bin/bash\ntouch #{tmp_dir}/test_file\n")
filename = "#{tmp_dir}/test_file-#{Enum.random(1..1000)}"
File.write(filepath(), "#!/bin/bash\ntouch #{filename}\n")
refute File.exists?("#{tmp_dir}/test_file")
refute File.exists?(filename)
assert :ok = Runner.run(:media_downloaded, %{})
assert File.exists?("#{tmp_dir}/test_file")
assert File.exists?(filename)
end
test "passes the event name to the script" do

View file

@ -1,7 +1,6 @@
defmodule Pinchflat.MediaTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.TasksFixtures
import Pinchflat.MediaFixtures
import Pinchflat.ProfilesFixtures
@ -13,8 +12,6 @@ defmodule Pinchflat.MediaTest do
alias Pinchflat.YtDlp.Media, as: YtDlpMedia
setup :verify_on_exit!
@invalid_attrs %{title: nil, media_id: nil, media_filepath: nil}
describe "schema" do

View file

@ -1,6 +1,6 @@
defmodule Pinchflat.Metadata.MetadataFileHelpersTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.MediaFixtures
alias Pinchflat.Metadata.MetadataFileHelpers, as: Helpers
@ -11,8 +11,6 @@ defmodule Pinchflat.Metadata.MetadataFileHelpersTest do
{:ok, %{media_item: media_item}}
end
setup :verify_on_exit!
describe "compress_and_store_metadata_for/2" do
test "returns the filepath", %{media_item: media_item} do
metadata_map = %{"foo" => "bar"}

View file

@ -1,6 +1,6 @@
defmodule Pinchflat.Metadata.SourceMetadataStorageWorkerTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.SourcesFixtures
import Pinchflat.ProfilesFixtures
@ -11,8 +11,6 @@ defmodule Pinchflat.Metadata.SourceMetadataStorageWorkerTest do
@source_details_ot "%(.{channel,channel_id,playlist_id,playlist_title,filename})j"
@metadata_ot "playlist:%()j"
setup :verify_on_exit!
describe "kickoff_with_task/1" do
test "enqueues a new worker for the source" do
source = source_fixture()

View file

@ -1,7 +1,6 @@
defmodule Pinchflat.ProfilesTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.MediaFixtures
import Pinchflat.SourcesFixtures
import Pinchflat.ProfilesFixtures
@ -11,8 +10,6 @@ defmodule Pinchflat.ProfilesTest do
@invalid_attrs %{name: nil, output_path_template: nil}
setup :verify_on_exit!
describe "schema" do
test "can be JSON encoded without error" do
profile = media_profile_fixture()

View file

@ -1,5 +1,5 @@
defmodule Pinchflat.SlowIndexing.FileFollowerServerTest do
use ExUnit.Case, async: false
use Pinchflat.DataCase
alias alias Pinchflat.Utils.FilesystemUtils
alias Pinchflat.SlowIndexing.FileFollowerServer

View file

@ -1,7 +1,6 @@
defmodule Pinchflat.SlowIndexing.MediaCollectionIndexingWorkerTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.TasksFixtures
import Pinchflat.MediaFixtures
import Pinchflat.SourcesFixtures
@ -13,8 +12,6 @@ defmodule Pinchflat.SlowIndexing.MediaCollectionIndexingWorkerTest do
alias Pinchflat.Downloading.MediaDownloadWorker
alias Pinchflat.SlowIndexing.MediaCollectionIndexingWorker
setup :verify_on_exit!
describe "kickoff_with_task/3" do
setup do
source = source_fixture(index_frequency_minutes: 10)

View file

@ -1,7 +1,6 @@
defmodule Pinchflat.SlowIndexing.SlowIndexingHelpersTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.TasksFixtures
import Pinchflat.MediaFixtures
import Pinchflat.SourcesFixtures
@ -15,8 +14,6 @@ defmodule Pinchflat.SlowIndexing.SlowIndexingHelpersTest do
alias Pinchflat.SlowIndexing.SlowIndexingHelpers
alias Pinchflat.SlowIndexing.MediaCollectionIndexingWorker
setup :verify_on_exit!
describe "kickoff_indexing_task/3" do
test "it schedules a job" do
source = source_fixture(index_frequency_minutes: 1)

View file

@ -1,6 +1,6 @@
defmodule Pinchflat.SourcesTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.TasksFixtures
import Pinchflat.MediaFixtures
import Pinchflat.ProfilesFixtures
@ -18,8 +18,6 @@ defmodule Pinchflat.SourcesTest do
@invalid_source_attrs %{name: nil, collection_id: nil}
setup :verify_on_exit!
describe "schema" do
test "source_metadata is deleted when the source is deleted" do
source =

View file

@ -1,5 +1,5 @@
defmodule Pinchflat.Utils.ChangesetUtilsTest do
use ExUnit.Case, async: false
use Pinchflat.DataCase
defmodule MockSchema do
use Ecto.Schema

View file

@ -1,5 +1,5 @@
defmodule Pinchflat.Utils.CliUtilsTest do
use ExUnit.Case, async: false
use Pinchflat.DataCase
alias Pinchflat.Utils.CliUtils

View file

@ -1,5 +1,5 @@
defmodule Pinchflat.Utils.DatetimeUtilsTest do
use ExUnit.Case, async: false
use Pinchflat.DataCase
alias Pinchflat.Utils.DatetimeUtils

View file

@ -1,5 +1,5 @@
defmodule Pinchflat.Utils.FunctionUtilsTest do
use ExUnit.Case, async: false
use Pinchflat.DataCase
alias Pinchflat.Utils.FunctionUtils

View file

@ -1,5 +1,5 @@
defmodule Pinchflat.Utils.NumberUtilsTest do
use ExUnit.Case, async: false
use Pinchflat.DataCase
alias Pinchflat.Utils.NumberUtils

View file

@ -1,5 +1,5 @@
defmodule Pinchflat.Utils.StringUtilsTest do
use ExUnit.Case, async: false
use Pinchflat.DataCase
alias Pinchflat.Utils.StringUtils

View file

@ -1,5 +1,5 @@
defmodule Pinchflat.Utils.XmlUtilsTest do
use ExUnit.Case, async: false
use Pinchflat.DataCase
alias Pinchflat.Utils.XmlUtils

View file

@ -1,5 +1,5 @@
defmodule Pinchflat.YtDlp.CommandRunnerTest do
use ExUnit.Case, async: false
use Pinchflat.DataCase
alias Pinchflat.Utils.FilesystemUtils

View file

@ -1,6 +1,6 @@
defmodule Pinchflat.YtDlp.MediaCollectionTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.SourcesFixtures
alias Pinchflat.YtDlp.Media
@ -8,8 +8,6 @@ defmodule Pinchflat.YtDlp.MediaCollectionTest do
@channel_url "https://www.youtube.com/c/PinchflatTestChannel"
setup :verify_on_exit!
describe "get_media_attributes_for_collection/2" do
test "returns a list of video attributes with no blank elements" do
expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot, _addl_opts ->

View file

@ -1,14 +1,12 @@
defmodule Pinchflat.YtDlp.MediaTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.MediaFixtures
alias Pinchflat.YtDlp.Media
@media_url "https://www.youtube.com/watch?v=TiZPUDkDYbk"
setup :verify_on_exit!
describe "download/2" do
test "it calls the backend runner with the expected arguments" do
expect(YtDlpRunnerMock, :run, fn @media_url, opts, ot, addl ->

View file

@ -1,14 +1,11 @@
defmodule PinchflatWeb.MediaItemControllerTest do
use PinchflatWeb.ConnCase
import Mox
import Pinchflat.MediaFixtures
alias Pinchflat.Repo
alias Pinchflat.Downloading.MediaDownloadWorker
setup :verify_on_exit!
describe "show media" do
setup [:create_media_item]

View file

@ -1,7 +1,6 @@
defmodule PinchflatWeb.MediaProfileControllerTest do
use PinchflatWeb.ConnCase
import Mox
import Pinchflat.MediaFixtures
import Pinchflat.SourcesFixtures
import Pinchflat.ProfilesFixtures
@ -16,8 +15,6 @@ defmodule PinchflatWeb.MediaProfileControllerTest do
}
@invalid_attrs %{name: nil, output_path_template: nil}
setup :verify_on_exit!
setup do
Settings.set(onboarding: false)
@ -41,7 +38,7 @@ defmodule PinchflatWeb.MediaProfileControllerTest do
Settings.set(onboarding: true)
conn = get(conn, ~p"/media_profiles/new")
refute html_response(conn, 200) =~ "MENU"
refute html_response(conn, 200) =~ "<span>MENU</span>"
end
end

View file

@ -1,13 +1,10 @@
defmodule PinchflatWeb.Settings.AppriseServerLiveTest do
use PinchflatWeb.ConnCase
import Mox
import Phoenix.LiveViewTest
alias Pinchflat.Settings.AppriseServerLive
setup :verify_on_exit!
describe "initial rendering" do
test "renders the input", %{conn: conn} do
{:ok, _view, html} = live_isolated(conn, AppriseServerLive, session: create_session(""))

View file

@ -1,6 +1,5 @@
defmodule PinchflatWeb.SourceControllerTest do
use PinchflatWeb.ConnCase
import Mox
import Pinchflat.MediaFixtures
import Pinchflat.SourcesFixtures
@ -32,8 +31,6 @@ defmodule PinchflatWeb.SourceControllerTest do
}
end
setup :verify_on_exit!
describe "index" do
test "lists all sources", %{conn: conn} do
conn = get(conn, ~p"/sources")

View file

@ -34,8 +34,10 @@ defmodule PinchflatWeb.Sources.MediaItemTableLiveTest do
describe "media_state" do
test "shows pending media when pending", %{conn: conn, source: source} do
downloaded_media_item = media_item_fixture(source_id: source.id)
pending_media_item = media_item_fixture(source_id: source.id, media_filepath: nil)
downloaded_media_item = media_item_fixture(source_id: source.id, title: "DL-#{Enum.random(0..9999)}")
pending_media_item =
media_item_fixture(source_id: source.id, media_filepath: nil, title: "P-#{Enum.random(0..9999)}")
{:ok, _view, html} = live_isolated(conn, MediaItemTableLive, session: create_session(source, "pending"))

View file

@ -17,6 +17,8 @@ defmodule PinchflatWeb.ConnCase do
use ExUnit.CaseTemplate
alias Pinchflat.TestingHelperMethods
using do
quote do
# The default endpoint for testing
@ -27,14 +29,19 @@ defmodule PinchflatWeb.ConnCase do
use Oban.Testing, repo: Repo
# Import conveniences for testing with connections
import Mox
import Plug.Conn
import Phoenix.ConnTest
import PinchflatWeb.ConnCase
import Pinchflat.TestingHelperMethods
setup :verify_on_exit!
end
end
setup tags do
TestingHelperMethods.create_platform_directories()
Pinchflat.DataCase.setup_sandbox(tags)
conn = Phoenix.ConnTest.build_conn()

View file

@ -15,6 +15,7 @@ defmodule Pinchflat.DataCase do
"""
use ExUnit.CaseTemplate
alias Pinchflat.TestingHelperMethods
using do
quote do
@ -22,16 +23,21 @@ defmodule Pinchflat.DataCase do
use Oban.Testing, repo: Repo
import Mox
import Ecto
import Ecto.Changeset
import Ecto.Query
import Pinchflat.DataCase
import Pinchflat.TestingHelperMethods
setup :verify_on_exit!
end
end
setup tags do
TestingHelperMethods.create_platform_directories()
Pinchflat.DataCase.setup_sandbox(tags)
:ok
end

View file

@ -54,4 +54,11 @@ defmodule Pinchflat.TestingHelperMethods do
|> render_metadata()
|> Phoenix.json_library().decode!()
end
def create_platform_directories do
File.mkdir_p!(Application.get_env(:pinchflat, :media_directory))
File.mkdir_p!(Application.get_env(:pinchflat, :metadata_directory))
File.mkdir_p!(Application.get_env(:pinchflat, :extras_directory))
File.mkdir_p!(Application.get_env(:pinchflat, :tmpfile_directory))
end
end