extends SceneTree ## Headless smoke test for Godot API client (auth + HTTP + WebSocket gateway). ## ## Exercises: ## 1. ApiClient autoload has WsGatewayClient child node. ## 2. ApiClient has all social methods adhering to {ok, status, data, detail}. ## 3. SocialApiClient helper methods work properly. ## 4. WsGatewayClient URL parsing, signal declarations, state transitions. func _initialize() -> void: _run() func _run() -> void: await process_frame print("SMOKE: Starting Social API client verification...") var api_client := root.get_node_or_null("ApiClient") if api_client == null: printerr("FAIL: ApiClient node not found in root") quit(1) return # Verify ws node exists on ApiClient if api_client.ws == null: printerr("FAIL: api_client.ws is null") quit(1) return if not (api_client.ws is WsGatewayClient): printerr("FAIL: api_client.ws is not a WsGatewayClient") quit(1) return print("PASS: ApiClient has WsGatewayClient attached.") # Verify WsGatewayClient states and signals var test_ws := WsGatewayClient.new() if test_ws.is_connected_to_gateway: printerr("FAIL: new test_ws should not be connected") quit(1) return print("PASS: WsGatewayClient initial state is disconnected.") # Verify ApiClient social methods exist var social_methods := [ "send_friend_request", "get_friend_requests", "accept_friend_request", "decline_friend_request", "unfriend", "get_friends", "follow_user", "unfollow_user", "get_following", "block_user", "unblock_user", "get_blocked", "send_presence_heartbeat", "get_friends_presence", "get_user_presence", "get_my_profile", "update_my_profile", "get_my_favorites", "replace_my_favorites", "get_public_profile", "create_group", "list_groups", "get_group", "update_group", "delete_group", "join_group", "leave_group", "set_group_member_role", "transfer_group_ownership", "get_dm_conversations", "start_dm_conversation", "get_dm_messages", "send_dm_message", "get_world_chat_messages", "send_world_chat_message", "get_room_chat_messages", "send_room_chat_message", "report_message" ] for m in social_methods: if not api_client.has_method(m): printerr("FAIL: ApiClient missing method: ", m) quit(1) return print("PASS: All %d social REST methods verified on ApiClient." % social_methods.size()) # Verify unauthenticated call correctly yields ok == false without crashing var result: Dictionary = await api_client.get_friends() if not result.has("ok") or not result.has("status") or not result.has("detail"): printerr("FAIL: result does not adhere to Result Dictionary Contract: ", result) quit(1) return print("PASS: Social REST call returns valid result dictionary (ok=%s, status=%d)." % [result.ok, result.status]) print("SMOKE RESULT: PASS") quit(0)