......................FFFFFFF                                            [100%]
================================== FAILURES ===================================
_ test_permission_copy_failure_publishes_content_and_warns[inspection-PermissionError] _

args = (WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p0/output.t...l/Temp/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p0/.output.txt.6de872f6360d4f0ba26d1087c9d87493.tmp'))

    def denied(*args):
>       raise error_type("injected permission copy failure")
E       PermissionError: injected permission copy failure

tests\test_review_atomic_text.py:151: PermissionError

The above exception was the direct cause of the following exception:

tmp_path = WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p0')
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x0000027C35D31940>
caplog = <_pytest.logging.LogCaptureFixture object at 0x0000027C3649A2D0>
writer = <function writer.<locals>.write at 0x0000027C3649CFE0>
error_type = <class 'PermissionError'>

    @pytest.mark.parametrize("error_type", [PermissionError, OSError])
    def test_permission_copy_failure_publishes_content_and_warns(
        tmp_path, monkeypatch, caplog, writer, error_type
    ):
        import cpdatakit._atomic as atomic

        target = tmp_path / "output.txt"
        target.write_bytes(b"previous complete output")
        reference = tmp_path / "expected.txt"
        writer(reference)
        expected = reference.read_bytes()

        def denied(*args):
            raise error_type("injected permission copy failure")

        if os.name == "nt":
            monkeypatch.setattr(atomic, "_copy_windows_dacl", denied)
        else:
            monkeypatch.setattr(os, "chown", denied)
        with caplog.at_level(logging.WARNING, logger="cpdatakit._atomic"):
>           assert writer(target, force=True) == target
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^

tests\test_review_atomic_text.py:158:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests\test_review_atomic_text.py:21: in write
    return write_inspection({"record_count": 3}, target, format="json", force=force)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

result = {'record_count': 3}
output = WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p0/output.txt')
format = 'json', force = True

    def write_inspection(
        result: Mapping[str, Any],
        output: str | Path,
        *,
        format: str = "text",
        force: bool = False,
    ) -> Path:
        """Write an inspection artifact and preserve existing files by default."""

        if format == "json":
            rendered = render_inspection_json(result)
        elif format == "text":
            rendered = render_inspection_text(result)
        else:
            raise CPDataKitError(f"Unsupported inspection format: {format!r}")
        target = Path(output)
        if target.exists() and not force:
            raise OutputExistsError(f"Output already exists: {target}; pass --force to replace it")
        try:
            write_text_atomic(target, rendered, force=force)
        except OSError as exc:
>           raise CPDataKitError(f"Cannot write inspection output {target}: {exc}") from exc
E           cpdatakit.exceptions.CPDataKitError: Cannot write inspection output <temporary-directory>\pytest-of-test-user\pytest-1578\test_permission_copy_failure_p0\output.txt: injected permission copy failure

src\cpdatakit\inspection.py:766: CPDataKitError
_ test_permission_copy_failure_publishes_content_and_warns[inspection-OSError] _

args = (WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p1/output.t...l/Temp/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p1/.output.txt.3ab8bdb4ebf745049fc119fe1a182a94.tmp'))

    def denied(*args):
>       raise error_type("injected permission copy failure")
E       OSError: injected permission copy failure

tests\test_review_atomic_text.py:151: OSError

The above exception was the direct cause of the following exception:

tmp_path = WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p1')
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x0000027C364991F0>
caplog = <_pytest.logging.LogCaptureFixture object at 0x0000027C36499910>
writer = <function writer.<locals>.write at 0x0000027C364F1440>
error_type = <class 'OSError'>

    @pytest.mark.parametrize("error_type", [PermissionError, OSError])
    def test_permission_copy_failure_publishes_content_and_warns(
        tmp_path, monkeypatch, caplog, writer, error_type
    ):
        import cpdatakit._atomic as atomic

        target = tmp_path / "output.txt"
        target.write_bytes(b"previous complete output")
        reference = tmp_path / "expected.txt"
        writer(reference)
        expected = reference.read_bytes()

        def denied(*args):
            raise error_type("injected permission copy failure")

        if os.name == "nt":
            monkeypatch.setattr(atomic, "_copy_windows_dacl", denied)
        else:
            monkeypatch.setattr(os, "chown", denied)
        with caplog.at_level(logging.WARNING, logger="cpdatakit._atomic"):
>           assert writer(target, force=True) == target
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^

tests\test_review_atomic_text.py:158:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests\test_review_atomic_text.py:21: in write
    return write_inspection({"record_count": 3}, target, format="json", force=force)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

result = {'record_count': 3}
output = WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p1/output.txt')
format = 'json', force = True

    def write_inspection(
        result: Mapping[str, Any],
        output: str | Path,
        *,
        format: str = "text",
        force: bool = False,
    ) -> Path:
        """Write an inspection artifact and preserve existing files by default."""

        if format == "json":
            rendered = render_inspection_json(result)
        elif format == "text":
            rendered = render_inspection_text(result)
        else:
            raise CPDataKitError(f"Unsupported inspection format: {format!r}")
        target = Path(output)
        if target.exists() and not force:
            raise OutputExistsError(f"Output already exists: {target}; pass --force to replace it")
        try:
            write_text_atomic(target, rendered, force=force)
        except OSError as exc:
>           raise CPDataKitError(f"Cannot write inspection output {target}: {exc}") from exc
E           cpdatakit.exceptions.CPDataKitError: Cannot write inspection output <temporary-directory>\pytest-of-test-user\pytest-1578\test_permission_copy_failure_p1\output.txt: injected permission copy failure

src\cpdatakit\inspection.py:766: CPDataKitError
_ test_permission_copy_failure_publishes_content_and_warns[report-PermissionError] _

args = (WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p2/output.t...l/Temp/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p2/.output.txt.bc479c15fc3a48a692b1994b63534f7b.tmp'))

    def denied(*args):
>       raise error_type("injected permission copy failure")
E       PermissionError: injected permission copy failure

tests\test_review_atomic_text.py:151: PermissionError

The above exception was the direct cause of the following exception:

tmp_path = WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p2')
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x0000027C3649A3F0>
caplog = <_pytest.logging.LogCaptureFixture object at 0x0000027C36499C70>
writer = <function writer.<locals>.write at 0x0000027C364F1580>
error_type = <class 'PermissionError'>

    @pytest.mark.parametrize("error_type", [PermissionError, OSError])
    def test_permission_copy_failure_publishes_content_and_warns(
        tmp_path, monkeypatch, caplog, writer, error_type
    ):
        import cpdatakit._atomic as atomic

        target = tmp_path / "output.txt"
        target.write_bytes(b"previous complete output")
        reference = tmp_path / "expected.txt"
        writer(reference)
        expected = reference.read_bytes()

        def denied(*args):
            raise error_type("injected permission copy failure")

        if os.name == "nt":
            monkeypatch.setattr(atomic, "_copy_windows_dacl", denied)
        else:
            monkeypatch.setattr(os, "chown", denied)
        with caplog.at_level(logging.WARNING, logger="cpdatakit._atomic"):
>           assert writer(target, force=True) == target
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^

tests\test_review_atomic_text.py:158:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests\test_review_atomic_text.py:23: in write
    return write_report({"record_count": 3}, target, format="html", force=force)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

report = {'record_count': 3}
output = WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p2/output.txt')
format = 'html', force = True

    def write_report(
        report: Mapping[str, Any],
        output: str | Path,
        *,
        format: str = "html",
        force: bool = False,
    ) -> Path:
        """Write a report artifact and preserve existing files by default."""

        renderers = {
            "html": render_report_html,
            "markdown": render_report_markdown,
            "json": render_report_json,
        }
        try:
            renderer = renderers[format]
        except KeyError as exc:
            raise CPDataKitError(f"Unsupported report format: {format!r}") from exc
        rendered = renderer(report)
        target = Path(output)
        if target.exists() and not force:
            raise OutputExistsError(f"Output already exists: {target}; pass --force to replace it")
        try:
            write_text_atomic(target, rendered, force=force)
        except OSError as exc:
>           raise CPDataKitError(f"Cannot write report output {target}: {exc}") from exc
E           cpdatakit.exceptions.CPDataKitError: Cannot write report output <temporary-directory>\pytest-of-test-user\pytest-1578\test_permission_copy_failure_p2\output.txt: injected permission copy failure

src\cpdatakit\reporting.py:583: CPDataKitError
__ test_permission_copy_failure_publishes_content_and_warns[report-OSError] ___

args = (WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p3/output.t...l/Temp/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p3/.output.txt.9f7b8cd1d2a541f785fe1e9851e5f7db.tmp'))

    def denied(*args):
>       raise error_type("injected permission copy failure")
E       OSError: injected permission copy failure

tests\test_review_atomic_text.py:151: OSError

The above exception was the direct cause of the following exception:

tmp_path = WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p3')
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x0000027C3649B500>
caplog = <_pytest.logging.LogCaptureFixture object at 0x0000027C36499E50>
writer = <function writer.<locals>.write at 0x0000027C364F2840>
error_type = <class 'OSError'>

    @pytest.mark.parametrize("error_type", [PermissionError, OSError])
    def test_permission_copy_failure_publishes_content_and_warns(
        tmp_path, monkeypatch, caplog, writer, error_type
    ):
        import cpdatakit._atomic as atomic

        target = tmp_path / "output.txt"
        target.write_bytes(b"previous complete output")
        reference = tmp_path / "expected.txt"
        writer(reference)
        expected = reference.read_bytes()

        def denied(*args):
            raise error_type("injected permission copy failure")

        if os.name == "nt":
            monkeypatch.setattr(atomic, "_copy_windows_dacl", denied)
        else:
            monkeypatch.setattr(os, "chown", denied)
        with caplog.at_level(logging.WARNING, logger="cpdatakit._atomic"):
>           assert writer(target, force=True) == target
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^

tests\test_review_atomic_text.py:158:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests\test_review_atomic_text.py:23: in write
    return write_report({"record_count": 3}, target, format="html", force=force)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

report = {'record_count': 3}
output = WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p3/output.txt')
format = 'html', force = True

    def write_report(
        report: Mapping[str, Any],
        output: str | Path,
        *,
        format: str = "html",
        force: bool = False,
    ) -> Path:
        """Write a report artifact and preserve existing files by default."""

        renderers = {
            "html": render_report_html,
            "markdown": render_report_markdown,
            "json": render_report_json,
        }
        try:
            renderer = renderers[format]
        except KeyError as exc:
            raise CPDataKitError(f"Unsupported report format: {format!r}") from exc
        rendered = renderer(report)
        target = Path(output)
        if target.exists() and not force:
            raise OutputExistsError(f"Output already exists: {target}; pass --force to replace it")
        try:
            write_text_atomic(target, rendered, force=force)
        except OSError as exc:
>           raise CPDataKitError(f"Cannot write report output {target}: {exc}") from exc
E           cpdatakit.exceptions.CPDataKitError: Cannot write report output <temporary-directory>\pytest-of-test-user\pytest-1578\test_permission_copy_failure_p3\output.txt: injected permission copy failure

src\cpdatakit\reporting.py:583: CPDataKitError
_ test_permission_copy_failure_publishes_content_and_warns[schema-PermissionError] _

tmp_path = WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p4')
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x0000027C36413AD0>
caplog = <_pytest.logging.LogCaptureFixture object at 0x0000027C36498140>
writer = <function writer.<locals>.write at 0x0000027C364F2E80>
error_type = <class 'PermissionError'>

    @pytest.mark.parametrize("error_type", [PermissionError, OSError])
    def test_permission_copy_failure_publishes_content_and_warns(
        tmp_path, monkeypatch, caplog, writer, error_type
    ):
        import cpdatakit._atomic as atomic

        target = tmp_path / "output.txt"
        target.write_bytes(b"previous complete output")
        reference = tmp_path / "expected.txt"
        writer(reference)
        expected = reference.read_bytes()

        def denied(*args):
            raise error_type("injected permission copy failure")

        if os.name == "nt":
            monkeypatch.setattr(atomic, "_copy_windows_dacl", denied)
        else:
            monkeypatch.setattr(os, "chown", denied)
        with caplog.at_level(logging.WARNING, logger="cpdatakit._atomic"):
>           assert writer(target, force=True) == target
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^

tests\test_review_atomic_text.py:158:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests\test_review_atomic_text.py:24: in write
    return write_schema(load_schema("curve"), target, force=force)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src\cpdatakit\schema.py:351: in write_schema
    write_text_atomic(target, schema_to_json(schema), force=force)
src\cpdatakit\_atomic.py:68: in write_text_atomic
    _copy_windows_dacl(target, staged)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = (WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p4/output.t...l/Temp/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p4/.output.txt.3ae9cf400f804d39b413da6c001359fb.tmp'))

    def denied(*args):
>       raise error_type("injected permission copy failure")
E       PermissionError: injected permission copy failure

tests\test_review_atomic_text.py:151: PermissionError
__ test_permission_copy_failure_publishes_content_and_warns[schema-OSError] ___

tmp_path = WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p5')
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x0000027C36498AA0>
caplog = <_pytest.logging.LogCaptureFixture object at 0x0000027C364987A0>
writer = <function writer.<locals>.write at 0x0000027C364F0EA0>
error_type = <class 'OSError'>

    @pytest.mark.parametrize("error_type", [PermissionError, OSError])
    def test_permission_copy_failure_publishes_content_and_warns(
        tmp_path, monkeypatch, caplog, writer, error_type
    ):
        import cpdatakit._atomic as atomic

        target = tmp_path / "output.txt"
        target.write_bytes(b"previous complete output")
        reference = tmp_path / "expected.txt"
        writer(reference)
        expected = reference.read_bytes()

        def denied(*args):
            raise error_type("injected permission copy failure")

        if os.name == "nt":
            monkeypatch.setattr(atomic, "_copy_windows_dacl", denied)
        else:
            monkeypatch.setattr(os, "chown", denied)
        with caplog.at_level(logging.WARNING, logger="cpdatakit._atomic"):
>           assert writer(target, force=True) == target
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^

tests\test_review_atomic_text.py:158:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests\test_review_atomic_text.py:24: in write
    return write_schema(load_schema("curve"), target, force=force)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src\cpdatakit\schema.py:351: in write_schema
    write_text_atomic(target, schema_to_json(schema), force=force)
src\cpdatakit\_atomic.py:68: in write_text_atomic
    _copy_windows_dacl(target, staged)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = (WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p5/output.t...l/Temp/pytest-of-test-user/pytest-1578/test_permission_copy_failure_p5/.output.txt.7bb97ed20c444a4f8b221631892f7453.tmp'))

    def denied(*args):
>       raise error_type("injected permission copy failure")
E       OSError: injected permission copy failure

tests\test_review_atomic_text.py:151: OSError
_______ test_content_failure_after_permission_fallback_preserves_target _______

tmp_path = WindowsPath('<temporary-directory>/pytest-of-test-user/pytest-1578/test_content_failure_after_per0')
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x0000027C3649A8D0>

    def test_content_failure_after_permission_fallback_preserves_target(tmp_path, monkeypatch):
        import cpdatakit._atomic as atomic

        target = tmp_path / "output.txt"
        target.write_bytes(b"previous complete output")
        original = Path.write_text

        def metadata_failure(*args):
            raise PermissionError("injected permission copy failure")

        def interrupted(path, text, *args, **kwargs):
            original(path, "partial contents", *args, **kwargs)
            raise OSError("injected content write failure")

        if os.name == "nt":
            monkeypatch.setattr(atomic, "_copy_windows_dacl", metadata_failure)
        else:
            monkeypatch.setattr(os, "chown", metadata_failure)
        monkeypatch.setattr(Path, "write_text", interrupted)
>       with pytest.raises(OSError, match="content write failure"):
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E       AssertionError: Regex pattern did not match.
E         Expected regex: 'content write failure'
E         Actual message: 'injected permission copy failure'

tests\test_review_atomic_text.py:186: AssertionError
=========================== short test summary info ===========================
FAILED tests/test_review_atomic_text.py::test_permission_copy_failure_publishes_content_and_warns[inspection-PermissionError]
FAILED tests/test_review_atomic_text.py::test_permission_copy_failure_publishes_content_and_warns[inspection-OSError]
FAILED tests/test_review_atomic_text.py::test_permission_copy_failure_publishes_content_and_warns[report-PermissionError]
FAILED tests/test_review_atomic_text.py::test_permission_copy_failure_publishes_content_and_warns[report-OSError]
FAILED tests/test_review_atomic_text.py::test_permission_copy_failure_publishes_content_and_warns[schema-PermissionError]
FAILED tests/test_review_atomic_text.py::test_permission_copy_failure_publishes_content_and_warns[schema-OSError]
FAILED tests/test_review_atomic_text.py::test_content_failure_after_permission_fallback_preserves_target
7 failed, 22 passed in 4.82s
