from __future__ import annotations
import pytest
import mrrc
def _build_record() -> mrrc.Record:
record = mrrc.Record()
record.add_field(mrrc.Field("001", data="ocm12345678"))
record.add_field(mrrc.Field("005", data="20200101000000.0"))
title = mrrc.Field("245", "1", "0")
title.add_subfield("a", "Original title /")
title.add_subfield("c", "by Original Author.")
record.add_field(title)
for heading in ("Cats.", "Dogs.", "Birds."):
subject = mrrc.Field("650", " ", "0")
subject.add_subfield("a", heading)
subject.add_subfield("9", "local")
record.add_field(subject)
return record
def test_getitem_indicator_assignment_persists() -> None:
record = _build_record()
record["245"].indicator1 = "0"
assert record["245"].indicator1 == "0"
def test_getitem_add_subfield_persists() -> None:
record = _build_record()
record["245"].add_subfield("b", "a subtitle /")
assert record["245"]["b"] == "a subtitle /"
def test_getitem_setitem_subfield_persists() -> None:
record = _build_record()
record["245"]["a"] = "Revised title /"
assert record["245"]["a"] == "Revised title /"
def test_get_field_delete_subfield_persists() -> None:
record = _build_record()
field = record.get_field("245")
assert field is not None
field.delete_subfield("c")
assert record["245"]["c"] is None
def test_get_fields_iteration_edits_persist() -> None:
record = _build_record()
for field in record.get_fields("650"):
field.delete_subfield("9")
assert all(f["9"] is None for f in record.get_fields("650"))
def test_get_fields_index_edit_persists() -> None:
record = _build_record()
record.get_fields("650")[0].add_subfield("x", "History.")
assert record.get_fields("650")[0]["x"] == "History."
def test_alias_handles_see_each_others_edits() -> None:
record = _build_record()
first = record["245"]
second = record["245"]
first.add_subfield("n", "Part 1.")
assert second["n"] == "Part 1."
def test_control_field_data_assignment_persists() -> None:
record = _build_record()
record["005"].data = "20260603120000.0"
assert record["005"].data == "20260603120000.0"
def test_control_field_handles_alias() -> None:
record = _build_record()
handle = record["001"]
record["001"].data = "ocn987654321"
assert handle.data == "ocn987654321"
def test_stale_handle_write_raises_after_removal() -> None:
record = _build_record()
second_subject = record.get_fields("650")[1]
record.remove_field("650") with pytest.raises(mrrc.StaleFieldError):
second_subject.add_subfield("x", "History.")
def test_stale_handle_read_raises_after_removal() -> None:
record = _build_record()
second_subject = record.get_fields("650")[1]
record.remove_field("650")
with pytest.raises(mrrc.StaleFieldError):
second_subject["a"]
def test_handle_survives_field_addition() -> None:
record = _build_record()
handle = record.get_fields("650")[2]
extra = mrrc.Field("650", " ", "0")
extra.add_subfield("a", "Fish.")
record.add_field(extra)
handle.add_subfield("x", "Behavior.")
assert record.get_fields("650")[2]["x"] == "Behavior."
def test_detached_field_mutate_then_add() -> None:
record = _build_record()
note = mrrc.Field("500", " ", " ")
note.add_subfield("a", "A general note.")
record.add_field(note)
assert record["500"]["a"] == "A general note."
def test_edits_survive_marc_roundtrip() -> None:
record = _build_record()
record["245"]["a"] = "Persisted title /"
record["005"].data = "20260603120000.0"
data = record.as_marc()
reread = next(mrrc.MARCReader(data))
assert reread is not None
assert reread["245"]["a"] == "Persisted title /"
assert reread["005"].data == "20260603120000.0"