$ python3 -m unittest discover -s tests/python -p test_ambience_audio.py -k AtomicPublication -v test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) ... { "files": 8, "bytes": 4608352 } test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) (asset='street') ... FAIL { "files": 8, "bytes": 4608352 } test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) (asset='mall') ... FAIL { "files": 8, "bytes": 4608352 } test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) (asset='theater') ... FAIL { "files": 8, "bytes": 4608352 } test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) (asset='department') ... FAIL { "files": 8, "bytes": 4608352 } test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) (asset='market') ... FAIL { "files": 8, "bytes": 4608352 } test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) (asset='subway') ... FAIL { "files": 8, "bytes": 4608352 } test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) (asset='cafe') ... FAIL { "files": 8, "bytes": 4608352 } test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) (asset='rain') ... FAIL test_atomic_success_removes_stale_files_and_stages_notice_on_same_filesystem (test_ambience_audio.AtomicPublication.test_atomic_success_removes_stale_files_and_stages_notice_on_same_filesystem) ... { "files": 8, "bytes": 4608352 } FAIL test_conversion_failure_and_keyboard_interrupt_preserve_prior_directory (test_ambience_audio.AtomicPublication.test_conversion_failure_and_keyboard_interrupt_preserve_prior_directory) ... ok test_exchange_failure_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_exchange_failure_preserves_prior_directory) ... ERROR test_first_publication_and_real_exchange (test_ambience_audio.AtomicPublication.test_first_publication_and_real_exchange) ... { "files": 8, "bytes": 4608352 } FAIL test_manifest_and_notice_write_failures_preserve_prior_directory (test_ambience_audio.AtomicPublication.test_manifest_and_notice_write_failures_preserve_prior_directory) ... test_manifest_and_notice_write_failures_preserve_prior_directory (test_ambience_audio.AtomicPublication.test_manifest_and_notice_write_failures_preserve_prior_directory) (file='AMBIENCE_NOTICES.md') ... FAIL test_sigterm_before_commit_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_sigterm_before_commit_preserves_prior_directory) ... Process ForkProcess-1: Traceback (most recent call last): File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/multiprocessing/process.py", line 314, in _bootstrap self.run() File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/multiprocessing/process.py", line 108, in run self._target(*self._args, **self._kwargs) File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 229, in child with patch.object(audio, "atomic_publish", pause): self.run_generate() File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1446, in __enter__ original, local = self.get_original() ^^^^^^^^^^^^^^^^^^^ File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1419, in get_original raise AttributeError( AttributeError: does not have the attribute 'atomic_publish' FAIL test_staged_manifest_notice_and_inventory_tampering_are_rejected (test_ambience_audio.AtomicPublication.test_staged_manifest_notice_and_inventory_tampering_are_rejected) ... ERROR test_symlink_output_is_rejected_before_conversion (test_ambience_audio.AtomicPublication.test_symlink_output_is_rejected_before_conversion) ... test_symlink_output_is_rejected_before_conversion (test_ambience_audio.AtomicPublication.test_symlink_output_is_rejected_before_conversion) (dangling=False) ... ERROR test_symlink_output_is_rejected_before_conversion (test_ambience_audio.AtomicPublication.test_symlink_output_is_rejected_before_conversion) (dangling=True) ... ERROR ====================================================================== ERROR: test_exchange_failure_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_exchange_failure_preserves_prior_directory) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 204, in test_exchange_failure_preserves_prior_directory with patch.object(audio.ctypes, "CDLL") as mocked: ^^^^^^^^^^^^ AttributeError: module 'ambience_audio' has no attribute 'ctypes' ====================================================================== ERROR: test_staged_manifest_notice_and_inventory_tampering_are_rejected (test_ambience_audio.AtomicPublication.test_staged_manifest_notice_and_inventory_tampering_are_rejected) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 181, in test_staged_manifest_notice_and_inventory_tampering_are_rejected validate = audio.validate_bundle ^^^^^^^^^^^^^^^^^^^^^ AttributeError: module 'ambience_audio' has no attribute 'validate_bundle' ====================================================================== ERROR: test_symlink_output_is_rejected_before_conversion (test_ambience_audio.AtomicPublication.test_symlink_output_is_rejected_before_conversion) (dangling=False) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 174, in test_symlink_output_is_rejected_before_conversion audio.generate(self.plan, self.sources, link, converter=converter) File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 114, in generate entry.update({"file": name, "sourceSha256": digest(source), "sourceBytes": source.stat().st_size, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: Mock.keys() returned a non-iterable (type Mock) ====================================================================== ERROR: test_symlink_output_is_rejected_before_conversion (test_ambience_audio.AtomicPublication.test_symlink_output_is_rejected_before_conversion) (dangling=True) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 174, in test_symlink_output_is_rejected_before_conversion audio.generate(self.plan, self.sources, link, converter=converter) File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 114, in generate entry.update({"file": name, "sourceSha256": digest(source), "sourceBytes": source.stat().st_size, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: Mock.keys() returned a non-iterable (type Mock) ====================================================================== FAIL: test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) (asset='street') ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 139, in test_all_eight_assets_validated_before_publication with self.assertRaises(ValueError): self.run_generate(broken) AssertionError: ValueError not raised ====================================================================== FAIL: test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) (asset='mall') ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 139, in test_all_eight_assets_validated_before_publication with self.assertRaises(ValueError): self.run_generate(broken) AssertionError: ValueError not raised ====================================================================== FAIL: test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) (asset='theater') ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 139, in test_all_eight_assets_validated_before_publication with self.assertRaises(ValueError): self.run_generate(broken) AssertionError: ValueError not raised ====================================================================== FAIL: test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) (asset='department') ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 139, in test_all_eight_assets_validated_before_publication with self.assertRaises(ValueError): self.run_generate(broken) AssertionError: ValueError not raised ====================================================================== FAIL: test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) (asset='market') ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 139, in test_all_eight_assets_validated_before_publication with self.assertRaises(ValueError): self.run_generate(broken) AssertionError: ValueError not raised ====================================================================== FAIL: test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) (asset='subway') ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 139, in test_all_eight_assets_validated_before_publication with self.assertRaises(ValueError): self.run_generate(broken) AssertionError: ValueError not raised ====================================================================== FAIL: test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) (asset='cafe') ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 139, in test_all_eight_assets_validated_before_publication with self.assertRaises(ValueError): self.run_generate(broken) AssertionError: ValueError not raised ====================================================================== FAIL: test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) (asset='rain') ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 139, in test_all_eight_assets_validated_before_publication with self.assertRaises(ValueError): self.run_generate(broken) AssertionError: ValueError not raised ====================================================================== FAIL: test_atomic_success_removes_stale_files_and_stages_notice_on_same_filesystem (test_ambience_audio.AtomicPublication.test_atomic_success_removes_stale_files_and_stages_notice_on_same_filesystem) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 118, in test_atomic_success_removes_stale_files_and_stages_notice_on_same_filesystem self.assertEqual({p.name for p in self.output.iterdir()}, expected) AssertionError: Items in the first set but not the second: 'old' Items in the second set but not the first: 'AMBIENCE_NOTICES.md' ====================================================================== FAIL: test_first_publication_and_real_exchange (test_ambience_audio.AtomicPublication.test_first_publication_and_real_exchange) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 214, in test_first_publication_and_real_exchange self.assertTrue((self.output / "AMBIENCE_NOTICES.md").is_file()) AssertionError: False is not true ====================================================================== FAIL: test_manifest_and_notice_write_failures_preserve_prior_directory (test_ambience_audio.AtomicPublication.test_manifest_and_notice_write_failures_preserve_prior_directory) (file='AMBIENCE_NOTICES.md') ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 164, in test_manifest_and_notice_write_failures_preserve_prior_directory self.assert_prior() File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 112, in assert_prior self.assertEqual({p.name: p.read_bytes() for p in self.output.iterdir()}, {"old": b"prior release"}) AssertionError: {'subway.wav': b'RIFF$\xca\x08\x00WAVEfmt \[15606259 chars]x00'} != {'old': b'prior release'} Diff is 21440297 characters long. Set self.maxDiff to None to see it. ====================================================================== FAIL: test_sigterm_before_commit_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_sigterm_before_commit_preserves_prior_directory) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 233, in test_sigterm_before_commit_preserves_prior_directory self.assertTrue(reached.wait(10), "validated stage must reach commit") AssertionError: False is not true : validated stage must reach commit ---------------------------------------------------------------------- Ran 9 tests in 12.490s FAILED (failures=12, errors=4) EXIT_CODE=1