diff --git a/config/test.exs b/config/test.exs index 42a691d443..763e581648 100644 --- a/config/test.exs +++ b/config/test.exs @@ -9,8 +9,17 @@ config :sanbase, available_slugs_module: Sanbase.DirectAvailableSlugs config :sanbase, Sanbase.EventBus, - disable_app_notification_subscriber: true, - disable_user_events_subscriber: true + extra_subscribers: [ + Sanbase.EventBus.NoopSubscriber + ], + disabled_subscribers: [ + Sanbase.EventBus.KafkaExporterSubscriber, + Sanbase.EventBus.BillingEventSubscriber, + Sanbase.EventBus.MetricRegistrySubscriber, + Sanbase.EventBus.NotificationsSubscriber, + Sanbase.EventBus.AppNotificationsSubscriber, + Sanbase.EventBus.UserEventsSubscriber + ] config :sanbase, Sanbase, url: {:system, "SANBASE_URL", ""} diff --git a/lib/sanbase/event_bus/event_bus.ex b/lib/sanbase/event_bus/event_bus.ex index 924bf707f8..d5b45a6f89 100644 --- a/lib/sanbase/event_bus/event_bus.ex +++ b/lib/sanbase/event_bus/event_bus.ex @@ -55,30 +55,35 @@ defmodule Sanbase.EventBus do __MODULE__.AppNotificationsSubscriber ] - @register_at_start_subscribers @subscribers - |> then(fn list -> - if Application.compile_env( - :sanbase, - [Sanbase.EventBus, :disable_app_notification_subscriber] - ) do - List.delete(list, __MODULE__.AppNotificationsSubscriber) - else - list - end - end) - |> then(fn list -> - if Application.compile_env( - :sanbase, - [Sanbase.EventBus, :disable_user_events_subscriber] - ) do - List.delete(list, __MODULE__.UserEventsSubscriber) - else - list - end - end) + @extra_subscribers Application.compile_env( + :sanbase, + [Sanbase.EventBus, :extra_subscribers], + [] + ) + + @disabled_subscribers Application.compile_env( + :sanbase, + [Sanbase.EventBus, :disabled_subscribers], + [] + ) + + # Add the extra to the main @subscribers so they can be started at launch. + # All subscribers are started at launch, but the disabled ones are not + # registered + @subscribers @subscribers ++ @extra_subscribers + + @register_at_start_subscribers @subscribers -- @disabled_subscribers def children(), do: @subscribers + def subscribe_subscriber(subscriber) do + EventBus.subscribe({subscriber, subscriber.topics()}) + end + + def unsubscribe_subscriber(subscriber) do + EventBus.unsubscribe(subscriber) + end + def init() do for topic <- @topics, do: EventBus.register_topic(topic) diff --git a/lib/sanbase/event_bus/noop_subscriber.ex b/lib/sanbase/event_bus/noop_subscriber.ex new file mode 100644 index 0000000000..214eab86fe --- /dev/null +++ b/lib/sanbase/event_bus/noop_subscriber.ex @@ -0,0 +1,24 @@ +defmodule Sanbase.EventBus.NoopSubscriber do + @moduledoc """ + A no-op EventBus subscriber used only in tests. + + Subscribes to all topics so the EventBus does not emit a warning about + topics having no subscribers when the other subscribers are disabled. + """ + use GenServer + + def topics(), do: [".*"] + + def start_link(opts \\ []) do + GenServer.start_link(__MODULE__, opts, name: Keyword.get(opts, :name, __MODULE__)) + end + + def init(opts) do + {:ok, opts} + end + + def process({_topic, _id} = event_shadow) do + spawn(fn -> EventBus.mark_as_completed({__MODULE__, event_shadow}) end) + :ok + end +end diff --git a/test/sanbase/app_notifications/app_notifications_test.exs b/test/sanbase/app_notifications/app_notifications_test.exs index d0b66ecf28..f69e7f3059 100644 --- a/test/sanbase/app_notifications/app_notifications_test.exs +++ b/test/sanbase/app_notifications/app_notifications_test.exs @@ -12,15 +12,12 @@ defmodule Sanbase.AppNotificationsTest do alias Sanbase.Vote setup_all do - # The GenServer is already running (started by supervision tree) - # but not subscribed to EventBus (disabled in test.exs config). - # We only need to subscribe it to EventBus topics. subscriber = Sanbase.EventBus.AppNotificationsSubscriber - EventBus.subscribe({subscriber, subscriber.topics()}) + Sanbase.EventBus.subscribe_subscriber(subscriber) on_exit(fn -> Sanbase.EventBus.drain_topics(subscriber.topics(), 10_000) - EventBus.unsubscribe(subscriber) + Sanbase.EventBus.unsubscribe_subscriber(subscriber) end) end diff --git a/test/sanbase/email/emails_test.exs b/test/sanbase/email/emails_test.exs index fcc369c4fb..30487a1a05 100644 --- a/test/sanbase/email/emails_test.exs +++ b/test/sanbase/email/emails_test.exs @@ -17,6 +17,16 @@ defmodule Sanbase.EmailsTest do setup :set_mox_from_context setup :verify_on_exit! + setup_all do + subscriber = Sanbase.EventBus.BillingEventSubscriber + Sanbase.EventBus.subscribe_subscriber(subscriber) + + on_exit(fn -> + Sanbase.EventBus.drain_topics(subscriber.topics(), 10_000) + Sanbase.EventBus.unsubscribe_subscriber(subscriber) + end) + end + setup_with_mocks([ {StripeApi, [:passthrough], [ diff --git a/test/sanbase/event_bus/kafka_exporter_subscriber_test.exs b/test/sanbase/event_bus/kafka_exporter_subscriber_test.exs index b736e838e8..79018e2b7b 100644 --- a/test/sanbase/event_bus/kafka_exporter_subscriber_test.exs +++ b/test/sanbase/event_bus/kafka_exporter_subscriber_test.exs @@ -6,6 +6,16 @@ defmodule Sanbase.EventBus.KafkaExporterSubscriberTest do setup :set_mox_from_context setup :verify_on_exit! + setup_all do + subscriber = Sanbase.EventBus.KafkaExporterSubscriber + Sanbase.EventBus.subscribe_subscriber(subscriber) + + on_exit(fn -> + Sanbase.EventBus.drain_topics(subscriber.topics(), 10_000) + Sanbase.EventBus.unsubscribe_subscriber(subscriber) + end) + end + test "check kafka message format" do # NOTE: This test is consistently failing for unknown reasons. Remove it for # now to unblock the other PRs and it will be revised later diff --git a/test/sanbase/metric_registry/metric_registry_test.exs b/test/sanbase/metric_registry/metric_registry_test.exs index 80d432201b..1ce3667e20 100644 --- a/test/sanbase/metric_registry/metric_registry_test.exs +++ b/test/sanbase/metric_registry/metric_registry_test.exs @@ -1,7 +1,17 @@ defmodule Sanbase.MetricRegistyTest do - use Sanbase.DataCase + use Sanbase.DataCase, async: false import ExUnit.CaptureLog + setup_all do + subscriber = Sanbase.EventBus.MetricRegistrySubscriber + Sanbase.EventBus.subscribe_subscriber(subscriber) + + on_exit(fn -> + Sanbase.EventBus.drain_topics(subscriber.topics(), 10_000) + Sanbase.EventBus.unsubscribe_subscriber(subscriber) + end) + end + test "creating a new metric" do log = capture_log(fn -> diff --git a/test/sanbase/telegram/telegram_test.exs b/test/sanbase/telegram/telegram_test.exs index c87fc27c64..7a1daaf327 100644 --- a/test/sanbase/telegram/telegram_test.exs +++ b/test/sanbase/telegram/telegram_test.exs @@ -15,11 +15,11 @@ defmodule Sanbase.TelegramTest do setup_all do subscriber = Sanbase.EventBus.UserEventsSubscriber - EventBus.subscribe({subscriber, subscriber.topics()}) + Sanbase.EventBus.subscribe_subscriber(subscriber) on_exit(fn -> Sanbase.EventBus.drain_topics(subscriber.topics(), 10_000) - EventBus.unsubscribe(subscriber) + Sanbase.EventBus.unsubscribe_subscriber(subscriber) end) end diff --git a/test/sanbase_web/api_call_limit/api_call_limit_api_test.exs b/test/sanbase_web/api_call_limit/api_call_limit_api_test.exs index 2ce614a626..b85b33af0b 100644 --- a/test/sanbase_web/api_call_limit/api_call_limit_api_test.exs +++ b/test/sanbase_web/api_call_limit/api_call_limit_api_test.exs @@ -13,8 +13,13 @@ defmodule SanbaseWeb.ApiCallLimitTest do setup_all do Application.put_env(SanbaseWeb.Graphql.AbsintheBeforeSend, :api_call_exporting_enabled, true) + subscriber = Sanbase.EventBus.BillingEventSubscriber + Sanbase.EventBus.subscribe_subscriber(subscriber) + on_exit(fn -> Application.delete_env(SanbaseWeb.Graphql.AbsintheBeforeSend, :api_call_exporting_enabled) + Sanbase.EventBus.drain_topics(subscriber.topics(), 10_000) + Sanbase.EventBus.unsubscribe_subscriber(subscriber) end) end @@ -460,8 +465,9 @@ defmodule SanbaseWeb.ApiCallLimitTest do |> Sanbase.Mock.run_with_mocks(fn -> Sanbase.Parallel.map( 1..(api_calls_per_iteration - 1), - fn i -> - {:ok, _} = Sanbase.Accounts.User.change_username(context.user, "username_#{i}") + fn _i -> + {:ok, _} = + Sanbase.Accounts.User.change_username(context.user, "username_#{UUID.uuid4()}") res = make_api_call(context.apikey_conn, []) assert res.status == 200 diff --git a/test/sanbase_web/channels/notifications_channel_test.exs b/test/sanbase_web/channels/notifications_channel_test.exs index c6c2bbc96d..1d782f1db5 100644 --- a/test/sanbase_web/channels/notifications_channel_test.exs +++ b/test/sanbase_web/channels/notifications_channel_test.exs @@ -5,15 +5,12 @@ defmodule SanbaseWeb.NotificationsChannelTest do import SanbaseWeb.Graphql.TestHelpers setup_all do - # The GenServer is already running (started by supervision tree) - # but not subscribed to EventBus (disabled in test.exs config). - # We only need to subscribe it to EventBus topics. subscriber = Sanbase.EventBus.AppNotificationsSubscriber - EventBus.subscribe({subscriber, subscriber.topics()}) + Sanbase.EventBus.subscribe_subscriber(subscriber) on_exit(fn -> Sanbase.EventBus.drain_topics(subscriber.topics(), 10_000) - EventBus.unsubscribe(subscriber) + Sanbase.EventBus.unsubscribe_subscriber(subscriber) end) end diff --git a/test/sanbase_web/controllers/mailjet_controller_test.exs b/test/sanbase_web/controllers/mailjet_controller_test.exs index 0a27704b04..3d052e5607 100644 --- a/test/sanbase_web/controllers/mailjet_controller_test.exs +++ b/test/sanbase_web/controllers/mailjet_controller_test.exs @@ -9,11 +9,11 @@ defmodule SanbaseWeb.MailjetControllerTest do setup_all do subscriber = Sanbase.EventBus.UserEventsSubscriber - EventBus.subscribe({subscriber, subscriber.topics()}) + Sanbase.EventBus.subscribe_subscriber(subscriber) on_exit(fn -> Sanbase.EventBus.drain_topics(subscriber.topics(), 10_000) - EventBus.unsubscribe(subscriber) + Sanbase.EventBus.unsubscribe_subscriber(subscriber) end) end diff --git a/test/sanbase_web/graphql/app_notifications/app_notification_api_test.exs b/test/sanbase_web/graphql/app_notifications/app_notification_api_test.exs index c749d5bb53..46757806a5 100644 --- a/test/sanbase_web/graphql/app_notifications/app_notification_api_test.exs +++ b/test/sanbase_web/graphql/app_notifications/app_notification_api_test.exs @@ -10,12 +10,11 @@ defmodule SanbaseWeb.Graphql.AppNotificationApiTest do setup_all do subscriber = Sanbase.EventBus.AppNotificationsSubscriber - - EventBus.subscribe({subscriber, subscriber.topics()}) + Sanbase.EventBus.subscribe_subscriber(subscriber) on_exit(fn -> Sanbase.EventBus.drain_topics(subscriber.topics(), 10_000) - EventBus.unsubscribe(subscriber) + Sanbase.EventBus.unsubscribe_subscriber(subscriber) end) end diff --git a/test/sanbase_web/graphql/billing/subscribe_api_test.exs b/test/sanbase_web/graphql/billing/subscribe_api_test.exs index 37623a8218..c6ac5e14c4 100644 --- a/test/sanbase_web/graphql/billing/subscribe_api_test.exs +++ b/test/sanbase_web/graphql/billing/subscribe_api_test.exs @@ -16,6 +16,16 @@ defmodule SanbaseWeb.Graphql.Billing.SubscribeApiTest do setup :set_mox_from_context setup :verify_on_exit! + setup_all do + subscriber = Sanbase.EventBus.BillingEventSubscriber + Sanbase.EventBus.subscribe_subscriber(subscriber) + + on_exit(fn -> + Sanbase.EventBus.drain_topics(subscriber.topics(), 10_000) + Sanbase.EventBus.unsubscribe_subscriber(subscriber) + end) + end + setup_with_mocks([ {StripeApi, [:passthrough], [create_product: fn _ -> StripeApiTestResponse.create_product_resp() end]}, diff --git a/test/sanbase_web/graphql/user/user_settings_test.exs b/test/sanbase_web/graphql/user/user_settings_test.exs index 7a01140a24..256f360c34 100644 --- a/test/sanbase_web/graphql/user/user_settings_test.exs +++ b/test/sanbase_web/graphql/user/user_settings_test.exs @@ -216,11 +216,11 @@ defmodule SanbaseWeb.Graphql.UserSettingsTest do describe "email settings" do setup do subscriber = Sanbase.EventBus.UserEventsSubscriber - EventBus.subscribe({subscriber, subscriber.topics()}) + Sanbase.EventBus.subscribe_subscriber(subscriber) on_exit(fn -> Sanbase.EventBus.drain_topics(subscriber.topics(), 10_000) - EventBus.unsubscribe(subscriber) + Sanbase.EventBus.unsubscribe_subscriber(subscriber) end) end diff --git a/test/sanbase_web/stripe_webhook_test.exs b/test/sanbase_web/stripe_webhook_test.exs index 5b9c497550..2056015a68 100644 --- a/test/sanbase_web/stripe_webhook_test.exs +++ b/test/sanbase_web/stripe_webhook_test.exs @@ -18,6 +18,16 @@ defmodule SanbaseWeb.StripeWebhookTest do setup :set_mox_from_context setup :verify_on_exit! + setup_all do + subscriber = Sanbase.EventBus.BillingEventSubscriber + Sanbase.EventBus.subscribe_subscriber(subscriber) + + on_exit(fn -> + Sanbase.EventBus.drain_topics(subscriber.topics(), 10_000) + Sanbase.EventBus.unsubscribe_subscriber(subscriber) + end) + end + setup_with_mocks([ {StripeApi, [], [