Fix rate_limiter_test.exs test "it restricts based on config values" (#233)
authorilja <akkoma.dev@ilja.space>
Tue, 1 Nov 2022 14:25:54 +0000 (14:25 +0000)
committerfloatingghost <hannah@coffee-and-dreams.uk>
Tue, 1 Nov 2022 14:25:54 +0000 (14:25 +0000)
Fixes one of the 'erratic' tests

It used a timer to sleep.
But time also goes on when doing other things, so depending on hardware, the timings could be off.
I slightly changed the tests so we still test what we functionally want.
Instead of waiting until the cache expires I now have a function to expire the test and use that.

That means we're not testing any more if the cache really expires after a certain amount of time,
but that's the responsability of the dependency imo, so shouldn't be a problem.

I also changed `Pleroma.Web.Endpoint, :http, :ip` in the tests to `127.0.0.1`
Currently it was set to 8.8.8.8, but I see no reason for that and, while I assume that no calls
are made to it, it may come over as weird or suspicious to people.

Co-authored-by: Ilja <ilja@ilja.space>
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma/pulls/233
Co-authored-by: ilja <akkoma.dev@ilja.space>
Co-committed-by: ilja <akkoma.dev@ilja.space>
test/pleroma/web/plugs/rate_limiter_test.exs

index b7cfde1f788d47035452a119f62a82565267b1f3..83a47ea308f6011edc5e172cdad6861eaff2a568 100644 (file)
@@ -48,38 +48,42 @@ defmodule Pleroma.Web.Plugs.RateLimiterTest do
     refute RateLimiter.disabled?(build_conn())
   end
 
-  @tag :erratic
   test "it restricts based on config values" do
     limiter_name = :test_plug_opts
     scale = 80
     limit = 5
 
-    clear_config([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})
+    clear_config([Pleroma.Web.Endpoint, :http, :ip], {127, 0, 0, 1})
     clear_config([:rate_limit, limiter_name], {scale, limit})
 
     plug_opts = RateLimiter.init(name: limiter_name)
     conn = build_conn(:get, "/")
 
-    for i <- 1..5 do
-      conn = RateLimiter.call(conn, plug_opts)
-      assert {^i, _} = RateLimiter.inspect_bucket(conn, limiter_name, plug_opts)
-      Process.sleep(10)
+    for _ <- 1..5 do
+      conn_limited = RateLimiter.call(conn, plug_opts)
+
+      refute conn_limited.status == Conn.Status.code(:too_many_requests)
+      refute conn_limited.resp_body
+      refute conn_limited.halted
     end
 
-    conn = RateLimiter.call(conn, plug_opts)
-    assert %{"error" => "Throttled"} = ConnTest.json_response(conn, :too_many_requests)
-    assert conn.halted
+    conn_limited = RateLimiter.call(conn, plug_opts)
+    assert %{"error" => "Throttled"} = ConnTest.json_response(conn_limited, :too_many_requests)
+    assert conn_limited.halted
 
-    Process.sleep(50)
+    expire_ttl(conn, limiter_name)
 
-    conn = build_conn(:get, "/")
+    for _ <- 1..5 do
+      conn_limited = RateLimiter.call(conn, plug_opts)
 
-    conn = RateLimiter.call(conn, plug_opts)
-    assert {1, 4} = RateLimiter.inspect_bucket(conn, limiter_name, plug_opts)
+      refute conn_limited.status == Conn.Status.code(:too_many_requests)
+      refute conn_limited.resp_body
+      refute conn_limited.halted
+    end
 
-    refute conn.status == Conn.Status.code(:too_many_requests)
-    refute conn.resp_body
-    refute conn.halted
+    conn_limited = RateLimiter.call(conn, plug_opts)
+    assert %{"error" => "Throttled"} = ConnTest.json_response(conn_limited, :too_many_requests)
+    assert conn_limited.halted
   end
 
   describe "options" do
@@ -263,4 +267,12 @@ defmodule Pleroma.Web.Plugs.RateLimiterTest do
 
     refute {:err, :not_found} == RateLimiter.inspect_bucket(conn, limiter_name, opts)
   end
+
+  def expire_ttl(%{remote_ip: remote_ip} = _conn, bucket_name_root) do
+    bucket_name = "anon:#{bucket_name_root}" |> String.to_atom()
+    key_name = "ip::#{remote_ip |> Tuple.to_list() |> Enum.join(".")}"
+
+    {:ok, bucket_value} = Cachex.get(bucket_name, key_name)
+    Cachex.put(bucket_name, key_name, bucket_value, ttl: -1)
+  end
 end