コード例 #1
0
def test_API_tilejson(event):
    """Test /tilejson.json route."""
    from cogeo_tiler.handler import app

    urlqs = urllib.parse.urlencode([("url", cog_path)])

    event["path"] = f"/tilejson.json"
    res = app(event, {})
    assert res["statusCode"] == 500
    headers = res["headers"]
    assert headers["Content-Type"] == "application/json"
    body = json.loads(res["body"])
    assert "url" in body["errorMessage"]

    event["path"] = f"/tilejson.json"
    event["queryStringParameters"] = {"url": cog_path, "tile_scale": "2"}
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "application/json"
    body = json.loads(res["body"])
    assert body["name"] == "cog.tif"
    assert body["tilejson"] == "2.1.0"
    assert body["tiles"][0] == (
        f"https://somewhere-over-the-rainbow.com/{{z}}/{{x}}/{{y}}@2x?{urlqs}"
    )
    assert len(body["bounds"]) == 4
    assert len(body["center"]) == 3
    assert body["minzoom"] == 6
    assert body["maxzoom"] == 8

    # test with tile_format
    event["path"] = f"/tilejson.json"
    event["queryStringParameters"] = {"url": cog_path, "tile_format": "jpg"}
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "application/json"
    body = json.loads(res["body"])
    assert body["tiles"][0] == (
        f"https://somewhere-over-the-rainbow.com/{{z}}/{{x}}/{{y}}@1x.jpg?{urlqs}"
    )

    # test with kwargs
    event["path"] = f"/tilejson.json"
    event["queryStringParameters"] = {"url": cog_path, "rescale": "-1,1"}
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "application/json"
    body = json.loads(res["body"])
    assert body["tiles"][0] == (
        f"https://somewhere-over-the-rainbow.com/{{z}}/{{x}}/{{y}}@1x?rescale=-1%2C1&{urlqs}"
    )
コード例 #2
0
def test_API_metadata(event):
    """Test /metadata route."""
    from cogeo_tiler.handler import app

    event["path"] = f"/metadata"
    res = app(event, {})
    assert res["statusCode"] == 500
    headers = res["headers"]
    assert headers["Content-Type"] == "application/json"
    body = json.loads(res["body"])
    assert "url" in body["errorMessage"]

    event["path"] = f"/metadata"
    event["queryStringParameters"] = {"url": cog_path}
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "application/json"
    body = json.loads(res["body"])
    assert body["address"]
    assert len(body["bounds"]["value"]) == 4
    assert body["bounds"]["crs"] == "EPSG:4326"
    assert len(body["statistics"].keys()) == 1
    assert len(body["statistics"]["1"]["histogram"][0]) == 20
    assert body["minzoom"]
    assert body["maxzoom"]
    assert body["band_descriptions"]

    event["path"] = f"/metadata"
    event["queryStringParameters"] = {"url": cog_path, "histogram_bins": "10"}
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "application/json"
    body = json.loads(res["body"])
    assert len(body["statistics"]["1"]["histogram"][0]) == 10

    event["queryStringParameters"] = {
        "url": cog_path,
        "pmin": "5",
        "pmax": "95",
        "nodata": "-9999",
        "indexes": "1",
        "overview_level": "1",
        "histogram_range": "1,1000",
    }
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "application/json"
    body = json.loads(res["body"])
    assert len(body["statistics"].keys()) == 1
コード例 #3
0
def test_API_tilesMock(tiler, event):
    """Tests if route pass the right variables."""
    from cogeo_tiler.handler import app

    tilesize = 256
    tile = numpy.random.rand(3, tilesize, tilesize).astype(numpy.int16)
    mask = numpy.full((tilesize, tilesize), 255)
    mask[0:100, 0:100] = 0

    tiler.return_value = (tile, mask)

    # test no ext
    event["path"] = f"/7/22/22"
    event["queryStringParameters"] = {"url": cog_path, "rescale": "0,10000"}
    res = app(event, {})
    assert res["statusCode"] == 200
    assert res["body"]
    assert res["isBase64Encoded"]
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    kwargs = tiler.call_args[1]
    assert kwargs["tilesize"] == 256
    vars = tiler.call_args[0]
    assert vars[1] == 22
    assert vars[2] == 22
    assert vars[3] == 7
コード例 #4
0
def test_API_bounds(app, event):
    """Test /bounds route."""
    from cogeo_tiler.handler import app

    event["path"] = "/bounds"
    res = app(event, {})
    assert res["statusCode"] == 500
    headers = res["headers"]
    assert headers["Content-Type"] == "application/json"
    body = json.loads(res["body"])
    assert "url" in body["errorMessage"]

    event["path"] = "/bounds"
    event["queryStringParameters"] = {"url": cog_path}
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "application/json"
    body = json.loads(res["body"])
    assert body["address"]
    assert len(body["bounds"]) == 4
コード例 #5
0
def test_API_point(app, event):
    """Test /point route."""
    from cogeo_tiler.handler import app

    event["path"] = "/point"
    event["queryStringParameters"] = {
        "url": cog_path,
        "lon": "-2.0",
        "lat": "49.0",
    }
    res = app(event, {})
    assert res["statusCode"] == 200
    body = json.loads(res["body"])
    assert body["values"] == [-3]
    headers = res["headers"]
    assert headers["Content-Type"] == "application/json"

    event["queryStringParameters"] = {
        "url": cog_path,
        "lon": "-2.0",
        "lat": "49.0",
        "indexes": "1,1,1",
    }
    res = app(event, {})
    assert res["statusCode"] == 200
    body = json.loads(res["body"])
    body["values"] == [-3, -3, -3]
    headers = res["headers"]
    assert headers["Content-Type"] == "application/json"

    event["queryStringParameters"] = {
        "url": cog_path,
        "lon": "-2.0",
        "lat": "53.0",
    }
    res = app(event, {})
    assert res["statusCode"] == 500
    assert headers["Content-Type"] == "application/json"
    body = json.loads(res["body"])
    assert body["errorMessage"] == "Point is outside dataset bounds"
コード例 #6
0
def test_API_wmts(app, event):
    """Test /wmts route."""
    from cogeo_tiler.handler import app

    event["path"] = "/wmts"
    event["queryStringParameters"] = {"url": cog_path}
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "application/xml"
    assert res["body"]
    assert "https://somewhere-over-the-rainbow.com/wmts?url" in res["body"]

    event["queryStringParameters"] = {"url": cog_path, "tile_scale": "2"}
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "application/xml"
    assert res["body"]
    assert (
        "https://somewhere-over-the-rainbow.com/{TileMatrix}/{TileCol}/{TileRow}@2x.png?url"
        in res["body"])
コード例 #7
0
def test_API_favicon(app, event):
    """Test /favicon.ico route."""
    event["path"] = "/favicon.ico"

    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
コード例 #8
0
    def do_GET(self):
        """Get requests."""
        q = urlparse(self.path)
        request = {
            "headers": dict(self.headers),
            "path": q.path,
            "queryStringParameters": dict(parse_qsl(q.query)),
            "httpMethod": self.command,
        }
        response = app(request, None)

        self.send_response(int(response["statusCode"]))
        for r in response["headers"]:
            self.send_header(r, response["headers"][r])
        self.end_headers()

        if response.get("isBase64Encoded"):
            response["body"] = base64.b64decode(response["body"])

        if isinstance(response["body"], str):
            self.wfile.write(bytes(response["body"], "utf-8"))
        else:
            self.wfile.write(response["body"])
コード例 #9
0
def test_API_tiles(app, event):
    """Test /tiles route."""
    from cogeo_tiler.handler import app

    # test missing url in queryString
    event["path"] = "/7/62/44.jpg"
    res = app(event, {})
    assert res["statusCode"] == 500
    headers = res["headers"]
    assert headers["Content-Type"] == "application/json"
    body = json.loads(res["body"])
    assert body["errorMessage"] == "Missing 'url' parameter"

    # test missing expr and indexes in queryString
    event["path"] = "/7/62/44.jpg"
    event["queryStringParameters"] = {
        "url": cog_path,
        "indexes": "1",
        "expr": "b1/b1"
    }
    res = app(event, {})
    assert res["statusCode"] == 500
    headers = res["headers"]
    assert headers["Content-Type"] == "application/json"
    body = json.loads(res["body"])
    assert body["errorMessage"] == "Cannot pass indexes and expression"

    # test valid request with linear rescaling
    event["path"] = "/7/62/44.png"
    event["queryStringParameters"] = {
        "url": cog_path,
        "rescale": "0,10000",
        "color_formula": "Gamma R 3.0",
    }
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    assert res["body"]
    assert res["isBase64Encoded"]

    # test valid request with expression
    event["path"] = "/7/62/44.png"
    event["queryStringParameters"] = {
        "url": cog_path,
        "expr": "b1/b1",
        "rescale": "0,1",
    }
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    assert res["body"]
    assert res["isBase64Encoded"]

    # test valid jpg request with linear rescaling
    event["path"] = "/7/62/44.jpg"
    event["queryStringParameters"] = {
        "url": cog_path,
        "rescale": "0,10000",
        "indexes": "1",
        "nodata": "-9999",
    }
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/jpg"
    assert res["body"]
    assert res["isBase64Encoded"]

    # test valid jpg request with rescaling and colormap
    event["path"] = "/7/62/44.png"
    event["queryStringParameters"] = {
        "url": cog_path,
        "rescale": "0,10000",
        "color_map": "schwarzwald",
    }
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    assert res["body"]
    assert res["isBase64Encoded"]

    # test scale (512px tile size)
    event["path"] = "/7/62/[email protected]"
    event["queryStringParameters"] = {"url": cog_path, "rescale": "0,10000"}
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    assert res["body"]
    assert res["isBase64Encoded"]

    # test no ext (partial: png)
    event["path"] = "/7/62/44"
    event["queryStringParameters"] = {"url": cog_path, "rescale": "0,10000"}
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/png"
    assert res["body"]
    assert res["isBase64Encoded"]

    # test no ext (full: jpeg)
    event["path"] = "/8/126/87"
    event["httpMethod"] = "GET"
    event["queryStringParameters"] = {"url": cog_path, "rescale": "0,10000"}
    res = app(event, {})
    assert res["statusCode"] == 200
    headers = res["headers"]
    assert headers["Content-Type"] == "image/jpg"
    assert res["body"]
    assert res["isBase64Encoded"]

    # test tif
    event["path"] = "/8/126/87.tif"
    event["queryStringParameters"] = {"url": cog_path}
    res = app(event, {})
    assert res["statusCode"] == 200
    assert res["body"]
    assert res["isBase64Encoded"]
    headers = res["headers"]
    assert headers["Content-Type"] == "image/tiff"

    # test npy
    event["path"] = "/8/126/87.npy"
    event["queryStringParameters"] = {"url": cog_path}
    res = app(event, {})
    assert res["statusCode"] == 200
    assert res["isBase64Encoded"]
    headers = res["headers"]
    assert headers["Content-Type"] == "application/x-binary"
    body = base64.b64decode(res["body"])
    data, datamask = numpy.load(BytesIO(body), allow_pickle=True)
    assert data.shape == (1, 256, 256)
    assert datamask.shape == (256, 256)