def test_algorithm_input_image_multiple_files(build_images, client, algorithm_io_image, settings, component_interfaces): # Override the celery settings settings.task_eager_propagates = (True, ) settings.task_always_eager = (True, ) creator = UserFactory() assert Job.objects.count() == 0 # Create the algorithm image algorithm_container, sha256 = algorithm_io_image alg = AlgorithmImageFactory(image__from_path=algorithm_container, image_sha256=sha256, ready=True) alg.algorithm.add_editor(creator) alg.algorithm.inputs.set(ComponentInterface.objects.all()) # create the job job = Job.objects.create(creator=creator, algorithm_image=alg) us = RawImageUploadSessionFactory() ImageFactory(origin=us), ImageFactory(origin=us) ci = ComponentInterface.objects.get(slug=DEFAULT_INPUT_INTERFACE_SLUG) civ = ComponentInterfaceValue.objects.create(interface=ci) job.inputs.add(civ) with pytest.raises(ValueError): with capture_on_commit_callbacks(execute=True): run_algorithm_job_for_inputs(job_pk=job.pk, upload_pks={civ.pk: us.pk})
def test_civ_existing_does_nothing(self): image = ImageFactory() ai = AlgorithmImageFactory() j = AlgorithmJobFactory(creator=ai.creator, algorithm_image=ai) civ = ComponentInterfaceValueFactory( interface=self.default_input_interface, image=image) j.inputs.set([civ]) assert Job.objects.count() == 1 run_algorithm_job_for_inputs(job_pk=j.pk, upload_pks=[]) assert Job.objects.count() == 1
def test_algorithm_multiple_inputs(client, algorithm_io_image, settings, component_interfaces): # Override the celery settings settings.task_eager_propagates = (True, ) settings.task_always_eager = (True, ) creator = UserFactory() assert Job.objects.count() == 0 # Create the algorithm image algorithm_container, sha256 = algorithm_io_image alg = AlgorithmImageFactory(image__from_path=algorithm_container, image_sha256=sha256, ready=True) alg.algorithm.add_editor(creator) alg.algorithm.inputs.set(ComponentInterface.objects.all()) # create the job job = Job.objects.create(creator=creator, algorithm_image=alg) expected = [] for ci in ComponentInterface.objects.all(): if ci.kind in InterfaceKind.interface_type_image(): image_file = ImageFileFactory( file__from_path=Path(__file__).parent / "resources" / "input_file.tif") job.inputs.add( ComponentInterfaceValueFactory(interface=ci, image=image_file.image, file=None)) expected.append("file") elif ci.kind in InterfaceKind.interface_type_file(): job.inputs.add( ComponentInterfaceValueFactory( interface=ci, file__from_path=Path(__file__).parent / "resources" / "test.json", )) expected.append("json") else: job.inputs.add( ComponentInterfaceValueFactory(interface=ci, value="test", file=None)) expected.append("test") # Nested on_commits created by these tasks with capture_on_commit_callbacks(execute=True): with capture_on_commit_callbacks(execute=True): run_algorithm_job_for_inputs(job_pk=job.pk, upload_pks=[]) job = Job.objects.get() assert job.status == job.SUCCESS assert {x[0] for x in job.input_files} == set(job.outputs.first().value.keys()) assert sorted( map( lambda x: x if x != {} else "json", job.outputs.first().value.values(), )) == sorted(expected)
def test_algorithm_multiple_inputs(client, algorithm_io_image, settings, component_interfaces): # Override the celery settings settings.task_eager_propagates = (True, ) settings.task_always_eager = (True, ) creator = UserFactory() assert Job.objects.count() == 0 # Create the algorithm image algorithm_container, sha256 = algorithm_io_image alg = AlgorithmImageFactory(image__from_path=algorithm_container, image_sha256=sha256, ready=True) alg.algorithm.add_editor(creator) alg.algorithm.inputs.set(ComponentInterface.objects.all()) alg.algorithm.outputs.set( [ComponentInterface.objects.get(slug="results-json-file")]) # create the job job = Job.objects.create(creator=creator, algorithm_image=alg) expected = [] for ci in ComponentInterface.objects.exclude( kind=InterfaceKindChoices.ZIP): if ci.is_image_kind: image_file = ImageFileFactory( file__from_path=Path(__file__).parent / "resources" / "input_file.tif") job.inputs.add( ComponentInterfaceValueFactory(interface=ci, image=image_file.image)) expected.append("file") elif ci.is_file_kind: civ = ComponentInterfaceValueFactory(interface=ci) civ.file.save("test", File(BytesIO(b""))) civ.save() job.inputs.add(civ) expected.append("file") else: job.inputs.add( ComponentInterfaceValueFactory(interface=ci, value="test")) expected.append("test") with capture_on_commit_callbacks() as callbacks: run_algorithm_job_for_inputs(job_pk=job.pk, upload_pks=[]) recurse_callbacks(callbacks=callbacks) job.refresh_from_db() assert job.error_message == "" assert job.status == job.SUCCESS # Remove fake value for score output_dict = job.outputs.first().value output_dict.pop("score") assert {f"/input/{x.relative_path}" for x in job.inputs.all()} == set(output_dict.keys()) assert sorted(map(lambda x: x if x != {} else "json", output_dict.values())) == sorted(expected)