defmodule Plausible.Shield.IPRuleCacheTest do use Plausible.DataCase, async: true alias Plausible.Shield.IPRule alias Plausible.Shield.IPRuleCache alias Plausible.Shields describe "public cache interface" do test "cache caches IP rules", %{test: test} do {:ok, _} = Supervisor.start_link([{IPRuleCache, [cache_name: test, child_id: :ip_rules_cache_id]}], strategy: :one_for_one, name: :"cache_supervisor_#{test}" ) site = insert(:site, domain: "site1.example.com") {:ok, %{id: rid1}} = Shields.add_ip_rule(site, %{"inet" => "1.1.1.1"}) {:ok, %{id: rid2}} = Shields.add_ip_rule(site, %{"inet" => "2.2.2.2"}) :ok = IPRuleCache.refresh_all(cache_name: test) :ok = Shields.remove_ip_rule(site, rid1) assert IPRuleCache.size(test) == 2 assert %IPRule{from_cache?: true, id: ^rid1} = IPRuleCache.get({site.domain, "1.1.1.1"}, force?: true, cache_name: test) assert %IPRule{from_cache?: true, id: ^rid2} = IPRuleCache.get({site.domain, "2.2.2.2"}, force?: true, cache_name: test) refute IPRuleCache.get({site.domain, "3.3.3.3"}, cache_name: test, force?: true) end test "cache allows IP lookups for sites with changed domain", %{test: test} do {:ok, _} = start_test_cache(test) site = insert(:site, domain: "new.example.com", domain_changed_from: "old.example.com") {:ok, _} = Shields.add_ip_rule(site, %{"inet" => "1.1.1.1"}) :ok = IPRuleCache.refresh_all(cache_name: test) assert IPRuleCache.get({"old.example.com", "1.1.1.1"}, force?: true, cache_name: test) assert IPRuleCache.get({"new.example.com", "1.1.1.1"}, force?: true, cache_name: test) end test "refreshes only recently added rules", %{test: test} do {:ok, _} = start_test_cache(test) domain = "site1.example.com" site = insert(:site, domain: domain) cache_opts = [cache_name: test, force?: true] yesterday = DateTime.utc_now() |> DateTime.add(-1 * 60 * 60 * 24) insert(:ip_rule, site: site, inserted_at: yesterday, updated_at: yesterday, inet: "1.1.1.1" ) insert(:ip_rule, site: site, inet: "2.2.2.2") assert IPRuleCache.get({domain, "1.1.1.1"}, cache_opts) == nil assert IPRuleCache.get({domain, "2.2.2.2"}, cache_opts) == nil assert :ok = IPRuleCache.refresh_updated_recently(cache_opts) refute IPRuleCache.get({domain, "1.1.1.1"}, cache_opts) assert %IPRule{} = IPRuleCache.get({domain, "2.2.2.2"}, cache_opts) end end defp start_test_cache(cache_name) do %{start: {m, f, a}} = IPRuleCache.child_spec(cache_name: cache_name) apply(m, f, a) end end