| defmodule Plausible.Workers.PurgeCDNCacheTest do |
| use Plausible.DataCase, async: true |
| import ExUnit.CaptureLog |
| import Plug.Conn |
|
|
| alias Plausible.Workers.PurgeCDNCache |
|
|
| describe "perform/1" do |
| setup do |
| |
| Application.put_env(:plausible, Plausible.Workers.PurgeCDNCache, |
| pullzone_id: "456", |
| api_key: "test-api-key", |
| req_opts: [ |
| plug: {Req.Test, Plausible.Workers.PurgeCDNCache} |
| ] |
| ) |
|
|
| :ok |
| end |
|
|
| test "successfully purges cache" do |
| Req.Test.expect(Plausible.Workers.PurgeCDNCache, &send_resp(&1, 204, "ok")) |
|
|
| assert {:ok, :success} = PurgeCDNCache.perform(%Oban.Job{args: %{"id" => "adf"}}) |
| end |
|
|
| test "handles missing configuration" do |
| |
| Application.put_env(:plausible, Plausible.Workers.PurgeCDNCache, []) |
|
|
| {result, log} = |
| with_log(fn -> PurgeCDNCache.perform(%Oban.Job{args: %{"id" => "adf"}}) end) |
|
|
| assert {:discard, "Configuration missing"} = result |
| assert log =~ "Ignoring purge CDN cache for tracker script adf: Configuration missing" |
| end |
|
|
| test "handles unexpected status code" do |
| Req.Test.expect( |
| Plausible.Workers.PurgeCDNCache, |
| &send_resp(&1, 500, "internal server error") |
| ) |
|
|
| {result, log} = |
| with_log(fn -> PurgeCDNCache.perform(%Oban.Job{args: %{"id" => "adf"}}) end) |
|
|
| assert {:error, "Unexpected status: 500"} = result |
| assert log =~ "Failed to purge CDN cache for tracker script adf: Unexpected status: 500" |
| end |
|
|
| test "handles network errors" do |
| Req.Test.expect( |
| Plausible.Workers.PurgeCDNCache, |
| &Req.Test.transport_error(&1, :econnrefused) |
| ) |
|
|
| {result, log} = |
| with_log(fn -> PurgeCDNCache.perform(%Oban.Job{args: %{"id" => "adf"}}) end) |
|
|
| assert {:error, %Req.TransportError{reason: :econnrefused}} = result |
|
|
| assert log =~ |
| "Failed to purge CDN cache for tracker script adf: %Req.TransportError{reason: :econnrefused}" |
| end |
| end |
|
|
| describe "backoff/1" do |
| test "implements exponential backoff starting at 3 minutes" do |
| assert PurgeCDNCache.backoff(%Oban.Job{attempt: 1}) == 180 |
| assert PurgeCDNCache.backoff(%Oban.Job{attempt: 2}) == 360 |
| assert PurgeCDNCache.backoff(%Oban.Job{attempt: 3}) == 720 |
| assert PurgeCDNCache.backoff(%Oban.Job{attempt: 4}) == 1440 |
| assert PurgeCDNCache.backoff(%Oban.Job{attempt: 5}) == 2880 |
| end |
| end |
| end |
|
|