bio-miga/miga

View on GitHub
test/hook_test.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
require 'test_helper'
require 'miga/project'

class HookTest < Test::Unit::TestCase
  include TestHelper

  def setup
    initialize_miga_home
  end

  def test_add_hook
    assert_nil(dataset.hooks[:on_remove])
    assert_equal(1, dataset.hooks[:on_save].size)
    dataset.add_hook(:on_save, :run_lambda, Proc.new { $counter += 1 })
    assert_equal(2, dataset.hooks[:on_save].size)
    $counter = 1
    dataset.save
    assert_equal(2, $counter)
  end

  def test_missing_action
    dataset.add_hook(:on_save, :this_is_not_an_action)
    assert_raise { dataset.save }
  end

  ##
  # Dummy class with hooks
  class MyHanger
    include MiGA::Common::Hooks
  end

  def test_empty_hooks
    a = MyHanger.new
    assert_equal({}, a.hooks)
  end

  def test_dataset_result_hooks
    $res = :test
    $counter = 1
    dataset.add_hook(:on_result_ready, :run_lambda, Proc.new { |r| $res = r })
    dataset.add_hook(
      :on_result_ready_trimmed_reads, :run_lambda, Proc.new { $counter += 1 }
    )
    FileUtils.touch(
      File.join(
        project.path, 'data', '02.trimmed_reads',
        "#{dataset.name}.1.clipped.fastq"
      )
    )
    FileUtils.touch(
      File.join(
        project.path, 'data', '02.trimmed_reads', "#{dataset.name}.done"
      )
    )
    assert_equal(:test, $res)
    dataset.add_result(:trimmed_reads)
    assert_equal(:trimmed_reads, $res)
    assert_equal(2, $counter)
  end

  def test_dataset_clear_run_counts
    dataset.metadata[:_try_something] = 1
    dataset.metadata[:_step] = 'Boop'
    dataset.metadata[:_not_a_counter] = 1
    dataset.save
    assert_equal(1, dataset.metadata[:_try_something])
    assert_equal('Boop', dataset.metadata[:_step])
    dataset.add_hook(:on_remove, :clear_run_counts)
    dataset.remove!
    assert_nil(dataset.metadata[:_try_something])
    assert_nil(dataset.metadata[:_step])
    assert_equal(1, dataset.metadata[:_not_a_counter])
  end

  def test_dataset_run_cmd
    f = tmpfile('hook_ds_cmd')
    dataset.metadata[:on_remove] = [[:run_cmd, "echo {{dataset}} > '#{f}'"]]
    assert_path_not_exist(f)
    dataset.remove!
    assert_path_exist(f)
    assert_equal(dataset.name, File.read(f).chomp)
  end

  def test_project_run_cmd
    f = tmpfile('hook_pr_cmd')
    project.add_hook(:on_save, :run_cmd, "echo {{project}} > '#{f}'")
    assert_path_not_exist(f)
    project.save
    assert_path_exist(f)
    assert_equal(project.path, File.read(f).chomp)
  end

  def test_project_result_hooks
    $res = :test
    $counter = 1
    project.add_hook(
      :on_result_ready,
      :run_lambda,
      Proc.new { |r| $res = r }
    )
    project.add_hook(
      :on_result_ready_project_stats,
      :run_lambda,
      Proc.new { $counter += 1 }
    )
    %w[taxonomy.json metadata.db done].each do |ext|
      FileUtils.touch(
        File.join(project.path, 'data', '90.stats', "miga-project.#{ext}")
      )
    end
    assert_equal(:project_stats, project.next_task)
    assert_equal(:test, $res)
    assert_equal(1, $counter)
    assert_equal(:haai_distances, project.next_task(nil, true))
    assert_equal(:project_stats, $res)
    assert_equal(2, $counter)
  end
end