def test_image_permission_with_public_job(): g_reg_anon = Group.objects.get( name=settings.REGISTERED_AND_ANON_USERS_GROUP_NAME ) g_reg = Group.objects.get(name=settings.REGISTERED_USERS_GROUP_NAME) job = AlgorithmJobFactory() output_image = ImageFactory() civ = ComponentInterfaceValueFactory(image=output_image) job.outputs.add(civ) assert "view_image" not in get_perms(g_reg, output_image) assert "view_image" not in get_perms(g_reg_anon, output_image) assert "view_image" not in get_perms(g_reg, job.inputs.first().image) assert "view_image" not in get_perms(g_reg_anon, job.inputs.first().image) job.public = True job.save() assert "view_image" not in get_perms(g_reg, output_image) assert "view_image" in get_perms(g_reg_anon, output_image) assert "view_image" not in get_perms(g_reg, job.inputs.first().image) assert "view_image" in get_perms(g_reg_anon, job.inputs.first().image) job.public = False job.save() assert "view_image" not in get_perms(g_reg, output_image) assert "view_image" not in get_perms(g_reg_anon, output_image) assert "view_image" not in get_perms(g_reg, job.inputs.first().image) assert "view_image" not in get_perms(g_reg_anon, job.inputs.first().image)
def test_used_by_other_public_result_permissions(): g_reg_anon = Group.objects.get( name=settings.REGISTERED_AND_ANON_USERS_GROUP_NAME) g_reg = Group.objects.get(name=settings.REGISTERED_USERS_GROUP_NAME) j1 = AlgorithmJobFactory(public=True) j2 = AlgorithmJobFactory(public=True) shared_image = ImageFactory() civ1 = ComponentInterfaceValueFactory(image=shared_image) j1.outputs.add(civ1) civ2 = ComponentInterfaceValueFactory(image=shared_image) j2.outputs.add(civ2) assert "view_image" not in get_perms(g_reg, shared_image) assert "view_image" in get_perms(g_reg_anon, shared_image) j2.outputs.clear() assert "view_image" not in get_perms(g_reg, shared_image) assert "view_image" in get_perms(g_reg_anon, shared_image) j2.outputs.add(civ2) j2.public = False j2.save() assert "view_image" not in get_perms(g_reg, shared_image) assert "view_image" in get_perms(g_reg_anon, shared_image) j1.public = False j1.save() assert "view_image" not in get_perms(g_reg, shared_image) assert "view_image" not in get_perms(g_reg_anon, shared_image)
def test_duration(): j = AlgorithmJobFactory() _ = EvaluationFactory() jbs = Job.objects.with_duration() assert jbs[0].duration is None assert Job.objects.average_duration() is None now = timezone.now() j.started_at = now - timedelta(minutes=5) j.completed_at = now j.save() jbs = Job.objects.with_duration() assert jbs[0].duration == timedelta(minutes=5) assert Job.objects.average_duration() == timedelta(minutes=5) _ = AlgorithmJobFactory() assert Job.objects.average_duration() == timedelta(minutes=5)
def test_public_job_group_permissions(): g_reg_anon = Group.objects.get( name=settings.REGISTERED_AND_ANON_USERS_GROUP_NAME) g_reg = Group.objects.get(name=settings.REGISTERED_USERS_GROUP_NAME) algorithm_job = AlgorithmJobFactory() assert "view_job" not in get_perms(g_reg, algorithm_job) assert "view_job" not in get_perms(g_reg_anon, algorithm_job) algorithm_job.public = True algorithm_job.save() assert "view_job" not in get_perms(g_reg, algorithm_job) assert "view_job" in get_perms(g_reg_anon, algorithm_job) algorithm_job.public = False algorithm_job.save() assert "view_job" not in get_perms(g_reg, algorithm_job) assert "view_job" not in get_perms(g_reg_anon, algorithm_job)
def test_average_duration(): alg = AlgorithmFactory() now = timezone.now() assert alg.average_duration is None j = AlgorithmJobFactory(algorithm_image__algorithm=alg) j.started_at = now - timedelta(minutes=5) j.completed_at = now j.status = j.SUCCESS j.save() assert alg.average_duration == timedelta(minutes=5) # Unsuccessful jobs should not count j = AlgorithmJobFactory(algorithm_image__algorithm=alg) j.started_at = now - timedelta(minutes=10) j.completed_at = now j.status = j.FAILURE j.save() assert alg.average_duration == timedelta(minutes=5) # Nor should jobs for other algorithms j = AlgorithmJobFactory() j.started_at = now - timedelta(minutes=15) j.completed_at = now j.status = j.SUCCESS j.save() assert alg.average_duration == timedelta(minutes=5)
def test_algorithm_jobs_list_view(client): editor = UserFactory() alg = AlgorithmFactory(public=True) alg.add_editor(editor) im = AlgorithmImageFactory(algorithm=alg) for x in range(50): created = timezone.now() - datetime.timedelta(days=x + 365) job = AlgorithmJobFactory(algorithm_image=im, status=Job.SUCCESS) job.created = created job.save() job.viewer_groups.add(alg.editors_group) response = get_view_for_user( viewname="algorithms:job-list", reverse_kwargs={"slug": slugify(alg.slug)}, client=client, user=editor, method=client.get, follow=True, ) assert response.status_code == 200 response = get_view_for_user( viewname="algorithms:job-list", reverse_kwargs={"slug": slugify(alg.slug)}, client=client, user=editor, method=client.get, follow=True, data={ "length": 10, "draw": 1, "order[0][dir]": "desc", "order[0][column]": 0, }, **{"HTTP_X_REQUESTED_WITH": "XMLHttpRequest"}, ) resp = response.json() assert resp["recordsTotal"] == 50 assert len(resp["data"]) == 10 response = get_view_for_user( viewname="algorithms:job-list", reverse_kwargs={"slug": slugify(alg.slug)}, client=client, user=editor, method=client.get, follow=True, data={ "length": 50, "draw": 1, "order[0][dir]": "desc", "order[0][column]": 0, }, **{"HTTP_X_REQUESTED_WITH": "XMLHttpRequest"}, ) resp = response.json() assert resp["recordsTotal"] == 50 assert len(resp["data"]) == 50 response = get_view_for_user( viewname="algorithms:job-list", reverse_kwargs={"slug": slugify(alg.slug)}, client=client, user=editor, method=client.get, follow=True, data={ "length": 50, "draw": 1, "order[0][dir]": "asc", "order[0][column]": 0, }, **{"HTTP_X_REQUESTED_WITH": "XMLHttpRequest"}, ) resp_new = response.json() assert resp_new["recordsTotal"] == 50 assert resp_new["data"] == resp["data"][::-1] response = get_view_for_user( viewname="algorithms:job-list", reverse_kwargs={"slug": slugify(alg.slug)}, client=client, user=editor, method=client.get, follow=True, data={ "length": 50, "draw": 1, "search[value]": job.creator.username, "order[0][column]": 0, }, **{"HTTP_X_REQUESTED_WITH": "XMLHttpRequest"}, ) resp = response.json() assert resp["recordsTotal"] == 50 assert resp["recordsFiltered"] == 1 assert len(resp["data"]) == 1