Fetching data is asynchronous, so the interface passes through more than one state. A request can be pending, successful with rows, successful with no rows, or failed. A resolved fetch promise doesn't prove that the server returned a successful HTTP status. Check response.ok before treating the body as success, then await the JSON parsing too. This workspace supplies local mock responses through the fixture; it doesn't call a live service. You'll render those responses and keep the action usable after loading. Empty results need their own visible state, because a blank list alone doesn't tell someone whether the request finished.