def test_circular_resolve(memory_jobstore): from jobflow.core.reference import OutputReference # test catching circular resolve failure ref1 = OutputReference("12345") task_data = {"uuid": ref1.uuid, "index": 1, "output": ref1} memory_jobstore.update(task_data) with pytest.raises(RuntimeError): ref1.resolve(memory_jobstore)
def test_reference_in_output(memory_jobstore): from jobflow.core.reference import OnMissing, OutputReference # test resolvable reference in job output ref1 = OutputReference("12345") ref2 = OutputReference("56789") task_data1 = {"uuid": ref1.uuid, "index": 1, "output": ref2} task_data2 = {"uuid": ref2.uuid, "index": 1, "output": "xyz"} memory_jobstore.update(task_data1) memory_jobstore.update(task_data2) assert "xyz" == ref1.resolve(memory_jobstore) # test missing reference in output ref1 = OutputReference("12345") ref2 = OutputReference("999") task_data = {"uuid": ref1.uuid, "index": 1, "output": ref2} memory_jobstore.update(task_data) assert ref1.resolve(memory_jobstore, on_missing=OnMissing.NONE) is None assert ref1.resolve(memory_jobstore, on_missing=OnMissing.PASS) == ref2 with pytest.raises(ValueError): ref1.resolve(memory_jobstore, on_missing=OnMissing.ERROR)
def test_resolve(memory_jobstore): from jobflow import OnMissing, OutputReference ref = OutputReference("123") # fail if cache or store not provided with pytest.raises(TypeError): ref.resolve() # test on missing assert ref.resolve(memory_jobstore, on_missing=OnMissing.NONE) is None assert ref.resolve(memory_jobstore, on_missing=OnMissing.PASS) == ref with pytest.raises(ValueError): ref.resolve(memory_jobstore, on_missing=OnMissing.ERROR) # resolve using store memory_jobstore.update({"uuid": "123", "index": 1, "output": 101}) assert ref.resolve(store=memory_jobstore) == 101 # resolve using store and empty cache cache = {} assert ref.resolve(store=memory_jobstore, cache=cache) == 101 assert cache["123"][1] == 101 # check cache supersedes store cache = {"123": {1: "xyz"}} assert ref.resolve(store=memory_jobstore, cache=cache) == "xyz" assert cache["123"][1] == "xyz" # test indexing ref = OutputReference("123", (("i", "a"), ("i", 1))) memory_jobstore.update({"uuid": "123", "index": 1, "output": {"a": [5, 6, 7]}}) assert ref.resolve(memory_jobstore) == 6 # test attribute access ref = OutputReference("123", (("a", "__module__"),)) memory_jobstore.update({"uuid": "123", "index": 1, "output": OutputReference}) assert ref.resolve(memory_jobstore) == "jobflow.core.reference" # test missing attribute throws error ref = OutputReference("123", (("a", "b"),)) memory_jobstore.update({"uuid": "123", "index": 1, "output": [1234]}) with pytest.raises(AttributeError): ref.resolve(memory_jobstore) # test missing index throws error ref = OutputReference("123", (("i", "b"),)) with pytest.raises(TypeError): ref.resolve(memory_jobstore)