package com.vtence.molecule.middlewares;

import com.vtence.molecule.Request;
import com.vtence.molecule.Response;
import org.junit.Test;

import static com.vtence.molecule.http.HttpStatus.NOT_FOUND;
import static com.vtence.molecule.http.HttpStatus.OK;
import static com.vtence.molecule.testing.ResponseAssert.assertThat;

public class URLMapTest {

    URLMap map = new URLMap(new NotFound());
    Request request = new Request();
    Response response = new Response();

    @Test
    public void fallsBackToDefaultApplicationForUnmappedPaths() throws Exception {
        request.path("/unmapped");

        map.handle(request, response);
        response.done();

        assertThat(response).hasStatus(NOT_FOUND)
                            .hasBodyText("Not found: /unmapped");
    }

    @Test
    public void dispatchesBasedOnRequestPath() throws Exception {
        map.mount("/foo", this::describeMount)
           .mount("/baz", this::describeMount);

        map.handle(request.path("/baz/quux"), response);

        assertThat(response).hasStatus(OK).hasBodyText("/baz at /quux (/baz/quux)");
    }

    @Test
    public void matchesMountPointsAsWords() throws Exception {
        map.mount("/foo", (request, response) -> response.done("mounted!?!"));

        map.handle(request.path("/foobar"), response);

        assertThat(response).hasStatus(NOT_FOUND);
    }

    @Test
    public void dispatchesToServerRootCorrectly() throws Exception {
        map.mount("/", this::describeMount);

        map.handle(request.path("/"), response);

        assertThat(response).hasStatus(OK).hasBodyText("/ at / (/)");
    }

    @Test
    public void dispatchesToImplicitMountRootCorrectly() throws Exception {
        map.mount("/foo", this::describeMount);

        map.handle(request.path("/foo"), response);

        assertThat(response).hasStatus(OK).hasBodyText("/foo at / (/foo)");
    }

    @Test
    public void dispatchesToExplicitMountRootCorrectly() throws Exception {
        map.mount("/foo", this::describeMount);

        map.handle(request.path("/foo/"), response);

        assertThat(response).hasStatus(OK).hasBodyText("/foo at / (/foo)");
    }

    @Test
    public void dispatchesToMostSpecifiPath() throws Exception {
        map.mount("/foo", this::describeMount)
           .mount("/foo/bar", this::describeMount);

        map.handle(request.path("/foo/bar/quux"), response);

        assertThat(response).hasStatus(OK).hasBodyText("/foo/bar at /quux (/foo/bar/quux)");
    }

    public void describeMount(Request request, Response response) {
        URLMap.MountPoint mountPoint = request.attribute(URLMap.MountPoint.class);
        response.done(String.format("%s at %s (%s)", mountPoint.app(), request.path(), mountPoint.uri(request.path())));
    }
}
@@ -2217,16 +2217,17 @@
 tSpecifi
+c
 Path() t
@@ -2785,8 +2785,9 @@
 %0A    %7D%0A%7D
+%0A

Fix typo