Changeset View
Changeset View
Standalone View
Standalone View
swh/vault/tests/test_cli.py
# Copyright (C) 2021 The Software Heritage developers | # Copyright (C) 2021 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU General Public License version 3, or any later version | # License: GNU General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
import tempfile | import tempfile | ||||
from unittest.mock import MagicMock | from unittest.mock import MagicMock | ||||
import click | import click | ||||
import click.testing | import click.testing | ||||
import pytest | import pytest | ||||
from swh.model.identifiers import CoreSWHID | |||||
from swh.vault.cli import vault as vault_cli_group | from swh.vault.cli import vault as vault_cli_group | ||||
from swh.vault.cookers.base import BaseVaultCooker | from swh.vault.cookers.base import BaseVaultCooker | ||||
from swh.vault.in_memory_backend import InMemoryVaultBackend | from swh.vault.in_memory_backend import InMemoryVaultBackend | ||||
def test_cook_unsupported_swhid(): | def test_cook_unsupported_swhid(): | ||||
runner = click.testing.CliRunner() | runner = click.testing.CliRunner() | ||||
result = runner.invoke(vault_cli_group, ["cook", "swh:1:dir:f00b4r", "-"]) | result = runner.invoke(vault_cli_group, ["cook", "swh:1:dir:f00b4r", "-"]) | ||||
assert isinstance(result.exception, SystemExit) | assert isinstance(result.exception, SystemExit) | ||||
assert "expected core SWHID" in result.stdout | assert "expected core SWHID" in result.stdout | ||||
result = runner.invoke(vault_cli_group, ["cook", "swh:1:ori:" + "0" * 40, "-"]) | result = runner.invoke(vault_cli_group, ["cook", "swh:1:ori:" + "0" * 40, "-"]) | ||||
assert isinstance(result.exception, SystemExit) | assert isinstance(result.exception, SystemExit) | ||||
assert "expected core SWHID" in result.stdout | assert "expected core SWHID" in result.stdout | ||||
result = runner.invoke(vault_cli_group, ["cook", "swh:1:cnt:" + "0" * 40, "-"]) | |||||
assert isinstance(result.exception, SystemExit) | |||||
assert "No cooker available for CONTENT" in result.stdout | |||||
def test_cook_unknown_cooker(): | def test_cook_unknown_cooker(): | ||||
runner = click.testing.CliRunner() | runner = click.testing.CliRunner() | ||||
result = runner.invoke( | result = runner.invoke( | ||||
vault_cli_group, | vault_cli_group, | ||||
["cook", "swh:1:dir:" + "0" * 40, "-", "--cooker-type", "gitfast"], | ["cook", "swh:1:dir:" + "0" * 40, "-", "--bundle-type", "gitfast"], | ||||
) | ) | ||||
assert isinstance(result.exception, SystemExit) | assert isinstance(result.exception, SystemExit) | ||||
assert "do not have a gitfast cooker" in result.stdout | assert "do not have a gitfast cooker" in result.stdout | ||||
result = runner.invoke(vault_cli_group, ["cook", "swh:1:rev:" + "0" * 40, "-"]) | result = runner.invoke(vault_cli_group, ["cook", "swh:1:rev:" + "0" * 40, "-"]) | ||||
assert isinstance(result.exception, SystemExit) | assert isinstance(result.exception, SystemExit) | ||||
assert "explicit --cooker-type" in result.stdout | assert "use --bundle-type" in result.stdout | ||||
@pytest.mark.parametrize( | @pytest.mark.parametrize( | ||||
"bundle_type,cooker_name_suffix,swhid_type", | "bundle_type,cooker_name_suffix,swhid_type", | ||||
[("directory", "", "dir"), ("revision", "gitfast", "rev"),], | [("directory", "", "dir"), ("revision", "gitfast", "rev"),], | ||||
) | ) | ||||
def test_cook_directory(bundle_type, cooker_name_suffix, swhid_type, mocker): | def test_cook_directory(bundle_type, cooker_name_suffix, swhid_type, mocker): | ||||
storage = object() | storage = object() | ||||
mocker.patch("swh.storage.get_storage", return_value=storage) | mocker.patch("swh.storage.get_storage", return_value=storage) | ||||
backend = MagicMock(spec=InMemoryVaultBackend) | backend = MagicMock(spec=InMemoryVaultBackend) | ||||
backend.fetch.return_value = b"bundle content" | backend.fetch.return_value = b"bundle content" | ||||
mocker.patch( | mocker.patch( | ||||
"swh.vault.in_memory_backend.InMemoryVaultBackend", return_value=backend | "swh.vault.in_memory_backend.InMemoryVaultBackend", return_value=backend | ||||
) | ) | ||||
cooker = MagicMock(spec=BaseVaultCooker) | cooker = MagicMock(spec=BaseVaultCooker) | ||||
cooker_cls = MagicMock(return_value=cooker) | cooker_cls = MagicMock(return_value=cooker) | ||||
mocker.patch("swh.vault.cookers.get_cooker_cls", return_value=cooker_cls) | mocker.patch("swh.vault.cookers.get_cooker_cls", return_value=cooker_cls) | ||||
runner = click.testing.CliRunner() | runner = click.testing.CliRunner() | ||||
swhid = CoreSWHID.from_string(f"swh:1:{swhid_type}:{'0'*40}") | |||||
with tempfile.NamedTemporaryFile("a", suffix=".yml") as config_fd: | with tempfile.NamedTemporaryFile("a", suffix=".yml") as config_fd: | ||||
config_fd.write('{"storage": {}}') | config_fd.write('{"storage": {}}') | ||||
config_fd.seek(0) | config_fd.seek(0) | ||||
if cooker_name_suffix: | if cooker_name_suffix: | ||||
result = runner.invoke( | result = runner.invoke( | ||||
vault_cli_group, | vault_cli_group, | ||||
[ | [ | ||||
"cook", | "cook", | ||||
f"swh:1:{swhid_type}:{'0'*40}", | f"swh:1:{swhid_type}:{'0'*40}", | ||||
"-", | "-", | ||||
"-C", | "-C", | ||||
config_fd.name, | config_fd.name, | ||||
"--cooker-type", | "--bundle-type", | ||||
cooker_name_suffix, | cooker_name_suffix, | ||||
], | ], | ||||
) | ) | ||||
else: | else: | ||||
result = runner.invoke( | result = runner.invoke( | ||||
vault_cli_group, | vault_cli_group, ["cook", str(swhid), "-", "-C", config_fd.name], | ||||
["cook", f"swh:1:{swhid_type}:{'0'*40}", "-", "-C", config_fd.name], | |||||
) | ) | ||||
if result.exception is not None: | if result.exception is not None: | ||||
raise result.exception | raise result.exception | ||||
cooker_cls.assert_called_once_with( | cooker_cls.assert_called_once_with( | ||||
bundle_type=f"{bundle_type}_{cooker_name_suffix}" | swhid=swhid, | ||||
if cooker_name_suffix | |||||
else bundle_type, | |||||
obj_id=b"\x00" * 20, | |||||
backend=backend, | backend=backend, | ||||
storage=storage, | storage=storage, | ||||
graph=None, | graph=None, | ||||
objstorage=None, | objstorage=None, | ||||
max_bundle_size=None, | max_bundle_size=None, | ||||
) | ) | ||||
cooker.cook.assert_called_once_with() | cooker.cook.assert_called_once_with() | ||||
assert result.stdout_bytes == b"bundle content" | assert result.stdout_bytes == b"bundle content" |