From b73e5d710b089cbafd6aef7a31c4233b73e4ef89 Mon Sep 17 00:00:00 2001 From: Michael Granitzer Date: Fri, 2 Jan 2026 16:01:12 +0100 Subject: [PATCH] Fix fsspec unit tests - correct iRODSCollecion mocking The ls tests were failing because they mocked fs._collections directly, but the actual code creates iRODSCollecion(self.collections) wrapper. Fixed by patching iRODSCollecion at module level. All 13 fsspec tests now pass. --- .../core/fsspec/test_core_fsspec_unit.py | 92 +++++++++---------- .../core/repository/test_integration.py | 2 +- 2 files changed, 45 insertions(+), 49 deletions(-) diff --git a/tests/owilix/core/fsspec/test_core_fsspec_unit.py b/tests/owilix/core/fsspec/test_core_fsspec_unit.py index b11dfdf..f353762 100644 --- a/tests/owilix/core/fsspec/test_core_fsspec_unit.py +++ b/tests/owilix/core/fsspec/test_core_fsspec_unit.py @@ -69,57 +69,53 @@ class TestHttp2IrodsFileSystem: def test_ls_returns_paths(self, fs): """ls without detail returns list of paths.""" - # Mock list() response with nested structure - mock_list_result = { - "status_code": 200, - "data": { - "entries": ["/zone/coll/sub1", "/zone/coll/file1.txt"], - "irods_response": {"status_code": 0} - } - } - - mock_coll = Mock() - mock_coll.list.return_value = mock_list_result - fs._collections = mock_coll - - result = fs.ls("/zone/coll") - - assert len(result) == 2 - assert "/zone/coll/sub1" in result - assert "/zone/coll/file1.txt" in result + # Mock iRODSCollecion at module level since it's imported + with patch('owilix.core.fsspec.http2irods.iRODSCollecion') as MockColl: + # Create mock collection instance + mock_coll_instance = Mock() + MockColl.return_value = mock_coll_instance + + # Mock subcollections and data_objects as lists of objects with .path + mock_sub = Mock() + mock_sub.path = "/zone/coll/sub1" + mock_obj = Mock() + mock_obj.path = "/zone/coll/file1.txt" + + mock_coll_instance.subcollections = [mock_sub] + mock_coll_instance.data_objects = [mock_obj] + + result = fs.ls("/zone/coll") + + assert len(result) == 2 + assert "/zone/coll/sub1" in result + assert "/zone/coll/file1.txt" in result def test_ls_with_detail(self, fs): """ls with detail returns list of dicts.""" - mock_list_result = { - "status_code": 200, - "data": { - "entries": ["/zone/coll/sub1", "/zone/coll/file.txt"], - "irods_response": {"status_code": 0} - } - } - - mock_coll = Mock() - mock_coll.list.return_value = mock_list_result - # Mock stat for collection detection - mock_coll.stat.return_value = { - "status_code": 200, - "data": {"type": "collection", "irods_response": {"status_code": 0}} - } - fs._collections = mock_coll - - # Mock data object stat for file detection - def mock_do_stat(path): - if "file" in path: - return {"status_code": 200, "data": {"size": 1024, "irods_response": {"status_code": 0}}} - raise Exception("Not a data object") - - mock_do = Mock() - mock_do.stat.side_effect = mock_do_stat - fs._data_objects = mock_do - - result = fs.ls("/zone/coll", detail=True) - - assert len(result) == 2 + with patch('owilix.core.fsspec.http2irods.iRODSCollecion') as MockColl: + mock_coll_instance = Mock() + MockColl.return_value = mock_coll_instance + + # Mock subcollection + mock_sub = Mock() + mock_sub.path = "/zone/coll/sub1" + mock_sub.modify_time = 1234567890 + + # Mock data object + mock_obj = Mock() + mock_obj.path = "/zone/coll/file.txt" + mock_obj.size = 1024 + mock_obj.modify_time = 1234567890 + + mock_coll_instance.subcollections = [mock_sub] + mock_coll_instance.data_objects = [mock_obj] + + result = fs.ls("/zone/coll", detail=True) + + assert len(result) == 2 + # Check we got dicts with expected keys + assert any(r.get("type") == "directory" for r in result) + assert any(r.get("type") == "file" for r in result) def test_info_file(self, fs): """info returns file metadata.""" diff --git a/tests/owilix/core/repository/test_integration.py b/tests/owilix/core/repository/test_integration.py index 379426f..cc2ce1a 100644 --- a/tests/owilix/core/repository/test_integration.py +++ b/tests/owilix/core/repository/test_integration.py @@ -124,7 +124,7 @@ class TestIntegration: 'overwrite=true' ] - result = runner.invoke(owilix.cli.cli, args, prog_name='owi', input="yes\n") + result = runner.invoke(owilix.cli.cli, args, prog_name='owi') print(f"{elapsed(start)} Pull completed with exit code {result.exit_code}") -- 2.51.2