summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjkeiser <jkeiser@opscode.com>2012-12-23 21:50:34 -0800
committerjkeiser <jkeiser@opscode.com>2012-12-23 21:50:34 -0800
commitee7f26b036e0fdfd545f1eeb73fdb0b197e6bf81 (patch)
tree8ca58c44041cb5083317c2506454bcd41ca5d2fd
parent83a1e64fe21d09004b62e3661758aff086094fa5 (diff)
downloadchef-zero-ee7f26b036e0fdfd545f1eeb73fdb0b197e6bf81.tar.gz
Add RSpec DSL for working with a ChefZero server
-rw-r--r--lib/chef_zero/rspec.rb69
1 files changed, 69 insertions, 0 deletions
diff --git a/lib/chef_zero/rspec.rb b/lib/chef_zero/rspec.rb
new file mode 100644
index 0000000..11b2e73
--- /dev/null
+++ b/lib/chef_zero/rspec.rb
@@ -0,0 +1,69 @@
+require 'thin'
+require 'tempfile'
+require 'chef_zero/server'
+require 'chef/config'
+
+module ChefZero
+ module RSpec
+ def when_the_chef_server(description, &block)
+ context "When the Chef server #{description}" do
+ before :each do
+ raise "Attempt to create multiple servers in one test" if @server
+ # Set up configuration so that clients will point to the server
+ Thin::Logging.silent = true
+ @chef_zero_server = ChefZero::Server.new(:port => 8889)
+ Chef::Config.chef_server_url = @chef_zero_server.url
+ Chef::Config.node_name = 'admin'
+ @chef_zero_client_key = Tempfile.new(['chef_zero_client_key', '.pem'])
+ @chef_zero_client_key.write(ChefZero::PRIVATE_KEY)
+ @chef_zero_client_key.close
+ Chef::Config.client_key = @chef_zero_client_key
+
+ # Start the server
+ @chef_zero_server.start_background
+ end
+
+ def self.client(name, client)
+ before(:each) { @chef_zero_server.load_data({ 'clients' => { name => client }}) }
+ end
+
+ def self.cookbook(name, version, cookbook)
+ before(:each) { @chef_zero_server.load_data({ 'cookbooks' => { "#{name}-#{version}" => cookbook }}) }
+ end
+
+ def self.data_bag(name, data_bag)
+ before(:each) { @chef_zero_server.load_data({ 'data' => { name => data_bag }}) }
+ end
+
+ def self.environment(name, environment)
+ before(:each) { @chef_zero_server.load_data({ 'environments' => { name => environment }}) }
+ end
+
+ def self.node(name, node)
+ before(:each) { @chef_zero_server.load_data({ 'nodes' => { name => node }}) }
+ end
+
+ def self.role(name, role)
+ before(:each) { @chef_zero_server.load_data({ 'roles' => { name => role }}) }
+ end
+
+ def self.user(name, user)
+ before(:each) { @chef_zero_server.load_data({ 'users' => { name => user }}) }
+ end
+
+ after :each do
+ if @chef_zero_server
+ @chef_zero_server.stop
+ @chef_zero_server = nil
+ end
+ if @chef_zero_client_key
+ @chef_zero_client_key.unlink
+ @chef_zero_client_key = nil
+ end
+ end
+
+ instance_eval(&block)
+ end
+ end
+ end
+end