Packages

A compact serialization library for Elixir using context-scoped schema registries. Eliminates global index collisions while maintaining wire format compatibility.

Current section

Files

Jump to
elixir_proto lib elixir_proto schema_registry_test.exs
Raw

lib/elixir_proto/schema_registry_test.exs

defmodule ElixirProto.SchemaRegistryTest do
use ExUnit.Case, async: false
alias ElixirProto.SchemaRegistry
setup do
# Reset registry for each test
SchemaRegistry.reset!()
:ok
end
describe "schema index registration" do
test "force registers schemas with explicit indices" do
SchemaRegistry.force_register_index("user.schema", 1)
SchemaRegistry.force_register_index("post.schema", 2)
SchemaRegistry.force_register_index("comment.schema", 3)
assert SchemaRegistry.get_index("user.schema") == 1
assert SchemaRegistry.get_index("post.schema") == 2
assert SchemaRegistry.get_index("comment.schema") == 3
end
test "returns existing index for already registered schemas" do
SchemaRegistry.force_register_index("test.schema", 5)
index = SchemaRegistry.get_index("test.schema")
assert index == 5
end
test "get_index returns correct index for schema name" do
SchemaRegistry.force_register_index("test.schema", 42)
expected_index = SchemaRegistry.get_index("test.schema")
assert expected_index == 42
end
end
describe "get_name/1" do
test "returns schema name for valid index" do
SchemaRegistry.force_register_index("test.schema", 7)
index = SchemaRegistry.get_index("test.schema")
assert SchemaRegistry.get_name(index) == "test.schema"
end
test "returns nil for unknown index" do
assert SchemaRegistry.get_name(999) == nil
end
end
describe "get_index/1" do
test "returns nil for unknown schema" do
assert SchemaRegistry.get_index("unknown.schema") == nil
end
end
describe "list_schemas/0" do
test "lists all registered schemas" do
SchemaRegistry.force_register_index("user.schema", 1)
SchemaRegistry.force_register_index("post.schema", 2)
schemas = SchemaRegistry.list_schemas()
assert Map.get(schemas, "user.schema") == 1
assert Map.get(schemas, "post.schema") == 2
end
end
describe "reset!/0" do
test "clears all registered schemas" do
SchemaRegistry.force_register_index("test.schema", 1)
assert SchemaRegistry.get_index("test.schema") == 1
SchemaRegistry.reset!()
assert SchemaRegistry.get_index("test.schema") == nil
end
end
describe "stats/0" do
test "returns registry statistics" do
SchemaRegistry.force_register_index("test1.schema", 1)
SchemaRegistry.force_register_index("test2.schema", 2)
stats = SchemaRegistry.stats()
assert stats.total_schemas == 2
# next_available_id should be higher than max registered index
assert stats.next_available_id >= 3
assert Map.get(stats.schemas, "test1.schema") == 1
SchemaRegistry.force_register_index("different.schema", 10)
stats = SchemaRegistry.stats()
assert stats.next_available_id >= 11
end
end
describe "export_registry/0 and import_registry/1" do
test "exports and imports registry data" do
SchemaRegistry.force_register_index("persistent.schema", 1)
index = SchemaRegistry.get_index("persistent.schema")
# Export
export_data = SchemaRegistry.export_registry()
assert Map.get(export_data.registry, "persistent.schema") == index
assert export_data.next_id > 1
assert is_struct(export_data.exported_at, DateTime)
# Reset and import
SchemaRegistry.reset!()
assert SchemaRegistry.get_index("persistent.schema") == nil
SchemaRegistry.import_registry(export_data)
assert SchemaRegistry.get_index("persistent.schema") == index
end
end
describe "force_register_index/2" do
test "registers schema with specific index" do
SchemaRegistry.force_register_index("custom.schema", 42)
assert SchemaRegistry.get_index("custom.schema") == 42
assert SchemaRegistry.get_name(42) == "custom.schema"
end
test "updates next_id when registering high index" do
SchemaRegistry.force_register_index("high.schema", 100)
stats = SchemaRegistry.stats()
assert stats.next_available_id >= 101
end
test "allows overwriting existing mappings" do
SchemaRegistry.force_register_index("overwrite.schema", 1)
assert SchemaRegistry.get_index("overwrite.schema") == 1
SchemaRegistry.force_register_index("overwrite.schema", 2)
assert SchemaRegistry.get_index("overwrite.schema") == 2
end
end
end