Merge branch 'master' of git.curoverse.com:arvados into 11876-r-sdk
[arvados.git] / apps / workbench / test / unit / pipeline_instance_test.rb
index 95ad8fa7cd11bf4abaabd7d04712945071255d28..3ff3fcfc771a4cd5dbf55a000f5dc704486ebf2c 100644 (file)
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: AGPL-3.0
+
 require 'test_helper'
 
 class PipelineInstanceTest < ActiveSupport::TestCase
 require 'test_helper'
 
 class PipelineInstanceTest < ActiveSupport::TestCase
+
+  reset_api_fixtures :after_each_test, false
+
+  def find_pi_with(token_name, pi_name)
+    use_token token_name
+    find_fixture(PipelineInstance, pi_name)
+  end
+
+  def attribute_editable_for?(token_name, pi_name, attr_name, ever=nil)
+    find_pi_with(token_name, pi_name).attribute_editable?(attr_name, ever)
+  end
+
   test "admin can edit name" do
   test "admin can edit name" do
-    use_token :admin
-    assert(find_fixture(PipelineInstance, "new_pipeline_in_subproject")
-             .attribute_editable?("name"),
+    assert(attribute_editable_for?(:admin, "new_pipeline_in_subproject",
+                                   "name"),
            "admin not allowed to edit pipeline instance name")
   end
 
   test "project owner can edit name" do
            "admin not allowed to edit pipeline instance name")
   end
 
   test "project owner can edit name" do
-    use_token :active
-    assert(find_fixture(PipelineInstance, "new_pipeline_in_subproject")
-             .attribute_editable?("name"),
+    assert(attribute_editable_for?(:active, "new_pipeline_in_subproject",
+                                   "name"),
            "project owner not allowed to edit pipeline instance name")
   end
 
   test "project admin can edit name" do
            "project owner not allowed to edit pipeline instance name")
   end
 
   test "project admin can edit name" do
-    use_token :subproject_admin
-    assert(find_fixture(PipelineInstance, "new_pipeline_in_subproject")
-             .attribute_editable?("name"),
+    assert(attribute_editable_for?(:subproject_admin,
+                                   "new_pipeline_in_subproject", "name"),
            "project admin not allowed to edit pipeline instance name")
   end
 
   test "project viewer cannot edit name" do
            "project admin not allowed to edit pipeline instance name")
   end
 
   test "project viewer cannot edit name" do
-    use_token :project_viewer
-    refute(find_fixture(PipelineInstance, "new_pipeline_in_subproject")
-             .attribute_editable?("name"),
+    refute(attribute_editable_for?(:project_viewer,
+                                   "new_pipeline_in_subproject", "name"),
            "project viewer allowed to edit pipeline instance name")
   end
            "project viewer allowed to edit pipeline instance name")
   end
+
+  test "name editable on completed pipeline" do
+    assert(attribute_editable_for?(:active, "has_component_with_completed_jobs",
+                                   "name"),
+           "name not editable on complete pipeline")
+  end
+
+  test "components editable on new pipeline" do
+    assert(attribute_editable_for?(:active, "new_pipeline", "components"),
+           "components not editable on new pipeline")
+  end
+
+  test "components not editable on completed pipeline" do
+    refute(attribute_editable_for?(:active, "has_component_with_completed_jobs",
+                                   "components"),
+           "components not editable on new pipeline")
+  end
+
+  test "job_logs for partially complete pipeline" do
+    log_uuid = api_fixture("collections", "real_log_collection", "uuid")
+    pi = find_pi_with(:active, "running_pipeline_with_complete_job")
+    assert_equal({previous: log_uuid, running: nil}, pi.job_log_ids)
+  end
+
+  test "job_logs for complete pipeline" do
+    log_uuid = api_fixture("collections", "real_log_collection", "uuid")
+    pi = find_pi_with(:active, "complete_pipeline_with_two_jobs")
+    assert_equal({ancient: log_uuid, previous: log_uuid}, pi.job_log_ids)
+  end
+
+  test "job_logs for malformed pipeline" do
+    pi = find_pi_with(:active, "components_is_jobspec")
+    assert_empty(pi.job_log_ids.select { |_, log| not log.nil? })
+  end
+
+  def check_stderr_logs(token_name, pi_name, log_name)
+    pi = find_pi_with(token_name, pi_name)
+    actual_logs = pi.stderr_log_lines
+    expected_text = api_fixture("logs", log_name, "properties", "text")
+    expected_text.each_line do |log_line|
+      assert_includes(actual_logs, log_line.chomp)
+    end
+  end
+
+  test "stderr_logs for running pipeline" do
+    check_stderr_logs(:active,
+                      "pipeline_in_publicly_accessible_project",
+                      "log_line_for_pipeline_in_publicly_accessible_project")
+  end
+
+  test "stderr_logs for job in complete pipeline" do
+    check_stderr_logs(:active,
+                      "failed_pipeline_with_two_jobs",
+                      "crunchstat_for_previous_job")
+  end
+
+  test "has_readable_logs? for unrun pipeline" do
+    pi = find_pi_with(:active, "new_pipeline")
+    refute(pi.has_readable_logs?)
+  end
+
+  test "has_readable_logs? for running pipeline" do
+    pi = find_pi_with(:active, "running_pipeline_with_complete_job")
+    assert(pi.has_readable_logs?)
+  end
+
+  test "has_readable_logs? for complete pipeline" do
+    pi = find_pi_with(:active, "pipeline_in_publicly_accessible_project_but_other_objects_elsewhere")
+    assert(pi.has_readable_logs?)
+  end
+
+  test "has_readable_logs? for complete pipeline when jobs unreadable" do
+    pi = find_pi_with(:anonymous, "pipeline_in_publicly_accessible_project_but_other_objects_elsewhere")
+    refute(pi.has_readable_logs?)
+  end
 end
 end