Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 0 additions & 11 deletions lib/live_debugger/structs/tree_node.ex
Original file line number Diff line number Diff line change
Expand Up @@ -48,17 +48,6 @@ defmodule LiveDebugger.Structs.TreeNode do
end
end

@doc """
Same as `id_from_string/1`, but raises an ArgumentError if the ID is invalid.
"""
@spec id_from_string!(id :: String.t()) :: id()
def id_from_string!(string) do
case id_from_string(string) do
{:ok, id} -> id
:error -> raise ArgumentError, "Invalid ID: #{inspect(string)}"
end
end

@doc """
Adds a child to the parent node.
"""
Expand Down
235 changes: 235 additions & 0 deletions test/structs/lv_process_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,235 @@
defmodule LiveDebugger.Structs.LvProcessTest do
use ExUnit.Case, async: true

import Mox

alias LiveDebugger.Structs.LvProcess

describe "new/2" do
test "creates a new LvProcess struct with the given pid and socket" do
pid = self()

socket = %Phoenix.LiveView.Socket{
id: "socket_id",
root_pid: pid,
parent_pid: nil,
transport_pid: nil,
view: LiveDebuggerTest.TestView,
host_uri: :not_mounted_at_router
}

lv_process = LvProcess.new(pid, socket)

assert %LvProcess{
socket_id: "socket_id",
root_pid: ^pid,
parent_pid: nil,
pid: ^pid,
transport_pid: nil,
module: LiveDebuggerTest.TestView,
nested?: false,
debugger?: false,
embedded?: true
} = lv_process
end
end

describe "new/1" do
test "returns nil if the process is not found" do
LiveDebugger.MockProcessService
|> expect(:state, fn _pid ->
{:error, :not_alive}
end)

assert LvProcess.new(self()) == nil
end

test "returns a new LvProcess struct if the process is found" do
socket_id = "socket_id"
pid = self()
root_pid = pid
parent_pid = nil
transport_pid = nil
module = LiveDebuggerTest.TestView

LiveDebugger.MockProcessService
|> expect(:state, fn _pid ->
{:ok,
LiveDebugger.Fakes.state(
socket_id: socket_id,
root_pid: root_pid,
parent_pid: parent_pid,
transport_pid: transport_pid,
module: module
)}
end)

assert %LvProcess{
socket_id: ^socket_id,
root_pid: ^root_pid,
parent_pid: ^parent_pid,
pid: ^pid,
transport_pid: ^transport_pid,
module: ^module,
nested?: false,
debugger?: false,
embedded?: false
} = LvProcess.new(pid)
end

test "sets embedded? when LiveView process is Embedded Live View" do
socket_id = "socket_id"
pid = self()
root_pid = pid
parent_pid = nil
transport_pid = :c.pid(0, 7, 0)
module = LiveDebuggerTest.TestView

LiveDebugger.MockProcessService
|> expect(:state, fn _pid ->
{:ok,
LiveDebugger.Fakes.state(
socket_id: socket_id,
root_pid: root_pid,
parent_pid: parent_pid,
transport_pid: transport_pid,
module: module,
host_uri: :not_mounted_at_router
)}
end)

assert %LvProcess{
socket_id: ^socket_id,
root_pid: ^root_pid,
parent_pid: ^parent_pid,
pid: ^pid,
transport_pid: ^transport_pid,
module: ^module,
nested?: false,
debugger?: false,
embedded?: true
} = LvProcess.new(pid)
end

test "sets debugger? when LiveView process is LiveDebugger process" do
socket_id = "socket_id"
pid = self()
root_pid = pid
parent_pid = nil
transport_pid = nil
module = LiveDebugger.TestView

LiveDebugger.MockProcessService
|> expect(:state, fn _pid ->
{:ok,
LiveDebugger.Fakes.state(
socket_id: socket_id,
root_pid: root_pid,
parent_pid: parent_pid,
transport_pid: transport_pid,
module: module
)}
end)

assert %LvProcess{
socket_id: ^socket_id,
root_pid: ^root_pid,
parent_pid: ^parent_pid,
pid: ^pid,
transport_pid: ^transport_pid,
module: ^module,
nested?: false,
debugger?: true,
embedded?: false
} = LvProcess.new(pid)
end

test "sets nested? when LiveView process is a Nested Live View" do
socket_id = "socket_id"
pid = :c.pid(0, 0, 1)
parent_pid = :c.pid(0, 0, 0)
root_pid = parent_pid
transport_pid = nil
module = LiveDebuggerTest.TestView

LiveDebugger.MockProcessService
|> expect(:state, fn _pid ->
{:ok,
LiveDebugger.Fakes.state(
socket_id: socket_id,
root_pid: root_pid,
parent_pid: parent_pid,
transport_pid: transport_pid,
module: module
)}
end)

assert %LvProcess{
socket_id: ^socket_id,
root_pid: ^root_pid,
parent_pid: ^parent_pid,
pid: ^pid,
transport_pid: ^transport_pid,
module: ^module,
nested?: true,
debugger?: false,
embedded?: false
} = LvProcess.new(pid)
end
end

describe "parent/1" do
test "returns the parent process of the given LvProcess" do
socket_id = "socket_id"
pid = :c.pid(0, 0, 1)
parent_pid = :c.pid(0, 0, 0)
root_pid = parent_pid
transport_pid = nil
module = LiveDebuggerTest.TestView

LiveDebugger.MockProcessService
|> expect(:state, fn ^parent_pid ->
{:ok,
LiveDebugger.Fakes.state(
socket_id: socket_id,
root_pid: root_pid,
parent_pid: nil,
transport_pid: transport_pid,
module: module
)}
end)

lv_process = %LvProcess{
socket_id: socket_id,
root_pid: root_pid,
parent_pid: parent_pid,
pid: pid,
transport_pid: transport_pid,
module: module,
nested?: true,
debugger?: false,
embedded?: false
}

assert %LvProcess{
pid: ^parent_pid
} = LvProcess.parent(lv_process)
end

test "returns nil if no parent" do
lv_process = %LvProcess{
socket_id: "socket_id",
root_pid: self(),
parent_pid: nil,
pid: self(),
transport_pid: nil,
module: LiveDebuggerTest.TestView,
nested?: false,
debugger?: false,
embedded?: false
}

assert LvProcess.parent(lv_process) == nil
end
end
end
39 changes: 39 additions & 0 deletions test/structs/trace_display_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
defmodule LiveDebugger.Structs.TraceDisplayTest do
use ExUnit.Case, async: true

alias LiveDebugger.Structs.TraceDisplay
alias LiveDebugger.Structs.Trace

@trace %Trace{
id: 1,
module: LiveDebuggerTest.TestView,
function: :handle_event,
arity: 3,
args: ["event", %{"key" => "value"}, %{}],
socket_id: "socket_id",
transport_pid: self(),
pid: self(),
cid: nil,
timestamp: System.system_time(:millisecond)
}

test "from_trace/1 creates a TraceDisplay struct" do
trace = @trace
trace_display = TraceDisplay.from_trace(trace)

assert %TraceDisplay{id: 1, trace: ^trace, render_body?: false} = trace_display
end

test "render_body/1 sets render_body? to true" do
trace_display = %TraceDisplay{
id: 1,
trace: @trace,
render_body?: false,
counter: 0
}

updated_trace_display = TraceDisplay.render_body(trace_display)

assert %TraceDisplay{render_body?: true} = updated_trace_display
end
end
Loading