|
| 1 | +from pathlib import Path |
| 2 | +from types import SimpleNamespace |
| 3 | +from typing import cast |
| 4 | +from unittest.mock import Mock |
| 5 | + |
| 6 | +import annofabapi |
| 7 | + |
| 8 | +from annofabcli.input_data.update_input_data import UpdateInputDataMain, UpdateResult |
| 9 | + |
| 10 | + |
| 11 | +def create_old_input_data() -> dict[str, str]: |
| 12 | + return { |
| 13 | + "input_data_id": "input1", |
| 14 | + "input_data_name": "old_name", |
| 15 | + "input_data_path": "s3://bucket/old_image.jpg", |
| 16 | + "updated_datetime": "2026-01-01T00:00:00.000+09:00", |
| 17 | + } |
| 18 | + |
| 19 | + |
| 20 | +def create_service() -> tuple[annofabapi.Resource, Mock, Mock]: |
| 21 | + api = Mock() |
| 22 | + wrapper = Mock() |
| 23 | + wrapper.get_input_data_or_none.return_value = create_old_input_data() |
| 24 | + service = cast(annofabapi.Resource, SimpleNamespace(api=api, wrapper=wrapper)) |
| 25 | + return service, api, wrapper |
| 26 | + |
| 27 | + |
| 28 | +def test_update_input_data_with_url_path() -> None: |
| 29 | + service, api, wrapper = create_service() |
| 30 | + main_obj = UpdateInputDataMain(service, all_yes=True) |
| 31 | + |
| 32 | + result = main_obj.update_input_data("project1", "input1", new_input_data_path="s3://bucket/new_image.jpg") |
| 33 | + |
| 34 | + assert result == UpdateResult.SUCCESS |
| 35 | + api.put_input_data.assert_called_once_with( |
| 36 | + "project1", |
| 37 | + "input1", |
| 38 | + request_body={ |
| 39 | + "input_data_id": "input1", |
| 40 | + "input_data_name": "old_name", |
| 41 | + "input_data_path": "s3://bucket/new_image.jpg", |
| 42 | + "updated_datetime": "2026-01-01T00:00:00.000+09:00", |
| 43 | + "last_updated_datetime": "2026-01-01T00:00:00.000+09:00", |
| 44 | + }, |
| 45 | + ) |
| 46 | + wrapper.put_input_data_from_file.assert_not_called() |
| 47 | + |
| 48 | + |
| 49 | +def test_update_input_data_with_file_scheme_path(tmp_path: Path) -> None: |
| 50 | + input_data_file = tmp_path / "new_image.jpg" |
| 51 | + input_data_file.write_bytes(b"image") |
| 52 | + service, api, wrapper = create_service() |
| 53 | + main_obj = UpdateInputDataMain(service, all_yes=True) |
| 54 | + |
| 55 | + result = main_obj.update_input_data("project1", "input1", new_input_data_name="new_name", new_input_data_path=f"file://{input_data_file}") |
| 56 | + |
| 57 | + assert result == UpdateResult.SUCCESS |
| 58 | + wrapper.put_input_data_from_file.assert_called_once_with( |
| 59 | + "project1", |
| 60 | + input_data_id="input1", |
| 61 | + file_path=str(input_data_file), |
| 62 | + request_body={ |
| 63 | + "input_data_id": "input1", |
| 64 | + "input_data_name": "new_name", |
| 65 | + "input_data_path": "s3://bucket/old_image.jpg", |
| 66 | + "updated_datetime": "2026-01-01T00:00:00.000+09:00", |
| 67 | + "last_updated_datetime": "2026-01-01T00:00:00.000+09:00", |
| 68 | + }, |
| 69 | + ) |
| 70 | + api.put_input_data.assert_not_called() |
| 71 | + |
| 72 | + |
| 73 | +def test_update_input_data_with_missing_file_scheme_path(tmp_path: Path) -> None: |
| 74 | + service, api, wrapper = create_service() |
| 75 | + main_obj = UpdateInputDataMain(service, all_yes=True) |
| 76 | + |
| 77 | + result = main_obj.update_input_data("project1", "input1", new_input_data_path=f"file://{tmp_path / 'missing.jpg'}") |
| 78 | + |
| 79 | + assert result == UpdateResult.SKIPPED |
| 80 | + wrapper.put_input_data_from_file.assert_not_called() |
| 81 | + api.put_input_data.assert_not_called() |
0 commit comments