This repository has been archived on 2023-08-07. You can view files and clone it, but cannot push or open issues or pull requests.
temple/test/temple/ast/components_test.exs

221 lines
5.3 KiB
Elixir

defmodule Temple.Ast.ComponentsTest do
use ExUnit.Case, async: true
alias Temple.Ast.Components
alias Temple.Ast.Slottable
describe "applicable?/1" do
test "runs when using the `c` ast with a block" do
ast =
quote do
c &SomeModule.render/1, foo: :bar do
div do
"hello"
end
end
end
assert Components.applicable?(ast)
end
test "runs when using the `c` ast with an inline block" do
ast =
quote do
c &SomeModule.render/1, foo: :bar do
"hello"
end
end
assert Components.applicable?(ast)
end
test "runs when using the `c` ast without a block" do
ast =
quote do
c &SomeModule.render/1, foo: :bar
end
assert Components.applicable?(ast)
end
end
describe "run/2" do
setup do
[func: quote(do: &SomeModule.render/1)]
end
test "adds a node to the buffer", %{func: func} do
raw_ast =
quote do
c unquote(func) do
aside class: "foobar" do
"I'm a component!"
end
end
end
ast = Components.run(raw_ast)
assert %Components{
function: ^func,
arguments: []
} = ast
end
test "runs when using the `c` ast with an inline block", %{func: func} do
ast =
quote do
c unquote(func), foo: :bar, do: "hello"
end
ast = Components.run(ast)
assert %Components{
function: ^func,
arguments: [foo: :bar]
} = ast
end
test "adds a node to the buffer that takes args", %{func: func} do
raw_ast =
quote do
c unquote(func), foo: :bar do
aside class: "foobar" do
"I'm a component!"
end
end
end
ast = Components.run(raw_ast)
assert %Components{
function: ^func,
arguments: [foo: :bar]
} = ast
end
test "adds a node to the buffer that without a block", %{func: func} do
raw_ast =
quote do
c unquote(func), foo: :bar
end
ast = Components.run(raw_ast)
assert %Components{
function: ^func,
arguments: [foo: :bar]
} = ast
end
test "gathers all slots", %{func: func} do
raw_ast =
quote do
c unquote(func), foo: :bar do
slot :foo, let!: %{form: form} do
"in the slot"
end
end
end
ast = Components.run(raw_ast)
assert %Components{
function: ^func,
arguments: [foo: :bar],
slots: [
%Slottable{
name: :foo,
content: [%Temple.Ast.Text{}],
parameter: {:%{}, _, [form: _]}
}
]
} = ast
end
test "slot attributes", %{func: func} do
raw_ast =
quote do
c unquote(func), foo: :bar do
slot :foo, let!: %{form: form}, label: the_label do
"in the slot"
end
end
end
ast = Components.run(raw_ast)
assert %Components{
function: ^func,
arguments: [foo: :bar],
slots: [
%Slottable{
name: :foo,
content: [%Temple.Ast.Text{}],
parameter: {:%{}, _, [form: _]},
attributes: [label: {:the_label, [], Temple.Ast.ComponentsTest}]
}
]
} = ast
end
test "slots should only be assigned to the component root" do
card = quote do: &Card.render/1
footer = quote do: &Card.Footer.render/1
list = quote do: &LinkList.render/1
raw_ast =
quote do
c unquote(card) do
c unquote(footer) do
c unquote(list), socials: @user.socials do
"hello"
slot :foo, let!: %{text: text, url: url} do
a class: "text-blue-500 hover:underline", href: url do
text
end
end
end
end
end
end
ast = Components.run(raw_ast)
assert [
%Slottable{
name: :inner_block,
parameter: nil
}
] = ast.slots
assert %Components{
slots: [
%Slottable{
content: [
%Components{
slots: [
%Slottable{
content: [
%Components{
slots: [
%Slottable{
name: :inner_block
},
%Slottable{
name: :foo
}
]
}
]
}
]
}
]
}
]
} = ast
end
end
end