aboutsummaryrefslogtreecommitdiff
path: root/spec/integration
diff options
context:
space:
mode:
authorJosh Cooper <josh@puppet.com>2018-08-27 14:37:09 -0700
committerGitHub <noreply@github.com>2018-08-27 14:37:09 -0700
commit74f80e8d72f8b646ea206c8481f15e08aa469198 (patch)
treeacf0e4d48682859f94a3925f0e76dc5199b62e19 /spec/integration
parent2142feac49c20972e39ed0e11a017fbbf15cc51f (diff)
parentf5d3f1058d52fc851ea42b09a2661554df48e694 (diff)
downloadpuppet-cron_core-74f80e8d72f8b646ea206c8481f15e08aa469198.tar.gz
puppet-cron_core-74f80e8d72f8b646ea206c8481f15e08aa469198.tar.bz2
Merge pull request #1 from jtappa/extract
Import the module
Diffstat (limited to 'spec/integration')
-rw-r--r--spec/integration/provider/cron/crontab_spec.rb237
1 files changed, 237 insertions, 0 deletions
diff --git a/spec/integration/provider/cron/crontab_spec.rb b/spec/integration/provider/cron/crontab_spec.rb
new file mode 100644
index 0000000..989eae6
--- /dev/null
+++ b/spec/integration/provider/cron/crontab_spec.rb
@@ -0,0 +1,237 @@
+require 'spec_helper'
+require 'puppet/file_bucket/dipper'
+require 'puppet_spec/compiler'
+
+describe Puppet::Type.type(:cron).provider(:crontab), unless: Puppet.features.microsoft_windows? do
+ include PuppetSpec::Files
+ include PuppetSpec::Compiler
+
+ before :each do
+ Puppet::Type.type(:cron).stubs(:defaultprovider).returns described_class
+ described_class.stubs(:suitable?).returns true
+ Puppet::FileBucket::Dipper.any_instance.stubs(:backup) # rubocop:disable RSpec/AnyInstance
+
+ # I don't want to execute anything
+ described_class.stubs(:filetype).returns Puppet::Util::FileType::FileTypeFlat
+ described_class.stubs(:default_target).returns crontab_user1
+
+ # I don't want to stub Time.now to get a static header because I don't know
+ # where Time.now is used elsewhere, so just go with a very simple header
+ described_class.stubs(:header).returns "# HEADER: some simple\n# HEADER: header\n"
+ FileUtils.cp(my_fixture('crontab_user1'), crontab_user1)
+ FileUtils.cp(my_fixture('crontab_user2'), crontab_user2)
+ end
+
+ after :each do
+ described_class.clear
+ end
+
+ let :crontab_user1 do
+ tmpfile('cron_integration_specs')
+ end
+
+ let :crontab_user2 do
+ tmpfile('cron_integration_specs')
+ end
+
+ def expect_output(fixture_name)
+ expect(File.read(crontab_user1)).to eq(File.read(my_fixture(fixture_name)))
+ end
+
+ describe 'when managing a cron entry' do
+ it 'is able to purge unmanaged entries' do
+ apply_with_error_check(<<-MANIFEST)
+ cron {
+ 'only managed entry':
+ ensure => 'present',
+ command => '/bin/true',
+ target => '#{crontab_user1}',
+ }
+ resources { 'cron': purge => 'true' }
+ MANIFEST
+ expect_output('purged')
+ end
+
+ describe 'with ensure absent' do
+ it 'does nothing if entry already absent' do
+ apply_with_error_check(<<-MANIFEST)
+ cron {
+ 'no_such_entry':
+ ensure => 'absent',
+ target => '#{crontab_user1}',
+ }
+ MANIFEST
+ expect_output('crontab_user1')
+ end
+
+ it 'removes the resource from crontab if present' do
+ apply_with_error_check(<<-MANIFEST)
+ cron {
+ 'My daily failure':
+ ensure => 'absent',
+ target => '#{crontab_user1}',
+ }
+ MANIFEST
+ expect_output('remove_named_resource')
+ end
+
+ it 'removes a matching cronentry if present' do
+ apply_with_error_check(<<-MANIFEST)
+ cron {
+ 'no_such_named_resource_in_crontab':
+ ensure => absent,
+ minute => [ '17-19', '22' ],
+ hour => [ '0-23/2' ],
+ weekday => 'Tue',
+ command => '/bin/unnamed_regular_command',
+ target => '#{crontab_user1}',
+ }
+ MANIFEST
+ expect_output('remove_unnamed_resource')
+ end
+ end
+
+ describe 'with ensure present' do
+ context 'and no command specified' do
+ it 'works if the resource is already present' do
+ apply_with_error_check(<<-MANIFEST)
+ cron {
+ 'My daily failure':
+ special => 'daily',
+ target => '#{crontab_user1}',
+ }
+ MANIFEST
+ expect_output('crontab_user1')
+ end
+ it 'fails if the resource needs creating' do
+ manifest = <<-MANIFEST
+ cron {
+ 'Entirely new resource':
+ special => 'daily',
+ target => '#{crontab_user1}',
+ }
+ MANIFEST
+ apply_compiled_manifest(manifest) do |res|
+ if res.ref == 'Cron[Entirely new resource]'
+ res.expects(:err).with(regexp_matches(%r{no command}))
+ else
+ res.expects(:err).never
+ end
+ end
+ end
+ end
+
+ it 'does nothing if entry already present' do
+ apply_with_error_check(<<-MANIFEST)
+ cron {
+ 'My daily failure':
+ special => 'daily',
+ command => '/bin/false',
+ target => '#{crontab_user1}',
+ }
+ MANIFEST
+ expect_output('crontab_user1')
+ end
+
+ it "works correctly when managing 'target' but not 'user'" do
+ apply_with_error_check(<<-MANIFEST)
+ cron {
+ 'My weekly failure':
+ special => 'weekly',
+ command => '/bin/false',
+ target => '#{crontab_user1}',
+ }
+ MANIFEST
+ expect_output('crontab_user3')
+ end
+
+ it 'does nothing if a matching entry already present' do
+ apply_with_error_check(<<-MANIFEST)
+ cron {
+ 'no_such_named_resource_in_crontab':
+ ensure => present,
+ minute => [ '17-19', '22' ],
+ hour => [ '0-23/2' ],
+ command => '/bin/unnamed_regular_command',
+ target => '#{crontab_user1}',
+ }
+ MANIFEST
+ expect_output('crontab_user1')
+ end
+
+ it 'adds a new normal entry if currently absent' do
+ apply_with_error_check(<<-MANIFEST)
+ cron {
+ 'new entry':
+ ensure => present,
+ minute => '12',
+ weekday => 'Tue',
+ command => '/bin/new',
+ environment => [
+ 'MAILTO=""',
+ 'SHELL=/bin/bash'
+ ],
+ target => '#{crontab_user1}',
+ }
+ MANIFEST
+ expect_output('create_normal_entry')
+ end
+
+ it 'adds a new special entry if currently absent' do
+ apply_with_error_check(<<-MANIFEST)
+ cron {
+ 'new special entry':
+ ensure => present,
+ special => 'reboot',
+ command => 'echo "Booted" 1>&2',
+ environment => 'MAILTO=bob@company.com',
+ target => '#{crontab_user1}',
+ }
+ MANIFEST
+ expect_output('create_special_entry')
+ end
+
+ it 'changes existing entry if out of sync' do
+ apply_with_error_check(<<-MANIFEST)
+ cron {
+ 'Monthly job':
+ ensure => present,
+ special => 'monthly',
+ #minute => ['22'],
+ command => '/usr/bin/monthly',
+ environment => [],
+ target => '#{crontab_user1}',
+ }
+ MANIFEST
+ expect_output('modify_entry')
+ end
+ it 'changes a special schedule to numeric if requested' do
+ apply_with_error_check(<<-MANIFEST)
+ cron {
+ 'My daily failure':
+ special => 'absent',
+ command => '/bin/false',
+ target => '#{crontab_user1}',
+ }
+ MANIFEST
+ expect_output('unspecialized')
+ end
+ it 'does not try to move an entry from one file to another' do
+ # force the parsedfile provider to also parse user1's crontab
+ apply_with_error_check(<<-MANIFEST)
+ cron {
+ 'foo':
+ ensure => absent,
+ target => '#{crontab_user1}';
+ 'My daily failure':
+ special => 'daily',
+ command => "/bin/false",
+ target => '#{crontab_user2}',
+ }
+ MANIFEST
+ expect(File.read(crontab_user1)).to eq(File.read(my_fixture('moved_cronjob_input1')))
+ expect(File.read(crontab_user2)).to eq(File.read(my_fixture('moved_cronjob_input2')))
+ end
+ end
+ end
+end