chore: import upstream snapshot with attribution
Integ / changes (push) Has been skipped
Pre-commit / pre-commit (push) Failing after 1s
CLI exit codes / changes (push) Has been skipped
Test (Install) / changes (push) Has been skipped
Test (Python) / changes (push) Has been skipped
Test (TypeScript) / changes (push) Has been skipped
CLI exit codes / cli-gate (push) Has been cancelled
Test (Install) / test-install-gate (push) Has been cancelled
Integ / integ-gate (push) Has been cancelled
Test (Python) / test-python-gate (push) Has been cancelled
Test (TypeScript) / test-typescript-gate (push) Has been cancelled
Test (Install) / python-minimal (3.12) (push) Has been cancelled
Test (Install) / python-minimal (3.11) (push) Has been cancelled
Test (Install) / python-extra (agno, mirage.agents.agno) (push) Has been cancelled
Test (Install) / python-extra (chroma, mirage.resource.chroma) (push) Has been cancelled
Test (Install) / python-extra (pdf, mirage.core.filetype.pdf) (push) Has been cancelled
Integ / integ (push) Has been cancelled
Integ / integ-database (push) Has been cancelled
Integ / integ-database-ts (push) Has been cancelled
Integ / integ-data (push) Has been cancelled
Integ / integ-ssh (push) Has been cancelled
Integ / integ-ssh-ts (push) Has been cancelled
Test (Python) / audit (push) Has been cancelled
Test (TypeScript) / test (push) Has been cancelled
Test (TypeScript) / python-fs-shim (push) Has been cancelled
CLI exit codes / Python CLI (push) Has been cancelled
CLI exit codes / TypeScript CLI (push) Has been cancelled
CLI exit codes / Cross-language snapshot interop (push) Has been cancelled
Test (Python) / test (push) Has been cancelled
Test (Python) / import-isolation (deepagents, openai, mirage.agents.openai_agents) (push) Has been cancelled
Test (Python) / import-isolation (deepagents, pydantic-ai, mirage.agents.pydantic_ai) (push) Has been cancelled
Integ / integ-ts (push) Has been cancelled
Integ / integ-fuse (push) Has been cancelled
Test (Install) / python-extra (databricks, mirage.resource.databricks_volume) (push) Has been cancelled
Test (Install) / python-extra (deepagents, mirage.agents.langchain) (push) Has been cancelled
Test (Install) / python-extra (email, mirage.resource.email) (push) Has been cancelled
Test (Install) / python-extra (fuse, mirage.fuse.mount) (push) Has been cancelled
Test (Install) / python-extra (hdf5, mirage.core.filetype.hdf5) (push) Has been cancelled
Test (Install) / python-extra (hf, mirage.resource.hf_buckets) (push) Has been cancelled
Test (Install) / python-extra (lancedb, mirage.resource.lancedb) (push) Has been cancelled
Test (Install) / python-extra (langfuse, mirage.resource.langfuse) (push) Has been cancelled
Test (Install) / python-extra (mongodb, mirage.resource.mongodb) (push) Has been cancelled
Test (Install) / python-extra (nextcloud, mirage.resource.nextcloud) (push) Has been cancelled
Test (Install) / python-extra (openai, mirage.agents.openai_agents) (push) Has been cancelled
Test (Install) / python-extra (openhands, mirage.agents.openhands, 3.12) (push) Has been cancelled
Test (Install) / python-extra (parquet, mirage.core.filetype.parquet) (push) Has been cancelled
Test (Install) / python-extra (postgres, mirage.resource.postgres) (push) Has been cancelled
Test (Install) / python-extra (pydantic-ai, mirage.agents.pydantic_ai) (push) Has been cancelled
Test (Install) / python-extra (qdrant, mirage.resource.qdrant) (push) Has been cancelled
Test (Install) / python-extra (redis, mirage.resource.redis) (push) Has been cancelled
Test (Install) / python-extra (s3, mirage.resource.s3) (push) Has been cancelled
Test (Install) / python-extra (ssh, mirage.resource.ssh) (push) Has been cancelled
Test (Install) / ts-minimal (push) Has been cancelled
Integ / changes (push) Has been skipped
Pre-commit / pre-commit (push) Failing after 1s
CLI exit codes / changes (push) Has been skipped
Test (Install) / changes (push) Has been skipped
Test (Python) / changes (push) Has been skipped
Test (TypeScript) / changes (push) Has been skipped
CLI exit codes / cli-gate (push) Has been cancelled
Test (Install) / test-install-gate (push) Has been cancelled
Integ / integ-gate (push) Has been cancelled
Test (Python) / test-python-gate (push) Has been cancelled
Test (TypeScript) / test-typescript-gate (push) Has been cancelled
Test (Install) / python-minimal (3.12) (push) Has been cancelled
Test (Install) / python-minimal (3.11) (push) Has been cancelled
Test (Install) / python-extra (agno, mirage.agents.agno) (push) Has been cancelled
Test (Install) / python-extra (chroma, mirage.resource.chroma) (push) Has been cancelled
Test (Install) / python-extra (pdf, mirage.core.filetype.pdf) (push) Has been cancelled
Integ / integ (push) Has been cancelled
Integ / integ-database (push) Has been cancelled
Integ / integ-database-ts (push) Has been cancelled
Integ / integ-data (push) Has been cancelled
Integ / integ-ssh (push) Has been cancelled
Integ / integ-ssh-ts (push) Has been cancelled
Test (Python) / audit (push) Has been cancelled
Test (TypeScript) / test (push) Has been cancelled
Test (TypeScript) / python-fs-shim (push) Has been cancelled
CLI exit codes / Python CLI (push) Has been cancelled
CLI exit codes / TypeScript CLI (push) Has been cancelled
CLI exit codes / Cross-language snapshot interop (push) Has been cancelled
Test (Python) / test (push) Has been cancelled
Test (Python) / import-isolation (deepagents, openai, mirage.agents.openai_agents) (push) Has been cancelled
Test (Python) / import-isolation (deepagents, pydantic-ai, mirage.agents.pydantic_ai) (push) Has been cancelled
Integ / integ-ts (push) Has been cancelled
Integ / integ-fuse (push) Has been cancelled
Test (Install) / python-extra (databricks, mirage.resource.databricks_volume) (push) Has been cancelled
Test (Install) / python-extra (deepagents, mirage.agents.langchain) (push) Has been cancelled
Test (Install) / python-extra (email, mirage.resource.email) (push) Has been cancelled
Test (Install) / python-extra (fuse, mirage.fuse.mount) (push) Has been cancelled
Test (Install) / python-extra (hdf5, mirage.core.filetype.hdf5) (push) Has been cancelled
Test (Install) / python-extra (hf, mirage.resource.hf_buckets) (push) Has been cancelled
Test (Install) / python-extra (lancedb, mirage.resource.lancedb) (push) Has been cancelled
Test (Install) / python-extra (langfuse, mirage.resource.langfuse) (push) Has been cancelled
Test (Install) / python-extra (mongodb, mirage.resource.mongodb) (push) Has been cancelled
Test (Install) / python-extra (nextcloud, mirage.resource.nextcloud) (push) Has been cancelled
Test (Install) / python-extra (openai, mirage.agents.openai_agents) (push) Has been cancelled
Test (Install) / python-extra (openhands, mirage.agents.openhands, 3.12) (push) Has been cancelled
Test (Install) / python-extra (parquet, mirage.core.filetype.parquet) (push) Has been cancelled
Test (Install) / python-extra (postgres, mirage.resource.postgres) (push) Has been cancelled
Test (Install) / python-extra (pydantic-ai, mirage.agents.pydantic_ai) (push) Has been cancelled
Test (Install) / python-extra (qdrant, mirage.resource.qdrant) (push) Has been cancelled
Test (Install) / python-extra (redis, mirage.resource.redis) (push) Has been cancelled
Test (Install) / python-extra (s3, mirage.resource.s3) (push) Has been cancelled
Test (Install) / python-extra (ssh, mirage.resource.ssh) (push) Has been cancelled
Test (Install) / ts-minimal (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
@@ -0,0 +1,100 @@
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
|
||||
import json
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from mirage.accessor.gdrive import GDriveAccessor
|
||||
from mirage.cache.index.config import IndexEntry
|
||||
from mirage.cache.index.ram import RAMIndexCacheStore
|
||||
from mirage.ops import Ops
|
||||
from mirage.ops.config import OpsMount
|
||||
from mirage.ops.gdrive import OPS as GDRIVE_OPS
|
||||
from mirage.types import MountMode
|
||||
|
||||
|
||||
def _make_gdrive_ops():
|
||||
accessor = GDriveAccessor(config=None, token_manager=None)
|
||||
index = RAMIndexCacheStore()
|
||||
ops_list = []
|
||||
for fn in GDRIVE_OPS:
|
||||
if hasattr(fn, "_registered_ops"):
|
||||
ops_list.extend(fn._registered_ops)
|
||||
mount = OpsMount(
|
||||
prefix="/gdrive/",
|
||||
resource_type="gdrive",
|
||||
accessor=accessor,
|
||||
index=index,
|
||||
mode=MountMode.READ,
|
||||
ops=ops_list,
|
||||
)
|
||||
return Ops([mount]), index
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_read_gdoc_via_filetype_cascade():
|
||||
ops, index = _make_gdrive_ops()
|
||||
await index.put(
|
||||
"/gdrive/docs/report.gdoc.json",
|
||||
IndexEntry(
|
||||
id="doc123",
|
||||
name="Report",
|
||||
resource_type="gdrive/gdoc",
|
||||
remote_time="2026-04-01T00:00:00Z",
|
||||
vfs_name="report.gdoc.json",
|
||||
))
|
||||
doc_json = json.dumps({"documentId": "doc123", "title": "Report"}).encode()
|
||||
with patch(
|
||||
"mirage.core.gdrive.read.read_doc",
|
||||
new_callable=AsyncMock,
|
||||
return_value=doc_json,
|
||||
):
|
||||
result = await ops.read("/gdrive/docs/report.gdoc.json")
|
||||
parsed = json.loads(result)
|
||||
assert parsed["documentId"] == "doc123"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_read_plain_file_falls_through():
|
||||
ops, index = _make_gdrive_ops()
|
||||
await index.put(
|
||||
"/gdrive/notes.txt",
|
||||
IndexEntry(
|
||||
id="file789",
|
||||
name="notes",
|
||||
resource_type="gdrive/file",
|
||||
remote_time="2026-04-01T00:00:00Z",
|
||||
vfs_name="notes.txt",
|
||||
))
|
||||
with patch(
|
||||
"mirage.core.gdrive.read.download_file",
|
||||
new_callable=AsyncMock,
|
||||
return_value=b"plain content",
|
||||
):
|
||||
result = await ops.read("/gdrive/notes.txt")
|
||||
assert result == b"plain content"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_readdir():
|
||||
ops, index = _make_gdrive_ops()
|
||||
with patch(
|
||||
"mirage.ops.gdrive.readdir.core_readdir",
|
||||
new_callable=AsyncMock,
|
||||
return_value=["/docs/report.gdoc.json"],
|
||||
):
|
||||
result = await ops.readdir("/gdrive/docs")
|
||||
assert "/docs/report.gdoc.json" in result
|
||||
@@ -0,0 +1,53 @@
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from mirage.accessor.gdrive import GDriveAccessor
|
||||
from mirage.cache.index.ram import RAMIndexCacheStore
|
||||
from mirage.ops.gdrive.read.read import read
|
||||
from mirage.types import PathSpec
|
||||
from mirage.utils.key_prefix import mount_key
|
||||
|
||||
|
||||
def _scope(path: str, prefix: str = "") -> PathSpec:
|
||||
return PathSpec(resource_path=mount_key(path, prefix),
|
||||
virtual=path,
|
||||
directory=path.rsplit("/", 1)[0] or "/")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def accessor():
|
||||
return GDriveAccessor(config=None, token_manager=None)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def index():
|
||||
return RAMIndexCacheStore()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_read_calls_core(accessor, index):
|
||||
fn = read._registered_ops[0].fn
|
||||
with patch(
|
||||
"mirage.ops.gdrive.read.read.core_read",
|
||||
new_callable=AsyncMock,
|
||||
return_value=b"file content",
|
||||
) as mock:
|
||||
result = await fn(accessor, _scope("/docs/readme.txt"), index=index)
|
||||
mock.assert_called_once_with(accessor, _scope("/docs/readme.txt"),
|
||||
index)
|
||||
assert result == b"file content"
|
||||
@@ -0,0 +1,57 @@
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from mirage.accessor.gdrive import GDriveAccessor
|
||||
from mirage.cache.index.ram import RAMIndexCacheStore
|
||||
from mirage.ops.gdrive.read.read_feather import read_feather
|
||||
from mirage.types import PathSpec
|
||||
from mirage.utils.key_prefix import mount_key
|
||||
|
||||
|
||||
def _scope(path: str, prefix: str = "") -> PathSpec:
|
||||
return PathSpec(resource_path=mount_key(path, prefix),
|
||||
virtual=path,
|
||||
directory=path.rsplit("/", 1)[0] or "/")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def accessor():
|
||||
return GDriveAccessor(config=None, token_manager=None)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def index():
|
||||
return RAMIndexCacheStore()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_read_feather_calls_core(accessor, index):
|
||||
fn = read_feather._registered_ops[0].fn
|
||||
with patch(
|
||||
"mirage.ops.gdrive.read.read_feather.core_read",
|
||||
new_callable=AsyncMock,
|
||||
return_value=b"raw-feather",
|
||||
) as mock_read, patch(
|
||||
"mirage.ops.gdrive.read.read_feather.feather_cat",
|
||||
return_value=b"csv-output",
|
||||
) as mock_cat:
|
||||
result = await fn(accessor, _scope("/data/file.feather"), index=index)
|
||||
mock_read.assert_called_once_with(accessor,
|
||||
_scope("/data/file.feather"), index)
|
||||
mock_cat.assert_called_once_with(b"raw-feather")
|
||||
assert result == b"csv-output"
|
||||
@@ -0,0 +1,80 @@
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
|
||||
import json
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from mirage.accessor.gdrive import GDriveAccessor
|
||||
from mirage.cache.index.config import IndexEntry
|
||||
from mirage.cache.index.ram import RAMIndexCacheStore
|
||||
from mirage.ops.gdrive.read.read import read
|
||||
from mirage.types import PathSpec
|
||||
from mirage.utils.key_prefix import mount_key
|
||||
|
||||
|
||||
def _scope(path: str, prefix: str = "") -> PathSpec:
|
||||
return PathSpec(resource_path=mount_key(path, prefix),
|
||||
virtual=path,
|
||||
directory=path.rsplit("/", 1)[0] or "/")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def index():
|
||||
store = RAMIndexCacheStore()
|
||||
return store
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def accessor():
|
||||
return GDriveAccessor(config=None, token_manager=None)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_read_gdoc_calls_core(accessor, index):
|
||||
await index.put(
|
||||
"/docs/report.gdoc.json",
|
||||
IndexEntry(
|
||||
id="doc123",
|
||||
name="Report",
|
||||
resource_type="gdrive/gdoc",
|
||||
remote_time="2026-04-01T00:00:00Z",
|
||||
vfs_name="report.gdoc.json",
|
||||
))
|
||||
fn = read._registered_ops[0].fn
|
||||
doc_json = json.dumps({"documentId": "doc123"}).encode()
|
||||
with patch(
|
||||
"mirage.ops.gdrive.read.read.core_read",
|
||||
new_callable=AsyncMock,
|
||||
return_value=doc_json,
|
||||
) as mock:
|
||||
result = await fn(accessor,
|
||||
_scope("/docs/report.gdoc.json"),
|
||||
index=index)
|
||||
mock.assert_called_once_with(accessor,
|
||||
_scope("/docs/report.gdoc.json"), index)
|
||||
assert json.loads(result)["documentId"] == "doc123"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_read_gdoc_not_found(accessor, index):
|
||||
fn = read._registered_ops[0].fn
|
||||
with patch(
|
||||
"mirage.ops.gdrive.read.read.core_read",
|
||||
new_callable=AsyncMock,
|
||||
side_effect=FileNotFoundError("nonexistent.gdoc.json"),
|
||||
):
|
||||
with pytest.raises(FileNotFoundError):
|
||||
await fn(accessor, _scope("/nonexistent.gdoc.json"), index=index)
|
||||
@@ -0,0 +1,80 @@
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
|
||||
import json
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from mirage.accessor.gdrive import GDriveAccessor
|
||||
from mirage.cache.index.config import IndexEntry
|
||||
from mirage.cache.index.ram import RAMIndexCacheStore
|
||||
from mirage.ops.gdrive.read.read import read
|
||||
from mirage.types import PathSpec
|
||||
from mirage.utils.key_prefix import mount_key
|
||||
|
||||
|
||||
def _scope(path: str, prefix: str = "") -> PathSpec:
|
||||
return PathSpec(resource_path=mount_key(path, prefix),
|
||||
virtual=path,
|
||||
directory=path.rsplit("/", 1)[0] or "/")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def index():
|
||||
return RAMIndexCacheStore()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def accessor():
|
||||
return GDriveAccessor(config=None, token_manager=None)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_read_gsheet_calls_core(accessor, index):
|
||||
await index.put(
|
||||
"/sheets/budget.gsheet.json",
|
||||
IndexEntry(
|
||||
id="sheet123",
|
||||
name="Budget",
|
||||
resource_type="gdrive/gsheet",
|
||||
remote_time="2026-04-01T00:00:00Z",
|
||||
vfs_name="budget.gsheet.json",
|
||||
))
|
||||
fn = read._registered_ops[0].fn
|
||||
sheet_json = json.dumps({"spreadsheetId": "sheet123"}).encode()
|
||||
with patch(
|
||||
"mirage.ops.gdrive.read.read.core_read",
|
||||
new_callable=AsyncMock,
|
||||
return_value=sheet_json,
|
||||
) as mock:
|
||||
result = await fn(accessor,
|
||||
_scope("/sheets/budget.gsheet.json"),
|
||||
index=index)
|
||||
mock.assert_called_once_with(accessor,
|
||||
_scope("/sheets/budget.gsheet.json"),
|
||||
index)
|
||||
assert json.loads(result)["spreadsheetId"] == "sheet123"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_read_gsheet_not_found(accessor, index):
|
||||
fn = read._registered_ops[0].fn
|
||||
with patch(
|
||||
"mirage.ops.gdrive.read.read.core_read",
|
||||
new_callable=AsyncMock,
|
||||
side_effect=FileNotFoundError("nonexistent.gsheet.json"),
|
||||
):
|
||||
with pytest.raises(FileNotFoundError):
|
||||
await fn(accessor, _scope("/nonexistent.gsheet.json"), index=index)
|
||||
@@ -0,0 +1,79 @@
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
|
||||
import json
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from mirage.accessor.gdrive import GDriveAccessor
|
||||
from mirage.cache.index.config import IndexEntry
|
||||
from mirage.cache.index.ram import RAMIndexCacheStore
|
||||
from mirage.ops.gdrive.read.read import read
|
||||
from mirage.types import PathSpec
|
||||
from mirage.utils.key_prefix import mount_key
|
||||
|
||||
|
||||
def _scope(path: str, prefix: str = "") -> PathSpec:
|
||||
return PathSpec(resource_path=mount_key(path, prefix),
|
||||
virtual=path,
|
||||
directory=path.rsplit("/", 1)[0] or "/")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def index():
|
||||
return RAMIndexCacheStore()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def accessor():
|
||||
return GDriveAccessor(config=None, token_manager=None)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_read_gslide_calls_core(accessor, index):
|
||||
await index.put(
|
||||
"/slides/deck.gslide.json",
|
||||
IndexEntry(
|
||||
id="slide123",
|
||||
name="Deck",
|
||||
resource_type="gdrive/gslide",
|
||||
remote_time="2026-04-01T00:00:00Z",
|
||||
vfs_name="deck.gslide.json",
|
||||
))
|
||||
fn = read._registered_ops[0].fn
|
||||
pres_json = json.dumps({"presentationId": "slide123"}).encode()
|
||||
with patch(
|
||||
"mirage.ops.gdrive.read.read.core_read",
|
||||
new_callable=AsyncMock,
|
||||
return_value=pres_json,
|
||||
) as mock:
|
||||
result = await fn(accessor,
|
||||
_scope("/slides/deck.gslide.json"),
|
||||
index=index)
|
||||
mock.assert_called_once_with(accessor,
|
||||
_scope("/slides/deck.gslide.json"), index)
|
||||
assert json.loads(result)["presentationId"] == "slide123"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_read_gslide_not_found(accessor, index):
|
||||
fn = read._registered_ops[0].fn
|
||||
with patch(
|
||||
"mirage.ops.gdrive.read.read.core_read",
|
||||
new_callable=AsyncMock,
|
||||
side_effect=FileNotFoundError("nonexistent.gslide.json"),
|
||||
):
|
||||
with pytest.raises(FileNotFoundError):
|
||||
await fn(accessor, _scope("/nonexistent.gslide.json"), index=index)
|
||||
@@ -0,0 +1,57 @@
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from mirage.accessor.gdrive import GDriveAccessor
|
||||
from mirage.cache.index.ram import RAMIndexCacheStore
|
||||
from mirage.ops.gdrive.read.read_hdf5 import read_hdf5
|
||||
from mirage.types import PathSpec
|
||||
from mirage.utils.key_prefix import mount_key
|
||||
|
||||
|
||||
def _scope(path: str, prefix: str = "") -> PathSpec:
|
||||
return PathSpec(resource_path=mount_key(path, prefix),
|
||||
virtual=path,
|
||||
directory=path.rsplit("/", 1)[0] or "/")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def accessor():
|
||||
return GDriveAccessor(config=None, token_manager=None)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def index():
|
||||
return RAMIndexCacheStore()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_read_hdf5_calls_core(accessor, index):
|
||||
fn = read_hdf5._registered_ops[0].fn
|
||||
with patch(
|
||||
"mirage.ops.gdrive.read.read_hdf5.core_read",
|
||||
new_callable=AsyncMock,
|
||||
return_value=b"raw-hdf5",
|
||||
) as mock_read, patch(
|
||||
"mirage.ops.gdrive.read.read_hdf5.hdf5_cat",
|
||||
return_value=b"csv-output",
|
||||
) as mock_cat:
|
||||
result = await fn(accessor, _scope("/data/file.hdf5"), index=index)
|
||||
mock_read.assert_called_once_with(accessor, _scope("/data/file.hdf5"),
|
||||
index)
|
||||
mock_cat.assert_called_once_with(b"raw-hdf5")
|
||||
assert result == b"csv-output"
|
||||
@@ -0,0 +1,57 @@
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from mirage.accessor.gdrive import GDriveAccessor
|
||||
from mirage.cache.index.ram import RAMIndexCacheStore
|
||||
from mirage.ops.gdrive.read.read_orc import read_orc
|
||||
from mirage.types import PathSpec
|
||||
from mirage.utils.key_prefix import mount_key
|
||||
|
||||
|
||||
def _scope(path: str, prefix: str = "") -> PathSpec:
|
||||
return PathSpec(resource_path=mount_key(path, prefix),
|
||||
virtual=path,
|
||||
directory=path.rsplit("/", 1)[0] or "/")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def accessor():
|
||||
return GDriveAccessor(config=None, token_manager=None)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def index():
|
||||
return RAMIndexCacheStore()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_read_orc_calls_core(accessor, index):
|
||||
fn = read_orc._registered_ops[0].fn
|
||||
with patch(
|
||||
"mirage.ops.gdrive.read.read_orc.core_read",
|
||||
new_callable=AsyncMock,
|
||||
return_value=b"raw-orc",
|
||||
) as mock_read, patch(
|
||||
"mirage.ops.gdrive.read.read_orc.orc_cat",
|
||||
return_value=b"csv-output",
|
||||
) as mock_cat:
|
||||
result = await fn(accessor, _scope("/data/file.orc"), index=index)
|
||||
mock_read.assert_called_once_with(accessor, _scope("/data/file.orc"),
|
||||
index)
|
||||
mock_cat.assert_called_once_with(b"raw-orc")
|
||||
assert result == b"csv-output"
|
||||
@@ -0,0 +1,57 @@
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from mirage.accessor.gdrive import GDriveAccessor
|
||||
from mirage.cache.index.ram import RAMIndexCacheStore
|
||||
from mirage.ops.gdrive.read.read_parquet import read_parquet
|
||||
from mirage.types import PathSpec
|
||||
from mirage.utils.key_prefix import mount_key
|
||||
|
||||
|
||||
def _scope(path: str, prefix: str = "") -> PathSpec:
|
||||
return PathSpec(resource_path=mount_key(path, prefix),
|
||||
virtual=path,
|
||||
directory=path.rsplit("/", 1)[0] or "/")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def accessor():
|
||||
return GDriveAccessor(config=None, token_manager=None)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def index():
|
||||
return RAMIndexCacheStore()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_read_parquet_calls_core(accessor, index):
|
||||
fn = read_parquet._registered_ops[0].fn
|
||||
with patch(
|
||||
"mirage.ops.gdrive.read.read_parquet.core_read",
|
||||
new_callable=AsyncMock,
|
||||
return_value=b"raw-parquet",
|
||||
) as mock_read, patch(
|
||||
"mirage.ops.gdrive.read.read_parquet.parquet_cat",
|
||||
return_value=b"csv-output",
|
||||
) as mock_cat:
|
||||
result = await fn(accessor, _scope("/data/file.parquet"), index=index)
|
||||
mock_read.assert_called_once_with(accessor,
|
||||
_scope("/data/file.parquet"), index)
|
||||
mock_cat.assert_called_once_with(b"raw-parquet")
|
||||
assert result == b"csv-output"
|
||||
@@ -0,0 +1,52 @@
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from mirage.accessor.gdrive import GDriveAccessor
|
||||
from mirage.cache.index.ram import RAMIndexCacheStore
|
||||
from mirage.ops.gdrive.readdir import readdir
|
||||
from mirage.types import PathSpec
|
||||
from mirage.utils.key_prefix import mount_key
|
||||
|
||||
|
||||
def _scope(path: str, prefix: str = "") -> PathSpec:
|
||||
return PathSpec(resource_path=mount_key(path, prefix),
|
||||
virtual=path,
|
||||
directory=path.rsplit("/", 1)[0] or "/")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def accessor():
|
||||
return GDriveAccessor(config=None, token_manager=None)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def index():
|
||||
return RAMIndexCacheStore()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_readdir_calls_core(accessor, index):
|
||||
fn = readdir._registered_ops[0].fn
|
||||
with patch(
|
||||
"mirage.ops.gdrive.readdir.core_readdir",
|
||||
new_callable=AsyncMock,
|
||||
return_value=["/docs/readme.txt"],
|
||||
) as mock:
|
||||
result = await fn(accessor, _scope("/docs"), index=index)
|
||||
mock.assert_called_once_with(accessor, _scope("/docs"), index)
|
||||
assert result == ["/docs/readme.txt"]
|
||||
@@ -0,0 +1,54 @@
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
||||
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from mirage.accessor.gdrive import GDriveAccessor
|
||||
from mirage.cache.index.ram import RAMIndexCacheStore
|
||||
from mirage.ops.gdrive.stat import stat
|
||||
from mirage.types import FileStat, PathSpec
|
||||
from mirage.utils.key_prefix import mount_key
|
||||
|
||||
|
||||
def _scope(path: str, prefix: str = "") -> PathSpec:
|
||||
return PathSpec(resource_path=mount_key(path, prefix),
|
||||
virtual=path,
|
||||
directory=path.rsplit("/", 1)[0] or "/")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def accessor():
|
||||
return GDriveAccessor(config=None, token_manager=None)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def index():
|
||||
return RAMIndexCacheStore()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_stat_calls_core(accessor, index):
|
||||
fn = stat._registered_ops[0].fn
|
||||
fake_stat = FileStat(name="readme.txt", size=50)
|
||||
with patch(
|
||||
"mirage.ops.gdrive.stat.core_stat",
|
||||
new_callable=AsyncMock,
|
||||
return_value=fake_stat,
|
||||
) as mock:
|
||||
result = await fn(accessor, _scope("/docs/readme.txt"), index=index)
|
||||
mock.assert_called_once_with(accessor, _scope("/docs/readme.txt"),
|
||||
index)
|
||||
assert result == fake_stat
|
||||
Reference in New Issue
Block a user