- <.link :if={not @onboarding} navigate={~p"/media_profiles"}>
+ <.link :if={!Plug.Conn.get_session(@conn, :onboarding)} navigate={~p"/media_profiles"}>
<.icon name="hero-arrow-left" class="w-10 h-10 hover:dark:text-white" />
diff --git a/lib/pinchflat_web/controllers/media_sources/source_controller.ex b/lib/pinchflat_web/controllers/media_sources/source_controller.ex
index 7bc9a18..58aaf90 100644
--- a/lib/pinchflat_web/controllers/media_sources/source_controller.ex
+++ b/lib/pinchflat_web/controllers/media_sources/source_controller.ex
@@ -20,11 +20,10 @@ defmodule PinchflatWeb.MediaSources.SourceController do
render(conn, :new,
changeset: changeset,
media_profiles: media_profiles(),
- onboarding: true,
layout: {Layouts, :onboarding}
)
else
- render(conn, :new, changeset: changeset, media_profiles: media_profiles(), onboarding: false)
+ render(conn, :new, changeset: changeset, media_profiles: media_profiles())
end
end
@@ -32,14 +31,22 @@ defmodule PinchflatWeb.MediaSources.SourceController do
case MediaSource.create_source(source_params) do
{:ok, source} ->
redirect_location =
- if get_session(conn, :onboarding), do: ~p"/", else: ~p"/sources/#{source}"
+ if get_session(conn, :onboarding), do: ~p"/?onboarding=1", else: ~p"/sources/#{source}"
conn
|> put_flash(:info, "Source created successfully.")
|> redirect(to: redirect_location)
{:error, %Ecto.Changeset{} = changeset} ->
- render(conn, :new, changeset: changeset, media_profiles: media_profiles())
+ if get_session(conn, :onboarding) do
+ render(conn, :new,
+ changeset: changeset,
+ media_profiles: media_profiles(),
+ layout: {Layouts, :onboarding}
+ )
+ else
+ render(conn, :new, changeset: changeset, media_profiles: media_profiles())
+ end
end
end
diff --git a/lib/pinchflat_web/controllers/media_sources/source_html/new.html.heex b/lib/pinchflat_web/controllers/media_sources/source_html/new.html.heex
index 2bc31ef..5914e03 100644
--- a/lib/pinchflat_web/controllers/media_sources/source_html/new.html.heex
+++ b/lib/pinchflat_web/controllers/media_sources/source_html/new.html.heex
@@ -1,5 +1,5 @@
- <.link :if={not @onboarding} navigate={~p"/sources"}>
+ <.link :if={!Plug.Conn.get_session(@conn, :onboarding)} navigate={~p"/sources"}>
<.icon name="hero-arrow-left" class="w-10 h-10 hover:dark:text-white" />
New Source
diff --git a/lib/pinchflat_web/controllers/pages/page_controller.ex b/lib/pinchflat_web/controllers/pages/page_controller.ex
index 4a91110..7c26cdf 100644
--- a/lib/pinchflat_web/controllers/pages/page_controller.ex
+++ b/lib/pinchflat_web/controllers/pages/page_controller.ex
@@ -1,25 +1,35 @@
defmodule PinchflatWeb.Pages.PageController do
use PinchflatWeb, :controller
- alias Pinchflat.Profiles
- alias Pinchflat.MediaSource
+ alias Pinchflat.Repo
+ alias Pinchflat.MediaSource.Source
+ alias Pinchflat.Profiles.MediaProfile
- def home(conn, _params) do
- media_profiles_exist = Profiles.media_profiles_exist?()
- sources_exist = MediaSource.sources_exist?()
+ def home(conn, params) do
+ force_onboarding = params["onboarding"]
+ media_profiles_exist = Repo.exists?(MediaProfile)
+ sources_exist = Repo.exists?(Source)
- if media_profiles_exist && sources_exist do
- conn
- |> put_session(:onboarding, false)
- |> render(:home)
+ if !force_onboarding && media_profiles_exist && sources_exist do
+ render_home_page(conn)
else
- conn
- |> put_session(:onboarding, true)
- |> render(:onboarding_checklist,
- media_profiles_exist: media_profiles_exist,
- sources_exist: sources_exist,
- layout: {Layouts, :onboarding}
- )
+ render_onboarding_page(conn, media_profiles_exist, sources_exist)
end
end
+
+ defp render_home_page(conn) do
+ conn
+ |> put_session(:onboarding, false)
+ |> render(:home)
+ end
+
+ defp render_onboarding_page(conn, media_profiles_exist, sources_exist) do
+ conn
+ |> put_session(:onboarding, true)
+ |> render(:onboarding_checklist,
+ media_profiles_exist: media_profiles_exist,
+ sources_exist: sources_exist,
+ layout: {Layouts, :onboarding}
+ )
+ end
end
diff --git a/lib/pinchflat_web/controllers/pages/page_html/home.html.heex b/lib/pinchflat_web/controllers/pages/page_html/home.html.heex
index 5ed529e..cecaf9e 100644
--- a/lib/pinchflat_web/controllers/pages/page_html/home.html.heex
+++ b/lib/pinchflat_web/controllers/pages/page_html/home.html.heex
@@ -1 +1,8 @@
-
hey
+
+
+
+
TODO: Put some useful info or analytics here
+
For now, the options in the sidebar have what you need
+
+
+
diff --git a/test/pinchflat/media_test.exs b/test/pinchflat/media_test.exs
index d116ddf..faeb656 100644
--- a/test/pinchflat/media_test.exs
+++ b/test/pinchflat/media_test.exs
@@ -245,6 +245,18 @@ defmodule Pinchflat.MediaTest do
"video/test.srt"
]
end
+
+ test "strips out nil values" do
+ filepaths = %{
+ media_filepath: "/video/test.mp4",
+ thumbnail_filepath: nil,
+ subtitle_filepaths: [["en", nil]]
+ }
+
+ media_item = media_item_fixture(filepaths)
+
+ assert Media.media_filepaths(media_item) == ["/video/test.mp4"]
+ end
end
describe "create_media_item/1" do
diff --git a/test/pinchflat_web/controllers/media_profile_controller_test.exs b/test/pinchflat_web/controllers/media_profile_controller_test.exs
index 8a2e3e1..7ae2298 100644
--- a/test/pinchflat_web/controllers/media_profile_controller_test.exs
+++ b/test/pinchflat_web/controllers/media_profile_controller_test.exs
@@ -22,6 +22,15 @@ defmodule PinchflatWeb.MediaProfileControllerTest do
conn = get(conn, ~p"/media_profiles/new")
assert html_response(conn, 200) =~ "New Media Profile"
end
+
+ test "renders correct layout when onboarding", %{session_conn: session_conn} do
+ session_conn =
+ session_conn
+ |> put_session(:onboarding, true)
+ |> get(~p"/media_profiles/new")
+
+ refute html_response(session_conn, 200) =~ "MENU"
+ end
end
describe "create media_profile" do
@@ -39,6 +48,24 @@ defmodule PinchflatWeb.MediaProfileControllerTest do
conn = post(conn, ~p"/media_profiles", media_profile: @invalid_attrs)
assert html_response(conn, 200) =~ "New Media Profile"
end
+
+ test "redirects to onboarding when onboarding", %{session_conn: session_conn} do
+ session_conn =
+ session_conn
+ |> put_session(:onboarding, true)
+ |> post(~p"/media_profiles", media_profile: @create_attrs)
+
+ assert redirected_to(session_conn) == ~p"/?onboarding=1"
+ end
+
+ test "renders correct layout on error when onboarding", %{session_conn: session_conn} do
+ session_conn =
+ session_conn
+ |> put_session(:onboarding, true)
+ |> post(~p"/media_profiles", media_profile: @invalid_attrs)
+
+ refute html_response(session_conn, 200) =~ "MENU"
+ end
end
describe "edit media_profile" do
diff --git a/test/pinchflat_web/controllers/page_controller_test.exs b/test/pinchflat_web/controllers/page_controller_test.exs
index 87378f0..bd8d23d 100644
--- a/test/pinchflat_web/controllers/page_controller_test.exs
+++ b/test/pinchflat_web/controllers/page_controller_test.exs
@@ -1,8 +1,52 @@
defmodule PinchflatWeb.PageControllerTest do
use PinchflatWeb.ConnCase
- test "GET /", %{conn: conn} do
- conn = get(conn, ~p"/")
- assert html_response(conn, 200) =~ "Peace of mind from prototype to production"
+ import Pinchflat.ProfilesFixtures
+ import Pinchflat.MediaSourceFixtures
+
+ describe "GET / when testing onboarding" do
+ test "sets the onboarding session to true when onboarding", %{conn: conn} do
+ conn = get(conn, ~p"/")
+ assert get_session(conn, :onboarding)
+ end
+
+ test "displays the onboarding page when no media profiles exist", %{conn: conn} do
+ conn = get(conn, ~p"/")
+ assert html_response(conn, 200) =~ "Welcome to Pinchflat"
+ end
+
+ test "displays the onboarding page when no sources exist", %{conn: conn} do
+ _ = media_profile_fixture()
+
+ conn = get(conn, ~p"/")
+ assert html_response(conn, 200) =~ "Welcome to Pinchflat"
+ end
+
+ test "displays the onboarding page when onboarding is forced", %{conn: conn} do
+ _ = media_profile_fixture()
+ _ = source_fixture()
+
+ conn = get(conn, ~p"/?onboarding=1")
+ assert html_response(conn, 200) =~ "Welcome to Pinchflat"
+ end
+
+ test "sets the onboarding session to false when not onboarding", %{conn: conn} do
+ conn = get(conn, ~p"/")
+ assert get_session(conn, :onboarding)
+
+ _ = media_profile_fixture()
+ _ = source_fixture()
+
+ conn = get(conn, ~p"/")
+ refute get_session(conn, :onboarding)
+ end
+
+ test "displays the home page when not onboarding", %{conn: conn} do
+ _ = media_profile_fixture()
+ _ = source_fixture()
+
+ conn = get(conn, ~p"/")
+ assert html_response(conn, 200) =~ "MENU"
+ end
end
end
diff --git a/test/pinchflat_web/controllers/source_controller_test.exs b/test/pinchflat_web/controllers/source_controller_test.exs
index 9f3e2bd..872bee3 100644
--- a/test/pinchflat_web/controllers/source_controller_test.exs
+++ b/test/pinchflat_web/controllers/source_controller_test.exs
@@ -38,6 +38,15 @@ defmodule PinchflatWeb.SourceControllerTest do
conn = get(conn, ~p"/sources/new")
assert html_response(conn, 200) =~ "New Source"
end
+
+ test "renders correct layout when onboarding", %{session_conn: session_conn} do
+ session_conn =
+ session_conn
+ |> put_session(:onboarding, true)
+ |> get(~p"/sources/new")
+
+ refute html_response(session_conn, 200) =~ "MENU"
+ end
end
describe "create source" do
@@ -56,6 +65,26 @@ defmodule PinchflatWeb.SourceControllerTest do
conn = post(conn, ~p"/sources", source: invalid_attrs)
assert html_response(conn, 200) =~ "New Source"
end
+
+ test "redirects to onboarding when onboarding", %{session_conn: session_conn, create_attrs: create_attrs} do
+ expect(YtDlpRunnerMock, :run, 1, &runner_function_mock/3)
+
+ session_conn =
+ session_conn
+ |> put_session(:onboarding, true)
+ |> post(~p"/sources", source: create_attrs)
+
+ assert redirected_to(session_conn) == ~p"/?onboarding=1"
+ end
+
+ test "renders correct layout on error when onboarding", %{session_conn: session_conn, invalid_attrs: invalid_attrs} do
+ session_conn =
+ session_conn
+ |> put_session(:onboarding, true)
+ |> post(~p"/sources", source: invalid_attrs)
+
+ refute html_response(session_conn, 200) =~ "MENU"
+ end
end
describe "edit source" do
diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex
index ff478a0..1408762 100644
--- a/test/support/conn_case.ex
+++ b/test/support/conn_case.ex
@@ -34,6 +34,10 @@ defmodule PinchflatWeb.ConnCase do
setup tags do
Pinchflat.DataCase.setup_sandbox(tags)
- {:ok, conn: Phoenix.ConnTest.build_conn()}
+
+ conn = Phoenix.ConnTest.build_conn()
+ session_conn = Plug.Test.init_test_session(conn, %{})
+
+ {:ok, conn: conn, session_conn: session_conn}
end
end