2026-02-18 21:23:15 +00:00
|
|
|
defmodule BerrypodWeb.Admin.SettingsTest do
|
|
|
|
|
use BerrypodWeb.ConnCase, async: false
|
2026-02-07 17:12:53 +00:00
|
|
|
|
|
|
|
|
import Phoenix.LiveViewTest
|
2026-02-18 21:23:15 +00:00
|
|
|
import Berrypod.AccountsFixtures
|
|
|
|
|
import Berrypod.ProductsFixtures
|
2026-02-07 17:12:53 +00:00
|
|
|
|
2026-02-18 21:23:15 +00:00
|
|
|
alias Berrypod.Settings
|
2026-02-07 17:12:53 +00:00
|
|
|
|
|
|
|
|
setup do
|
|
|
|
|
user = user_fixture()
|
|
|
|
|
%{user: user}
|
|
|
|
|
end
|
|
|
|
|
|
2026-02-11 22:58:58 +00:00
|
|
|
describe "shop status toggle" do
|
|
|
|
|
setup %{conn: conn, user: user} do
|
|
|
|
|
conn = log_in_user(conn, user)
|
|
|
|
|
%{conn: conn}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
test "shows offline status by default", %{conn: conn} do
|
|
|
|
|
{:ok, _view, html} = live(conn, ~p"/admin/settings")
|
|
|
|
|
|
|
|
|
|
assert html =~ "Offline"
|
|
|
|
|
assert html =~ "coming soon"
|
|
|
|
|
assert html =~ "Go live"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
test "can go live", %{conn: conn} do
|
|
|
|
|
{:ok, view, _html} = live(conn, ~p"/admin/settings")
|
|
|
|
|
|
|
|
|
|
html = render_click(view, "toggle_site_live")
|
|
|
|
|
|
|
|
|
|
assert html =~ "Shop is now live"
|
|
|
|
|
assert html =~ "Live"
|
|
|
|
|
assert html =~ "Take offline"
|
|
|
|
|
assert Settings.site_live?()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
test "can take offline after going live", %{conn: conn} do
|
|
|
|
|
{:ok, _} = Settings.set_site_live(true)
|
|
|
|
|
{:ok, view, _html} = live(conn, ~p"/admin/settings")
|
|
|
|
|
|
|
|
|
|
html = render_click(view, "toggle_site_live")
|
|
|
|
|
|
|
|
|
|
assert html =~ "Shop taken offline"
|
|
|
|
|
assert html =~ "Offline"
|
|
|
|
|
assert html =~ "Go live"
|
|
|
|
|
refute Settings.site_live?()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2026-02-07 17:12:53 +00:00
|
|
|
describe "unauthenticated" do
|
|
|
|
|
test "redirects to login", %{conn: conn} do
|
|
|
|
|
{:error, redirect} = live(conn, ~p"/admin/settings")
|
|
|
|
|
assert {:redirect, %{to: path}} = redirect
|
|
|
|
|
assert path == ~p"/users/log-in"
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
describe "authenticated - not configured" do
|
|
|
|
|
setup %{conn: conn, user: user} do
|
|
|
|
|
conn = log_in_user(conn, user)
|
|
|
|
|
%{conn: conn}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
test "renders setup form when Stripe is not configured", %{conn: conn} do
|
|
|
|
|
{:ok, _view, html} = live(conn, ~p"/admin/settings")
|
|
|
|
|
|
2026-02-11 22:58:58 +00:00
|
|
|
assert html =~ "Settings"
|
2026-02-07 17:12:53 +00:00
|
|
|
assert html =~ "Not connected"
|
|
|
|
|
assert html =~ "Connect Stripe"
|
|
|
|
|
assert html =~ "Stripe dashboard"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
test "shows error for empty API key", %{conn: conn} do
|
|
|
|
|
{:ok, view, _html} = live(conn, ~p"/admin/settings")
|
|
|
|
|
|
|
|
|
|
html =
|
|
|
|
|
view
|
2026-02-12 09:04:51 +00:00
|
|
|
|> form(~s(form[phx-submit="connect_stripe"]), %{stripe: %{api_key: ""}})
|
2026-02-07 17:12:53 +00:00
|
|
|
|> render_submit()
|
|
|
|
|
|
|
|
|
|
assert html =~ "Please enter your Stripe secret key"
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
describe "authenticated - connected (localhost)" do
|
|
|
|
|
setup %{conn: conn, user: user} do
|
|
|
|
|
# Pre-configure a Stripe API key
|
|
|
|
|
Settings.put_secret("stripe_api_key", "sk_test_simulated_key_12345")
|
|
|
|
|
conn = log_in_user(conn, user)
|
|
|
|
|
%{conn: conn}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
test "renders dev mode view with CLI instructions", %{conn: conn} do
|
|
|
|
|
{:ok, _view, html} = live(conn, ~p"/admin/settings")
|
|
|
|
|
|
|
|
|
|
assert html =~ "Dev mode"
|
|
|
|
|
assert html =~ "sk_test_•••345"
|
|
|
|
|
assert html =~ "stripe listen"
|
|
|
|
|
assert html =~ "Webhook signing secret"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
test "saves manual signing secret", %{conn: conn} do
|
|
|
|
|
{:ok, view, _html} = live(conn, ~p"/admin/settings")
|
|
|
|
|
|
|
|
|
|
html =
|
|
|
|
|
view
|
2026-02-12 09:04:51 +00:00
|
|
|
|> form(~s(form[phx-submit="save_signing_secret"]), %{
|
|
|
|
|
webhook: %{signing_secret: "whsec_test_manual_456"}
|
|
|
|
|
})
|
2026-02-07 17:12:53 +00:00
|
|
|
|> render_submit()
|
|
|
|
|
|
2026-03-07 21:01:54 +00:00
|
|
|
assert has_element?(view, ".admin-inline-feedback-saved")
|
2026-02-07 17:12:53 +00:00
|
|
|
assert html =~ "whsec_te•••456"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
test "shows error for empty signing secret", %{conn: conn} do
|
|
|
|
|
{:ok, view, _html} = live(conn, ~p"/admin/settings")
|
|
|
|
|
|
|
|
|
|
html =
|
|
|
|
|
view
|
2026-02-12 09:04:51 +00:00
|
|
|
|> form(~s(form[phx-submit="save_signing_secret"]), %{webhook: %{signing_secret: ""}})
|
2026-02-07 17:12:53 +00:00
|
|
|
|> render_submit()
|
|
|
|
|
|
|
|
|
|
assert html =~ "Please enter a signing secret"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
test "disconnect clears configuration", %{conn: conn} do
|
|
|
|
|
{:ok, view, _html} = live(conn, ~p"/admin/settings")
|
|
|
|
|
|
|
|
|
|
html = render_click(view, "disconnect_stripe")
|
|
|
|
|
|
|
|
|
|
assert html =~ "Stripe disconnected"
|
|
|
|
|
assert html =~ "Not connected"
|
|
|
|
|
assert html =~ "Connect Stripe"
|
|
|
|
|
refute Settings.has_secret?("stripe_api_key")
|
|
|
|
|
end
|
|
|
|
|
end
|
2026-02-12 09:04:51 +00:00
|
|
|
|
|
|
|
|
describe "products section" do
|
|
|
|
|
setup %{conn: conn, user: user} do
|
|
|
|
|
conn = log_in_user(conn, user)
|
|
|
|
|
%{conn: conn}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
test "shows connect button when no provider connected", %{conn: conn} do
|
|
|
|
|
{:ok, view, html} = live(conn, ~p"/admin/settings")
|
|
|
|
|
|
|
|
|
|
assert html =~ "Products"
|
|
|
|
|
assert html =~ "Not connected"
|
2026-02-15 10:53:15 +00:00
|
|
|
assert has_element?(view, ~s(a[href="/admin/providers"]), "Connect a provider")
|
2026-02-12 09:04:51 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
test "shows connection info when provider connected", %{conn: conn} do
|
|
|
|
|
conn_record = provider_connection_fixture(%{name: "Test Shop"})
|
|
|
|
|
product_fixture(%{provider_connection: conn_record})
|
|
|
|
|
|
|
|
|
|
{:ok, _view, html} = live(conn, ~p"/admin/settings")
|
|
|
|
|
|
|
|
|
|
assert html =~ "Connected"
|
|
|
|
|
assert html =~ "Test Shop"
|
|
|
|
|
assert html =~ "Sync products"
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2026-03-04 17:12:10 +00:00
|
|
|
describe "from address" do
|
|
|
|
|
setup %{conn: conn, user: user} do
|
|
|
|
|
conn = log_in_user(conn, user)
|
|
|
|
|
%{conn: conn}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
test "shows from address section", %{conn: conn} do
|
|
|
|
|
{:ok, _view, html} = live(conn, ~p"/admin/settings")
|
|
|
|
|
|
|
|
|
|
assert html =~ "From address"
|
|
|
|
|
assert html =~ "sender address"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
test "saves from address", %{conn: conn} do
|
|
|
|
|
{:ok, view, _html} = live(conn, ~p"/admin/settings")
|
|
|
|
|
|
2026-03-08 18:42:29 +00:00
|
|
|
view
|
|
|
|
|
|> form("form[phx-submit=\"save_from_address\"]", %{from_address: "shop@example.com"})
|
|
|
|
|
|> render_submit()
|
2026-03-04 17:12:10 +00:00
|
|
|
|
2026-03-07 21:01:54 +00:00
|
|
|
assert has_element?(view, ".admin-inline-feedback-saved")
|
2026-03-04 17:12:10 +00:00
|
|
|
assert Settings.get_setting("email_from_address") == "shop@example.com"
|
|
|
|
|
end
|
|
|
|
|
end
|
2026-02-07 17:12:53 +00:00
|
|
|
end
|