-module(ws_handler_tests). -include_lib("eunit/include/eunit.hrl"). -record(state, { user_id :: binary() | undefined, subscriptions = [] :: [binary()] }). setup() -> pg:start_link(), ok. cleanup(_) -> ok. ws_handler_test_() -> {foreach, fun setup/0, fun cleanup/1, [ {"WebSocket info notification - booking", fun test_websocket_info_booking/0}, {"WebSocket info notification - calendar", fun test_websocket_info_calendar/0}, {"WebSocket info notification - event", fun test_websocket_info_event/0} ]}. test_websocket_info_booking() -> State = #state{user_id = <<"user123">>, subscriptions = []}, Data = #{booking_id => <<"book123">>, event_id => <<"ev123">>, status => confirmed}, Msg = {notification, booking_update, Data}, case ws_handler:websocket_info(Msg, State) of {reply, {text, Reply}, _} -> Decoded = jsx:decode(Reply, [return_maps]), ?assertEqual(<<"booking_update">>, maps:get(<<"type">>, Decoded)), ?assertEqual(<<"book123">>, maps:get(<<"booking_id">>, maps:get(<<"data">>, Decoded))); _ -> ?assert(false, "Expected reply") end. test_websocket_info_calendar() -> State = #state{user_id = <<"user123">>, subscriptions = [<<"cal123">>]}, Data = #{calendar_id => <<"cal123">>, title => <<"Updated">>}, Msg = {notification, calendar_update, Data}, case ws_handler:websocket_info(Msg, State) of {reply, {text, Reply}, _} -> Decoded = jsx:decode(Reply, [return_maps]), ?assertEqual(<<"calendar_update">>, maps:get(<<"type">>, Decoded)); _ -> ?assert(false, "Expected reply") end. test_websocket_info_event() -> State = #state{user_id = <<"user123">>, subscriptions = []}, Data = #{event_id => <<"ev123">>, title => <<"Updated Event">>}, Msg = {notification, event_update, Data}, case ws_handler:websocket_info(Msg, State) of {reply, {text, Reply}, _} -> Decoded = jsx:decode(Reply, [return_maps]), ?assertEqual(<<"event_update">>, maps:get(<<"type">>, Decoded)); _ -> ?assert(false, "Expected reply") end.