diff --git a/app-openbis-command-line/src/python/obis/dm/data_mgmt_test.py b/app-openbis-command-line/src/python/obis/dm/data_mgmt_test.py index 977f091a15bbd11105dfc60ab0edc9c4d46a4de3..99274b686a4f29dae7d6b252b1a596c70be723ae 100644 --- a/app-openbis-command-line/src/python/obis/dm/data_mgmt_test.py +++ b/app-openbis-command-line/src/python/obis/dm/data_mgmt_test.py @@ -24,21 +24,21 @@ data_mgmt_test.py Created by Chandrasekhar Ramakrishnan on 2017-02-02. Copyright (c) 2017 Chandrasekhar Ramakrishnan. All rights reserved. """ +import hashlib import json import os import random import shutil import socket -import hashlib - from datetime import datetime +from unittest.mock import Mock, MagicMock, ANY +from pybis.pybis import ExternalDMS, DataSet + +from . import CommandResult from . import data_mgmt from . import git from . import utils -from . import CommandResult -from unittest.mock import Mock, MagicMock, ANY -from pybis.pybis import ExternalDMS, DataSet def generate_perm_id(): @@ -60,8 +60,23 @@ def shared_dm(path): return dm +def physical_dm(path): + openbis_config = { + 'allow_http_but_do_not_use_this_in_production_and_only_within_safe_networks': True + } + dm = data_mgmt.DataMgmt(openbis_config=openbis_config, + git_config={'data_path': path, + 'metadata_path': path, + 'invocation_path': path + }, + repository_type=utils.Type.PHYSICAL) + dm.debug = True + return dm + + def test_no_git(tmpdir): - git_config = {'find_git': False, 'data_path': None, 'metadata_path': None, 'invocation_path': None} + git_config = {'find_git': False, 'data_path': None, 'metadata_path': None, + 'invocation_path': None} dm = data_mgmt.DataMgmt(git_config=git_config) try: dm.init_data("") @@ -99,16 +114,17 @@ def test_data_use_case(tmpdir): dm = shared_dm(tmpdir) tmp_dir_path = str(tmpdir) - assert git_status(tmp_dir_path).returncode == 128 # The folder should not be a git repo at first. + assert git_status( + tmp_dir_path).returncode == 128 # The folder should not be a git repo at first. with data_mgmt.cd(tmp_dir_path): - result = dm.init_data("test") print(result.output) assert result.returncode == 0 assert git_status(tmp_dir_path).returncode == 0 # The folder should be a git repo now - assert git_status(tmp_dir_path, annex=True).returncode == 0 # ...and a git-annex repo as well. + assert git_status(tmp_dir_path, + annex=True).returncode == 0 # ...and a git-annex repo as well. copy_test_data(tmpdir) @@ -153,7 +169,6 @@ def test_child_data_set(tmpdir): tmp_dir_path = str(tmpdir) with data_mgmt.cd(tmp_dir_path): - result = dm.init_data("test") assert result.returncode == 0 @@ -180,7 +195,8 @@ def test_child_data_set(tmpdir): assert repository_id is not None contents = git.GitRepoFileInfo(dm.git_wrapper).contents(git_annex_hash_as_checksum=True) - check_new_data_set_expectations(dm, tmp_dir_path, commit_id, repository_id, ANY, child_ds_code, parent_ds_code, + check_new_data_set_expectations(dm, tmp_dir_path, commit_id, repository_id, ANY, + child_ds_code, parent_ds_code, properties, contents) @@ -215,9 +231,10 @@ def test_undo_commit_when_sync_fails(tmpdir): # given dm = shared_dm(tmpdir) dm.git_wrapper = Mock() - dm.git_wrapper.git_top_level_path = MagicMock(return_value = CommandResult(returncode=0, output=None)) - dm.git_wrapper.git_add = MagicMock(return_value = CommandResult(returncode=0, output=None)) - dm.git_wrapper.git_commit = MagicMock(return_value = CommandResult(returncode=0, output=None)) + dm.git_wrapper.git_top_level_path = MagicMock( + return_value=CommandResult(returncode=0, output=None)) + dm.git_wrapper.git_add = MagicMock(return_value=CommandResult(returncode=0, output=None)) + dm.git_wrapper.git_commit = MagicMock(return_value=CommandResult(returncode=0, output=None)) dm._sync = lambda *args: CommandResult(returncode=-1, output="dummy error") # when result = dm.commit("Added data.") @@ -230,7 +247,6 @@ def test_init_analysis(tmpdir): tmp_dir_path = str(tmpdir) with data_mgmt.cd(tmp_dir_path): - dm = shared_dm(tmp_dir_path) prepare_registration_expectations(dm) openbis = dm.openbis @@ -250,7 +266,6 @@ def test_init_analysis(tmpdir): os.mkdir(analysis_repo) with data_mgmt.cd(analysis_repo): - dm = shared_dm(os.path.join(tmpdir, analysis_repo)) dm.openbis = openbis prepare_new_data_set_expectations(dm) @@ -269,10 +284,27 @@ def test_init_analysis(tmpdir): assert repository_id is not None contents = git.GitRepoFileInfo(dm.git_wrapper).contents(git_annex_hash_as_checksum=True) - check_new_data_set_expectations(dm, tmp_dir_path + '/' + analysis_repo, commit_id, repository_id, ANY, child_ds_code, parent_ds_code, + check_new_data_set_expectations(dm, tmp_dir_path + '/' + analysis_repo, commit_id, + repository_id, ANY, child_ds_code, parent_ds_code, None, contents) +def test_init_physical(tmpdir): + tmp_dir_path = str(tmpdir) + + with data_mgmt.cd(tmp_dir_path): + dm = physical_dm(tmp_dir_path) + init_result = dm.init_data("") + assert init_result.returncode == 0 + + files = os.listdir(os.path.join(tmp_dir_path, ".obis")) + assert files == ['config.json'] + + with open(os.path.join(tmp_dir_path, ".obis", "config.json")) as f: + config_local = json.load(f) + assert config_local.get('is_physical') is True + + # TODO Test that if the data set registration fails, the data_set_id is reverted def set_registration_configuration(dm, properties=None): @@ -288,10 +320,11 @@ def set_registration_configuration(dm, properties=None): def prepare_registration_expectations(dm): dm.openbis = Mock() dm.openbis.is_session_active = MagicMock(return_value=True) - edms = ExternalDMS(dm.openbis, {'code': 'AUSER-MACHINE-ffffffff', 'label': 'AUSER-MACHINE-ffffffff'}) + edms = ExternalDMS(dm.openbis, + {'code': 'AUSER-MACHINE-ffffffff', 'label': 'AUSER-MACHINE-ffffffff'}) dm.openbis.create_external_data_management_system = MagicMock(return_value=edms) dm.openbis.get_external_data_management_system = MagicMock(return_value=edms) - dm.openbis.create_permId.side_effect = [0, 1, 2 , 3, 4, 5, 6, 7, 8, 9] + dm.openbis.create_permId.side_effect = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] prepare_new_data_set_expectations(dm) @@ -301,8 +334,8 @@ def prepare_new_data_set_expectations(dm, properties={}): data_set = DataSet(dm.openbis, None, {'code': perm_id, 'properties': properties, 'components': [], "parents": [], "children": [], "samples": [], 'tags': [], 'containers': [], - 'physicalData': None, 'linkedData': { 'contentCopies': []}}, - kind='LINK') + 'physicalData': None, 'linkedData': {'contentCopies': []}}, + kind='LINK') dm.openbis.new_git_data_set = MagicMock(return_value=data_set) dm.openbis.get_dataset = MagicMock(return_value=data_set) @@ -312,11 +345,13 @@ def prepare_new_data_set_expectations(dm, properties={}): dm.openbis.get_sample = MagicMock(return_value=sample) - -def check_new_data_set_expectations(dm, tmp_dir_path, commit_id, repository_id, external_dms, data_set_id, parent_id, properties, +def check_new_data_set_expectations(dm, tmp_dir_path, commit_id, repository_id, external_dms, + data_set_id, parent_id, properties, contents): - dm.openbis.new_git_data_set.assert_called_with('DS_TYPE', tmp_dir_path, commit_id, repository_id, external_dms, - data_set_code=data_set_id, experiment=None, parents=parent_id, properties=properties, + dm.openbis.new_git_data_set.assert_called_with('DS_TYPE', tmp_dir_path, commit_id, + repository_id, external_dms, + data_set_code=data_set_id, experiment=None, + parents=parent_id, properties=properties, contents=contents, sample="/SAMPLE/ID")