These are some common examples you can use in your tests. Take note of the differences between beaker-rspec style testing and Litmus.

Testing Puppet code

The following example tests that your Puppet code works. Take note of the repeatable pattern.

require 'spec_helper_acceptance'

describe 'a feature', if: ['debian', 'redhat', 'ubuntu'].include?(os[:family]) do
  let(:pp) do
    <<-MANIFEST
      include feature::some_class
    MANIFEST
  end

  it 'applies idempotently' do
    idempotent_apply(pp)
  end

  describe file("/etc/feature.conf") do
    it { is_expected.to be_file }
    its(:content) { is_expected.to match %r{key = default value} }
  end

  describe port(777) do
    it { is_expected.to be_listening }
  end
end

Testing manifest code for idempotency

The idempotent_apply helper function runs the given manifest twice and will test that the first run doesn’t have errors and the second run doesn’t have changes. For many regular modules that already will give good confidence that it is working:

pp = 'class { "mysql::server": }'
idempotent_apply(pp)

Running shell commands

To run a shell command and test it’s output:

expect(run_shell('/usr/local/sbin/mysqlbackup.sh').stderr).to eq('')

Serverspec Idioms

An example of a serverspec declaration:

describe command('/usr/local/sbin/mysqlbackup.sh') do
  its(:stderr) { should eq '' }
end

Checking facts

With Litmus, you can use the serverspec functions — these are cached so are quick to call. For example:

os[:family]

or

host_inventory['facter']['os']['release']

For more information, see the serverspec docs.

Debugging tests

There is a known issue when running certain commands from within a pry session. To debug tests, use the following pry-byebug gem:

gem  'pry-byebug', '> 3.4.3'

Setting up Travis and Appveyor

To see this running on CI, enable the use_litmus flags for Travis CI and/or Appveyor. See the pdk-templates docs for details and additional options.