File: test_table.py

package info (click to toggle)
pystac 1.13.0-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 19,904 kB
  • sloc: python: 24,370; makefile: 124; sh: 7
file content (97 lines) | stat: -rw-r--r-- 3,236 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
from pathlib import Path

import pytest

import pystac
from pystac import ExtensionTypeError, Item
from pystac.extensions.table import Column, TableExtension
from tests.utils import TestCases


@pytest.fixture
def table_item() -> Item:
    return pystac.Item.from_file(TestCases.get_path("data-files/table/item.json"))


@pytest.mark.vcr()
def test_validate(table_item: Item) -> None:
    table_item.validate()


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

    with pytest.raises(pystac.ExtensionNotImplemented):
        _ = TableExtension.ext(table_item)

    # Should raise exception if owning item does not include extension URI
    asset = table_item.assets["data"]

    with pytest.raises(pystac.ExtensionNotImplemented):
        _ = TableExtension.ext(asset)

    # Should succeed if Asset has no owner
    ownerless_asset = pystac.Asset.from_dict(asset.to_dict())
    _ = TableExtension.ext(ownerless_asset)


def test_item_ext_add_to(table_item: Item) -> None:
    table_item.stac_extensions.remove(TableExtension.get_schema_uri())

    _ = TableExtension.ext(table_item, add_if_missing=True)

    assert TableExtension.get_schema_uri() in table_item.stac_extensions


def test_asset_ext_add_to(table_item: Item) -> None:
    table_item.stac_extensions.remove(TableExtension.get_schema_uri())

    assert TableExtension.get_schema_uri() not in table_item.stac_extensions
    asset = table_item.assets["data"]

    _ = TableExtension.ext(asset, add_if_missing=True)
    assert TableExtension.get_schema_uri() in table_item.stac_extensions


def test_should_raise_when_passing_invalid_extension_object() -> None:
    with pytest.raises(
        ExtensionTypeError, match=r"^TableExtension does not apply to type 'object'$"
    ):
        # calling it wrong on purpose so ------v
        TableExtension.ext(object())  # type: ignore


def test_item_with_table_extension_is_serilalizable_and_roundtrips(
    tmp_path: Path,
    table_item: Item,
) -> None:
    # add column metadata
    tab_ext = TableExtension.ext(table_item, add_if_missing=True)
    columns = [
        Column({"name": "col_1", "type": "str"}),
        Column({"name": "col_2", "type": "byte_array"}),
    ]
    tab_ext.columns = columns
    table_item.save_object(dest_href=str(tmp_path / "item.json"))
    assert all(isinstance(c, Column) for c in tab_ext.columns)
    assert all(
        before.properties == after.properties
        for before, after in zip(columns, tab_ext.columns)
    )


@pytest.mark.parametrize(
    "schema_uri",
    (
        "https://stac-extensions.github.io/table/v1.0.0/schema.json",
        "https://stac-extensions.github.io/table/v1.0.1/schema.json",
        "https://stac-extensions.github.io/table/v1.1.0/schema.json",
    ),
)
def test_migrate(schema_uri: str, table_item: Item) -> None:
    item_dict = table_item.to_dict(include_self_link=False, transform_hrefs=False)
    item_dict["stac_extensions"] = [schema_uri]
    assert Item.from_dict(item_dict, migrate=True).stac_extensions == [
        "https://stac-extensions.github.io/table/v1.2.0/schema.json"
    ]