commit: 35814de0dff761e347e6977afb40b80099df4f4e
parent edfb1deb1c578e48c0cbeebb1961c90b76b28beb
Author: Lain Soykaf <lain@lain.com>
Date: Tue, 25 Feb 2025 12:31:19 +0400
LanguageDetectorTests: Switch to mox
Diffstat:
6 files changed, 70 insertions(+), 28 deletions(-)
diff --git 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
@@ -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
@@ -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
@@ -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
@@ -1,18 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
-# 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
@@ -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
+)