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)
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}"
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)
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)
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)
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)