114 lines
2.8 KiB
Elixir
114 lines
2.8 KiB
Elixir
defmodule SQLTest do
|
|
use ElixirAi.TestCase
|
|
alias ElixirAi.Data.DbHelpers
|
|
|
|
test "converts simple named parameters" do
|
|
query = "SELECT * FROM users WHERE id = $(id) AND email = $(email)"
|
|
|
|
params = %{
|
|
"id" => 10,
|
|
"email" => "test@example.com"
|
|
}
|
|
|
|
assert DbHelpers.named_params_to_positional_params(query, params) ==
|
|
{
|
|
"SELECT * FROM users WHERE id = $1 AND email = $2",
|
|
[10, "test@example.com"]
|
|
}
|
|
end
|
|
|
|
test "reuses positional parameter for repeated named parameter" do
|
|
query = """
|
|
SELECT * FROM users
|
|
WHERE id = $(id)
|
|
OR owner_id = $(id)
|
|
"""
|
|
|
|
params = %{"id" => 42}
|
|
|
|
assert DbHelpers.named_params_to_positional_params(query, params) ==
|
|
{
|
|
"""
|
|
SELECT * FROM users
|
|
WHERE id = $1
|
|
OR owner_id = $1
|
|
""",
|
|
[42]
|
|
}
|
|
end
|
|
|
|
test "assigns parameters in order of first appearance" do
|
|
query = "SELECT * FROM items WHERE category = $(category) AND owner = $(owner)"
|
|
|
|
params = %{
|
|
"owner" => 5,
|
|
"category" => "books"
|
|
}
|
|
|
|
assert DbHelpers.named_params_to_positional_params(query, params) ==
|
|
{
|
|
"SELECT * FROM items WHERE category = $1 AND owner = $2",
|
|
["books", 5]
|
|
}
|
|
end
|
|
|
|
test "handles multiple distinct parameters" do
|
|
query = "INSERT INTO posts(title, body, author_id) VALUES($(title), $(body), $(author))"
|
|
|
|
params = %{
|
|
"title" => "Hello",
|
|
"body" => "World",
|
|
"author" => 7
|
|
}
|
|
|
|
assert DbHelpers.named_params_to_positional_params(query, params) ==
|
|
{
|
|
"INSERT INTO posts(title, body, author_id) VALUES($1, $2, $3)",
|
|
["Hello", "World", 7]
|
|
}
|
|
end
|
|
|
|
test "works when same parameter appears many times" do
|
|
query = """
|
|
SELECT *
|
|
FROM logs
|
|
WHERE user_id = $(user)
|
|
OR editor_id = $(user)
|
|
OR reviewer_id = $(user)
|
|
"""
|
|
|
|
params = %{"user" => 99}
|
|
|
|
assert DbHelpers.named_params_to_positional_params(query, params) ==
|
|
{
|
|
"""
|
|
SELECT *
|
|
FROM logs
|
|
WHERE user_id = $1
|
|
OR editor_id = $1
|
|
OR reviewer_id = $1
|
|
""",
|
|
[99]
|
|
}
|
|
end
|
|
|
|
test "raises if parameter is missing" do
|
|
query = "SELECT * FROM users WHERE id = $(id)"
|
|
|
|
params = %{}
|
|
|
|
assert_raise KeyError, fn ->
|
|
DbHelpers.named_params_to_positional_params(query, params)
|
|
end
|
|
end
|
|
|
|
test "query without named parameters returns unchanged query and empty params" do
|
|
query = "SELECT * FROM users"
|
|
|
|
params = %{}
|
|
|
|
assert DbHelpers.named_params_to_positional_params(query, params) ==
|
|
{"SELECT * FROM users", []}
|
|
end
|
|
end
|