fix(calendar): persist settings on PUT/POST
Accept calendar.settings (e.g. week_patterns) in validate_update and convert_field; apply on create like tags. Unblocks Front#42 pattern save which previously got 200 with empty settings.
This commit is contained in:
@@ -23,6 +23,7 @@ test() ->
|
||||
test_get_calendar_unauthorized(CalId),
|
||||
test_get_calendar_not_found(Token),
|
||||
test_update_calendar(Token, CalId),
|
||||
test_update_calendar_settings(Token, CalId),
|
||||
test_update_calendar_forbidden(OtherToken, CalId),
|
||||
test_delete_calendar(Token, CalId),
|
||||
test_delete_calendar_forbidden(OtherToken, CalId),
|
||||
@@ -60,6 +61,26 @@ test_update_calendar(Token, CalId) ->
|
||||
?assertEqual(<<"New desc">>, maps:get(<<"description">>, Updated)),
|
||||
ct:pal(" OK").
|
||||
|
||||
test_update_calendar_settings(Token, CalId) ->
|
||||
ct:pal(" TEST: Persist calendar.settings.week_patterns"),
|
||||
Path = <<"/v1/calendars/", CalId/binary>>,
|
||||
Settings = #{
|
||||
<<"week_patterns">> => [
|
||||
#{
|
||||
<<"id">> => <<"pat1">>,
|
||||
<<"name">> => <<"Mon-Fri">>,
|
||||
<<"slots">> => [
|
||||
#{<<"weekday">> => 1, <<"time">> => <<"10:00">>, <<"duration">> => 60, <<"title">> => <<"Open">>}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
Updated = api_test_runner:client_put(Path, Token, #{settings => Settings}),
|
||||
?assertEqual(Settings, maps:get(<<"settings">>, Updated)),
|
||||
Got = api_test_runner:client_get(Path, Token),
|
||||
?assertEqual(Settings, maps:get(<<"settings">>, Got)),
|
||||
ct:pal(" OK").
|
||||
|
||||
test_update_calendar_forbidden(OtherToken, CalId) ->
|
||||
ct:pal(" TEST: Update calendar by non-owner (403)"),
|
||||
Path = <<"/v1/calendars/", CalId/binary>>,
|
||||
|
||||
@@ -35,6 +35,8 @@ logic_calendar_test_() ->
|
||||
{"Get calendar test", fun test_get_calendar/0},
|
||||
{"List calendars test", fun test_list_calendars/0},
|
||||
{"Update calendar test", fun test_update_calendar/0},
|
||||
{"Persist calendar settings (week_patterns)", fun test_update_settings/0},
|
||||
{"Reject non-map settings", fun test_update_settings_invalid/0},
|
||||
{"Delete calendar test", fun test_delete_calendar/0},
|
||||
{"Access control test", fun test_access_control/0},
|
||||
{"Ensure default calendar test", fun test_ensure_default_calendar/0}
|
||||
@@ -117,6 +119,39 @@ test_update_calendar() ->
|
||||
?assertMatch({error, access_denied},
|
||||
logic_calendar:update_calendar(OtherUserId, Calendar#calendar.id, Updates)).
|
||||
|
||||
test_update_settings() ->
|
||||
UserId = create_test_user(),
|
||||
{ok, Calendar} = logic_calendar:create_calendar(UserId, <<"Studio">>, <<"">>, manual),
|
||||
Patterns = [
|
||||
#{
|
||||
<<"id">> => <<"p1">>,
|
||||
<<"name">> => <<"Weekdays">>,
|
||||
<<"updated_at">> => <<"2026-07-29T12:00:00Z">>,
|
||||
<<"slots">> => [
|
||||
#{<<"weekday">> => 1, <<"time">> => <<"10:00">>, <<"duration">> => 60, <<"title">> => <<"Open">>}
|
||||
]
|
||||
}
|
||||
],
|
||||
Settings = #{<<"week_patterns">> => Patterns},
|
||||
{ok, Updated} = logic_calendar:update_calendar(
|
||||
UserId, Calendar#calendar.id, [{settings, Settings}]),
|
||||
?assertEqual(Settings, Updated#calendar.settings),
|
||||
{ok, Reloaded} = logic_calendar:get_calendar(UserId, Calendar#calendar.id),
|
||||
?assertEqual(Settings, Reloaded#calendar.settings),
|
||||
%% binary key path (as from raw JSON list before convert_field)
|
||||
Settings2 = Settings#{<<"foo">> => <<"bar">>},
|
||||
{ok, Updated2} = logic_calendar:update_calendar(
|
||||
UserId, Calendar#calendar.id, [{<<"settings">>, Settings2}]),
|
||||
?assertEqual(Settings2, Updated2#calendar.settings).
|
||||
|
||||
test_update_settings_invalid() ->
|
||||
UserId = create_test_user(),
|
||||
{ok, Calendar} = logic_calendar:create_calendar(UserId, <<"Studio">>, <<"">>, manual),
|
||||
%% non-map settings silently dropped by validate_updates — calendar unchanged
|
||||
{ok, Same} = logic_calendar:update_calendar(
|
||||
UserId, Calendar#calendar.id, [{settings, [<<"not-a-map">>]}]),
|
||||
?assertEqual(#{}, Same#calendar.settings).
|
||||
|
||||
test_delete_calendar() ->
|
||||
UserId = create_test_user(),
|
||||
{ok, Calendar} = logic_calendar:create_calendar(UserId, <<"Test">>, <<"">>, manual),
|
||||
|
||||
Reference in New Issue
Block a user