Files
wehub-resource-sync bcbd1bdb22
Test (Python) / test-python-gate (push) Blocked by required conditions
Test (TypeScript) / test-typescript-gate (push) Blocked by required conditions
CLI exit codes / cli-gate (push) Blocked by required conditions
Test (Install) / test-install-gate (push) Blocked by required conditions
Integ / integ-gate (push) Blocked by required conditions
CLI exit codes / Python CLI (push) Waiting to run
Integ / changes (push) Has been skipped
Test (Install) / python-minimal (3.11) (push) Waiting to run
Test (Install) / python-minimal (3.12) (push) Waiting to run
Test (Install) / python-extra (chroma, mirage.resource.chroma) (push) Waiting to run
Integ / integ-ts (push) Waiting to run
Integ / integ (push) Waiting to run
Test (Install) / python-extra (deepagents, mirage.agents.langchain) (push) Waiting to run
Integ / integ-database (push) Waiting to run
Test (Install) / python-extra (email, mirage.resource.email) (push) Waiting to run
Test (Install) / python-extra (hdf5, mirage.core.filetype.hdf5) (push) Waiting to run
Integ / integ-ssh (push) Waiting to run
Pre-commit / pre-commit (push) Failing after 1s
CLI exit codes / changes (push) Has been skipped
Test (Install) / changes (push) Has been skipped
CLI exit codes / TypeScript CLI (push) Waiting to run
CLI exit codes / Cross-language snapshot interop (push) Waiting to run
Test (Install) / python-extra (agno, mirage.agents.agno) (push) Waiting to run
Test (Install) / python-extra (databricks, mirage.resource.databricks_volume) (push) Waiting to run
Test (Python) / changes (push) Has been skipped
Integ / integ-database-ts (push) Waiting to run
Test (Install) / python-extra (fuse, mirage.fuse.mount) (push) Waiting to run
Integ / integ-data (push) Waiting to run
Test (Install) / python-extra (lancedb, mirage.resource.lancedb) (push) Waiting to run
Test (Python) / test (push) Waiting to run
Integ / integ-fuse (push) Waiting to run
Test (Install) / python-extra (langfuse, mirage.resource.langfuse) (push) Waiting to run
Test (Python) / import-isolation (deepagents, openai, mirage.agents.openai_agents) (push) Waiting to run
Test (Python) / audit (push) Waiting to run
Test (Install) / python-extra (hf, mirage.resource.hf_buckets) (push) Waiting to run
Integ / integ-ssh-ts (push) Waiting to run
Test (Install) / python-extra (mongodb, mirage.resource.mongodb) (push) Waiting to run
Test (Python) / import-isolation (deepagents, pydantic-ai, mirage.agents.pydantic_ai) (push) Waiting to run
Test (TypeScript) / changes (push) Has been skipped
Test (Install) / python-extra (nextcloud, mirage.resource.nextcloud) (push) Waiting to run
Test (Install) / python-extra (openai, mirage.agents.openai_agents) (push) Waiting to run
Test (Install) / python-extra (openhands, mirage.agents.openhands, 3.12) (push) Waiting to run
Test (Install) / python-extra (parquet, mirage.core.filetype.parquet) (push) Waiting to run
Test (TypeScript) / test (push) Waiting to run
Test (Install) / python-extra (pdf, mirage.core.filetype.pdf) (push) Waiting to run
Test (TypeScript) / python-fs-shim (push) Waiting to run
Test (Install) / python-extra (postgres, mirage.resource.postgres) (push) Waiting to run
Test (Install) / python-extra (pydantic-ai, mirage.agents.pydantic_ai) (push) Waiting to run
Test (Install) / python-extra (qdrant, mirage.resource.qdrant) (push) Waiting to run
Test (Install) / python-extra (redis, mirage.resource.redis) (push) Waiting to run
Test (Install) / python-extra (s3, mirage.resource.s3) (push) Waiting to run
Test (Install) / python-extra (ssh, mirage.resource.ssh) (push) Waiting to run
Test (Install) / ts-minimal (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 12:30:44 +08:00

154 lines
5.4 KiB
Python

# ========= 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 patch
import pytest
from mirage.core.github.config import GitHubConfig
from mirage.core.github.tree_entry import TreeEntry
from mirage.resource.github.github import GitHubResource
from mirage.types import ResourceName
CONFIG = GitHubConfig(token="test-token")
OWNER = "test-owner"
REPO = "test-repo"
def _make_resource(ref: str = "main",
default_branch: str = "main",
tree: dict | None = None,
truncated: bool = False) -> GitHubResource:
if tree is None:
tree = {}
with patch("mirage.resource.github.github.fetch_default_branch_sync",
return_value=default_branch), \
patch("mirage.resource.github.github.fetch_tree_sync",
return_value=(tree, truncated)):
return GitHubResource(
config=CONFIG,
owner=OWNER,
repo=REPO,
ref=ref,
)
def test_name() -> None:
resource = _make_resource()
assert resource.name == ResourceName.GITHUB
def test_caches_reads() -> None:
resource = _make_resource()
assert resource.caches_reads is True
def test_bind_args() -> None:
resource = _make_resource()
assert resource.accessor.config is CONFIG
assert resource.accessor.owner == OWNER
assert resource.accessor.repo == REPO
assert resource.accessor.ref == "main"
def test_owner_repo_ref_fall_back_to_config() -> None:
config = GitHubConfig(token="test-token",
owner="cfg-owner",
repo="cfg-repo",
ref="cfg-ref")
with patch("mirage.resource.github.github.fetch_default_branch_sync",
return_value="main"), \
patch("mirage.resource.github.github.fetch_tree_sync",
return_value=({}, False)):
resource = GitHubResource(config=config)
assert resource.accessor.owner == "cfg-owner"
assert resource.accessor.repo == "cfg-repo"
assert resource.accessor.ref == "cfg-ref"
def test_kwargs_take_precedence_over_config() -> None:
config = GitHubConfig(token="test-token",
owner="cfg-owner",
repo="cfg-repo",
ref="cfg-ref")
with patch("mirage.resource.github.github.fetch_default_branch_sync",
return_value="main"), \
patch("mirage.resource.github.github.fetch_tree_sync",
return_value=({}, False)):
resource = GitHubResource(config=config,
owner="kw-owner",
repo="kw-repo",
ref="kw-ref")
assert resource.accessor.owner == "kw-owner"
assert resource.accessor.repo == "kw-repo"
assert resource.accessor.ref == "kw-ref"
def test_missing_owner_repo_raises() -> None:
with pytest.raises(ValueError, match="requires owner and repo"):
GitHubResource(config=GitHubConfig(token="test-token"))
def test_is_default_branch_true() -> None:
resource = _make_resource(ref="main", default_branch="main")
assert resource.is_default_branch is True
def test_is_default_branch_false() -> None:
resource = _make_resource(ref="feature-branch", default_branch="main")
assert resource.is_default_branch is False
@pytest.mark.asyncio
async def test_fingerprint_returns_sha() -> None:
tree = {
"src/main.py":
TreeEntry(path="src/main.py", type="blob", sha="abc123", size=100),
}
resource = _make_resource(tree=tree)
result = await resource.fingerprint("src/main.py")
assert result == "abc123"
@pytest.mark.asyncio
async def test_fingerprint_strips_slash() -> None:
tree = {
"src/main.py":
TreeEntry(path="src/main.py", type="blob", sha="abc123", size=100),
}
resource = _make_resource(tree=tree)
result = await resource.fingerprint("/src/main.py")
assert result == "abc123"
@pytest.mark.asyncio
async def test_fingerprint_returns_none_when_path_not_in_tree() -> None:
resource = _make_resource()
result = await resource.fingerprint("nonexistent.py")
assert result is None
@patch("mirage.resource.github.github.fetch_tree_sync")
@patch("mirage.resource.github.github.fetch_default_branch_sync")
def test_init_fetches_default_branch(mock_fetch_branch,
mock_fetch_tree) -> None:
mock_fetch_branch.return_value = "develop"
mock_fetch_tree.return_value = ({}, False)
resource = GitHubResource(config=CONFIG,
owner=OWNER,
repo=REPO,
ref="main")
assert resource.accessor.default_branch == "develop"
mock_fetch_branch.assert_called_once_with(CONFIG, OWNER, REPO)