mirror of
https://github.com/livebook-dev/livebook.git
synced 2025-10-08 20:46:16 +08:00
Home tests (#118)
* Test forking existing session * Test session deletion * Fix capitalization
This commit is contained in:
parent
0983a9df77
commit
de83020d05
4 changed files with 52 additions and 30 deletions
|
@ -31,6 +31,6 @@ defmodule LivebookWeb.DeleteSessionComponent do
|
||||||
@impl true
|
@impl true
|
||||||
def handle_event("delete", %{}, socket) do
|
def handle_event("delete", %{}, socket) do
|
||||||
SessionSupervisor.delete_session(socket.assigns.session_summary.session_id)
|
SessionSupervisor.delete_session(socket.assigns.session_summary.session_id)
|
||||||
{:noreply, push_redirect(socket, to: socket.assigns.return_to)}
|
{:noreply, push_patch(socket, to: socket.assigns.return_to)}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -38,7 +38,7 @@ defmodule LivebookWeb.HomeLive do
|
||||||
</div>
|
</div>
|
||||||
<button class="button button-blue"
|
<button class="button button-blue"
|
||||||
phx-click="new">
|
phx-click="new">
|
||||||
New Notebook
|
New notebook
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="w-full h-80">
|
<div class="w-full h-80">
|
||||||
|
@ -70,7 +70,7 @@ defmodule LivebookWeb.HomeLive do
|
||||||
</div>
|
</div>
|
||||||
<div class="w-full py-12">
|
<div class="w-full py-12">
|
||||||
<h3 class="text-xl font-semibold text-gray-800 mb-5">
|
<h3 class="text-xl font-semibold text-gray-800 mb-5">
|
||||||
Running Sessions
|
Running sessions
|
||||||
</h3>
|
</h3>
|
||||||
<%= if @session_summaries == [] do %>
|
<%= if @session_summaries == [] do %>
|
||||||
<div class="p-5 flex space-x-4 items-center border border-gray-200 rounded-lg">
|
<div class="p-5 flex space-x-4 items-center border border-gray-200 rounded-lg">
|
||||||
|
@ -80,7 +80,7 @@ defmodule LivebookWeb.HomeLive do
|
||||||
<div class="text-gray-600">
|
<div class="text-gray-600">
|
||||||
You do not have any running sessions.
|
You do not have any running sessions.
|
||||||
<br>
|
<br>
|
||||||
Please create a new one by clicking <span class="font-semibold">“New Notebook”</span>
|
Please create a new one by clicking <span class="font-semibold">“New notebook”</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<% else %>
|
<% else %>
|
||||||
|
@ -125,6 +125,12 @@ defmodule LivebookWeb.HomeLive do
|
||||||
create_session(socket, notebook: notebook, path: socket.assigns.path)
|
create_session(socket, notebook: notebook, path: socket.assigns.path)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def handle_event("fork_session", %{"id" => session_id}, socket) do
|
||||||
|
data = Session.get_data(session_id)
|
||||||
|
notebook = %{data.notebook | name: data.notebook.name <> " - fork"}
|
||||||
|
create_session(socket, notebook: notebook)
|
||||||
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({:session_created, id}, socket) do
|
def handle_info({:session_created, id}, socket) do
|
||||||
summary = Session.get_summary(id)
|
summary = Session.get_summary(id)
|
||||||
|
@ -137,12 +143,6 @@ defmodule LivebookWeb.HomeLive do
|
||||||
{:noreply, assign(socket, session_summaries: session_summaries)}
|
{:noreply, assign(socket, session_summaries: session_summaries)}
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle_info({:fork_session, id}, socket) do
|
|
||||||
data = Session.get_data(id)
|
|
||||||
notebook = %{data.notebook | name: data.notebook.name <> " - fork"}
|
|
||||||
create_session(socket, notebook: notebook)
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_info(_message, socket), do: {:noreply, socket}
|
def handle_info(_message, socket), do: {:noreply, socket}
|
||||||
|
|
||||||
defp default_path(), do: File.cwd!() <> "/"
|
defp default_path(), do: File.cwd!() <> "/"
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
defmodule LivebookWeb.SessionsComponent do
|
defmodule LivebookWeb.SessionsComponent do
|
||||||
use LivebookWeb, :live_component
|
use LivebookWeb, :live_component
|
||||||
|
|
||||||
alias Livebook.SessionSupervisor
|
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def render(assigns) do
|
def render(assigns) do
|
||||||
~L"""
|
~L"""
|
||||||
<div class="flex flex-col space-y-4">
|
<div class="flex flex-col space-y-4">
|
||||||
<%= for summary <- @session_summaries do %>
|
<%= for summary <- @session_summaries do %>
|
||||||
<div class="p-5 flex items-center border border-gray-200 rounded-lg">
|
<div class="p-5 flex items-center border border-gray-200 rounded-lg"
|
||||||
|
data-test-session-id="<%= summary.session_id %>">
|
||||||
<div class="flex-grow flex flex-col space-y-1">
|
<div class="flex-grow flex flex-col space-y-1">
|
||||||
<%= live_redirect summary.notebook_name, to: Routes.session_path(@socket, :page, summary.session_id),
|
<%= live_redirect summary.notebook_name, to: Routes.session_path(@socket, :page, summary.session_id),
|
||||||
class: "font-semibold text-gray-800 hover:text-gray-900" %>
|
class: "font-semibold text-gray-800 hover:text-gray-900" %>
|
||||||
|
@ -23,8 +22,7 @@ defmodule LivebookWeb.SessionsComponent do
|
||||||
<div class="absolute right-0 z-20 rounded-lg shadow-center bg-white flex flex-col py-2" data-element="menu">
|
<div class="absolute right-0 z-20 rounded-lg shadow-center bg-white flex flex-col py-2" data-element="menu">
|
||||||
<button class="flex space-x-3 px-5 py-2 items-center text-gray-500 hover:bg-gray-50"
|
<button class="flex space-x-3 px-5 py-2 items-center text-gray-500 hover:bg-gray-50"
|
||||||
phx-click="fork_session"
|
phx-click="fork_session"
|
||||||
phx-value-id="<%= summary.session_id %>"
|
phx-value-id="<%= summary.session_id %>">
|
||||||
phx-target="<%= @myself %>">
|
|
||||||
<%= remix_icon("git-branch-line") %>
|
<%= remix_icon("git-branch-line") %>
|
||||||
<span class="font-medium">Fork</span>
|
<span class="font-medium">Fork</span>
|
||||||
</button>
|
</button>
|
||||||
|
@ -40,15 +38,4 @@ defmodule LivebookWeb.SessionsComponent do
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
|
||||||
def handle_event("delete_session", %{"id" => session_id}, socket) do
|
|
||||||
SessionSupervisor.delete_session(session_id)
|
|
||||||
{:noreply, socket}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event("fork_session", %{"id" => session_id}, socket) do
|
|
||||||
send(self(), {:fork_session, session_id})
|
|
||||||
{:noreply, socket}
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,12 +3,12 @@ defmodule LivebookWeb.HomeLiveTest do
|
||||||
|
|
||||||
import Phoenix.LiveViewTest
|
import Phoenix.LiveViewTest
|
||||||
|
|
||||||
alias Livebook.SessionSupervisor
|
alias Livebook.{SessionSupervisor, Session}
|
||||||
|
|
||||||
test "disconnected and connected render", %{conn: conn} do
|
test "disconnected and connected render", %{conn: conn} do
|
||||||
{:ok, view, disconnected_html} = live(conn, "/")
|
{:ok, view, disconnected_html} = live(conn, "/")
|
||||||
assert disconnected_html =~ "Running Sessions"
|
assert disconnected_html =~ "Running sessions"
|
||||||
assert render(view) =~ "Running Sessions"
|
assert render(view) =~ "Running sessions"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "redirects to session upon creation", %{conn: conn} do
|
test "redirects to session upon creation", %{conn: conn} do
|
||||||
|
@ -16,7 +16,7 @@ defmodule LivebookWeb.HomeLiveTest do
|
||||||
|
|
||||||
assert {:error, {:live_redirect, %{to: to}}} =
|
assert {:error, {:live_redirect, %{to: to}}} =
|
||||||
view
|
view
|
||||||
|> element("button", "New Notebook")
|
|> element("button", "New notebook")
|
||||||
|> render_click()
|
|> render_click()
|
||||||
|
|
||||||
assert to =~ "/sessions/"
|
assert to =~ "/sessions/"
|
||||||
|
@ -99,6 +99,41 @@ defmodule LivebookWeb.HomeLiveTest do
|
||||||
SessionSupervisor.delete_session(id)
|
SessionSupervisor.delete_session(id)
|
||||||
refute render(view) =~ id
|
refute render(view) =~ id
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "allows forking existing session", %{conn: conn} do
|
||||||
|
{:ok, id} = SessionSupervisor.create_session()
|
||||||
|
Session.set_notebook_name(id, "My notebook")
|
||||||
|
|
||||||
|
{:ok, view, _} = live(conn, "/")
|
||||||
|
|
||||||
|
assert {:error, {:live_redirect, %{to: to}}} =
|
||||||
|
view
|
||||||
|
|> element(~s{[data-test-session-id="#{id}"] button}, "Fork")
|
||||||
|
|> render_click()
|
||||||
|
|
||||||
|
assert to =~ "/sessions/"
|
||||||
|
|
||||||
|
{:ok, view, _} = live(conn, to)
|
||||||
|
assert render(view) =~ "My notebook - fork"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "allows deleting session after confirmation", %{conn: conn} do
|
||||||
|
{:ok, id} = SessionSupervisor.create_session()
|
||||||
|
|
||||||
|
{:ok, view, _} = live(conn, "/")
|
||||||
|
|
||||||
|
assert render(view) =~ id
|
||||||
|
|
||||||
|
view
|
||||||
|
|> element(~s{[data-test-session-id="#{id}"] a}, "Delete")
|
||||||
|
|> render_click()
|
||||||
|
|
||||||
|
view
|
||||||
|
|> element(~s{button}, "Delete session")
|
||||||
|
|> render_click()
|
||||||
|
|
||||||
|
refute render(view) =~ id
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Helpers
|
# Helpers
|
||||||
|
|
Loading…
Add table
Reference in a new issue