defmodule SimpleshopTheme.Stripe.SetupTest do
  use SimpleshopTheme.DataCase, async: false

  alias SimpleshopTheme.Settings
  alias SimpleshopTheme.Stripe.Setup

  describe "localhost?/0" do
    test "returns true for localhost endpoint" do
      # In test env, endpoint URL is localhost
      assert Setup.localhost?()
    end
  end

  describe "webhook_url/0" do
    test "returns the webhook endpoint URL" do
      url = Setup.webhook_url()
      assert url =~ "/webhooks/stripe"
    end
  end

  describe "save_signing_secret/1" do
    test "stores signing secret and loads into Application env" do
      Setup.save_signing_secret("whsec_test_secret_123")

      assert Settings.get_secret("stripe_signing_secret") == "whsec_test_secret_123"
      assert Application.get_env(:stripity_stripe, :signing_secret) == "whsec_test_secret_123"
    end
  end

  describe "disconnect/0" do
    test "removes all Stripe settings from DB and Application env" do
      # Set up some Stripe config
      Settings.put_secret("stripe_api_key", "sk_test_123")
      Settings.put_secret("stripe_signing_secret", "whsec_test_456")
      Settings.put_setting("stripe_webhook_endpoint_id", "we_test_789")
      Application.put_env(:stripity_stripe, :api_key, "sk_test_123")
      Application.put_env(:stripity_stripe, :signing_secret, "whsec_test_456")

      assert :ok = Setup.disconnect()

      # DB cleared
      refute Settings.has_secret?("stripe_api_key")
      refute Settings.has_secret?("stripe_signing_secret")
      assert Settings.get_setting("stripe_webhook_endpoint_id") == nil

      # Application env cleared
      assert Application.get_env(:stripity_stripe, :api_key) == nil
      assert Application.get_env(:stripity_stripe, :signing_secret) == nil
    end

    test "handles disconnect when nothing is configured" do
      assert :ok = Setup.disconnect()
    end
  end
end
