defmodule Plausible.Auth.SSO.Domain.Verification.WorkerTest do use Plausible.DataCase on_ee do use Bamboo.Test, shared: true use Oban.Testing, repo: Plausible.Repo use Plausible.Auth.SSO.Domain.Status alias Plausible.Auth.SSO alias Plausible.Auth.SSO.Domain.Verification.Worker test "no sso domain cancels the job" do assert {:cancel, :domain_not_found} = perform_job(Worker, %{"domain" => "hello.example.com"}) end test "enqueue works" do {:ok, _} = Worker.enqueue("example.com") assert_enqueued(worker: Worker, args: %{domain: "example.com"}) end test "enqueue is idempotent" do {:ok, %{id: id}} = Worker.enqueue("example.com") {:ok, %{id: ^id, conflict?: true}} = Worker.enqueue("example.com") assert_enqueued(worker: Worker, args: %{domain: "example.com"}) end test "enqueue then cancel" do {:ok, _} = Worker.enqueue("example.com") assert_enqueued(worker: Worker, args: %{domain: "example.com"}) :ok = Worker.cancel("example.com") refute_enqueued(worker: Worker, args: %{domain: "example.com"}) end describe "integration set up" do setup do owner = new_user() team = new_site(owner: owner).team integration = SSO.initiate_saml_integration(team) domain = "#{Enum.random(1..10_000)}.example.com" {:ok, sso_domain} = SSO.Domains.add(integration, domain) {:ok, owner: owner, team: team, integration: integration, domain: domain, sso_domain: sso_domain} end test "domain is marked as in progress and job is snoozed", %{domain: domain} do assert {:ok, %{status: Status.pending()}} = SSO.Domains.get(domain) assert {:snooze, 15} = perform_job(Worker, %{"domain" => domain}, meta: %{bypass_checks: true}) assert {:ok, %{status: Status.in_progress()}} = SSO.Domains.get(domain) assert {:snooze, 7680} = perform_job(Worker, %{"domain" => domain}, attempt: 10, meta: %{bypass_checks: true} ) assert {:ok, %{status: Status.in_progress()}} = SSO.Domains.get(domain) end test "domain is marked as verified and emails are sent", %{ domain: domain, team: team, owner: owner } do owner2 = add_member(team, role: :owner) assert {:ok, %{status: Status.verified()}} = perform_job(Worker, %{"domain" => domain}, meta: %{skip_checks: true}) assert_email_delivered_with( to: [nil: owner.email], subject: "Your SSO domain #{domain} is ready!" ) assert_email_delivered_with( to: [nil: owner2.email], subject: "Your SSO domain #{domain} is ready!" ) {:ok, domain} = SSO.Domains.get(domain) assert audited_entry("sso_domain_verification_success", team_id: team.id, entity_id: "#{domain.id}" ) end test "domain is marked as unverified when max snoozes exhausted", %{ domain: domain, team: team } do assert {:snooze, _} = perform_job(Worker, %{"domain" => domain}, attempt: 14, meta: %{bypass_checks: true} ) assert {:cancel, :max_snoozes} = perform_job(Worker, %{"domain" => domain}, attempt: 15, meta: %{bypass_checks: true} ) assert_email_delivered_with(subject: "SSO domain #{domain} verification failure") {:ok, domain} = SSO.Domains.get(domain) assert audited_entry("sso_domain_verification_failure", team_id: team.id, entity_id: "#{domain.id}" ) end end end end