mirror of
https://github.com/wanderer-industries/wanderer
synced 2026-05-01 15:00:31 +00:00
270 lines
7.8 KiB
Elixir
270 lines
7.8 KiB
Elixir
defmodule WandererApp.Map.Operations.SystemsTest do
|
|
use WandererApp.DataCase
|
|
|
|
alias WandererApp.Map.Operations.Systems
|
|
alias WandererApp.MapTestHelpers
|
|
alias WandererAppWeb.Factory
|
|
|
|
describe "parameter validation" do
|
|
test "validates missing connection assigns for create_system" do
|
|
conn = %{assigns: %{}}
|
|
attrs = %{"solar_system_id" => "30000142"}
|
|
|
|
result = Systems.create_system(conn, attrs)
|
|
assert {:error, :missing_params} = result
|
|
end
|
|
|
|
test "validates missing connection assigns for update_system" do
|
|
conn = %{assigns: %{}}
|
|
attrs = %{"position_x" => "150"}
|
|
|
|
result = Systems.update_system(conn, 30_000_142, attrs)
|
|
assert {:error, :missing_params} = result
|
|
end
|
|
|
|
test "validates missing connection assigns for delete_system" do
|
|
conn = %{assigns: %{}}
|
|
|
|
result = Systems.delete_system(conn, 30_000_142)
|
|
assert {:error, :missing_params} = result
|
|
end
|
|
|
|
test "validates missing connection assigns for upsert_systems_and_connections" do
|
|
conn = %{assigns: %{}}
|
|
systems = []
|
|
connections = []
|
|
|
|
result = Systems.upsert_systems_and_connections(conn, systems, connections)
|
|
assert {:error, :missing_params} = result
|
|
end
|
|
end
|
|
|
|
describe "bulk operations" do
|
|
test "handles empty systems and connections lists" do
|
|
conn = %{
|
|
assigns: %{
|
|
map_id: Ecto.UUID.generate(),
|
|
owner_character_id: "123456789",
|
|
owner_user_id: Ecto.UUID.generate()
|
|
}
|
|
}
|
|
|
|
systems = []
|
|
connections = []
|
|
|
|
MapTestHelpers.expect_map_server_error(fn ->
|
|
result = Systems.upsert_systems_and_connections(conn, systems, connections)
|
|
|
|
case result do
|
|
{:ok, %{systems: %{created: 0, updated: 0}, connections: %{created: 0, updated: 0}}} ->
|
|
:ok
|
|
|
|
# Error is acceptable for testing
|
|
{:error, _} ->
|
|
:ok
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
|
|
describe "core functions with real implementations" do
|
|
test "list_systems/1 function exists and handles map_id parameter" do
|
|
map_id = Ecto.UUID.generate()
|
|
|
|
# Should not crash, actual behavior depends on database state
|
|
result = Systems.list_systems(map_id)
|
|
assert is_list(result)
|
|
end
|
|
|
|
test "get_system/2 function exists and handles parameters" do
|
|
map_id = Ecto.UUID.generate()
|
|
system_id = 30_000_142
|
|
|
|
# Should not crash, actual behavior depends on database state
|
|
result = Systems.get_system(map_id, system_id)
|
|
assert is_tuple(result)
|
|
end
|
|
|
|
test "create_system validates integer solar_system_id parameter" do
|
|
map_id = Ecto.UUID.generate()
|
|
user_id = Ecto.UUID.generate()
|
|
char_id = "123456789"
|
|
|
|
conn = %{
|
|
assigns: %{
|
|
map_id: map_id,
|
|
owner_character_id: char_id,
|
|
owner_user_id: user_id
|
|
}
|
|
}
|
|
|
|
# Test with valid integer string
|
|
params_valid = %{
|
|
"solar_system_id" => "30000142",
|
|
"position_x" => "100",
|
|
"position_y" => "200"
|
|
}
|
|
|
|
# This should not crash on parameter parsing
|
|
MapTestHelpers.expect_map_server_error(fn ->
|
|
result = Systems.create_system(conn, params_valid)
|
|
# Result depends on underlying services, but function should handle the call
|
|
assert is_tuple(result)
|
|
end)
|
|
|
|
# Test with invalid solar_system_id
|
|
params_invalid = %{
|
|
"solar_system_id" => "invalid",
|
|
"position_x" => "100",
|
|
"position_y" => "200"
|
|
}
|
|
|
|
MapTestHelpers.expect_map_server_error(fn ->
|
|
result_invalid = Systems.create_system(conn, params_invalid)
|
|
# Should handle invalid parameter gracefully
|
|
assert is_tuple(result_invalid)
|
|
end)
|
|
end
|
|
|
|
test "update_system handles coordinate parsing" do
|
|
map_id = Ecto.UUID.generate()
|
|
system_id = 30_000_142
|
|
|
|
conn = %{assigns: %{map_id: map_id}}
|
|
|
|
# Test with string coordinates that should parse to integers
|
|
attrs = %{
|
|
"position_x" => "150",
|
|
"position_y" => "250"
|
|
}
|
|
|
|
result = Systems.update_system(conn, system_id, attrs)
|
|
# Function should handle coordinate parsing
|
|
assert is_tuple(result)
|
|
|
|
# Test with invalid coordinates
|
|
attrs_invalid = %{
|
|
"position_x" => "invalid",
|
|
"position_y" => "250"
|
|
}
|
|
|
|
result_invalid = Systems.update_system(conn, system_id, attrs_invalid)
|
|
# Should handle invalid coordinates gracefully
|
|
assert is_tuple(result_invalid)
|
|
end
|
|
|
|
test "delete_system handles system_id parameter" do
|
|
map_id = Ecto.UUID.generate()
|
|
user_id = Ecto.UUID.generate()
|
|
char_id = "123456789"
|
|
system_id = 30_000_142
|
|
|
|
conn = %{
|
|
assigns: %{
|
|
map_id: map_id,
|
|
owner_character_id: char_id,
|
|
owner_user_id: user_id
|
|
}
|
|
}
|
|
|
|
MapTestHelpers.expect_map_server_error(fn ->
|
|
result = Systems.delete_system(conn, system_id)
|
|
# Function should handle the call
|
|
assert is_tuple(result)
|
|
end)
|
|
end
|
|
|
|
test "upsert_systems_and_connections processes empty lists correctly" do
|
|
map_id = Ecto.UUID.generate()
|
|
user_id = Ecto.UUID.generate()
|
|
char_id = "123456789"
|
|
|
|
conn = %{
|
|
assigns: %{
|
|
map_id: map_id,
|
|
owner_character_id: char_id,
|
|
owner_user_id: user_id
|
|
}
|
|
}
|
|
|
|
# Test with non-empty data to exercise more code paths
|
|
systems = [
|
|
%{
|
|
"solar_system_id" => 30_000_142,
|
|
"position_x" => 100,
|
|
"position_y" => 200
|
|
}
|
|
]
|
|
|
|
connections = [
|
|
%{
|
|
"solar_system_source" => 30_000_142,
|
|
"solar_system_target" => 30_000_143
|
|
}
|
|
]
|
|
|
|
MapTestHelpers.expect_map_server_error(fn ->
|
|
result = Systems.upsert_systems_and_connections(conn, systems, connections)
|
|
# Function should process the data and return a result
|
|
assert is_tuple(result)
|
|
|
|
# Verify the result structure when successful
|
|
case result do
|
|
{:ok, %{systems: sys_result, connections: conn_result}} ->
|
|
assert Map.has_key?(sys_result, :created)
|
|
assert Map.has_key?(sys_result, :updated)
|
|
assert Map.has_key?(conn_result, :created)
|
|
assert Map.has_key?(conn_result, :updated)
|
|
|
|
_ ->
|
|
# Other result types are also valid depending on underlying state
|
|
:ok
|
|
end
|
|
end)
|
|
end
|
|
|
|
test "internal helper functions work correctly" do
|
|
# Test coordinate normalization by creating a system with coordinates
|
|
_params_with_coords = %{
|
|
"position_x" => 100,
|
|
"position_y" => 200
|
|
}
|
|
|
|
# Test solar system ID parsing
|
|
system_id_valid = "30000142"
|
|
_system_id_invalid = "invalid"
|
|
|
|
# These are internal functions tested indirectly through public API
|
|
# The main goal is to exercise code paths that use these helpers
|
|
|
|
# Test that functions can handle various input formats
|
|
map_id = Ecto.UUID.generate()
|
|
user_id = Ecto.UUID.generate()
|
|
char_id = "123456789"
|
|
|
|
conn_valid = %{
|
|
assigns: %{
|
|
map_id: map_id,
|
|
owner_character_id: char_id,
|
|
owner_user_id: user_id
|
|
}
|
|
}
|
|
|
|
# This will exercise the fetch_system_id and normalize_coordinates functions
|
|
params_various_formats = [
|
|
%{"solar_system_id" => system_id_valid, "position_x" => 100, "position_y" => 200},
|
|
%{"solar_system_id" => system_id_valid, "position_x" => "150", "position_y" => "250"},
|
|
%{solar_system_id: 30_000_142, position_x: 300, position_y: 400}
|
|
]
|
|
|
|
Enum.each(params_various_formats, fn params ->
|
|
MapTestHelpers.expect_map_server_error(fn ->
|
|
result = Systems.create_system(conn_valid, params)
|
|
# Each call should handle the parameter format
|
|
assert is_tuple(result)
|
|
end)
|
|
end)
|
|
end
|
|
end
|
|
end
|