summaryrefslogtreecommitdiff
path: root/lib/chef_zero/rspec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chef_zero/rspec.rb')
-rw-r--r--lib/chef_zero/rspec.rb195
1 files changed, 158 insertions, 37 deletions
diff --git a/lib/chef_zero/rspec.rb b/lib/chef_zero/rspec.rb
index e67fdc2..6a78a78 100644
--- a/lib/chef_zero/rspec.rb
+++ b/lib/chef_zero/rspec.rb
@@ -24,6 +24,11 @@ module ChefZero
end
def when_the_chef_server(description, *tags, &block)
+ if tags.last.is_a?(Hash)
+ opts = tags.last
+ else
+ opts = {}
+ end
context "When the Chef server #{description}", *tags do
before :each do
@@ -33,6 +38,7 @@ module ChefZero
else
default_opts
end
+ server_opts = server_opts.merge(opts)
if ChefZero::RSpec.server && server_opts != ChefZero::RSpec.server.options
ChefZero::RSpec.server.stop
@@ -77,79 +83,194 @@ module ChefZero
end
end
- def self.organization(name, org = '{}')
- before(:each) do
- ChefZero::RSpec.server.data_store.set([ 'organizations', name, 'org' ], dejsonize(org), :create_dir, :create)
- @current_org = name
+ def self.organization(name, org = '{}', &block)
+ before(:each) { organization(name, org, &block) }
+ end
+
+ def organization(name, org = '{}', &block)
+ ChefZero::RSpec.server.data_store.set([ 'organizations', name, 'org' ], dejsonize(org), :create_dir, :create)
+ prev_org_name = @current_org
+ @current_org = name
+ prev_object_path = @current_object_path
+ @current_object_path = "organizations/#{name}"
+ if block_given?
+ begin
+ instance_eval(&block)
+ ensure
+ @current_org = prev_org_name
+ @current_object_path = prev_object_path
+ end
end
end
- def self.acl(path, acl)
- before(:each) do
- path = [ 'organizations', @current_org || 'chef' ] + path.split('/')
- ChefZero::RSpec.server.data_store.set(ChefData::AclPath.get_acl_data_path(path), acl)
+ def self.acl_for(path, data)
+ before(:each) { acl_for(path, data) }
+ end
+
+ def acl_for(path, data)
+ ChefZero::RSpec.server.load_data({ 'acls' => { path => data } }, current_org)
+ end
+
+ def acl(data)
+ acl_for(@current_object_path, data)
+ end
+
+ def self.client(name, data, &block)
+ before(:each) { client(name, data, &block) }
+ end
+
+ def client(name, data, &block)
+ with_object_path("clients/#{name}") do
+ ChefZero::RSpec.server.load_data({ 'clients' => { name => data } }, current_org)
+ instance_eval(&block) if block_given?
end
end
- def self.group(name, group)
- before(:each) do
- path = [ 'organizations', @current_org || 'chef' ] + path.split('/')
- ChefZero::RSpec.server.data_store.set([ 'organizations', @current_org || 'chef', 'groups', name ], dejsonize(group), :create)
+ def self.container(name, data, &block)
+ before(:each) { container(name, data, &block) }
+ end
+
+ def container(name, data, &block)
+ with_object_path("containers/#{name}") do
+ ChefZero::RSpec.server.load_data({ 'containers' => { name => data } }, current_org)
+ instance_eval(&block) if block_given?
end
end
- def self.org_invite(username)
- before(:each) do
- ChefZero::RSpec.server.data_store.set([ 'organizations', @current_org || 'chef', 'users', username ], '{}', :create)
+ def self.cookbook(name, version, data, options = {}, &block)
+ before(:each) { cookbook(name, version, data, &block) }
+ end
+
+ def cookbook(name, version, data, options = {}, &block)
+ with_object_path("cookbooks/#{name}") do
+ ChefZero::RSpec.server.load_data({ 'cookbooks' => { "#{name}-#{version}" => data.merge(options) }}, current_org)
+ instance_eval(&block) if block_given?
end
end
- def self.org_members(name, *members)
- before(:each) do
- members.each do |member|
- ChefZero::RSpec.server.set([ 'organizations', @current_org || 'chef', 'users', member], '{}')
- end
+ def self.data_bag(name, data, &block)
+ before(:each) { data_bag(name, data, &block) }
+ end
+
+ def data_bag(name, data, &block)
+ with_object_path("data/#{name}") do
+ ChefZero::RSpec.server.load_data({ 'data' => { name => data }}, current_org)
+ instance_eval(&block) if block_given?
end
end
- def self.client(name, client)
- before(:each) { ChefZero::RSpec.server.load_data({ 'clients' => { name => client }}, @current_org) }
+ def self.environment(name, data, &block)
+ before(:each) { environment(name, data, &block) }
end
- def self.cookbook(name, version, cookbook, options = {})
- before(:each) { ChefZero::RSpec.server.load_data({ 'cookbooks' => { "#{name}-#{version}" => cookbook.merge(options) }}, @current_org) }
+ def environment(name, data, &block)
+ with_object_path("environments/#{name}") do
+ ChefZero::RSpec.server.load_data({ 'environments' => { name => data } }, current_org)
+ instance_eval(&block) if block_given?
+ end
+ end
+
+ def self.group(name, data, &block)
+ before(:each) { group(name, data, &block) }
end
- def self.data_bag(name, data_bag)
- before(:each) { ChefZero::RSpec.server.load_data({ 'data' => { name => data_bag }}, @current_org) }
+ def group(name, data, &block)
+ with_object_path("groups/#{name}") do
+ ChefZero::RSpec.server.load_data({ 'groups' => { name => data } }, current_org)
+ instance_eval(&block) if block_given?
+ end
end
- def self.environment(name, environment)
- before(:each) { ChefZero::RSpec.server.load_data({ 'environments' => { name => environment }}, @current_org) }
+ def self.node(name, data, &block)
+ before(:each) { node(name, data, &block) }
end
- def self.node(name, node)
- before(:each) { ChefZero::RSpec.server.load_data({ 'nodes' => { name => node }}, @current_org) }
+ def node(name, data, &block)
+ with_object_path("nodes/#{name}") do
+ ChefZero::RSpec.server.load_data({ 'nodes' => { name => data } }, current_org)
+ instance_eval(&block) if block_given?
+ end
end
- def self.role(name, role)
- before(:each) { ChefZero::RSpec.server.load_data({ 'roles' => { name => role }}, @current_org) }
+ def self.org_invite(*usernames)
+ before(:each) { org_invite(*usernames) }
end
- def self.user(name, user)
+ def org_invite(*usernames)
+ ChefZero::RSpec.server.load_data({ 'invites' => usernames }, current_org)
+ end
+
+ def self.org_member(*usernames)
+ before(:each) { org_member(*usernames) }
+ end
+
+ def org_member(*usernames)
+ ChefZero::RSpec.server.load_data({ 'members' => usernames }, current_org)
+ end
+
+ def self.role(name, data, &block)
+ before(:each) { role(name, data, &block) }
+ end
+
+ def role(name, data, &block)
+ with_object_path("roles/#{name}") do
+ ChefZero::RSpec.server.load_data({ 'roles' => { name => data } }, current_org)
+ instance_eval(&block) if block_given?
+ end
+ end
+
+ def self.sandbox(name, data, &block)
+ before(:each) { sandbox(name, data, &block) }
+ end
+
+ def sandbox(name, data, &block)
+ with_object_path("sandboxes/#{name}") do
+ ChefZero::RSpec.server.load_data({ 'sandboxes' => { name => data } }, current_org)
+ instance_eval(&block) if block_given?
+ end
+ end
+
+ def self.user(name, data, &block)
+ before(:each) { user(name, data, &block) }
+ end
+
+ def user(name, data, &block)
if ChefZero::RSpec.server.options[:osc_compat]
- before(:each) { ChefZero::RSpec.server.load_data({ 'users' => { name => user }}, @current_org) }
+ with_object_path("users/#{name}") do
+ ChefZero::RSpec.server.load_data({ 'users' => { name => data }}, current_org)
+ instance_eval(&block) if block_given?
+ end
else
- before(:each) { ChefZero::RSpec.server.set([ 'users', name ], dejsonize(user)) }
+ old_object_path = @current_object_path
+ @current_object_path = "users/#{name}"
+ begin
+ ChefZero::RSpec.server.load_data({ 'users' => { name => data }}, current_org)
+ instance_eval(&block) if block_given?
+ ensure
+ @current_object_path = old_object_path
+ end
end
end
- def self.dejsonize(data)
+ def dejsonize(data)
if data.is_a?(String)
data
else
- JSON.pretty_generate(value)
+ JSON.pretty_generate(data)
+ end
+ end
+
+ def current_org
+ @current_org || 'chef'
+ end
+
+ def with_object_path(object_path)
+ old_object_path = @current_object_path
+ @current_object_path = object_path
+ begin
+ yield if block_given?
end
+ @current_object_path = old_object_path
end
# after :each do