test/unit/cleaner_test.rb in foreman-tasks-0.9.5 vs test/unit/cleaner_test.rb in foreman-tasks-0.9.6

- old
+ new

@@ -1,8 +1,13 @@ require 'foreman_tasks_test_helper' class TasksTest < ActiveSupport::TestCase + before do + # To stop dynflow from backing up actions, execution_plans and steps + ForemanTasks.dynflow.world.persistence.adapter.stubs(:backup_to_csv) + end + describe ForemanTasks::Cleaner do it 'is able to delete tasks (including the dynflow plans) based on filter' do cleaner = ForemanTasks::Cleaner.new(:filter => 'label = "Actions::User::Create"', :after => '10d') tasks_to_delete = [FactoryGirl.create(:dynflow_task, :user_create_task), @@ -10,10 +15,11 @@ tasks_to_keep = [FactoryGirl.create(:dynflow_task, :user_create_task) do |task| task.started_at = task.ended_at = Time.zone.now task.save end, FactoryGirl.create(:dynflow_task, :product_create_task)] + cleaner.expects(:tasks_to_csv) cleaner.delete ForemanTasks::Task.where(id: tasks_to_delete).must_be_empty ForemanTasks::Task.where(id: tasks_to_keep).order(:id).map(&:id).must_equal tasks_to_keep.map(&:id).sort ForemanTasks.dynflow.world.persistence @@ -30,10 +36,11 @@ task.started_at = task.ended_at = Time.zone.now task.save end] tasks_to_keep = [FactoryGirl.create(:dynflow_task, :product_create_task)] + cleaner.expects(:tasks_to_csv) cleaner.delete ForemanTasks::Task.where(id: tasks_to_delete).must_be_empty ForemanTasks::Task.where(id: tasks_to_keep).must_equal tasks_to_keep end @@ -44,15 +51,36 @@ tasks_to_keep = [FactoryGirl.create(:dynflow_task, :user_create_task) do |task| task.started_at = task.ended_at = Time.zone.now task.save end] + cleaner.expects(:tasks_to_csv) cleaner.delete ForemanTasks::Task.where(id: tasks_to_delete).must_be_empty ForemanTasks::Task.where(id: tasks_to_keep).must_equal tasks_to_keep end + it 'backs tasks up before deleting' do + dir = '/tmp' + cleaner = ForemanTasks::Cleaner.new(:filter => '', :after => '10d', :backup_dir => dir) + tasks_to_delete = [FactoryGirl.create(:dynflow_task, :user_create_task), + FactoryGirl.create(:dynflow_task, :product_create_task)] + + r, w = IO.pipe + cleaner.expects(:with_backup_file) + .with(dir, 'foreman_tasks.csv') + .yields(w, false) + cleaner.delete + w.close + header, *data = r.readlines.map(&:chomp) + header.must_equal ForemanTasks::Task.attribute_names.join(',') + expected_lines = tasks_to_delete.map { |task| task.attributes.values.join(',') } + data.count.must_equal expected_lines.count + expected_lines.each { |line| data.must_include line } + ForemanTasks::Task.where(id: tasks_to_delete).must_be_empty + end + class ActionWithCleanup < Actions::Base def self.cleanup_after '15d' end end @@ -65,9 +93,32 @@ it 'searches for the actions that have the cleanup_after defined' do ForemanTasks::Cleaner.stubs(:cleanup_settings => { :actions => [{ :name => ActionWithCleanup.name, :after => '5d' }] }) ForemanTasks::Cleaner.actions_with_default_cleanup[ActionWithCleanup].must_equal '5d' + end + + it 'deprecates the usage of :after' do + Foreman::Deprecation.expects(:deprecation_warning) + ForemanTasks::Cleaner.any_instance.expects(:delete) + ForemanTasks::Cleaner.stubs(:cleanup_settings => + { :after => '1d' }) + ForemanTasks::Cleaner.stubs(:actions_with_default_cleanup).returns({}) + ForemanTasks::Cleaner.run({}) + end + + it 'generates filters from rules properly' do + actions_with_default = { 'action1' => nil, 'action2' => nil } + rules = [{ :after => nil }, + { :after => '10d', :filter => 'label = something', :states => %w[stopped paused] }, + { :after => '15d', :filter => 'label = something_else', + :override_actions => true, :states => 'all' }] + ForemanTasks::Cleaner.stubs(:cleanup_settings).returns(:rules => rules) + r1, r2 = ForemanTasks::Cleaner.actions_by_rules actions_with_default + r1[:filter].must_equal '(label !^ (action1, action2)) AND (label = something)' + r1[:states].must_equal %w[stopped paused] + r2[:filter].must_equal '(label = something_else)' + r2[:states].must_equal [] end end end end