When testing controllers, the goal is to call the router's controller endpoint and verify the HTTP response, including the status code, response content, headers, and more.

To initialize a test request, use testing::request, which prepares your app routers, providing the request instance and the application context.

In the following example, we have a POST endpoint that returns the data sent in the POST request.

async fn can_print_echo() {

    testing::request::<App, _, _>(|request, _ctx| async move {
        let response = request
            .json(&serde_json::json!({"site": "Loco"}))

        assert_debug_snapshot!((response.status_code(), response.text()));

As you can see initialize the testing request and using request instance calling /example endpoing. the request returns a Response instance with the status code and the response test

Seeding Data Before Running Tests

To seed data before running tests, refer to the documentation here