mirror of
https://github.com/livebook-dev/livebook.git
synced 2025-03-03 18:35:41 +08:00
Normalize textarea newlines (#402)
* Normalize textarea newlines * Add test
This commit is contained in:
parent
579fe821ef
commit
c674a0ec5d
2 changed files with 34 additions and 10 deletions
|
@ -432,6 +432,10 @@ defmodule LivebookWeb.SessionLive do
|
|||
end
|
||||
|
||||
def handle_event("set_cell_value", %{"cell_id" => cell_id, "value" => value}, socket) do
|
||||
# The browser may normalize newlines to \r\n, but we want \n
|
||||
# to more closely imitate an actual shell
|
||||
value = String.replace(value, "\r\n", "\n")
|
||||
|
||||
Session.set_cell_attributes(socket.assigns.session_id, cell_id, %{value: value})
|
||||
|
||||
{:noreply, socket}
|
||||
|
|
|
@ -52,14 +52,14 @@ defmodule LivebookWeb.SessionLiveTest do
|
|||
|
||||
{:ok, view, _} = live(conn, "/sessions/#{session_id}")
|
||||
|
||||
cell_id = insert_cell(session_id, section_id, :markdown)
|
||||
cell_id = insert_text_cell(session_id, section_id, :markdown)
|
||||
|
||||
assert render(view) =~ cell_id
|
||||
end
|
||||
|
||||
test "un-renders a deleted cell", %{conn: conn, session_id: session_id} do
|
||||
section_id = insert_section(session_id)
|
||||
cell_id = insert_cell(session_id, section_id, :markdown)
|
||||
cell_id = insert_text_cell(session_id, section_id, :markdown)
|
||||
|
||||
{:ok, view, _} = live(conn, "/sessions/#{session_id}")
|
||||
|
||||
|
@ -96,7 +96,7 @@ defmodule LivebookWeb.SessionLiveTest do
|
|||
|
||||
test "queueing cell evaluation", %{conn: conn, session_id: session_id} do
|
||||
section_id = insert_section(session_id)
|
||||
cell_id = insert_cell(session_id, section_id, :elixir, "Process.sleep(10)")
|
||||
cell_id = insert_text_cell(session_id, section_id, :elixir, "Process.sleep(10)")
|
||||
|
||||
{:ok, view, _} = live(conn, "/sessions/#{session_id}")
|
||||
|
||||
|
@ -110,7 +110,7 @@ defmodule LivebookWeb.SessionLiveTest do
|
|||
|
||||
test "cancelling cell evaluation", %{conn: conn, session_id: session_id} do
|
||||
section_id = insert_section(session_id)
|
||||
cell_id = insert_cell(session_id, section_id, :elixir, "Process.sleep(2000)")
|
||||
cell_id = insert_text_cell(session_id, section_id, :elixir, "Process.sleep(2000)")
|
||||
|
||||
{:ok, view, _} = live(conn, "/sessions/#{session_id}")
|
||||
|
||||
|
@ -128,7 +128,7 @@ defmodule LivebookWeb.SessionLiveTest do
|
|||
|
||||
test "inserting a cell below the given cell", %{conn: conn, session_id: session_id} do
|
||||
section_id = insert_section(session_id)
|
||||
cell_id = insert_cell(session_id, section_id, :elixir)
|
||||
cell_id = insert_text_cell(session_id, section_id, :elixir)
|
||||
|
||||
{:ok, view, _} = live(conn, "/sessions/#{session_id}")
|
||||
|
||||
|
@ -142,7 +142,7 @@ defmodule LivebookWeb.SessionLiveTest do
|
|||
|
||||
test "inserting a cell above the given cell", %{conn: conn, session_id: session_id} do
|
||||
section_id = insert_section(session_id)
|
||||
cell_id = insert_cell(session_id, section_id, :elixir)
|
||||
cell_id = insert_text_cell(session_id, section_id, :elixir)
|
||||
|
||||
{:ok, view, _} = live(conn, "/sessions/#{session_id}")
|
||||
|
||||
|
@ -156,7 +156,7 @@ defmodule LivebookWeb.SessionLiveTest do
|
|||
|
||||
test "deleting the given cell", %{conn: conn, session_id: session_id} do
|
||||
section_id = insert_section(session_id)
|
||||
cell_id = insert_cell(session_id, section_id, :elixir)
|
||||
cell_id = insert_text_cell(session_id, section_id, :elixir)
|
||||
|
||||
{:ok, view, _} = live(conn, "/sessions/#{session_id}")
|
||||
|
||||
|
@ -166,6 +166,20 @@ defmodule LivebookWeb.SessionLiveTest do
|
|||
|
||||
assert %{notebook: %{sections: [%{cells: []}]}} = Session.get_data(session_id)
|
||||
end
|
||||
|
||||
test "newlines in input values are normalized", %{conn: conn, session_id: session_id} do
|
||||
section_id = insert_section(session_id)
|
||||
cell_id = insert_input_cell(session_id, section_id)
|
||||
|
||||
{:ok, view, _} = live(conn, "/sessions/#{session_id}")
|
||||
|
||||
view
|
||||
|> element(~s/form[phx-change="set_cell_value"]/)
|
||||
|> render_change(%{"value" => "line\r\nline"})
|
||||
|
||||
assert %{notebook: %{sections: [%{cells: [%{id: ^cell_id, value: "line\nline"}]}]}} =
|
||||
Session.get_data(session_id)
|
||||
end
|
||||
end
|
||||
|
||||
describe "runtime settings" do
|
||||
|
@ -220,7 +234,7 @@ defmodule LivebookWeb.SessionLiveTest do
|
|||
test "replies with nil completion reference when no runtime is started",
|
||||
%{conn: conn, session_id: session_id} do
|
||||
section_id = insert_section(session_id)
|
||||
cell_id = insert_cell(session_id, section_id, :elixir, "Process.sleep(10)")
|
||||
cell_id = insert_text_cell(session_id, section_id, :elixir, "Process.sleep(10)")
|
||||
|
||||
{:ok, view, _} = live(conn, "/sessions/#{session_id}")
|
||||
|
||||
|
@ -234,7 +248,7 @@ defmodule LivebookWeb.SessionLiveTest do
|
|||
test "replies with completion reference and then sends asynchronous response",
|
||||
%{conn: conn, session_id: session_id} do
|
||||
section_id = insert_section(session_id)
|
||||
cell_id = insert_cell(session_id, section_id, :elixir, "Process.sleep(10)")
|
||||
cell_id = insert_text_cell(session_id, section_id, :elixir, "Process.sleep(10)")
|
||||
|
||||
{:ok, runtime} = Livebook.Runtime.Embedded.init()
|
||||
Session.connect_runtime(session_id, runtime)
|
||||
|
@ -364,7 +378,7 @@ defmodule LivebookWeb.SessionLiveTest do
|
|||
section.id
|
||||
end
|
||||
|
||||
defp insert_cell(session_id, section_id, type, content \\ "") do
|
||||
defp insert_text_cell(session_id, section_id, type, content \\ "") do
|
||||
Session.insert_cell(session_id, section_id, 0, type)
|
||||
%{notebook: %{sections: [%{cells: [cell]}]}} = Session.get_data(session_id)
|
||||
|
||||
|
@ -380,6 +394,12 @@ defmodule LivebookWeb.SessionLiveTest do
|
|||
cell.id
|
||||
end
|
||||
|
||||
defp insert_input_cell(session_id, section_id) do
|
||||
Session.insert_cell(session_id, section_id, 0, :input)
|
||||
%{notebook: %{sections: [%{cells: [cell]}]}} = Session.get_data(session_id)
|
||||
cell.id
|
||||
end
|
||||
|
||||
defp create_user_with_name(name) do
|
||||
{:ok, user} = User.new() |> User.change(%{"name" => name})
|
||||
user
|
||||
|
|
Loading…
Reference in a new issue