| 72 | } |
| 73 | |
| 74 | void test_json_endpoint() { |
| 75 | FL_WARN("\n=== Test 1: GET /json (Slideshow Data) ==="); |
| 76 | |
| 77 | fl::task::Promise<fl::net::http::Response> promise = fl::net::http::fetch_get("http://localhost:8081/json"); |
| 78 | fl::task::PromiseResult<fl::net::http::Response> result = fl::task::await_top_level(promise); |
| 79 | |
| 80 | if (!result.ok()) { |
| 81 | FL_WARN("✗ FAILED: " << result.error_message()); |
| 82 | tests_failed++; |
| 83 | state = FAILED; |
| 84 | return; |
| 85 | } |
| 86 | |
| 87 | const fl::net::http::Response& resp = result.value(); |
| 88 | if (resp.status() != 200) { |
| 89 | FL_WARN("✗ FAILED: Status " << resp.status() << " " << resp.status_text()); |
| 90 | tests_failed++; |
| 91 | state = FAILED; |
| 92 | return; |
| 93 | } |
| 94 | |
| 95 | if (!resp.is_json()) { |
| 96 | FL_WARN("✗ FAILED: Response is not JSON"); |
| 97 | tests_failed++; |
| 98 | state = FAILED; |
| 99 | return; |
| 100 | } |
| 101 | |
| 102 | fl::json data = resp.json(); |
| 103 | fl::string author = data["slideshow"]["author"] | fl::string("unknown"); |
| 104 | fl::string title = data["slideshow"]["title"] | fl::string("untitled"); |
| 105 | int slide_count = data["slideshow"]["slides"].size(); |
| 106 | |
| 107 | if (author == "unknown" || title == "untitled" || slide_count == 0) { |
| 108 | FL_WARN("✗ FAILED: Invalid JSON structure"); |
| 109 | FL_WARN(" Author: " << author); |
| 110 | FL_WARN(" Title: " << title); |
| 111 | FL_WARN(" Slides: " << slide_count); |
| 112 | tests_failed++; |
| 113 | state = FAILED; |
| 114 | return; |
| 115 | } |
| 116 | |
| 117 | FL_WARN("✓ PASSED"); |
| 118 | FL_WARN(" Author: " << author); |
| 119 | FL_WARN(" Title: " << title); |
| 120 | FL_WARN(" Slides: " << slide_count); |
| 121 | tests_passed++; |
| 122 | } |
| 123 | |
| 124 | void test_get_endpoint() { |
| 125 | FL_WARN("\n=== Test 2: GET /get (Request Echo) ==="); |