aprs.me/test/aprsme/devices_seeder_test.exs

84 lines
2.4 KiB
Elixir

defmodule Aprsme.DevicesSeederTest do
use Aprsme.DataCase, async: false
alias Aprsme.Devices
alias Aprsme.DevicesSeeder
alias Aprsme.Repo
setup do
Repo.delete_all(Devices)
:ok
end
describe "seed_from_json/1" do
test "seeds the devices table from the default test JSON file" do
assert {:ok, :seeded} = DevicesSeeder.seed_from_json()
assert Repo.aggregate(Devices, :count) > 0
end
test "returns an error tuple when the file does not exist" do
assert {:error, message} = DevicesSeeder.seed_from_json("nonexistent/file.json")
assert message =~ "Failed to read file"
end
test "returns an error tuple when the JSON is malformed" do
tmp = Path.join(System.tmp_dir!(), "bad_devices_#{System.unique_integer([:positive])}.json")
File.write!(tmp, "{malformed json")
try do
assert {:error, message} = DevicesSeeder.seed_from_json(tmp)
assert message =~ "Failed to decode JSON"
after
File.rm(tmp)
end
end
test "wipes existing devices before seeding" do
Repo.insert!(%Devices{identifier: "TOWIPE", vendor: "v", model: "m"})
assert {:ok, :seeded} = DevicesSeeder.seed_from_json()
assert Repo.get_by(Devices, identifier: "TOWIPE") == nil
end
test "wraps a non-list features value into a single-element list" do
tmp = Path.join(System.tmp_dir!(), "single_feature_#{System.unique_integer([:positive])}.json")
File.write!(
tmp,
Jason.encode!(%{
"tocalls" => %{
"APSGL" => %{"vendor" => "V", "model" => "M", "features" => "single-feature"}
}
})
)
try do
assert {:ok, :seeded} = DevicesSeeder.seed_from_json(tmp)
dev = Repo.get_by(Devices, identifier: "APSGL")
assert dev.features == ["single-feature"]
after
File.rm(tmp)
end
end
test "preserves a list-typed features value as-is" do
tmp = Path.join(System.tmp_dir!(), "list_feature_#{System.unique_integer([:positive])}.json")
File.write!(
tmp,
Jason.encode!(%{
"tocalls" => %{
"APLST" => %{"vendor" => "V", "model" => "M", "features" => ["a", "b"]}
}
})
)
try do
assert {:ok, :seeded} = DevicesSeeder.seed_from_json(tmp)
dev = Repo.get_by(Devices, identifier: "APLST")
assert dev.features == ["a", "b"]
after
File.rm(tmp)
end
end
end
end