From 35814de0dff761e347e6977afb40b80099df4f4e Mon Sep 17 00:00:00 2001 From: Lain Soykaf Date: Tue, 25 Feb 2025 12:31:19 +0400 Subject: [PATCH] LanguageDetectorTests: Switch to mox --- config/test.exs | 1 + lib/pleroma/language/language_detector.ex | 3 +- .../language/language_detector_test.ex | 31 ++++++++++++-- .../article_note_page_validator_test.exs | 41 ++++++++++++++++--- test/support/language_detector_mock.ex | 18 -------- test/support/mocks.ex | 4 ++ 6 files changed, 70 insertions(+), 28 deletions(-) delete mode 100644 test/support/language_detector_mock.ex diff --git a/config/test.exs b/config/test.exs index 6fe84478a..141a206fa 100644 --- a/config/test.exs +++ b/config/test.exs @@ -152,6 +152,7 @@ config :pleroma, Pleroma.User.Backup, config_impl: Pleroma.UnstubbedConfigMock config :pleroma, Pleroma.Uploaders.S3, ex_aws_impl: Pleroma.Uploaders.S3.ExAwsMock config :pleroma, Pleroma.Uploaders.S3, config_impl: Pleroma.UnstubbedConfigMock config :pleroma, Pleroma.Upload, config_impl: Pleroma.UnstubbedConfigMock +config :pleroma, Pleroma.Language.LanguageDetector, config_impl: Pleroma.UnstubbedConfigMock config :pleroma, Pleroma.ScheduledActivity, config_impl: Pleroma.UnstubbedConfigMock config :pleroma, Pleroma.Web.RichMedia.Helpers, config_impl: Pleroma.StaticStubbedConfigMock config :pleroma, Pleroma.Uploaders.IPFS, config_impl: Pleroma.UnstubbedConfigMock diff --git a/lib/pleroma/language/language_detector.ex b/lib/pleroma/language/language_detector.ex index 2efe22d5e..16e2d4faa 100644 --- a/lib/pleroma/language/language_detector.ex +++ b/lib/pleroma/language/language_detector.ex @@ -7,6 +7,7 @@ defmodule Pleroma.Language.LanguageDetector do only: [good_locale_code?: 1] @words_threshold 4 + @config_impl Application.compile_env(:pleroma, [__MODULE__, :config_impl], Pleroma.Config) def configured? do provider = get_provider() @@ -53,6 +54,6 @@ defmodule Pleroma.Language.LanguageDetector do end defp get_provider do - Pleroma.Config.get([__MODULE__, :provider]) + @config_impl.get([__MODULE__, :provider]) end end diff --git a/test/pleroma/language/language_detector_test.ex b/test/pleroma/language/language_detector_test.ex index 4d9af33bf..b867fca19 100644 --- a/test/pleroma/language/language_detector_test.ex +++ b/test/pleroma/language/language_detector_test.ex @@ -3,26 +3,51 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Language.LanguageDetectorTest do - use Pleroma.Web.ConnCase + use Pleroma.DataCase, async: true alias Pleroma.Language.LanguageDetector + alias Pleroma.Language.LanguageDetectorMock + alias Pleroma.UnstubbedConfigMock - setup do: clear_config([Pleroma.Language.LanguageDetector, :provider], LanguageDetectorMock) + import Mox + + setup do + # Stub the UnstubbedConfigMock to return our mock for the provider + UnstubbedConfigMock + |> stub(:get, fn + [Pleroma.Language.LanguageDetector, :provider] -> LanguageDetectorMock + _other -> nil + end) + + # Stub the LanguageDetectorMock with default implementations + LanguageDetectorMock + |> stub(:missing_dependencies, fn -> [] end) + |> stub(:configured?, fn -> true end) + + :ok + end test "it detects text language" do + LanguageDetectorMock + |> expect(:detect, fn _text -> "fr" end) + detected_language = LanguageDetector.detect("Je viens d'atterrir en Tchéquie.") assert detected_language == "fr" end test "it returns nil if text is not long enough" do + # No need to set expectations as the word count check happens before the provider is called + detected_language = LanguageDetector.detect("it returns nil") assert detected_language == nil end test "it returns nil if no provider specified" do - clear_config([Pleroma.Language.LanguageDetector, :provider], nil) + # Override the stub to return nil for the provider + UnstubbedConfigMock + |> expect(:get, fn [Pleroma.Language.LanguageDetector, :provider] -> nil end) detected_language = LanguageDetector.detect("this should also return nil") diff --git a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs index b64c554d8..63e2b173a 100644 --- a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs +++ b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs @@ -8,10 +8,30 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidatorTest alias Pleroma.Web.ActivityPub.ObjectValidator alias Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator alias Pleroma.Web.ActivityPub.Utils + alias Pleroma.Language.LanguageDetectorMock + alias Pleroma.UnstubbedConfigMock - import Mock + import Mox import Pleroma.Factory + # Setup for all tests + setup do + # Stub the UnstubbedConfigMock to return our mock for the provider + UnstubbedConfigMock + |> stub(:get, fn + [Pleroma.Language.LanguageDetector, :provider] -> LanguageDetectorMock + _other -> nil + end) + + # Stub the LanguageDetectorMock with default implementations + LanguageDetectorMock + |> stub(:missing_dependencies, fn -> [] end) + |> stub(:configured?, fn -> true end) + |> stub(:detect, fn _text -> nil end) + + :ok + end + describe "Notes" do setup do user = insert(:user) @@ -235,9 +255,20 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidatorTest assert object.language == "pl" end - test_with_mock "it doesn't call LanguageDetector when language is specified", - Pleroma.Language.LanguageDetector, - detect: fn _ -> nil end do + test "it doesn't call LanguageDetector when language is specified" do + # Set up expectation that detect should not be called + LanguageDetectorMock + |> expect(:detect, 0, fn _ -> flunk("LanguageDetector.detect should not be called") end) + |> stub(:missing_dependencies, fn -> [] end) + |> stub(:configured?, fn -> true end) + + # Stub the UnstubbedConfigMock to return our mock for the provider + UnstubbedConfigMock + |> stub(:get, fn + [Pleroma.Language.LanguageDetector, :provider] -> LanguageDetectorMock + _other -> nil + end) + user = insert(:user) note = %{ @@ -253,8 +284,6 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidatorTest } ArticleNotePageValidator.cast_and_apply(note) - - refute called(Pleroma.Language.LanguageDetector.detect(:_)) end test "it adds contentMap if language is specified" do diff --git a/test/support/language_detector_mock.ex b/test/support/language_detector_mock.ex deleted file mode 100644 index 3e6a258ae..000000000 --- a/test/support/language_detector_mock.ex +++ /dev/null @@ -1,18 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2022 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule LanguageDetectorMock do - alias Pleroma.Language.LanguageDetector.Provider - - @behaviour Provider - - @impl Provider - def missing_dependencies, do: [] - - @impl Provider - def configured?, do: true - - @impl Provider - def detect(_text), do: "fr" -end diff --git a/test/support/mocks.ex b/test/support/mocks.ex index d84958e15..68b0de565 100644 --- a/test/support/mocks.ex +++ b/test/support/mocks.ex @@ -33,3 +33,7 @@ Mox.defmock(Pleroma.StubbedHTTPSignaturesMock, for: Pleroma.HTTPSignaturesAPI) Mox.defmock(Pleroma.LoggerMock, for: Pleroma.Logging) Mox.defmock(Pleroma.Uploaders.S3.ExAwsMock, for: Pleroma.Uploaders.S3.ExAwsAPI) + +Mox.defmock(Pleroma.Language.LanguageDetectorMock, + for: Pleroma.Language.LanguageDetector.Provider +)