def test_constructor__requirements(): node = Node(requirements=id) assert node.requirements == frozenset([id]) node = Node(requirements=[id]) assert node.requirements == frozenset([id]) node = Node(requirements=[id, str]) assert node.requirements == frozenset([id, str])
def test_run__exception__create_temp_dir(): cfg_mock = Mock(temp_root=_DUMMY_TEMP_ROOT) node_mock = Node() node_mock._create_temp_dir = Mock() node_mock._create_temp_dir.side_effect = OSError() with pytest.raises(NodeUnhandledException): node_mock.run(cfg_mock) assert node_mock._create_temp_dir.mock_calls == [call(cfg_mock)]
def test_run__exception__remove_temp_dir(): cfg_mock = Mock(temp_root=_DUMMY_TEMP_ROOT) mock = Mock() node_mock = Node() node_mock._create_temp_dir = mock._create_temp_dir node_mock._create_temp_dir.return_value = _DUMMY_TEMP node_mock._remove_temp_dir = mock._remove_temp_dir node_mock._remove_temp_dir.side_effect = OSError() with pytest.raises(NodeUnhandledException): node_mock.run(cfg_mock) assert mock.mock_calls == [ call._create_temp_dir(cfg_mock), call._remove_temp_dir(_DUMMY_TEMP), ]
def test_run__exceptions(key, exception, expectation): mock = Mock() node = Node() node._create_temp_dir = mock._create_temp_dir node._create_temp_dir.return_value = _DUMMY_TEMP setattr(node, key, getattr(mock, key)) getattr(node, key).side_effect = exception cfg_mock = Mock(temp_root=_DUMMY_TEMP_ROOT) with pytest.raises(expectation): node.run(cfg_mock) assert mock.mock_calls == [ call._create_temp_dir(cfg_mock), getattr(call, key)(cfg_mock, _DUMMY_TEMP), ]
def test_run__error_log__node_error(tmp_path, exception): temp = tmp_path / "xTMPx" mock = Mock() cfg_mock = Mock(temp_root=tmp_path) node_mock = Node() node_mock._create_temp_dir = mock._create_temp_dir node_mock._create_temp_dir.return_value = temp node_mock._run = mock._run node_mock._run.side_effect = exception("ARGH!") os.mkdir(temp) with pytest.raises(NodeError): node_mock.run(cfg_mock) log_file = tmp_path / "xTMPx" / "pipe.errors" assert log_file.exists() assert "Errors =" in log_file.read_text() assert mock.mock_calls == [ call._create_temp_dir(cfg_mock), call._run(cfg_mock, temp), ]
def test_run__order(): cfg_mock = Mock(temp_root=_DUMMY_TEMP_ROOT) node_mock = Mock() node = Node() node._create_temp_dir = node_mock._create_temp_dir node._create_temp_dir.return_value = _DUMMY_TEMP node._setup = node_mock._setup node._run = node_mock._run node._teardown = node_mock._teardown node._remove_temp_dir = node_mock._remove_temp_dir node.run(cfg_mock) node_mock.mock_calls == [ call._create_temp_dir(cfg_mock), call._setup(cfg_mock, _DUMMY_TEMP), call._run(cfg_mock, _DUMMY_TEMP), call._teardown(cfg_mock, _DUMMY_TEMP), call._remove_temp_dir(_DUMMY_TEMP), ]
def test__setup__input_files_missing(kwargs): with pytest.raises(NodeError): Node(**kwargs)._setup(None, None)
def test__setup__input_files(kwargs): Node(**kwargs)._setup(None, None)
def test_constructor(key, value): defaults = {"input_files": _EMPTY_FILE} defaults[key] = value node = Node(**defaults) expected = safe_coerce_to_frozenset(value) assert getattr(node, key) == expected
def test_constructor__not_a_node(): with pytest.raises(TypeError): Node(dependencies=(1, ))
def test_constructor__iterable(): sub_nodes = [Node(), Node()] my_node = Node(dependencies=iter(sub_nodes)) assert my_node.dependencies == frozenset(sub_nodes)
def test_constructor__single_node(): sub_node = Node() my_node = Node(dependencies=sub_node) assert my_node.dependencies == frozenset([sub_node])
def test_constructor__nodes_is_none(): my_node = Node(dependencies=None) assert my_node.dependencies == frozenset()
def test_constructor__requirements__wrong_type(value): with pytest.raises(TypeError): Node(requirements=value)
def test_constructor__invalid_values(key, value): with pytest.raises(TypeError): Node(**{key: value})
def test__teardown__output_files(): Node(input_files=_EMPTY_FILE, output_files=_IN_FILES)._teardown(None, None)
def test__teardown__output_files_missing(): node = Node(input_files=_EMPTY_FILE, output_files=_OUT_FILES) with pytest.raises(NodeError): node._teardown(None, None)
def test__teardown__output_files(): Node(input_files=_EMPTY_FILE, output_files=_IN_FILES)._teardown(None, None) def test__teardown__output_files_missing(): node = Node(input_files=_EMPTY_FILE, output_files=_OUT_FILES) with pytest.raises(NodeError): node._teardown(None, None) ############################################################################### ############################################################################### # CommandNode: Constructor _SIMPLE_DEPS = Node() _SIMPLE_SUBS = Node() _SIMPLE_CMD_MOCK = Mock( input_files=_IN_FILES, output_files=_OUT_FILES, executables=_EXEC_FILES, auxiliary_files=_AUX_FILES, requirements=_REQUIREMENTS, ) _SIMPLE_CMD_NODE = CommandNode(command=_SIMPLE_CMD_MOCK, dependencies=_SIMPLE_DEPS) def test_commandnode_constructor__input_files(): assert _SIMPLE_CMD_NODE.input_files == _IN_FILES