"""pytest suite proving backward/forward compatibility of schema versions."""

from __future__ import annotations

from pathlib import Path

import pyarrow.parquet as pq
import pytest

FIXTURES = Path(__file__).parent / "fixtures"


def _schema(name: str) -> set[str]:
    return set(pq.read_schema(FIXTURES / name).names)


def test_v1_columns():
    assert _schema("v1.parquet") == {"id", "actor", "repo", "created_at"}


def test_v2_adds_optional_payload_size():
    assert _schema("v2.parquet") == _schema("v1.parquet") | {"payload_size"}


def test_v3_adds_required_event_type():
    assert _schema("v3.parquet") == _schema("v2.parquet") | {"event_type"}


def test_v3_reads_v1_consumer_safe():
    """A v1 consumer reading v3 must still find v1 columns (backward compat)."""
    v3 = pq.read_table(FIXTURES / "v3.parquet").select(["id", "actor", "repo", "created_at"])
    assert v3.num_rows == 10
    assert v3.column_names == ["id", "actor", "repo", "created_at"]


def test_v1_reads_v3_producer_safe():
    """A v3 producer can be read by a v1 consumer (forward compat) because
    the v1 columns are a strict subset of v3 columns."""
    assert _schema("v1.parquet").issubset(_schema("v3.parquet"))


@pytest.mark.parametrize("name,col", [("v2.parquet", "payload_size"),
                                       ("v3.parquet", "event_type")])
def test_new_columns_have_values(name: str, col: str):
    tbl = pq.read_table(FIXTURES / name, columns=[col])
    assert tbl.num_rows == 10
    assert tbl.column(col).null_count == 0
