def test_skip_remote_extension():
    test_item = request(EO_EXTENSION)
    test_item["stac_extensions"].append(
        "http://some-remote-extension.json.schema")

    # This should fail
    with pytest.raises(AttributeError):
        item_model_factory(test_item, skip_remote_refs=False)(**test_item)

    # This should work
    item_model_factory(test_item, skip_remote_refs=True)(**test_item)
def test_point_cloud_extension_validation_error():
    test_item = request(POINTCLOUD_EXTENSION)
    test_item["properties"]["pc:count"] = ["not-an-int"]
    model = item_model_factory(test_item)

    with pytest.raises(ValidationError):
        model(**test_item)
def test_sar_extension_validation_error():
    test_item = request(SAR_EXTENSION)
    test_item["properties"]["sar:polarizations"] = ["foo", "bar"]
    model = item_model_factory(test_item)

    with pytest.raises(ValidationError):
        model(**test_item)
def test_datacube_extension_validation_error():
    test_item = request(DATACUBE_EXTENSION)
    test_item["properties"]["cube:dimensions"]["x"]["extent"] = ""

    model = item_model_factory(test_item)
    with pytest.raises(ValidationError):
        model(**test_item)
def test_version_extension_validation_error():
    test_item = request(VERSION_EXTENSION_ITEM)
    del test_item["properties"]["version"]
    model = item_model_factory(test_item)

    with pytest.raises(ValidationError):
        model(**test_item)
def test_view_extension_validation_error():
    test_item = request(VIEW_EXTENSION)
    test_item["properties"]["view:off_nadir"] = "foo"
    model = item_model_factory(test_item)

    with pytest.raises(ValidationError):
        model(**test_item)
Example #7
0
def test_proj_extension_validation_error():
    test_item = request(PROJ_EXTENSION)
    del test_item["properties"]["proj:epsg"]
    model = item_model_factory(test_item)

    with pytest.raises(ValidationError):
        model(**test_item)
def test_sci_extension_validation_error():
    test_item = request(SCIENTIFIC_EXTENSION)
    test_item["properties"]["sci:doi"] = [43]
    model = item_model_factory(test_item)

    with pytest.raises(ValidationError):
        model(**test_item)
def test_proj_extension():
    # The example item uses an invalid band name
    test_item = request(PROJ_EXTENSION)
    test_item["stac_extensions"][1] = "projection"
    test_item["assets"]["B8"]["eo:bands"][0]["common_name"] = "pan"

    valid_item = item_model_factory(test_item)(**test_item).to_dict()
    dict_match(test_item, valid_item)
def test_vendor_extension_invalid_alias():
    url = "https://invalid-url"
    test_item = request(EO_EXTENSION)
    test_item["stac_extensions"][-1] = url

    with pytest.raises(AttributeError) as e:
        model = item_model_factory(test_item)
    assert str(e.value) == f"Invalid extension name or alias: {url}"
Example #11
0
def test_version_extension_item():
    test_item = request(VERSION_EXTENSION_ITEM)

    # This example adds version fields to top level of the feature instead of inside properties
    assert "version" in test_item
    test_item["properties"]["version"] = test_item.pop("version")

    valid_item = item_model_factory(test_item)(**test_item).to_dict()
    dict_match(test_item, valid_item)
Example #12
0
def test_proj_extension():
    test_item = request(PROJ_EXTENSION)

    # This example uses EO extension but doesn't include eo:gsd (required field)
    assert "eo" in test_item["stac_extensions"]
    assert "eo:gsd" not in test_item["properties"]
    test_item["properties"]["eo:gsd"] = 10

    valid_item = item_model_factory(test_item)(**test_item).to_dict()
    dict_match(test_item, valid_item)
Example #13
0
def test_sar_extensions():
    test_item = request(SAR_EXTENSION)

    # This example uses eo:bands instead of sar:polarizations for the measurement asset
    assert "sar:bands" in test_item["assets"]["measurement"]
    test_item["assets"]["measurement"]["sar:polarizations"] = test_item[
        "assets"]["measurement"].pop("sar:bands")

    valid_item = item_model_factory(test_item)(**test_item).to_dict()
    dict_match(test_item, valid_item)
def test_item_factory_custom_base():
    class TestProperties(ItemProperties):
        foo: str = Field("bar", const=True)

    class TestItem(Item):
        properties: TestProperties

    test_item = request(EO_EXTENSION)

    model = item_model_factory(test_item, base_class=TestItem)(**test_item)
    assert model.properties.foo == "bar"
def test_label_extension():
    test_item = request(LABEL_EXTENSION)

    # This example contains an invalid geometry (linear ring does not close)
    coords = test_item["geometry"]["coordinates"]
    assert len(coords[0]) == 4
    coords[0].append(coords[0][0])
    test_item["geometry"]["coordinates"] = coords

    valid_item = item_model_factory(test_item)(**test_item).to_dict()
    dict_match(test_item, valid_item)
def test_vendor_extension_validation():
    test_item = request(EO_EXTENSION)

    # This item implements a vendor extension
    assert (test_item["stac_extensions"][-1] ==
            "https://example.com/stac/landsat-extension/1.0/schema.json")

    test_item["stac_extensions"][-1] = landsat_alias

    valid_item = item_model_factory(test_item)(**test_item).to_dict()
    dict_match(test_item, valid_item)
def test_sar_extensions():
    test_item = request(SAR_EXTENSION)
    valid_item = item_model_factory(test_item)(**test_item).to_dict()
    dict_match(test_item, valid_item)
def test_item_extensions(infile):
    test_item = request(infile)
    valid_item = item_model_factory(test_item)(**test_item).to_dict()
    dict_match(test_item, valid_item)
def test_excludes():
    test_item = request(EO_EXTENSION)
    valid_item = item_model_factory(test_item)(**test_item).dict(
        by_alias=True, exclude_unset=True, exclude={"properties": {"bands"}})
    assert "eo:bands" not in valid_item["properties"]
def test_serialize_namespace():
    test_item = request(SAR_EXTENSION)
    valid_item = item_model_factory(test_item)(**test_item)
    assert "sar:instrument_mode" in valid_item.dict(
        by_alias=True)["properties"]
    assert "instrument_mode" in valid_item.dict(by_alias=False)["properties"]
def test_eo_extension_validation_error():
    test_item = request(EO_EXTENSION)
    test_item["properties"]["eo:cloud_cover"] = "foo"
    model = item_model_factory(test_item)
    with pytest.raises(ValidationError):
        model(**test_item)
def test_version_extension_item():
    test_item = request(VERSION_EXTENSION_ITEM)
    valid_item = item_model_factory(test_item)(**test_item).to_dict()
    dict_match(test_item, valid_item)
Example #23
0
def test_eo_extension_validation_error():
    test_item = request(EO_EXTENSION)
    model = item_model_factory(test_item)
    del test_item["properties"]["eo:bands"]
    with pytest.raises(ValidationError):
        model(**test_item)