diff --git a/test/membership/setting_env_test.exs b/test/membership/setting_env_test.exs new file mode 100644 index 0000000..262f748 --- /dev/null +++ b/test/membership/setting_env_test.exs @@ -0,0 +1,61 @@ +defmodule Mv.Membership.SettingEnvTest do + use Mv.DataCase, async: false + alias Mv.Membership + + describe "Settings with environment variable" do + test "club_name can be set via ASSOCIATION_NAME environment variable" do + # Set environment variable + System.put_env("ASSOCIATION_NAME", "Test Association from Env") + + try do + # Get settings - should use environment variable if no DB value exists + {:ok, settings} = Membership.get_settings() + + # If settings don't have a club_name in DB, it should use the env var + # This depends on implementation - we'll check that the env var is respected + assert settings.club_name != nil + after + # Clean up + System.delete_env("ASSOCIATION_NAME") + end + end + + test "database value takes precedence over environment variable" do + # Set environment variable + System.put_env("ASSOCIATION_NAME", "Env Value") + + try do + # Set a value in the database + {:ok, settings} = Membership.get_settings() + {:ok, _updated} = Membership.update_settings(settings, %{club_name: "DB Value"}) + + # Get settings again - should use DB value, not env var + {:ok, settings_after} = Membership.get_settings() + assert settings_after.club_name == "DB Value" + after + # Clean up + System.delete_env("ASSOCIATION_NAME") + end + end + + test "uses environment variable when database value is not set" do + # Set environment variable + System.put_env("ASSOCIATION_NAME", "Default from Env") + + try do + # Clear database value (if possible) or check that env var is used + {:ok, settings} = Membership.get_settings() + + # If club_name is nil or empty in DB, should use env var + # This test depends on implementation details + # We're testing that the env var fallback works + club_name = settings.club_name || System.get_env("ASSOCIATION_NAME") + assert club_name != nil + assert club_name != "" + after + # Clean up + System.delete_env("ASSOCIATION_NAME") + end + end + end +end diff --git a/test/membership/setting_test.exs b/test/membership/setting_test.exs new file mode 100644 index 0000000..46cf3b9 --- /dev/null +++ b/test/membership/setting_test.exs @@ -0,0 +1,53 @@ +defmodule Mv.Membership.SettingTest do + use Mv.DataCase, async: false + alias Mv.Membership + + describe "Settings Resource" do + test "can read settings" do + # Settings should be a singleton resource + assert {:ok, _settings} = Membership.get_settings() + end + + test "settings have club_name attribute" do + {:ok, settings} = Membership.get_settings() + assert Map.has_key?(settings, :club_name) + end + + test "can update club_name" do + {:ok, settings} = Membership.get_settings() + + assert {:ok, updated_settings} = + Membership.update_settings(settings, %{club_name: "New Club Name"}) + + assert updated_settings.club_name == "New Club Name" + end + + test "club_name is required" do + {:ok, settings} = Membership.get_settings() + + assert {:error, %Ash.Error.Invalid{errors: errors}} = + Membership.update_settings(settings, %{club_name: nil}) + + assert error_message(errors, :club_name) =~ "must be present" + end + + test "club_name cannot be empty" do + {:ok, settings} = Membership.get_settings() + + assert {:error, %Ash.Error.Invalid{errors: errors}} = + Membership.update_settings(settings, %{club_name: ""}) + + assert error_message(errors, :club_name) =~ "must be present" + end + end + + # Helper function to extract error messages + defp error_message(errors, field) do + errors + |> Enum.find(fn error -> error.field == field end) + |> case do + nil -> "" + error -> List.first(error.message) || "" + end + end +end diff --git a/test/mv_web/components/layouts/navbar_test.exs b/test/mv_web/components/layouts/navbar_test.exs index b6fa556..6a50996 100644 --- a/test/mv_web/components/layouts/navbar_test.exs +++ b/test/mv_web/components/layouts/navbar_test.exs @@ -84,5 +84,23 @@ defmodule MvWeb.Layouts.NavbarTest do # Check for correct logout path assert html =~ ~s(href="/sign-out") end + + test "Settings link navigates to global settings page", %{conn: conn} do + user = create_test_user(%{email: "test@example.com"}) + conn = conn_with_oidc_user(conn, user) + + html = + render_component(&MvWeb.Layouts.Navbar.navbar/1, %{ + current_user: user + }) + + # Check that Settings link exists and points to /settings + assert html =~ "Settings" + assert html =~ ~s(href="/settings") || html =~ ~s(navigate="/settings") + + # Verify the link actually works by navigating to it + {:ok, _view, settings_html} = live(conn, ~p"/settings") + assert settings_html =~ "Vereinsdaten" + end end end diff --git a/test/mv_web/live/global_settings_live_test.exs b/test/mv_web/live/global_settings_live_test.exs new file mode 100644 index 0000000..f06deb1 --- /dev/null +++ b/test/mv_web/live/global_settings_live_test.exs @@ -0,0 +1,67 @@ +defmodule MvWeb.GlobalSettingsLiveTest do + use MvWeb.ConnCase, async: true + import Phoenix.LiveViewTest + alias Mv.Membership + + describe "Global Settings LiveView" do + setup %{conn: conn} do + user = create_test_user(%{email: "admin@example.com"}) + conn = conn_with_oidc_user(conn, user) + {:ok, conn: conn, user: user} + end + + test "renders the global settings page", %{conn: conn} do + {:ok, view, html} = live(conn, ~p"/settings") + + assert html =~ "Vereinsdaten" + assert html =~ "Settings" + end + + test "displays current club name", %{conn: conn} do + # Set initial club name + {:ok, settings} = Membership.get_settings() + Membership.update_settings!(settings, %{club_name: "Test Club"}) + + {:ok, _view, html} = live(conn, ~p"/settings") + + assert html =~ "Test Club" + end + + test "can update club name via form", %{conn: conn} do + {:ok, view, _html} = live(conn, ~p"/settings") + + # Submit form with new club name + assert view + |> form("#settings-form", %{setting: %{club_name: "Updated Club Name"}}) + |> render_submit() + + # Check for success message + assert render(view) =~ "Settings updated successfully" + assert render(view) =~ "Updated Club Name" + end + + test "shows error when club_name is empty", %{conn: conn} do + {:ok, view, _html} = live(conn, ~p"/settings") + + # Submit form with empty club name + html = + view + |> form("#settings-form", %{setting: %{club_name: ""}}) + |> render_submit() + + assert html =~ "must be present" + end + + test "shows error when club_name is missing", %{conn: conn} do + {:ok, view, _html} = live(conn, ~p"/settings") + + # Submit form without club_name + html = + view + |> form("#settings-form", %{setting: %{}}) + |> render_submit() + + assert html =~ "must be present" + end + end +end