summaryrefslogtreecommitdiff
path: root/spec/integration
diff options
context:
space:
mode:
Diffstat (limited to 'spec/integration')
-rw-r--r--spec/integration/audit/audit_spec.rb80
1 files changed, 80 insertions, 0 deletions
diff --git a/spec/integration/audit/audit_spec.rb b/spec/integration/audit/audit_spec.rb
new file mode 100644
index 0000000000..b562e608ab
--- /dev/null
+++ b/spec/integration/audit/audit_spec.rb
@@ -0,0 +1,80 @@
+require "spec_helper"
+
+require "support/shared/integration/integration_helper"
+require "chef/mixin/shell_out"
+require "chef-utils/dist"
+
+describe "chef-client with audit mode" do
+
+ include IntegrationSupport
+ include Chef::Mixin::ShellOut
+
+ let(:chef_dir) { File.join(__dir__, "..", "..", "..", "bin") }
+
+ # Invoke `chef-client` as `ruby PATH/TO/chef-client`. This ensures the
+ # following constraints are satisfied:
+ # * Windows: windows can only run batch scripts as bare executables. Rubygems
+ # creates batch wrappers for installed gems, but we don't have batch wrappers
+ # in the source tree.
+ # * Other `chef-client` in PATH: A common case is running the tests on a
+ # machine that has omnibus chef installed. In that case we need to ensure
+ # we're running `chef-client` from the source tree and not the external one.
+ # cf. CHEF-4914
+ let(:chef_client) { "bundle exec #{ChefUtils::Dist::Infra::CLIENT} --minimal-ohai" }
+
+ when_the_repository "has a custom profile" do
+ before do
+ directory "profiles/my-profile" do
+ file "inspec.yml", <<~FILE
+ ---
+ name: my-profile
+ title: a minimal profile
+ FILE
+
+ directory "controls" do
+ file "my_control.rb", <<~FILE
+ control "my control" do
+ title "Home directory exists"
+ impact 0.0
+ describe Dir.home do
+ it { should be_kind_of String }
+ end
+ end
+ FILE
+ end
+ end
+
+ file "attributes.json", <<~FILE
+ {
+ "audit": {
+ "reporter": ["json-file"],
+ "profiles": {
+ "my-profile": {
+ "path": "#{path_to("profiles/my-profile")}"
+ }
+ }
+ }
+ }
+ FILE
+ end
+
+ it "should complete with success" do
+ result = shell_out!("#{chef_client} --local-mode --json-attributes #{path_to("attributes.json")}", cwd: chef_dir)
+ result.error!
+
+ inspec_report = JSON.parse(File.read(Dir["#{Chef::Config[:cache_path]}/audit_reports/audit-*.json"].last))
+ expect(inspec_report["profiles"].length).to eq(1)
+
+ profile = inspec_report["profiles"].first
+ expect(profile["name"]).to eq("my-profile")
+ expect(profile["controls"].length).to eq(1)
+
+ control = profile["controls"].first
+ expect(control["id"]).to eq("my control")
+ expect(control["results"].length).to eq(1)
+
+ result = control["results"].first
+ expect(result["status"]).to eq("passed")
+ end
+ end
+end