diff --git a/config/jsonb.exs b/config/jsonb.exs index 6b7bf9b3..0cd2afe4 100644 --- a/config/jsonb.exs +++ b/config/jsonb.exs @@ -9,12 +9,14 @@ config :ex_unit, default_config = [ column_data_type: "jsonb", + metadata_column_data_type: "jsonb", username: "postgres", password: "postgres", database: "eventstore_jsonb_test", hostname: "localhost", pool_size: 1, serializer: EventStore.JsonbSerializer, + metadata_serializer: EventStore.JsonbSerializer, subscription_retry_interval: 1_000, types: EventStore.PostgresTypes ] diff --git a/config/migration.exs b/config/migration.exs index c433d139..ef9bde02 100644 --- a/config/migration.exs +++ b/config/migration.exs @@ -14,6 +14,7 @@ default_config = [ hostname: "localhost", pool_size: 1, serializer: EventStore.JsonSerializer, + metadata_serializer: EventStore.JsonSerializer, subscription_retry_interval: 1_000 ] diff --git a/config/test.exs b/config/test.exs index bd56ca0d..3e7f0bf1 100644 --- a/config/test.exs +++ b/config/test.exs @@ -14,6 +14,7 @@ default_config = [ hostname: "localhost", pool_size: 1, serializer: EventStore.JsonSerializer, + metadata_serializer: EventStore.JsonSerializer, subscription_retry_interval: 1_000 ] diff --git a/lib/event_store.ex b/lib/event_store.ex index 6808dcfe..08270119 100644 --- a/lib/event_store.ex +++ b/lib/event_store.ex @@ -23,6 +23,7 @@ defmodule EventStore do config :my_app, MyApp.EventStore, serializer: EventStore.JsonSerializer, + metadata_serializer: EventStore.JsonSerializer, username: "postgres", password: "postgres", database: "eventstore", @@ -445,6 +446,7 @@ defmodule EventStore do conn = Keyword.fetch!(config, :conn) schema = Keyword.fetch!(config, :schema) serializer = Keyword.fetch!(config, :serializer) + metadata_serializer = Keyword.fetch!(config, :metadata_serializer) with {start_from, opts} <- Keyword.pop(opts, :start_from, :origin), {:ok, start_from} <- Stream.start_from(conn, stream_uuid, start_from, schema: schema) do @@ -459,6 +461,7 @@ defmodule EventStore do event_store: name, schema: schema, serializer: serializer, + metadata_serializer: metadata_serializer, stream_uuid: stream_uuid, subscription_name: subscription_name, start_from: start_from diff --git a/lib/event_store/config.ex b/lib/event_store/config.ex index e247be13..68a8ee24 100644 --- a/lib/event_store/config.ex +++ b/lib/event_store/config.ex @@ -67,6 +67,19 @@ defmodule EventStore.Config do end end + def metadata_column_data_type(event_store, config) do + case Keyword.get(config, :metadata_column_data_type, column_data_type(event_store, config)) do + valid when valid in ["bytea", "jsonb"] -> + valid + + invalid -> + raise ArgumentError, + inspect(event_store) <> + " `:column_data_type` expects either \"bytea\" or \"jsonb\" but got: " <> + inspect(invalid) + end + end + @postgrex_connection_opts [ :username, :password, diff --git a/lib/event_store/config/parser.ex b/lib/event_store/config/parser.ex index 6b112b22..aa4efd4c 100644 --- a/lib/event_store/config/parser.ex +++ b/lib/event_store/config/parser.ex @@ -16,6 +16,7 @@ defmodule EventStore.Config.Parser do |> Keyword.put(:pool, EventStore.Config.get_pool()) |> Keyword.put_new(:schema, "public") |> Keyword.put_new(:column_data_type, "bytea") + |> Keyword.put_new(:metadata_column_data_type, "bytea") |> Keyword.put_new(:enable_hard_deletes, false) end diff --git a/lib/event_store/notifications/publisher.ex b/lib/event_store/notifications/publisher.ex index 1523705a..a61a1ac6 100644 --- a/lib/event_store/notifications/publisher.ex +++ b/lib/event_store/notifications/publisher.ex @@ -12,7 +12,7 @@ defmodule EventStore.Notifications.Publisher do alias EventStore.Notifications.Notification defmodule State do - defstruct [:conn, :event_store, :schema, :serializer, :subscribe_to] + defstruct [:conn, :event_store, :schema, :serializer, :metadata_serializer, :subscribe_to] def new(opts) do %State{ @@ -20,6 +20,7 @@ defmodule EventStore.Notifications.Publisher do event_store: Keyword.fetch!(opts, :event_store), schema: Keyword.fetch!(opts, :schema), serializer: Keyword.fetch!(opts, :serializer), + metadata_serializer: Keyword.fetch!(opts, :metadata_serializer), subscribe_to: Keyword.fetch!(opts, :subscribe_to) } end @@ -62,14 +63,20 @@ defmodule EventStore.Notifications.Publisher do to_stream_version: to_stream_version } = notification - %State{conn: conn, schema: schema, serializer: serializer} = state + %State{ + conn: conn, + schema: schema, + serializer: serializer, + metadata_serializer: metadata_serializer + } = state count = to_stream_version - from_stream_version + 1 try do case Storage.read_stream_forward(conn, stream_id, from_stream_version, count, schema: schema) do {:ok, events} -> - deserialized_events = deserialize_recorded_events(events, serializer) + deserialized_events = + deserialize_recorded_events(events, serializer, metadata_serializer) {stream_uuid, deserialized_events} @@ -87,8 +94,8 @@ defmodule EventStore.Notifications.Publisher do end end - defp deserialize_recorded_events(recorded_events, serializer) do - Enum.map(recorded_events, &RecordedEvent.deserialize(&1, serializer)) + defp deserialize_recorded_events(recorded_events, serializer, metadata_serializer) do + Enum.map(recorded_events, &RecordedEvent.deserialize(&1, serializer, metadata_serializer)) end defp broadcast(event_store, stream_uuid, events) do diff --git a/lib/event_store/notifications/supervisor.ex b/lib/event_store/notifications/supervisor.ex index e276e392..2295dc57 100644 --- a/lib/event_store/notifications/supervisor.ex +++ b/lib/event_store/notifications/supervisor.ex @@ -21,6 +21,7 @@ defmodule EventStore.Notifications.Supervisor do def init({event_store, config}) do schema = Keyword.fetch!(config, :schema) serializer = Keyword.fetch!(config, :serializer) + metadata_serializer = Keyword.get(config, :metadata_serializer, serializer) conn = Keyword.fetch!(config, :conn) listener_name = Module.concat([event_store, Listener]) @@ -51,6 +52,7 @@ defmodule EventStore.Notifications.Supervisor do event_store: event_store, schema: schema, serializer: serializer, + metadata_serializer: metadata_serializer, subscribe_to: listener_name, name: publisher_name, hibernate_after: hibernate_after} diff --git a/lib/event_store/recorded_event.ex b/lib/event_store/recorded_event.ex index f6292792..14856224 100644 --- a/lib/event_store/recorded_event.ex +++ b/lib/event_store/recorded_event.ex @@ -55,13 +55,13 @@ defmodule EventStore.RecordedEvent do :created_at ] - def deserialize(%RecordedEvent{} = recorded_event, serializer) do + def deserialize(%RecordedEvent{} = recorded_event, serializer, metadata_serializer) do %RecordedEvent{data: data, metadata: metadata, event_type: event_type} = recorded_event %RecordedEvent{ recorded_event | data: serializer.deserialize(data, type: event_type), - metadata: serializer.deserialize(metadata, []) + metadata: metadata_serializer.deserialize(metadata, []) } end diff --git a/lib/event_store/serializer.ex b/lib/event_store/serializer.ex index 3d27dea1..8f91bfd0 100644 --- a/lib/event_store/serializer.ex +++ b/lib/event_store/serializer.ex @@ -31,4 +31,19 @@ defmodule EventStore.Serializer do message: "#{inspect(event_store)} configuration expects :serializer to be configured" end end + + @doc """ + Get the metadata serializer module from the given config for the event store. + """ + def metadata_serializer(event_store, config) do + case Keyword.fetch(config, :metadata_serializer) do + {:ok, serializer} -> + serializer + + :error -> + raise ArgumentError, + message: + "#{inspect(event_store)} configuration expects :metadata_serializer to be configured" + end + end end diff --git a/lib/event_store/snapshots/snapshot_data.ex b/lib/event_store/snapshots/snapshot_data.ex index c8bbaeb3..d76f2cd3 100644 --- a/lib/event_store/snapshots/snapshot_data.ex +++ b/lib/event_store/snapshots/snapshot_data.ex @@ -16,23 +16,23 @@ defmodule EventStore.Snapshots.SnapshotData do created_at: DateTime.t() } - def serialize(%SnapshotData{} = snapshot, serializer) do + def serialize(%SnapshotData{} = snapshot, serializer, metadata_serializer) do %SnapshotData{data: data, metadata: metadata} = snapshot %SnapshotData{ snapshot | data: serializer.serialize(data), - metadata: serializer.serialize(metadata) + metadata: metadata_serializer.serialize(metadata) } end - def deserialize(%SnapshotData{} = snapshot, serializer) do + def deserialize(%SnapshotData{} = snapshot, serializer, metadata_serializer) do %SnapshotData{source_type: source_type, data: data, metadata: metadata} = snapshot %SnapshotData{ snapshot | data: serializer.deserialize(data, type: source_type), - metadata: serializer.deserialize(metadata, []) + metadata: metadata_serializer.deserialize(metadata, []) } end end diff --git a/lib/event_store/snapshots/snapshotter.ex b/lib/event_store/snapshots/snapshotter.ex index 0ada96b2..93005c66 100644 --- a/lib/event_store/snapshots/snapshotter.ex +++ b/lib/event_store/snapshots/snapshotter.ex @@ -9,9 +9,10 @@ defmodule EventStore.Snapshots.Snapshotter do """ def read_snapshot(conn, source_uuid, opts) do {serializer, opts} = Keyword.pop(opts, :serializer) + {metadata_serializer, opts} = Keyword.pop(opts, :metadata_serializer, serializer) with {:ok, snapshot} <- Snapshot.read_snapshot(conn, source_uuid, opts) do - deserialized = SnapshotData.deserialize(snapshot, serializer) + deserialized = SnapshotData.deserialize(snapshot, serializer, metadata_serializer) {:ok, deserialized} end @@ -24,8 +25,9 @@ defmodule EventStore.Snapshots.Snapshotter do """ def record_snapshot(conn, %SnapshotData{} = snapshot, opts) do {serializer, opts} = Keyword.pop(opts, :serializer) + {metadata_serializer, opts} = Keyword.pop(opts, :metadata_serializer, serializer) - serialized = SnapshotData.serialize(snapshot, serializer) + serialized = SnapshotData.serialize(snapshot, serializer, metadata_serializer) Snapshot.record_snapshot(conn, serialized, opts) end diff --git a/lib/event_store/sql/init.ex b/lib/event_store/sql/init.ex index e71bfbad..e6257428 100644 --- a/lib/event_store/sql/init.ex +++ b/lib/event_store/sql/init.ex @@ -5,13 +5,14 @@ defmodule EventStore.Sql.Init do def statements(config) do column_data_type = Keyword.fetch!(config, :column_data_type) + metadata_column_data_type = Keyword.fetch!(config, :metadata_column_data_type) schema = Keyword.fetch!(config, :schema) [ "SET LOCAL search_path TO #{schema};", create_streams_table(), create_stream_uuid_index(), - create_events_table(column_data_type), + create_events_table(column_data_type, metadata_column_data_type), create_stream_events_table(), create_stream_events_index(), create_event_store_exception_function(), @@ -26,7 +27,7 @@ defmodule EventStore.Sql.Init do create_event_notification_trigger(), create_subscriptions_table(), create_subscription_index(), - create_snapshots_table(column_data_type), + create_snapshots_table(column_data_type, metadata_column_data_type), create_schema_migrations_table(), record_event_store_schema_version() ] @@ -58,7 +59,7 @@ defmodule EventStore.Sql.Init do """ end - defp create_events_table(column_data_type) do + defp create_events_table(column_data_type, metadata_column_data_type) do """ CREATE TABLE events ( @@ -67,7 +68,7 @@ defmodule EventStore.Sql.Init do causation_id uuid NULL, correlation_id uuid NULL, data #{column_data_type} NOT NULL, - metadata #{column_data_type} NULL, + metadata #{metadata_column_data_type} NULL, created_at timestamp with time zone DEFAULT NOW() NOT NULL ); """ @@ -242,7 +243,7 @@ defmodule EventStore.Sql.Init do """ end - defp create_snapshots_table(column_data_type) do + defp create_snapshots_table(column_data_type, metadata_column_data_type) do """ CREATE TABLE snapshots ( @@ -250,7 +251,7 @@ defmodule EventStore.Sql.Init do source_version bigint NOT NULL, source_type text NOT NULL, data #{column_data_type} NOT NULL, - metadata #{column_data_type} NULL, + metadata #{metadata_column_data_type} NULL, created_at timestamp with time zone DEFAULT NOW() NOT NULL ); """ diff --git a/lib/event_store/streams/stream.ex b/lib/event_store/streams/stream.ex index 7de47ace..e1f319a5 100644 --- a/lib/event_store/streams/stream.ex +++ b/lib/event_store/streams/stream.ex @@ -7,9 +7,19 @@ defmodule EventStore.Streams.Stream do def append_to_stream(conn, stream_uuid, expected_version, events, opts) when length(events) < 1000 do {serializer, new_opts} = Keyword.pop(opts, :serializer) - - with {:ok, stream} <- stream_info(conn, stream_uuid, expected_version, new_opts), - :ok <- do_append_to_storage(conn, stream, events, expected_version, serializer, new_opts) do + {metadata_serializer, nn_opts} = Keyword.pop(new_opts, :metadata_serializer, serializer) + + with {:ok, stream} <- stream_info(conn, stream_uuid, expected_version, nn_opts), + :ok <- + do_append_to_storage( + conn, + stream, + events, + expected_version, + serializer, + metadata_serializer, + nn_opts + ) do :ok end |> maybe_retry_once(conn, stream_uuid, expected_version, events, opts) @@ -17,6 +27,7 @@ defmodule EventStore.Streams.Stream do def append_to_stream(conn, stream_uuid, expected_version, events, opts) do {serializer, new_opts} = Keyword.pop(opts, :serializer) + {metadata_serializer, nn_opts} = Keyword.pop(new_opts, :metadata_serializer) transaction( conn, @@ -29,7 +40,8 @@ defmodule EventStore.Streams.Stream do events, expected_version, serializer, - new_opts + metadata_serializer, + nn_opts ) do :ok else @@ -143,18 +155,19 @@ defmodule EventStore.Streams.Stream do events, expected_version, serializer, + metadata_serializer, opts ) do - prepared_events = prepare_events(events, stream, serializer) + prepared_events = prepare_events(events, stream, serializer, metadata_serializer) write_to_stream(conn, prepared_events, stream, expected_version, opts) end - defp prepare_events(events, %StreamInfo{} = stream, serializer) do + defp prepare_events(events, %StreamInfo{} = stream, serializer, metadata_serializer) do %StreamInfo{stream_uuid: stream_uuid, stream_version: stream_version} = stream events - |> Enum.map(&map_to_recorded_event(&1, utc_now(), serializer)) + |> Enum.map(&map_to_recorded_event(&1, utc_now(), serializer, metadata_serializer)) |> Enum.with_index(1) |> Enum.map(fn {recorded_event, index} -> %RecordedEvent{ @@ -168,13 +181,19 @@ defmodule EventStore.Streams.Stream do defp map_to_recorded_event( %EventData{data: %{__struct__: event_type}, event_type: nil} = event, created_at, - serializer + serializer, + metadata_serializer ) do %{event | event_type: Atom.to_string(event_type)} - |> map_to_recorded_event(created_at, serializer) + |> map_to_recorded_event(created_at, serializer, metadata_serializer) end - defp map_to_recorded_event(%EventData{} = event_data, created_at, serializer) do + defp map_to_recorded_event( + %EventData{} = event_data, + created_at, + serializer, + metadata_serializer + ) do %EventData{ event_id: event_id, causation_id: causation_id, @@ -190,7 +209,7 @@ defmodule EventStore.Streams.Stream do correlation_id: correlation_id, event_type: event_type, data: serializer.serialize(data), - metadata: serializer.serialize(metadata), + metadata: metadata_serializer.serialize(metadata), created_at: created_at } end @@ -222,10 +241,12 @@ defmodule EventStore.Streams.Stream do %StreamInfo{stream_id: stream_id} = stream {serializer, opts} = Keyword.pop(opts, :serializer) + {metadata_serializer, opts} = Keyword.pop(opts, :metadata_serializer, serializer) with {:ok, recorded_events} <- Storage.read_stream_forward(conn, stream_id, start_version, count, opts) do - deserialized_events = deserialize_recorded_events(recorded_events, serializer) + deserialized_events = + deserialize_recorded_events(recorded_events, serializer, metadata_serializer) {:ok, deserialized_events} end @@ -235,10 +256,12 @@ defmodule EventStore.Streams.Stream do %StreamInfo{stream_id: stream_id} = stream {serializer, opts} = Keyword.pop(opts, :serializer) + {metadata_serializer, opts} = Keyword.pop(opts, :metadata_serializer, serializer) with {:ok, recorded_events} <- Storage.read_stream_backward(conn, stream_id, start_version, count, opts) do - deserialized_events = deserialize_recorded_events(recorded_events, serializer) + deserialized_events = + deserialize_recorded_events(recorded_events, serializer, metadata_serializer) {:ok, deserialized_events} end @@ -289,8 +312,8 @@ defmodule EventStore.Streams.Stream do ) end - defp deserialize_recorded_events(recorded_events, serializer), - do: Enum.map(recorded_events, &RecordedEvent.deserialize(&1, serializer)) + defp deserialize_recorded_events(recorded_events, serializer, metadata_serializer), + do: Enum.map(recorded_events, &RecordedEvent.deserialize(&1, serializer, metadata_serializer)) defp soft_delete_stream(conn, stream, opts) do %StreamInfo{stream_id: stream_id} = stream diff --git a/lib/event_store/subscriptions/subscription_fsm.ex b/lib/event_store/subscriptions/subscription_fsm.ex index feac27db..1d0a1b59 100644 --- a/lib/event_store/subscriptions/subscription_fsm.ex +++ b/lib/event_store/subscriptions/subscription_fsm.ex @@ -10,13 +10,16 @@ defmodule EventStore.Subscriptions.SubscriptionFsm do require Logger def new(stream_uuid, subscription_name, opts) do + serializer = Keyword.fetch!(opts, :serializer) + new( data: %SubscriptionState{ conn: Keyword.fetch!(opts, :conn), event_store: Keyword.fetch!(opts, :event_store), stream_uuid: stream_uuid, subscription_name: subscription_name, - serializer: Keyword.fetch!(opts, :serializer), + serializer: serializer, + metadata_serializer: Keyword.get(opts, :metadata_serializer, serializer), schema: Keyword.fetch!(opts, :schema), start_from: opts[:start_from] || 0, mapper: opts[:mapper], @@ -456,6 +459,7 @@ defmodule EventStore.Subscriptions.SubscriptionFsm do conn: conn, schema: schema, serializer: serializer, + metadata_serializer: metadata_serializer, stream_uuid: stream_uuid, last_sent: last_sent, max_size: max_size @@ -463,7 +467,8 @@ defmodule EventStore.Subscriptions.SubscriptionFsm do Stream.read_stream_forward(conn, stream_uuid, last_sent + 1, max_size, schema: schema, - serializer: serializer + serializer: serializer, + metadata_serializer: metadata_serializer ) end diff --git a/lib/event_store/subscriptions/subscription_state.ex b/lib/event_store/subscriptions/subscription_state.ex index dfc29fa6..63872616 100644 --- a/lib/event_store/subscriptions/subscription_state.ex +++ b/lib/event_store/subscriptions/subscription_state.ex @@ -8,6 +8,7 @@ defmodule EventStore.Subscriptions.SubscriptionState do :conn, :event_store, :serializer, + :metadata_serializer, :schema, :stream_uuid, :start_from, diff --git a/lib/event_store/supervisor.ex b/lib/event_store/supervisor.ex index c1f0e140..8a1a8261 100644 --- a/lib/event_store/supervisor.ex +++ b/lib/event_store/supervisor.ex @@ -111,14 +111,18 @@ defmodule EventStore.Supervisor do defp validate_config!(event_store, name, config) do conn = postgrex_conn(name, config) column_data_type = Config.column_data_type(event_store, config) + metadata_column_data_type = Config.metadata_column_data_type(event_store, config) serializer = Serializer.serializer(event_store, config) + metadata_serializer = Serializer.metadata_serializer(event_store, config) subscription_retry_interval = Subscriptions.retry_interval(event_store, config) subscription_hibernate_after = Subscriptions.hibernate_after(event_store, config) Keyword.merge(config, conn: conn, column_data_type: column_data_type, + metadata_column_data_type: metadata_column_data_type, serializer: serializer, + metadata_serializer: metadata_serializer, subscription_retry_interval: subscription_retry_interval, subscription_hibernate_after: subscription_hibernate_after ) diff --git a/test/config_test.exs b/test/config_test.exs index 0d7a509b..c59f7068 100644 --- a/test/config_test.exs +++ b/test/config_test.exs @@ -17,6 +17,7 @@ defmodule EventStore.ConfigTest do assert Config.parse(config) == [ enable_hard_deletes: false, + metadata_column_data_type: "bytea", column_data_type: "bytea", pool: EventStore.Config.get_pool(), timeout: 120_000, @@ -41,6 +42,7 @@ defmodule EventStore.ConfigTest do assert Config.parse(config) == [ enable_hard_deletes: false, + metadata_column_data_type: "bytea", column_data_type: "bytea", schema: "public", pool: EventStore.Config.get_pool(), @@ -63,6 +65,7 @@ defmodule EventStore.ConfigTest do assert Config.parse(config) == [ enable_hard_deletes: false, + metadata_column_data_type: "bytea", column_data_type: "bytea", schema: "public", pool: EventStore.Config.get_pool(), @@ -86,6 +89,7 @@ defmodule EventStore.ConfigTest do assert Config.parse(config) == [ enable_hard_deletes: false, + metadata_column_data_type: "bytea", column_data_type: "bytea", schema: "public", pool: EventStore.Config.get_pool(), @@ -103,6 +107,7 @@ defmodule EventStore.ConfigTest do assert Config.parse(config) == [ enable_hard_deletes: false, + metadata_column_data_type: "bytea", column_data_type: "bytea", schema: "public", pool: EventStore.Config.get_pool(), @@ -121,6 +126,7 @@ defmodule EventStore.ConfigTest do assert Config.parse(config) == [ enable_hard_deletes: false, + metadata_column_data_type: "bytea", column_data_type: "bytea", schema: "public", pool: EventStore.Config.get_pool(), @@ -142,6 +148,7 @@ defmodule EventStore.ConfigTest do assert Config.parse(config) == [ enable_hard_deletes: false, + metadata_column_data_type: "bytea", column_data_type: "bytea", schema: "public", pool: EventStore.Config.get_pool(), @@ -174,6 +181,7 @@ defmodule EventStore.ConfigTest do assert Config.parse(config) == [ enable_hard_deletes: false, + metadata_column_data_type: "bytea", column_data_type: "bytea", schema: "public", pool: EventStore.Config.get_pool(), @@ -192,6 +200,7 @@ defmodule EventStore.ConfigTest do assert Config.parse(config) == [ enable_hard_deletes: false, + metadata_column_data_type: "bytea", column_data_type: "bytea", schema: "public", pool: EventStore.Config.get_pool(), diff --git a/test/runtime_config_test.exs b/test/runtime_config_test.exs index a6048234..5579612b 100644 --- a/test/runtime_config_test.exs +++ b/test/runtime_config_test.exs @@ -71,7 +71,8 @@ defmodule EventStore.RuntimeConfigTest do password: "postgres", database: "eventstore_test", hostname: "localhost", - serializer: EventStore.JsonSerializer + serializer: EventStore.JsonSerializer, + metadata_serializer: EventStore.JsonSerializer ] assert {:ok, _pid} = start_supervised({RuntimeConfiguredEventStore, config}) @@ -81,6 +82,7 @@ defmodule EventStore.RuntimeConfigTest do defp with_defaults(config) do config |> Keyword.put_new(:column_data_type, "bytea") + |> Keyword.put_new(:metadata_column_data_type, "bytea") |> Keyword.put_new(:enable_hard_deletes, false) |> Keyword.put_new(:otp_app, :eventstore) |> Keyword.put_new(:pool, DBConnection.ConnectionPool) diff --git a/test/support/storage_case.ex b/test/support/storage_case.ex index 2b465819..8280d2c9 100644 --- a/test/support/storage_case.ex +++ b/test/support/storage_case.ex @@ -8,6 +8,7 @@ defmodule EventStore.StorageCase do setup_all do config = Config.parsed(@event_store, :eventstore) serializer = Serializer.serializer(@event_store, config) + metadata_serializer = Serializer.metadata_serializer(@event_store, config) postgrex_config = Config.default_postgrex_opts(config) if Mix.env() == :migration do @@ -24,7 +25,8 @@ defmodule EventStore.StorageCase do schema: "public", event_store: @event_store, postgrex_config: postgrex_config, - serializer: serializer + serializer: serializer, + metadata_serializer: metadata_serializer ] end