Skip to content

993 progress: convert 3 more files; 10 to go #1531

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 18 commits into from
Feb 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
232 changes: 118 additions & 114 deletions tests/extensions/test_grid.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
# This is for the type checking on GridTest.test_clear_code
# mypy: warn_unused_ignores=False

import unittest
from datetime import datetime
from typing import Any

Expand All @@ -19,7 +18,15 @@
code = "MGRS-4CFJ"


def make_item() -> pystac.Item:
@pytest.fixture
def sentinel2_example_item() -> pystac.Item:
return pystac.Item.from_file(
TestCases.get_path("data-files/grid/example-sentinel2.json")
)


@pytest.fixture
def item() -> pystac.Item:
"""Create basic test items that are only slightly different."""
asset_id = "an/asset"
start = datetime(2018, 1, 2)
Expand All @@ -31,118 +38,115 @@ def make_item() -> pystac.Item:
return item


class GridTest(unittest.TestCase):
def setUp(self) -> None:
super().setUp()
self.item = make_item()
self.sentinel_example_uri = TestCases.get_path(
"data-files/grid/example-sentinel2.json"
)

def test_stac_extensions(self) -> None:
self.assertTrue(GridExtension.has_extension(self.item))

def test_item_repr(self) -> None:
grid_item_ext = GridExtension.ext(self.item)
self.assertEqual(
f"<ItemGridExtension Item id={self.item.id}>", grid_item_ext.__repr__()
)

@pytest.mark.vcr()
def test_attributes(self) -> None:
GridExtension.ext(self.item).apply(code)
self.assertEqual(code, GridExtension.ext(self.item).code)
self.item.validate()

def test_invalid_code_value(self) -> None:
with self.assertRaises(ValueError):
GridExtension.ext(self.item).apply("not_a_valid_code")

@pytest.mark.vcr()
def test_modify(self) -> None:
GridExtension.ext(self.item).apply(code)
GridExtension.ext(self.item).apply(code + "a")
self.assertEqual(code + "a", GridExtension.ext(self.item).code)
self.item.validate()

def test_from_dict(self) -> None:
d: dict[str, Any] = {
"type": "Feature",
"stac_version": "1.1.0",
"id": "an/asset",
"properties": {
"grid:code": code,
"datetime": "2018-01-02T00:00:00Z",
},
"geometry": None,
"links": [],
"assets": {},
"stac_extensions": [GridExtension.get_schema_uri()],
}
item = pystac.Item.from_dict(d)
self.assertEqual(code, GridExtension.ext(item).code)

def test_to_from_dict(self) -> None:
GridExtension.ext(self.item).apply(code)
d = self.item.to_dict()
self.assertEqual(code, d["properties"][grid.CODE_PROP])

item = pystac.Item.from_dict(d)
self.assertEqual(code, GridExtension.ext(item).code)

def test_clear_code(self) -> None:
GridExtension.ext(self.item).apply(code)

with self.assertRaises(ValueError):
# Ignore type errors because this test intentionally checks behavior
# that does not conform to the type signature.
# https://github.com/stac-utils/pystac/pull/878#discussion_r957352232
GridExtension.ext(self.item).code = None # type: ignore
with self.assertRaises(ValueError):
# First segment has to be all caps
# https://github.com/stac-utils/pystac/pull/878#discussion_r957354927
GridExtension.ext(self.item).code = "this-is-not-a-grid-code"
with self.assertRaises(ValueError):
# Folks might try to put an epsg code in
# https://github.com/stac-utils/pystac/pull/878#discussion_r957355415
GridExtension.ext(self.item).code = "4326"
with self.assertRaises(ValueError):
# Folks might try to put an epsg code in
# https://github.com/stac-utils/pystac/pull/878#discussion_r957355415
GridExtension.ext(self.item).code = "EPSG:4326"

def test_extension_not_implemented(self) -> None:
# Should raise exception if Item does not include extension URI
item = pystac.Item.from_file(self.sentinel_example_uri)
item.stac_extensions.remove(GridExtension.get_schema_uri())

with self.assertRaises(pystac.ExtensionNotImplemented):
_ = GridExtension.ext(item)

# Should raise exception if owning Item does not include extension URI
item.properties["grid:code"] = None

with self.assertRaises(pystac.ExtensionNotImplemented):
_ = GridExtension.ext(item)

def test_item_ext_add_to(self) -> None:
item = pystac.Item.from_file(self.sentinel_example_uri)
item.stac_extensions.remove(GridExtension.get_schema_uri())
self.assertNotIn(GridExtension.get_schema_uri(), item.stac_extensions)

_ = GridExtension.ext(item, add_if_missing=True)

self.assertIn(GridExtension.get_schema_uri(), item.stac_extensions)

def test_should_raise_exception_when_passing_invalid_extension_object(
self,
) -> None:
self.assertRaisesRegex(
ExtensionTypeError,
r"^GridExtension does not apply to type 'object'$",
GridExtension.ext,
object(),
)
def test_stac_extensions(item: pystac.Item) -> None:
assert GridExtension.has_extension(item)


def test_item_repr(item: pystac.Item) -> None:
grid_item_ext = GridExtension.ext(item)
assert f"<ItemGridExtension Item id={item.id}>" == grid_item_ext.__repr__()


@pytest.mark.vcr()
def test_attributes(item: pystac.Item) -> None:
GridExtension.ext(item).apply(code)
assert code == GridExtension.ext(item).code
item.validate()


def test_invalid_code_value(item: pystac.Item) -> None:
with pytest.raises(ValueError):
GridExtension.ext(item).apply("not_a_valid_code")


@pytest.mark.vcr()
def test_modify(item: pystac.Item) -> None:
GridExtension.ext(item).apply(code)
GridExtension.ext(item).apply(code + "a")
assert code + "a" == GridExtension.ext(item).code
item.validate()


def test_from_dict() -> None:
d: dict[str, Any] = {
"type": "Feature",
"stac_version": "1.1.0",
"id": "an/asset",
"properties": {
"grid:code": code,
"datetime": "2018-01-02T00:00:00Z",
},
"geometry": None,
"links": [],
"assets": {},
"stac_extensions": [GridExtension.get_schema_uri()],
}
item = pystac.Item.from_dict(d)
assert code == GridExtension.ext(item).code


def test_to_from_dict(item: pystac.Item) -> None:
GridExtension.ext(item).apply(code)
d = item.to_dict()
assert code == d["properties"][grid.CODE_PROP]

item = pystac.Item.from_dict(d)
assert code == GridExtension.ext(item).code


def test_clear_code(item: pystac.Item) -> None:
GridExtension.ext(item).apply(code)

with pytest.raises(ValueError):
# Ignore type errors because this test intentionally checks behavior
# that does not conform to the type signature.
# https://github.com/stac-utils/pystac/pull/878#discussion_r957352232
GridExtension.ext(item).code = None # type: ignore
with pytest.raises(ValueError):
# First segment has to be all caps
# https://github.com/stac-utils/pystac/pull/878#discussion_r957354927
GridExtension.ext(item).code = "this-is-not-a-grid-code"
with pytest.raises(ValueError):
# Folks might try to put an epsg code in
# https://github.com/stac-utils/pystac/pull/878#discussion_r957355415
GridExtension.ext(item).code = "4326"
with pytest.raises(ValueError):
# Folks might try to put an epsg code in
# https://github.com/stac-utils/pystac/pull/878#discussion_r957355415
GridExtension.ext(item).code = "EPSG:4326"


def test_extension_not_implemented(sentinel2_example_item: pystac.Item) -> None:
# Should raise exception if Item does not include extension URI
item = sentinel2_example_item
item.stac_extensions.remove(GridExtension.get_schema_uri())

with pytest.raises(pystac.ExtensionNotImplemented):
_ = GridExtension.ext(item)

# Should raise exception if owning Item does not include extension URI
item.properties["grid:code"] = None

with pytest.raises(pystac.ExtensionNotImplemented):
_ = GridExtension.ext(item)


def test_item_ext_add_to(sentinel2_example_item: pystac.Item) -> None:
item = sentinel2_example_item
item.stac_extensions.remove(GridExtension.get_schema_uri())
assert GridExtension.get_schema_uri() not in item.stac_extensions

_ = GridExtension.ext(item, add_if_missing=True)

assert GridExtension.get_schema_uri() in item.stac_extensions


def test_should_raise_when_passing_invalid_extension_object() -> None:
with pytest.raises(
ExtensionTypeError, match=r"^GridExtension does not apply to type 'object'$"
):
# intentionally calling it wrong so tell mypy to ignore this line:
GridExtension.ext(object()) # type: ignore


@pytest.fixture
Expand Down
Loading