Esempio n. 1
0
def test_API_MVTtiles(get_assets, event):
    """Test /tiles routes."""
    from cogeo_mosaic_tiler.handlers.app import app

    get_assets.return_value = [asset1, asset2]

    event["path"] = f"/9/150/182.pbf"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = {}
    res = app(event, {})
    assert res["statusCode"] == 400

    event["path"] = f"/9/150/182.pbf"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(url="http://mymosaic.json", tile_size="64")
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "application/x-protobuf"
    assert res["body"]

    event[
        "path"
    ] = f"/b99dd7e8cc284c6da4d2899e16b6ff85c8ab97041ae7b459eb67e516/9/150/182.pbf"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(url="http://mymosaic.json", tile_size="64")
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "application/x-protobuf"
    assert res["body"]
Esempio n. 2
0
def test_get_mosaic_wmts_mosaicid(get_data):
    """Test /wmts route."""
    from cogeo_mosaic_tiler.handlers.app import app

    get_data.return_value = mosaic_content

    event = {
        "resource": "/{proxy+}",
        "pathParameters": {
            "proxy": "b99dd7e8cc284c6da4d2899e16b6ff85c8ab97041ae7b459eb67e516/wmts"
        },
        "path": "/b99dd7e8cc284c6da4d2899e16b6ff85c8ab97041ae7b459eb67e516/wmts",
        "headers": {"host": "somewhere-over-the-rainbow.com"},
    }

    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(tile_scale="2")

    headers = {
        "Access-Control-Allow-Credentials": "true",
        "Access-Control-Allow-Methods": "GET",
        "Access-Control-Allow-Origin": "*",
        "Content-Type": "application/xml",
    }
    statusCode = 200

    res = app(event, {})
    assert res["headers"] == headers
    assert res["statusCode"] == statusCode
    body = res["body"]
    assert "https://somewhere-over-the-rainbow.com/wmts" in body
    assert "99dd7e8cc284c6da4d2899e16b6ff85c8ab97041ae7b459eb67e516" in body
    get_data.assert_called_once()
Esempio n. 3
0
def test_get_mosaic_info_mosaicid(get_data, event):
    """Test /info route."""
    from cogeo_mosaic_tiler.handlers.app import app

    get_data.return_value = mosaic_content

    event["path"] = "/b99dd7e8cc284c6da4d2899e16b6ff85c8ab97041ae7b459eb67e516/info"
    event["httpMethod"] = "GET"

    headers = {
        "Access-Control-Allow-Credentials": "true",
        "Access-Control-Allow-Methods": "GET",
        "Access-Control-Allow-Origin": "*",
        "Content-Type": "application/json",
    }
    statusCode = 200

    res = app(event, {})
    assert res["headers"] == headers
    assert res["statusCode"] == statusCode
    body = json.loads(res["body"])
    assert body["bounds"]
    assert body["center"]
    assert body["maxzoom"] == 9
    assert body["minzoom"] == 7
    assert body["name"] == "b99dd7e8cc284c6da4d2899e16b6ff85c8ab97041ae7b459eb67e516"
    assert len(body["quadkeys"]) == 9
    assert body["layers"] == ["band1", "band2", "band3"]
    get_data.assert_called_once()
Esempio n. 4
0
def test_get_mosaic_info(get_data, event):
    """Test /info route."""
    from cogeo_mosaic_tiler.handlers.app import app

    get_data.return_value = mosaic_content

    event["path"] = "/info"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(url="http://mymosaic.json")

    headers = {
        "Access-Control-Allow-Credentials": "true",
        "Access-Control-Allow-Methods": "GET",
        "Access-Control-Allow-Origin": "*",
        "Content-Type": "application/json",
    }
    statusCode = 200

    res = app(event, {})
    assert res["headers"] == headers
    assert res["statusCode"] == statusCode
    body = json.loads(res["body"])
    assert body["bounds"]
    assert body["center"]
    assert body["maxzoom"] == 9
    assert body["minzoom"] == 7
    assert body["name"] == "http://mymosaic.json"
    assert len(body["quadkeys"]) == 9
    assert body["layers"] == ["band1", "band2", "band3"]
    get_data.assert_called_once()
Esempio n. 5
0
def test_create_mosaic(aws_put_data, get_mosaic, event):
    """Test /create route."""
    from cogeo_mosaic_tiler.handlers.app import app

    event["path"] = "/create"
    event["httpMethod"] = "POST"
    event["isBase64Encoded"] = "true"
    event["body"] = base64.b64encode(json.dumps([asset1, asset2]).encode()).decode(
        "utf-8"
    )

    headers = {
        "Access-Control-Allow-Credentials": "true",
        "Access-Control-Allow-Methods": "POST",
        "Access-Control-Allow-Origin": "*",
        "Content-Type": "application/json",
    }

    get_mosaic.side_effect = ClientError(
        {"Error": {"Code": "404", "Message": "Not Found"}}, "get_object"
    )
    aws_put_data.return_value = True

    res = app(event, {})
    assert res["headers"] == headers
    assert res["statusCode"] == 200
    tilejson = json.loads(res["body"])
    assert tilejson["bounds"]
    assert tilejson["center"]
    assert tilejson["name"]
    tileurl = tilejson["tiles"][0]
    url_info = urllib.parse.urlparse(tileurl)
    assert url_info.netloc == "somewhere-over-the-rainbow.com"
    assert re.match(r"/[0-9A-Fa-f]{56}/{z}/{x}/{y}@1x", url_info.path)
    aws_put_data.assert_called()
Esempio n. 6
0
def test_add_mosaic(aws_put_data, event):
    """Test /add route."""
    from cogeo_mosaic_tiler.handlers.app import app

    event["path"] = "/add"
    event["httpMethod"] = "POST"
    event["body"] = json.dumps(mosaic_content).encode()

    headers = {
        "Access-Control-Allow-Credentials": "true",
        "Access-Control-Allow-Methods": "POST",
        "Access-Control-Allow-Origin": "*",
        "Content-Type": "application/json",
    }
    aws_put_data.return_value = True

    res = app(event, {})
    assert res["headers"] == headers
    assert res["statusCode"] == 200
    aws_put_data.assert_called()
    aws_put_data.reset_mock()

    event["isBase64Encoded"] = "true"
    event["body"] = base64.b64encode(json.dumps(mosaic_content).encode()).decode(
        "utf-8"
    )
    aws_put_data.return_value = True

    res = app(event, {})
    assert res["headers"] == headers
    assert res["statusCode"] == 200
    aws_put_data.assert_called()
    aws_put_data.reset_mock()

    event["queryStringParameters"] = dict(
        mosaicid="b99dd7e8cc284c6da4d2899e16b6ff85c8ab97041ae7b459eb67e516"
    )
    res = app(event, {})
    assert res["headers"] == headers
    assert res["statusCode"] == 200
    aws_put_data.assert_called()
Esempio n. 7
0
def test_API_emptytiles(get_assets, event):
    """Test /tiles routes."""
    from cogeo_mosaic_tiler.handlers.app import app

    get_assets.return_value = [asset1, asset2]

    # empty assets
    event["path"] = f"/9/140/182.png"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(url="http://mymosaic.json")
    res = app(event, {})
    assert res["statusCode"] == 204
    headers = res["headers"]
    assert headers["Content-Type"] == "text/plain"
    assert res["body"] == "empty tiles"
Esempio n. 8
0
def test_API_errors(get_assets, event):
    """Test /tiles routes."""
    from cogeo_mosaic_tiler.handlers.app import app

    get_assets.return_value = []

    # missing URL
    event["path"] = f"/9/150/182.png"
    event["httpMethod"] = "GET"
    res = app(event, {})
    assert res["statusCode"] == 400
    headers = res["headers"]
    assert headers["Content-Type"] == "text/plain"
    assert res["body"] == "Missing 'URL' parameter"

    # empty assets
    event["path"] = f"/9/150/182.png"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(url="http://mymosaic.json")
    res = app(event, {})
    assert res["statusCode"] == 204
    headers = res["headers"]
    assert headers["Content-Type"] == "text/plain"
    assert res["body"] == "No assets found for tile 9-150-182"
Esempio n. 9
0
def test_tilejson_mosaicid(get_data):
    """Test /tilejson.json route."""
    from cogeo_mosaic_tiler.handlers.app import app

    get_data.return_value = mosaic_content

    event = {
        "resource": "/{proxy+}",
        "pathParameters": {
            "proxy": "b99dd7e8cc284c6da4d2899e16b6ff85c8ab97041ae7b459eb67e516/tilejson.json"
        },
        "path": "/b99dd7e8cc284c6da4d2899e16b6ff85c8ab97041ae7b459eb67e516/tilejson.json",
        "headers": {"host": "somewhere-over-the-rainbow.com"},
    }
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(rescale="-1,1")

    headers = {
        "Access-Control-Allow-Credentials": "true",
        "Access-Control-Allow-Methods": "GET",
        "Access-Control-Allow-Origin": "*",
        "Content-Type": "application/json",
    }

    res = app(event, {})
    assert res["headers"] == headers
    assert res["statusCode"] == 200
    body = json.loads(res["body"])
    assert body["bounds"]
    assert body["center"]
    assert body["maxzoom"] == 9
    assert body["minzoom"] == 7
    assert (
        body["name"]
        == "s3://my-bucket/mosaics/b99dd7e8cc284c6da4d2899e16b6ff85c8ab97041ae7b459eb67e516.json.gz"
    )
    assert body["tilejson"] == "2.1.0"

    url_info = urllib.parse.urlparse(body["tiles"][0])
    assert url_info.netloc == "somewhere-over-the-rainbow.com"
    assert (
        url_info.path
        == "/b99dd7e8cc284c6da4d2899e16b6ff85c8ab97041ae7b459eb67e516/{z}/{x}/{y}@1x"
    )
    qs = urllib.parse.parse_qs(url_info.query)
    assert qs["rescale"][0] == "-1,1"
Esempio n. 10
0
def test_favicon(event):
    """Test /favicon.ico route."""
    from cogeo_mosaic_tiler.handlers.app import app

    event["path"] = "/favicon.ico"
    event["httpMethod"] = "GET"

    resp = {
        "body": "",
        "headers": {
            "Access-Control-Allow-Credentials": "true",
            "Access-Control-Allow-Methods": "GET",
            "Access-Control-Allow-Origin": "*",
            "Content-Type": "text/plain",
        },
        "statusCode": 204,
    }
    res = app(event, {})
    assert res == resp
Esempio n. 11
0
def test_API_points(get_assets, event):
    """Test /point routes."""
    from cogeo_mosaic_tiler.handlers.app import app

    get_assets.return_value = [asset1, asset2]

    event["path"] = f"/point"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(
        url="http://mymosaic.json", lng="-73", lat="45"
    )
    res = app(event, {})
    print(res)
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "application/json"
    body = json.loads(res["body"])
    assert body["coordinates"]
    assert body["values"]
    assert len(body["values"]) == 2
Esempio n. 12
0
def test_get_mosaic_geojson_mosaicid(get_data, event):
    """Test /geojson route."""
    from cogeo_mosaic_tiler.handlers.app import app

    get_data.return_value = mosaic_content

    event["path"] = "/b99dd7e8cc284c6da4d2899e16b6ff85c8ab97041ae7b459eb67e516/geojson"
    event["httpMethod"] = "GET"

    headers = {
        "Access-Control-Allow-Credentials": "true",
        "Access-Control-Allow-Methods": "GET",
        "Access-Control-Allow-Origin": "*",
        "Content-Type": "application/json",
    }
    statusCode = 200

    res = app(event, {})
    assert res["headers"] == headers
    assert res["statusCode"] == statusCode
    body = json.loads(res["body"])
    assert body["type"] == "FeatureCollection"
    assert len(body["features"]) == 9
    get_data.assert_called_once()
Esempio n. 13
0
def test_API_tiles(get_assets, event):
    """Test /tiles routes."""
    from cogeo_mosaic_tiler.handlers.app import app

    get_assets.return_value = [asset1, asset2]

    event["path"] = f"/9/150/182.png"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(url="http://mymosaic.json")
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    assert res["body"]

    event["path"] = f"/9/150/182.png"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(
        url="http://mymosaic.json", pixel_selection="first"
    )
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    assert res["body"]

    event["path"] = f"/9/150/182.png"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(
        url="http://mymosaic.json", pixel_selection="highest"
    )
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    assert res["body"]

    event["path"] = f"/9/150/182.png"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(
        url="http://mymosaic.json", pixel_selection="lowest"
    )
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    assert res["body"]

    event["path"] = f"/9/150/182.png"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(
        url="http://mymosaic.json", pixel_selection="mean"
    )
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    assert res["body"]

    event["path"] = f"/9/150/182.png"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(
        url="http://mymosaic.json", pixel_selection="median"
    )
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    assert res["body"]

    event["path"] = f"/9/150/182.png"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(
        url="http://mymosaic.json", rescale="0,10000", indexes="1", color_map="cfastie"
    )
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    assert res["body"]

    event["path"] = f"/9/150/[email protected]"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(url="http://mymosaic.json", rescale="0,10000")
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    assert res["body"]

    event["path"] = f"/9/155/182@2x"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(url="http://mymosaic.json", rescale="0,10000")
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    assert res["body"]

    event["path"] = f"/9/150/182"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(url="http://mymosaic.json", rescale="0,10000")
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/jpg"
    assert res["body"]

    event[
        "path"
    ] = f"/b99dd7e8cc284c6da4d2899e16b6ff85c8ab97041ae7b459eb67e516/9/150/182.png"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(rescale="0,10000")
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    assert res["body"]

    event[
        "path"
    ] = f"/b99dd7e8cc284c6da4d2899e16b6ff85c8ab97041ae7b459eb67e516/9/150/[email protected]"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(rescale="0,10000")
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    assert res["body"]

    event[
        "path"
    ] = f"/b99dd7e8cc284c6da4d2899e16b6ff85c8ab97041ae7b459eb67e516/9/150/182@2x"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = dict(rescale="0,10000")
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/jpg"
    assert res["body"]
Esempio n. 14
0
def test_tilejson(get_data, event):
    """Test /tilejson.json route."""
    from cogeo_mosaic_tiler.handlers.app import app

    get_data.return_value = mosaic_content

    event = {
        "resource": "/{proxy+}",
        "pathParameters": {"proxy": "tilejson.json"},
        "path": "/tilejson.json",
        "headers": {"host": "somewhere-over-the-rainbow.com"},
    }
    event["path"] = "/tilejson.json"
    event["httpMethod"] = "GET"
    headers = {
        "Access-Control-Allow-Credentials": "true",
        "Access-Control-Allow-Methods": "GET",
        "Access-Control-Allow-Origin": "*",
        "Content-Type": "application/json",
    }
    res = app(event, {})
    assert res["statusCode"] == 400

    # png 256px
    event["queryStringParameters"] = dict(url="http://mymosaic.json", rescale="-1,1")

    res = app(event, {})
    assert res["headers"] == headers
    assert res["statusCode"] == 200
    body = json.loads(res["body"])
    assert body["bounds"]
    assert body["center"]
    assert body["maxzoom"] == 9
    assert body["minzoom"] == 7
    assert body["name"] == "http://mymosaic.json"
    assert body["tilejson"] == "2.1.0"

    url_info = urllib.parse.urlparse(body["tiles"][0])
    assert url_info.netloc == "somewhere-over-the-rainbow.com"
    assert url_info.path == "/{z}/{x}/{y}@1x"
    qs = urllib.parse.parse_qs(url_info.query)
    assert qs["url"][0] == "http://mymosaic.json"
    assert qs["rescale"][0] == "-1,1"

    # Jpeg 512px
    event["queryStringParameters"] = dict(
        url="http://mymosaic.json", tile_format="jpg", tile_scale=2
    )

    res = app(event, {})
    assert res["headers"] == headers
    assert res["statusCode"] == 200
    body = json.loads(res["body"])
    url_info = urllib.parse.urlparse(body["tiles"][0])
    assert url_info.netloc == "somewhere-over-the-rainbow.com"
    assert url_info.path == "/{z}/{x}/{y}@2x.jpg"
    qs = urllib.parse.parse_qs(url_info.query)
    assert qs["url"][0] == "http://mymosaic.json"

    event["queryStringParameters"] = dict(url="http://mymosaic.json", tile_format="pbf")

    res = app(event, {})
    assert res["headers"] == headers
    assert res["statusCode"] == 200
    body = json.loads(res["body"])
    url_info = urllib.parse.urlparse(body["tiles"][0])
    assert url_info.netloc == "somewhere-over-the-rainbow.com"
    assert url_info.path == "/{z}/{x}/{y}.pbf"
    qs = urllib.parse.parse_qs(url_info.query)
    assert qs["url"][0] == "http://mymosaic.json"