[Enhancement] Show currently executing jobs on homepage (#250)
* [WIP] Added PoC job table * [WIP] hooked up tasks table with real data * Added reload on websocket command * Hooked it all up to a websocket
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
defmodule PinchflatWeb.Pages.JobTableLiveTest do
|
||||
use PinchflatWeb.ConnCase
|
||||
|
||||
import Ecto.Query, warn: false
|
||||
import Phoenix.LiveViewTest
|
||||
import Pinchflat.MediaFixtures
|
||||
import Pinchflat.SourcesFixtures
|
||||
|
||||
alias Pinchflat.Utils.StringUtils
|
||||
alias Pinchflat.Pages.JobTableLive
|
||||
alias Pinchflat.Downloading.MediaDownloadWorker
|
||||
alias Pinchflat.FastIndexing.FastIndexingWorker
|
||||
|
||||
describe "initial rendering" do
|
||||
test "shows message when no records", %{conn: conn} do
|
||||
{:ok, _view, html} = live_isolated(conn, JobTableLive, session: %{})
|
||||
|
||||
assert html =~ "Nothing Here!"
|
||||
refute html =~ "Subject"
|
||||
end
|
||||
|
||||
test "shows records when present", %{conn: conn} do
|
||||
{_source, _media_item, _task, _job} = create_media_item_job()
|
||||
{:ok, _view, html} = live_isolated(conn, JobTableLive, session: %{})
|
||||
|
||||
assert html =~ "Subject"
|
||||
end
|
||||
|
||||
test "doesn't show records when not in executing state", %{conn: conn} do
|
||||
{_source, _media_item, _task, _job} = create_media_item_job(:scheduled)
|
||||
{_source, _media_item, _task, _job} = create_media_item_job(:completed)
|
||||
{:ok, _view, html} = live_isolated(conn, JobTableLive, session: %{})
|
||||
|
||||
assert html =~ "Nothing Here!"
|
||||
refute html =~ "Subject"
|
||||
end
|
||||
end
|
||||
|
||||
describe "job rendering" do
|
||||
test "shows worker name", %{conn: conn} do
|
||||
{_source, _media_item, _task, _job} = create_media_item_job()
|
||||
{:ok, _view, html} = live_isolated(conn, JobTableLive, session: %{})
|
||||
|
||||
assert html =~ "Downloading Media"
|
||||
end
|
||||
|
||||
test "shows the media item title", %{conn: conn} do
|
||||
{_source, media_item, _task, _job} = create_media_item_job()
|
||||
{:ok, _view, html} = live_isolated(conn, JobTableLive, session: %{})
|
||||
|
||||
assert html =~ StringUtils.truncate(media_item.title, 35)
|
||||
end
|
||||
|
||||
test "shows a media item link", %{conn: conn} do
|
||||
{_source, media_item, _task, _job} = create_media_item_job()
|
||||
{:ok, _view, html} = live_isolated(conn, JobTableLive, session: %{})
|
||||
|
||||
assert html =~ ~p"/sources/#{media_item.source_id}/media/#{media_item}"
|
||||
end
|
||||
|
||||
test "shows the source custom name", %{conn: conn} do
|
||||
{source, _task, _job} = create_source_job()
|
||||
{:ok, _view, html} = live_isolated(conn, JobTableLive, session: %{})
|
||||
|
||||
assert html =~ StringUtils.truncate(source.custom_name, 35)
|
||||
end
|
||||
|
||||
test "shows a source link", %{conn: conn} do
|
||||
{source, _task, _job} = create_source_job()
|
||||
{:ok, _view, html} = live_isolated(conn, JobTableLive, session: %{})
|
||||
|
||||
assert html =~ ~p"/sources/#{source.id}"
|
||||
end
|
||||
|
||||
test "listens for job:state change events", %{conn: conn} do
|
||||
{_source, _media_item, _task, _job} = create_media_item_job()
|
||||
{:ok, _view, _html} = live_isolated(conn, JobTableLive, session: %{})
|
||||
|
||||
PinchflatWeb.Endpoint.broadcast("job:state", "change", nil)
|
||||
|
||||
assert_receive %Phoenix.Socket.Broadcast{topic: "job:state", event: "change", payload: nil}
|
||||
end
|
||||
end
|
||||
|
||||
defp create_media_item_job(job_state \\ :executing) do
|
||||
source = source_fixture()
|
||||
media_item = media_item_fixture(source_id: source.id)
|
||||
{:ok, task} = MediaDownloadWorker.kickoff_with_task(media_item)
|
||||
|
||||
Oban.Job
|
||||
|> where([j], j.id == ^task.job_id)
|
||||
|> Repo.update_all(set: [state: to_string(job_state)])
|
||||
|
||||
job = Repo.get!(Oban.Job, task.job_id)
|
||||
|
||||
{source, media_item, task, job}
|
||||
end
|
||||
|
||||
defp create_source_job(job_state \\ :executing) do
|
||||
source = source_fixture()
|
||||
{:ok, task} = FastIndexingWorker.kickoff_with_task(source)
|
||||
|
||||
Oban.Job
|
||||
|> where([j], j.id == ^task.job_id)
|
||||
|> Repo.update_all(set: [state: to_string(job_state)])
|
||||
|
||||
job = Repo.get!(Oban.Job, task.job_id)
|
||||
|
||||
{source, task, job}
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user