From fb59ef99c1bd97418aebdfa13750b2fe6bdfd4b4 Mon Sep 17 00:00:00 2001 From: Moritz Date: Tue, 12 May 2026 23:14:44 +0200 Subject: [PATCH] Accept future join dates: remove past-only validation and update tests --- lib/membership/member.ex | 5 ----- test/membership/member_test.exs | 37 ++++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/lib/membership/member.ex b/lib/membership/member.ex index 4e85fa8..f87c468 100644 --- a/lib/membership/member.ex +++ b/lib/membership/member.ex @@ -473,11 +473,6 @@ defmodule Mv.Membership.Member do end end - # Join date not in future - validate compare(:join_date, less_than_or_equal_to: &Date.utc_today/0), - where: [present(:join_date)], - message: "cannot be in the future" - # Exit date not before join date validate compare(:exit_date, greater_than: :join_date), where: [present([:join_date, :exit_date])], diff --git a/test/membership/member_test.exs b/test/membership/member_test.exs index ca4d022..5e30da6 100644 --- a/test/membership/member_test.exs +++ b/test/membership/member_test.exs @@ -49,12 +49,43 @@ defmodule Mv.Membership.MemberTest do assert error_message(errors, :email) =~ "is not a valid email" end - test "Join date cannot be in the future", %{actor: actor} do + test "Join date can be in the future", %{actor: actor} do attrs = Map.put(@valid_attrs, :join_date, Date.utc_today() |> Date.add(1)) - assert {:error, - %Ash.Error.Invalid{errors: [%Ash.Error.Changes.InvalidAttribute{field: :join_date}]}} = + assert {:ok, _member} = Membership.create_member(attrs, actor: actor) + end + + test "Join date far in the future (2099) is accepted", %{actor: actor} do + attrs = Map.put(@valid_attrs, :join_date, ~D[2099-12-31]) + + assert {:ok, _member} = Membership.create_member(attrs, actor: actor) + end + + test "Join date today is accepted", %{actor: actor} do + attrs = Map.put(@valid_attrs, :join_date, Date.utc_today()) + + assert {:ok, _member} = Membership.create_member(attrs, actor: actor) + end + + test "Join date in the future is accepted on update", %{actor: actor} do + {:ok, member} = Membership.create_member(@valid_attrs, actor: actor) + + assert {:ok, _updated} = + Membership.update_member(member, %{join_date: Date.utc_today() |> Date.add(30)}, + actor: actor + ) + end + + test "Exit date before future join date is rejected", %{actor: actor} do + attrs = + @valid_attrs + |> Map.put(:join_date, Date.utc_today() |> Date.add(10)) + |> Map.put(:exit_date, Date.utc_today() |> Date.add(5)) + + assert {:error, %Ash.Error.Invalid{errors: errors}} = Membership.create_member(attrs, actor: actor) + + assert error_message(errors, :exit_date) =~ "cannot be before join date" end test "Exit date is optional but must not be before join date if both are specified", %{