chef 12.0.0.alpha.0 → 12.0.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (207) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +3 -5
  3. data/lib/chef/api_client.rb +1 -1
  4. data/lib/chef/application.rb +16 -8
  5. data/lib/chef/chef_fs/chef_fs_data_store.rb +1 -1
  6. data/lib/chef/chef_fs/command_line.rb +1 -1
  7. data/lib/chef/chef_fs/file_system.rb +1 -1
  8. data/lib/chef/chef_fs/file_system/acl_entry.rb +1 -1
  9. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +3 -3
  10. data/lib/chef/chef_fs/file_system/cookbook_file.rb +2 -2
  11. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +2 -2
  12. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +4 -4
  13. data/lib/chef/config.rb +6 -5
  14. data/lib/chef/config_fetcher.rb +1 -1
  15. data/lib/chef/cookbook/cookbook_version_loader.rb +126 -43
  16. data/lib/chef/cookbook/metadata.rb +102 -53
  17. data/lib/chef/cookbook/syntax_check.rb +1 -1
  18. data/lib/chef/cookbook_loader.rb +62 -14
  19. data/lib/chef/cookbook_site_streaming_uploader.rb +12 -1
  20. data/lib/chef/cookbook_version.rb +13 -4
  21. data/lib/chef/data_bag.rb +28 -15
  22. data/lib/chef/data_bag_item.rb +5 -7
  23. data/lib/chef/digester.rb +5 -9
  24. data/lib/chef/dsl/recipe.rb +14 -0
  25. data/lib/chef/encrypted_data_bag_item.rb +1 -0
  26. data/lib/chef/encrypted_data_bag_item/assertions.rb +57 -0
  27. data/lib/chef/encrypted_data_bag_item/decryptor.rb +52 -28
  28. data/lib/chef/encrypted_data_bag_item/encrypted_data_bag_item_assertions.rb +37 -0
  29. data/lib/chef/encrypted_data_bag_item/encryption_failure.rb +22 -0
  30. data/lib/chef/encrypted_data_bag_item/encryptor.rb +79 -8
  31. data/lib/chef/environment.rb +1 -3
  32. data/lib/chef/exceptions.rb +18 -3
  33. data/lib/chef/formatters/base.rb +7 -0
  34. data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +1 -1
  35. data/lib/chef/handler/json_file.rb +0 -1
  36. data/lib/chef/http/json_output.rb +1 -1
  37. data/lib/chef/json_compat.rb +24 -6
  38. data/lib/chef/knife/bootstrap.rb +2 -2
  39. data/lib/chef/knife/client_delete.rb +1 -1
  40. data/lib/chef/knife/cookbook_site_download.rb +1 -1
  41. data/lib/chef/knife/cookbook_site_list.rb +1 -1
  42. data/lib/chef/knife/cookbook_site_search.rb +1 -1
  43. data/lib/chef/knife/cookbook_site_share.rb +2 -2
  44. data/lib/chef/knife/cookbook_site_show.rb +3 -3
  45. data/lib/chef/knife/cookbook_site_unshare.rb +1 -1
  46. data/lib/chef/knife/core/node_editor.rb +2 -3
  47. data/lib/chef/knife/core/ui.rb +2 -2
  48. data/lib/chef/knife/deps.rb +2 -3
  49. data/lib/chef/mixin/shell_out.rb +1 -1
  50. data/lib/chef/mixin/windows_architecture_helper.rb +1 -0
  51. data/lib/chef/node.rb +1 -2
  52. data/lib/chef/platform/provider_mapping.rb +33 -6
  53. data/lib/chef/provider.rb +0 -2
  54. data/lib/chef/provider/cookbook_file/content.rb +1 -1
  55. data/lib/chef/provider/cron.rb +11 -0
  56. data/lib/chef/provider/deploy.rb +3 -2
  57. data/lib/chef/provider/deploy/revision.rb +2 -2
  58. data/lib/chef/provider/env.rb +1 -1
  59. data/lib/chef/provider/env/windows.rb +5 -9
  60. data/lib/chef/provider/file.rb +84 -33
  61. data/lib/chef/provider/git.rb +2 -1
  62. data/lib/chef/provider/group/aix.rb +17 -2
  63. data/lib/chef/provider/group/dscl.rb +27 -9
  64. data/lib/chef/provider/group/pw.rb +8 -1
  65. data/lib/chef/provider/http_request.rb +4 -4
  66. data/lib/chef/provider/log.rb +4 -14
  67. data/lib/chef/provider/mount/mount.rb +2 -2
  68. data/lib/chef/provider/package/ips.rb +17 -23
  69. data/lib/chef/provider/package/paludis.rb +2 -2
  70. data/lib/chef/provider/package/rpm.rb +2 -2
  71. data/lib/chef/provider/package/rubygems.rb +2 -0
  72. data/lib/chef/provider/package/yum.rb +2 -0
  73. data/lib/chef/provider/package/zypper.rb +1 -1
  74. data/lib/chef/provider/remote_file/cache_control_data.rb +2 -2
  75. data/lib/chef/provider/service/windows.rb +87 -21
  76. data/lib/chef/provider/user/aix.rb +95 -0
  77. data/lib/chef/provider/user/dscl.rb +544 -156
  78. data/lib/chef/provider/user/useradd.rb +1 -0
  79. data/lib/chef/providers.rb +1 -0
  80. data/lib/chef/resource.rb +4 -3
  81. data/lib/chef/resource/freebsd_package.rb +10 -2
  82. data/lib/chef/resource/paludis_package.rb +1 -0
  83. data/lib/chef/resource/scm.rb +10 -0
  84. data/lib/chef/resource/user.rb +27 -0
  85. data/lib/chef/resource/windows_service.rb +53 -0
  86. data/lib/chef/resource_collection.rb +23 -12
  87. data/lib/chef/resource_reporter.rb +10 -10
  88. data/lib/chef/resources.rb +1 -0
  89. data/lib/chef/role.rb +3 -3
  90. data/lib/chef/run_list.rb +6 -3
  91. data/lib/chef/user.rb +1 -1
  92. data/lib/chef/util/diff.rb +1 -2
  93. data/lib/chef/version.rb +1 -1
  94. data/lib/chef/version_constraint.rb +4 -4
  95. data/spec/data/cookbooks/angrybash/metadata.rb +2 -0
  96. data/spec/data/cookbooks/apache2/metadata.rb +2 -0
  97. data/spec/data/cookbooks/borken/metadata.rb +2 -0
  98. data/spec/data/cookbooks/ignorken/metadata.rb +2 -0
  99. data/spec/data/cookbooks/java/metadata.rb +2 -0
  100. data/spec/data/cookbooks/name-mismatch-versionnumber/README.md +4 -0
  101. data/spec/data/cookbooks/name-mismatch-versionnumber/metadata.rb +8 -0
  102. data/spec/data/cookbooks/name-mismatch-versionnumber/recipes/default.rb +8 -0
  103. data/spec/data/cookbooks/openldap/files/default/remotedir/not_a_template.erb +2 -0
  104. data/spec/data/cookbooks/preseed/metadata.rb +2 -0
  105. data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/README.md +4 -0
  106. data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/metadata.rb +13 -0
  107. data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/recipes/default.rb +8 -0
  108. data/spec/data/invalid-metadata-chef-repo/invalid-metadata/README.md +4 -0
  109. data/spec/data/invalid-metadata-chef-repo/invalid-metadata/metadata.rb +10 -0
  110. data/spec/data/invalid-metadata-chef-repo/invalid-metadata/recipes/default.rb +8 -0
  111. data/spec/data/mac_users/10.7-8.plist.xml +559 -0
  112. data/spec/data/mac_users/10.7-8.shadow.xml +11 -0
  113. data/spec/data/mac_users/10.7.plist.xml +559 -0
  114. data/spec/data/mac_users/10.7.shadow.xml +11 -0
  115. data/spec/data/mac_users/10.8.plist.xml +559 -0
  116. data/spec/data/mac_users/10.8.shadow.xml +21 -0
  117. data/spec/data/mac_users/10.9.plist.xml +560 -0
  118. data/spec/data/mac_users/10.9.shadow.xml +21 -0
  119. data/spec/data/object_loader/environments/test.json +2 -0
  120. data/spec/data/object_loader/environments/test_json_class.json +2 -0
  121. data/spec/data/object_loader/nodes/test.json +2 -0
  122. data/spec/data/object_loader/nodes/test_json_class.json +2 -0
  123. data/spec/data/object_loader/roles/test.json +2 -0
  124. data/spec/data/object_loader/roles/test_json_class.json +2 -0
  125. data/spec/functional/resource/bff_spec.rb +1 -1
  126. data/spec/functional/resource/cron_spec.rb +20 -1
  127. data/spec/functional/resource/env_spec.rb +137 -0
  128. data/spec/functional/resource/group_spec.rb +7 -5
  129. data/spec/functional/resource/remote_file_spec.rb +12 -1
  130. data/spec/functional/resource/user/dscl_spec.rb +198 -0
  131. data/spec/functional/resource/{user_spec.rb → user/useradd_spec.rb} +175 -37
  132. data/spec/integration/client/client_spec.rb +6 -4
  133. data/spec/integration/client/ipv6_spec.rb +16 -14
  134. data/spec/integration/knife/chef_fs_data_store_spec.rb +57 -46
  135. data/spec/integration/knife/chef_repo_path_spec.rb +105 -78
  136. data/spec/integration/knife/chef_repository_file_system_spec.rb +100 -84
  137. data/spec/integration/knife/chefignore_spec.rb +76 -46
  138. data/spec/integration/knife/common_options_spec.rb +16 -21
  139. data/spec/integration/knife/cookbook_api_ipv6_spec.rb +3 -3
  140. data/spec/integration/knife/delete_spec.rb +66 -46
  141. data/spec/integration/knife/deps_spec.rb +145 -94
  142. data/spec/integration/knife/diff_spec.rb +176 -110
  143. data/spec/integration/knife/download_spec.rb +229 -133
  144. data/spec/integration/knife/list_spec.rb +62 -54
  145. data/spec/integration/knife/raw_spec.rb +24 -9
  146. data/spec/integration/knife/redirection_spec.rb +2 -2
  147. data/spec/integration/knife/serve_spec.rb +2 -2
  148. data/spec/integration/knife/show_spec.rb +32 -26
  149. data/spec/integration/knife/upload_spec.rb +308 -165
  150. data/spec/integration/recipes/lwrp_inline_resources_spec.rb +10 -8
  151. data/spec/integration/solo/solo_spec.rb +22 -11
  152. data/spec/spec_helper.rb +3 -0
  153. data/spec/support/lib/chef/resource/zen_follower.rb +46 -0
  154. data/spec/support/platform_helpers.rb +12 -0
  155. data/spec/support/shared/functional/file_resource.rb +10 -0
  156. data/spec/support/shared/integration/chef_zero_support.rb +130 -0
  157. data/spec/support/shared/integration/integration_helper.rb +100 -98
  158. data/spec/support/shared/integration/knife_support.rb +0 -1
  159. data/spec/support/shared/unit/provider/file.rb +6 -4
  160. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +10 -1
  161. data/spec/unit/api_client/registration_spec.rb +83 -74
  162. data/spec/unit/application_spec.rb +32 -9
  163. data/spec/unit/cookbook/cookbook_version_loader_spec.rb +179 -0
  164. data/spec/unit/cookbook/metadata_spec.rb +190 -150
  165. data/spec/unit/cookbook/syntax_check_spec.rb +3 -2
  166. data/spec/unit/cookbook_loader_spec.rb +114 -53
  167. data/spec/unit/{cookbook_site_streaming_uploader.rb → cookbook_site_streaming_uploader_spec.rb} +21 -1
  168. data/spec/unit/data_bag_spec.rb +88 -13
  169. data/spec/unit/deprecation_spec.rb +1 -2
  170. data/spec/unit/encrypted_data_bag_item_spec.rb +145 -9
  171. data/spec/unit/environment_spec.rb +1 -1
  172. data/spec/unit/formatters/base_spec.rb +48 -0
  173. data/spec/unit/json_compat_spec.rb +48 -17
  174. data/spec/unit/knife/client_delete_spec.rb +4 -4
  175. data/spec/unit/knife/client_show_spec.rb +15 -5
  176. data/spec/unit/knife/cookbook_site_download_spec.rb +1 -1
  177. data/spec/unit/knife/cookbook_site_share_spec.rb +3 -3
  178. data/spec/unit/knife/data_bag_from_file_spec.rb +0 -2
  179. data/spec/unit/knife/data_bag_show_spec.rb +23 -14
  180. data/spec/unit/knife/node_show_spec.rb +32 -15
  181. data/spec/unit/knife/role_show_spec.rb +59 -0
  182. data/spec/unit/platform_spec.rb +10 -0
  183. data/spec/unit/provider/deploy_spec.rb +4 -0
  184. data/spec/unit/provider/env_spec.rb +19 -0
  185. data/spec/unit/provider/git_spec.rb +22 -2
  186. data/spec/unit/provider/group/dscl_spec.rb +38 -1
  187. data/spec/unit/provider/group/pw_spec.rb +2 -2
  188. data/spec/unit/provider/http_request_spec.rb +8 -8
  189. data/spec/unit/provider/log_spec.rb +33 -53
  190. data/spec/unit/provider/mount/mount_spec.rb +12 -3
  191. data/spec/unit/provider/package/ips_spec.rb +96 -63
  192. data/spec/unit/provider/package/paludis_spec.rb +5 -5
  193. data/spec/unit/provider/package/rpm_spec.rb +12 -0
  194. data/spec/unit/provider/package/zypper_spec.rb +28 -16
  195. data/spec/unit/provider/service/windows_spec.rb +77 -17
  196. data/spec/unit/provider/user/dscl_spec.rb +659 -264
  197. data/spec/unit/provider/user/useradd_spec.rb +1 -0
  198. data/spec/unit/recipe_spec.rb +41 -0
  199. data/spec/unit/resource/scm_spec.rb +11 -0
  200. data/spec/unit/resource/user_spec.rb +4 -0
  201. data/spec/unit/resource/windows_service_spec.rb +46 -0
  202. data/spec/unit/resource_collection_spec.rb +33 -0
  203. data/spec/unit/resource_reporter_spec.rb +48 -0
  204. data/spec/unit/resource_spec.rb +9 -2
  205. data/spec/unit/role_spec.rb +6 -0
  206. data/spec/unit/version_constraint_spec.rb +28 -0
  207. metadata +61 -4
@@ -20,7 +20,7 @@ require 'support/shared/context/config'
20
20
  require 'chef/knife/list'
21
21
 
22
22
  describe 'knife list' do
23
- extend IntegrationSupport
23
+ include IntegrationSupport
24
24
  include KnifeSupport
25
25
 
26
26
  include_context "default config options"
@@ -71,20 +71,22 @@ EOM
71
71
  end
72
72
 
73
73
  when_the_chef_server "has plenty of stuff in it" do
74
- client 'client1', {}
75
- client 'client2', {}
76
- cookbook 'cookbook1', '1.0.0', { 'metadata.rb' => '' }
77
- cookbook 'cookbook2', '1.0.1', { 'metadata.rb' => '', 'recipes' => { 'default.rb' => '' } }
78
- data_bag 'bag1', { 'item1' => {}, 'item2' => {} }
79
- data_bag 'bag2', { 'item1' => {}, 'item2' => {} }
80
- environment 'environment1', {}
81
- environment 'environment2', {}
82
- node 'node1', {}
83
- node 'node2', {}
84
- role 'role1', {}
85
- role 'role2', {}
86
- user 'user1', {}
87
- user 'user2', {}
74
+ before do
75
+ client 'client1', {}
76
+ client 'client2', {}
77
+ cookbook 'cookbook1', '1.0.0'
78
+ cookbook 'cookbook2', '1.0.1', { 'recipes' => { 'default.rb' => '' } }
79
+ data_bag 'bag1', { 'item1' => {}, 'item2' => {} }
80
+ data_bag 'bag2', { 'item1' => {}, 'item2' => {} }
81
+ environment 'environment1', {}
82
+ environment 'environment2', {}
83
+ node 'node1', {}
84
+ node 'node2', {}
85
+ role 'role1', {}
86
+ role 'role2', {}
87
+ user 'user1', {}
88
+ user 'user2', {}
89
+ end
88
90
 
89
91
  it "knife list / returns all top level directories" do
90
92
  knife('list /').should_succeed <<EOM
@@ -317,7 +319,7 @@ EOM
317
319
  context 'symlink tests' do
318
320
  when_the_repository 'is empty' do
319
321
  context 'when cwd is at the top of the repository' do
320
- cwd '.'
322
+ before { cwd '.' }
321
323
 
322
324
  it "knife list -Rfp returns everything" do
323
325
  knife('list -Rfp').should_succeed <<EOM
@@ -360,9 +362,9 @@ EOM
360
362
  end
361
363
 
362
364
  when_the_repository 'has a cookbooks directory' do
363
- directory 'cookbooks'
365
+ before { directory 'cookbooks' }
364
366
  context 'when cwd is in cookbooks/' do
365
- cwd 'cookbooks'
367
+ before { cwd 'cookbooks' }
366
368
 
367
369
  it "knife list -Rfp / returns everything" do
368
370
  knife('list -Rfp /').should_succeed <<EOM
@@ -454,10 +456,10 @@ EOM
454
456
  end
455
457
 
456
458
  when_the_repository 'has a cookbooks/cookbook2 directory' do
457
- directory 'cookbooks/cookbook2'
459
+ before { directory 'cookbooks/cookbook2' }
458
460
 
459
461
  context 'when cwd is in cookbooks/cookbook2' do
460
- cwd 'cookbooks/cookbook2'
462
+ before { cwd 'cookbooks/cookbook2' }
461
463
 
462
464
  it "knife list -Rfp returns cookbooks" do
463
465
  knife('list -Rfp').should_succeed <<EOM
@@ -470,11 +472,13 @@ EOM
470
472
  end
471
473
 
472
474
  when_the_repository 'has a cookbooks directory and a symlinked cookbooks directory', :pending => (Chef::Platform.windows?) do
473
- directory 'cookbooks'
474
- symlink 'symlinked', 'cookbooks'
475
+ before do
476
+ directory 'cookbooks'
477
+ symlink 'symlinked', 'cookbooks'
478
+ end
475
479
 
476
480
  context 'when cwd is in cookbooks/' do
477
- cwd 'cookbooks'
481
+ before { cwd 'cookbooks' }
478
482
 
479
483
  it "knife list -Rfp returns cookbooks" do
480
484
  knife('list -Rfp').should_succeed <<EOM
@@ -489,7 +493,7 @@ EOM
489
493
  end
490
494
 
491
495
  context 'when cwd is in symlinked/' do
492
- cwd 'symlinked'
496
+ before { cwd 'symlinked' }
493
497
 
494
498
  it "knife list -Rfp returns cookbooks" do
495
499
  knife('list -Rfp').should_succeed <<EOM
@@ -505,11 +509,13 @@ EOM
505
509
  end
506
510
 
507
511
  when_the_repository 'has a real_cookbooks directory and a cookbooks symlink to it', :pending => (Chef::Platform.windows?) do
508
- directory 'real_cookbooks'
509
- symlink 'cookbooks', 'real_cookbooks'
512
+ before do
513
+ directory 'real_cookbooks'
514
+ symlink 'cookbooks', 'real_cookbooks'
515
+ end
510
516
 
511
517
  context 'when cwd is in real_cookbooks/' do
512
- cwd 'real_cookbooks'
518
+ before { cwd 'real_cookbooks' }
513
519
 
514
520
  it "knife list -Rfp returns cookbooks" do
515
521
  knife('list -Rfp').should_succeed <<EOM
@@ -524,7 +530,7 @@ EOM
524
530
  end
525
531
 
526
532
  context 'when cwd is in cookbooks/' do
527
- cwd 'cookbooks'
533
+ before { cwd 'cookbooks' }
528
534
 
529
535
  it "knife list -Rfp returns cookbooks" do
530
536
  knife('list -Rfp').should_succeed <<EOM
@@ -553,36 +559,38 @@ EOM
553
559
  end
554
560
 
555
561
  when_the_repository "has a bunch of stuff" do
556
- file 'clients/client1.json', {}
557
- file 'clients/client2.json', {}
558
-
559
- directory 'cookbooks/cookbook1' do
560
- file 'metadata.rb', ''
561
- end
562
- directory 'cookbooks/cookbook2' do
563
- file 'metadata.rb', ''
564
- file 'recipes/default.rb', ''
565
- end
562
+ before do
563
+ file 'clients/client1.json', {}
564
+ file 'clients/client2.json', {}
566
565
 
567
- directory 'data_bags' do
568
- directory 'bag1' do
569
- file 'item1.json', {}
570
- file 'item2.json', {}
566
+ directory 'cookbooks/cookbook1' do
567
+ file 'metadata.rb', cb_metadata("cookbook1", "1.0.0")
571
568
  end
572
- directory 'bag2' do
573
- file 'item1.json', {}
574
- file 'item2.json', {}
569
+ directory 'cookbooks/cookbook2' do
570
+ file 'metadata.rb', cb_metadata("cookbook2", "2.0.0")
571
+ file 'recipes/default.rb', ''
572
+ end
573
+
574
+ directory 'data_bags' do
575
+ directory 'bag1' do
576
+ file 'item1.json', {}
577
+ file 'item2.json', {}
578
+ end
579
+ directory 'bag2' do
580
+ file 'item1.json', {}
581
+ file 'item2.json', {}
582
+ end
575
583
  end
576
- end
577
584
 
578
- file 'environments/environment1.json', {}
579
- file 'environments/environment2.json', {}
580
- file 'nodes/node1.json', {}
581
- file 'nodes/node2.json', {}
582
- file 'roles/role1.json', {}
583
- file 'roles/role2.json', {}
584
- file 'users/user1.json', {}
585
- file 'users/user2.json', {}
585
+ file 'environments/environment1.json', {}
586
+ file 'environments/environment2.json', {}
587
+ file 'nodes/node1.json', {}
588
+ file 'nodes/node2.json', {}
589
+ file 'roles/role1.json', {}
590
+ file 'roles/role2.json', {}
591
+ file 'users/user1.json', {}
592
+ file 'users/user2.json', {}
593
+ end
586
594
 
587
595
  it "knife list -Rfp / returns everything" do
588
596
  knife('list -Rp --local --flat /').should_succeed <<EOM
@@ -21,20 +21,22 @@ require 'chef/knife/raw'
21
21
  require 'chef/knife/show'
22
22
 
23
23
  describe 'knife raw' do
24
- extend IntegrationSupport
24
+ include IntegrationSupport
25
25
  include KnifeSupport
26
26
  include AppServerSupport
27
27
 
28
28
  include_context "default config options"
29
29
 
30
30
  when_the_chef_server "has one of each thing" do
31
- client 'x', '{}'
32
- cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' }
33
- data_bag 'x', { 'y' => '{}' }
34
- environment 'x', '{}'
35
- node 'x', '{}'
36
- role 'x', '{}'
37
- user 'x', '{}'
31
+ before do
32
+ client 'x', '{}'
33
+ cookbook 'x', '1.0.0'
34
+ data_bag 'x', { 'y' => '{}' }
35
+ environment 'x', '{}'
36
+ node 'x', '{}'
37
+ role 'x', '{}'
38
+ user 'x', '{}'
39
+ end
38
40
 
39
41
  it 'knife raw /nodes/x returns the node', :pending => (RUBY_VERSION < "1.9") do
40
42
  knife('raw /nodes/x').should_succeed <<EOM
@@ -44,12 +46,16 @@ describe 'knife raw' do
44
46
  "chef_type": "node",
45
47
  "chef_environment": "_default",
46
48
  "override": {
49
+
47
50
  },
48
51
  "normal": {
52
+
49
53
  },
50
54
  "default": {
55
+
51
56
  },
52
57
  "automatic": {
58
+
53
59
  },
54
60
  "run_list": [
55
61
 
@@ -70,13 +76,16 @@ EOM
70
76
  "json_class": "Chef::Role",
71
77
  "chef_type": "role",
72
78
  "default_attributes": {
79
+
73
80
  },
74
81
  "override_attributes": {
82
+
75
83
  },
76
84
  "run_list": [
77
85
 
78
86
  ],
79
87
  "env_run_lists": {
88
+
80
89
  }
81
90
  }
82
91
  EOM
@@ -92,13 +101,16 @@ EOM
92
101
  "json_class": "Chef::Role",
93
102
  "chef_type": "role",
94
103
  "default_attributes": {
104
+
95
105
  },
96
106
  "override_attributes": {
107
+
97
108
  },
98
109
  "run_list": [
99
110
 
100
111
  ],
101
112
  "env_run_lists": {
113
+
102
114
  }
103
115
  }
104
116
  EOM
@@ -111,13 +123,16 @@ EOM
111
123
  "json_class": "Chef::Role",
112
124
  "chef_type": "role",
113
125
  "default_attributes": {
126
+
114
127
  },
115
128
  "override_attributes": {
129
+
116
130
  },
117
131
  "run_list": [
118
132
 
119
133
  ],
120
134
  "env_run_lists": {
135
+
121
136
  }
122
137
  }
123
138
  EOM
@@ -154,7 +169,7 @@ EOM
154
169
 
155
170
  knife("raw -m POST -i #{file.path} /roles").should_succeed <<EOM
156
171
  {
157
- "uri": "#{ChefZero::RSpec.server.url}/roles/y"
172
+ "uri": "#{ChefZeroSupport::Server.server.url}/roles/y"
158
173
  }
159
174
  EOM
160
175
  knife('show /roles/y.json').should_succeed <<EOM
@@ -20,14 +20,14 @@ require 'support/shared/context/config'
20
20
  require 'chef/knife/list'
21
21
 
22
22
  describe 'redirection' do
23
- extend IntegrationSupport
23
+ include IntegrationSupport
24
24
  include KnifeSupport
25
25
  include AppServerSupport
26
26
 
27
27
  include_context "default config options"
28
28
 
29
29
  when_the_chef_server 'has a role' do
30
- role 'x', {}
30
+ before { role 'x', {} }
31
31
 
32
32
  context 'and another server redirects to it with 302' do
33
33
  before :each do
@@ -20,12 +20,12 @@ require 'chef/knife/serve'
20
20
  require 'chef/server_api'
21
21
 
22
22
  describe 'knife serve' do
23
- extend IntegrationSupport
23
+ include IntegrationSupport
24
24
  include KnifeSupport
25
25
  include AppServerSupport
26
26
 
27
27
  when_the_repository 'also has one of each thing' do
28
- file 'nodes/x.json', { 'foo' => 'bar' }
28
+ before { file 'nodes/x.json', { 'foo' => 'bar' } }
29
29
 
30
30
  it 'knife serve serves up /nodes/x' do
31
31
  exception = nil
@@ -20,40 +20,44 @@ require 'support/shared/context/config'
20
20
  require 'chef/knife/show'
21
21
 
22
22
  describe 'knife show' do
23
- extend IntegrationSupport
23
+ include IntegrationSupport
24
24
  include KnifeSupport
25
25
 
26
26
  include_context "default config options"
27
27
 
28
28
  when_the_chef_server "has one of each thing" do
29
- client 'x', '{}'
30
- cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' }
31
- data_bag 'x', { 'y' => '{}' }
32
- environment 'x', '{}'
33
- node 'x', '{}'
34
- role 'x', '{}'
35
- user 'x', '{}'
29
+ before do
30
+ client 'x', '{}'
31
+ cookbook 'x', '1.0.0'
32
+ data_bag 'x', { 'y' => '{}' }
33
+ environment 'x', '{}'
34
+ node 'x', '{}'
35
+ role 'x', '{}'
36
+ user 'x', '{}'
37
+ end
36
38
 
37
39
  when_the_repository 'also has one of each thing' do
38
- file 'clients/x.json', { 'foo' => 'bar' }
39
- file 'cookbooks/x/metadata.rb', 'version "1.0.1"'
40
- file 'data_bags/x/y.json', { 'foo' => 'bar' }
41
- file 'environments/_default.json', { 'foo' => 'bar' }
42
- file 'environments/x.json', { 'foo' => 'bar' }
43
- file 'nodes/x.json', { 'foo' => 'bar' }
44
- file 'roles/x.json', { 'foo' => 'bar' }
45
- file 'users/x.json', { 'foo' => 'bar' }
40
+ before do
41
+ file 'clients/x.json', { 'foo' => 'bar' }
42
+ file 'cookbooks/x/metadata.rb', cb_metadata('x', '1.0.0')
43
+ file 'data_bags/x/y.json', { 'foo' => 'bar' }
44
+ file 'environments/_default.json', { 'foo' => 'bar' }
45
+ file 'environments/x.json', { 'foo' => 'bar' }
46
+ file 'nodes/x.json', { 'foo' => 'bar' }
47
+ file 'roles/x.json', { 'foo' => 'bar' }
48
+ file 'users/x.json', { 'foo' => 'bar' }
49
+ end
46
50
 
47
51
  it 'knife show /cookbooks/x/metadata.rb shows the remote version' do
48
52
  knife('show /cookbooks/x/metadata.rb').should_succeed <<EOM
49
53
  /cookbooks/x/metadata.rb:
50
- version "1.0.0"
54
+ name 'x'; version '1.0.0'
51
55
  EOM
52
56
  end
53
57
  it 'knife show --local /cookbooks/x/metadata.rb shows the local version' do
54
58
  knife('show --local /cookbooks/x/metadata.rb').should_succeed <<EOM
55
59
  /cookbooks/x/metadata.rb:
56
- version "1.0.1"
60
+ name 'x'; version '1.0.0'
57
61
  EOM
58
62
  end
59
63
  it 'knife show /data_bags/x/y.json shows the remote version' do
@@ -122,13 +126,15 @@ EOM
122
126
  end
123
127
 
124
128
  when_the_chef_server 'has a hash with multiple keys' do
125
- environment 'x', {
126
- 'default_attributes' => { 'foo' => 'bar' },
127
- 'cookbook_versions' => { 'blah' => '= 1.0.0'},
128
- 'override_attributes' => { 'x' => 'y' },
129
- 'description' => 'woo',
130
- 'name' => 'x'
131
- }
129
+ before do
130
+ environment 'x', {
131
+ 'default_attributes' => { 'foo' => 'bar' },
132
+ 'cookbook_versions' => { 'blah' => '= 1.0.0'},
133
+ 'override_attributes' => { 'x' => 'y' },
134
+ 'description' => 'woo',
135
+ 'name' => 'x'
136
+ }
137
+ end
132
138
  it 'knife show shows the attributes in a predetermined order', :pending => (RUBY_VERSION < "1.9") do
133
139
  knife('show /environments/x.json').should_succeed <<EOM
134
140
  /environments/x.json:
@@ -150,7 +156,7 @@ EOM
150
156
  end
151
157
 
152
158
  when_the_repository 'has an environment with bad JSON' do
153
- file 'environments/x.json', '{'
159
+ before { file 'environments/x.json', '{' }
154
160
  it 'knife show succeeds' do
155
161
  knife('show --local /environments/x.json').should_succeed <<EOM
156
162
  /environments/x.json:
@@ -21,27 +21,33 @@ require 'chef/knife/diff'
21
21
  require 'chef/knife/raw'
22
22
 
23
23
  describe 'knife upload' do
24
- extend IntegrationSupport
24
+ include IntegrationSupport
25
25
  include KnifeSupport
26
26
 
27
27
  context 'without versioned cookbooks' do
28
+
28
29
  when_the_chef_server "has one of each thing" do
29
- client 'x', {}
30
- cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' }
31
- data_bag 'x', { 'y' => {} }
32
- environment 'x', {}
33
- node 'x', {}
34
- role 'x', {}
35
- user 'x', {}
30
+
31
+ before do
32
+ client 'x', {}
33
+ cookbook 'x', '1.0.0'
34
+ data_bag 'x', { 'y' => {} }
35
+ environment 'x', {}
36
+ node 'x', {}
37
+ role 'x', {}
38
+ user 'x', {}
39
+ end
36
40
 
37
41
  when_the_repository 'has only top-level directories' do
38
- directory 'clients'
39
- directory 'cookbooks'
40
- directory 'data_bags'
41
- directory 'environments'
42
- directory 'nodes'
43
- directory 'roles'
44
- directory 'users'
42
+ before do
43
+ directory 'clients'
44
+ directory 'cookbooks'
45
+ directory 'data_bags'
46
+ directory 'environments'
47
+ directory 'nodes'
48
+ directory 'roles'
49
+ directory 'users'
50
+ end
45
51
 
46
52
  it 'knife upload does nothing' do
47
53
  knife('upload /').should_succeed ''
@@ -80,17 +86,20 @@ EOM
80
86
  end
81
87
 
82
88
  when_the_repository 'has an identical copy of each thing' do
83
- file 'clients/chef-validator.json', { 'validator' => true, 'public_key' => ChefZero::PUBLIC_KEY }
84
- file 'clients/chef-webui.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
85
- file 'clients/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
86
- file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
87
- file 'data_bags/x/y.json', {}
88
- file 'environments/_default.json', { "description" => "The default Chef environment" }
89
- file 'environments/x.json', {}
90
- file 'nodes/x.json', {}
91
- file 'roles/x.json', {}
92
- file 'users/admin.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
93
- file 'users/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
89
+
90
+ before do
91
+ file 'clients/chef-validator.json', { 'validator' => true, 'public_key' => ChefZero::PUBLIC_KEY }
92
+ file 'clients/chef-webui.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
93
+ file 'clients/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
94
+ file 'cookbooks/x/metadata.rb', cb_metadata("x", "1.0.0")
95
+ file 'data_bags/x/y.json', {}
96
+ file 'environments/_default.json', { "description" => "The default Chef environment" }
97
+ file 'environments/x.json', {}
98
+ file 'nodes/x.json', {}
99
+ file 'roles/x.json', {}
100
+ file 'users/admin.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
101
+ file 'users/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
102
+ end
94
103
 
95
104
  it 'knife upload makes no changes' do
96
105
  knife('upload /cookbooks/x').should_succeed ''
@@ -103,7 +112,10 @@ EOM
103
112
  end
104
113
 
105
114
  context 'except the role file' do
106
- file 'roles/x.json', { 'description' => 'blarghle' }
115
+ before do
116
+ file 'roles/x.json', { 'description' => 'blarghle' }
117
+ end
118
+
107
119
  it 'knife upload changes the role' do
108
120
  knife('upload /').should_succeed "Updated /roles/x.json\n"
109
121
  knife('diff --name-status /').should_succeed ''
@@ -115,7 +127,8 @@ EOM
115
127
  end
116
128
 
117
129
  context 'except the role file is textually different, but not ACTUALLY different' do
118
- file 'roles/x.json', <<EOM
130
+ before do
131
+ file 'roles/x.json', <<EOM
119
132
  {
120
133
  "chef_type": "role",
121
134
  "default_attributes": {
@@ -132,6 +145,8 @@ EOM
132
145
  ]
133
146
  }
134
147
  EOM
148
+ end
149
+
135
150
  it 'knife upload / does not change anything' do
136
151
  knife('upload /').should_succeed ''
137
152
  knife('diff --name-status /').should_succeed ''
@@ -139,15 +154,17 @@ EOM
139
154
  end
140
155
 
141
156
  context 'as well as one extra copy of each thing' do
142
- file 'clients/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
143
- file 'cookbooks/x/blah.rb', ''
144
- file 'cookbooks/y/metadata.rb', 'version "1.0.0"'
145
- file 'data_bags/x/z.json', {}
146
- file 'data_bags/y/zz.json', {}
147
- file 'environments/y.json', {}
148
- file 'nodes/y.json', {}
149
- file 'roles/y.json', {}
150
- file 'users/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
157
+ before do
158
+ file 'clients/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
159
+ file 'cookbooks/x/blah.rb', ''
160
+ file 'cookbooks/y/metadata.rb', cb_metadata("y", "1.0.0")
161
+ file 'data_bags/x/z.json', {}
162
+ file 'data_bags/y/zz.json', {}
163
+ file 'environments/y.json', {}
164
+ file 'nodes/y.json', {}
165
+ file 'roles/y.json', {}
166
+ file 'users/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
167
+ end
151
168
 
152
169
  it 'knife upload adds the new files' do
153
170
  knife('upload /').should_succeed <<EOM
@@ -219,7 +236,10 @@ EOM
219
236
  end
220
237
 
221
238
  context 'when current directory is top level' do
222
- cwd '.'
239
+ before do
240
+ cwd '.'
241
+ end
242
+
223
243
  it 'knife upload with no parameters reports an error' do
224
244
  knife('upload').should_fail "FATAL: Must specify at least one argument. If you want to upload everything in this directory, type \"knife upload .\"\n", :stdout => /USAGE/
225
245
  end
@@ -229,7 +249,11 @@ EOM
229
249
 
230
250
  when_the_chef_server 'is empty' do
231
251
  when_the_repository 'has a data bag item' do
232
- file 'data_bags/x/y.json', { 'foo' => 'bar' }
252
+
253
+ before do
254
+ file 'data_bags/x/y.json', { 'foo' => 'bar' }
255
+ end
256
+
233
257
  it 'knife upload of the data bag uploads only the values in the data bag item and no other' do
234
258
  knife('upload /data_bags/x/y.json').should_succeed <<EOM
235
259
  Created /data_bags/x
@@ -249,7 +273,11 @@ EOM
249
273
  end
250
274
 
251
275
  when_the_repository 'has a data bag item with keys chef_type and data_bag' do
252
- file 'data_bags/x/y.json', { 'chef_type' => 'aaa', 'data_bag' => 'bbb' }
276
+
277
+ before do
278
+ file 'data_bags/x/y.json', { 'chef_type' => 'aaa', 'data_bag' => 'bbb' }
279
+ end
280
+
253
281
  it 'upload preserves chef_type and data_bag' do
254
282
  knife('upload /data_bags/x/y.json').should_succeed <<EOM
255
283
  Created /data_bags/x
@@ -265,8 +293,10 @@ EOM
265
293
 
266
294
  # Test upload of an item when the other end doesn't even have the container
267
295
  when_the_repository 'has two data bag items' do
268
- file 'data_bags/x/y.json', {}
269
- file 'data_bags/x/z.json', {}
296
+ before do
297
+ file 'data_bags/x/y.json', {}
298
+ file 'data_bags/x/z.json', {}
299
+ end
270
300
  it 'knife upload of one data bag item itself succeeds' do
271
301
  knife('upload /data_bags/x/y.json').should_succeed <<EOM
272
302
  Created /data_bags/x
@@ -280,12 +310,17 @@ EOM
280
310
  end
281
311
 
282
312
  when_the_chef_server 'has three data bag items' do
283
- data_bag 'x', { 'deleted' => {}, 'modified' => {}, 'unmodified' => {} }
313
+
314
+ before do
315
+ data_bag 'x', { 'deleted' => {}, 'modified' => {}, 'unmodified' => {} }
316
+ end
284
317
 
285
318
  when_the_repository 'has a modified, unmodified, added and deleted data bag item' do
286
- file 'data_bags/x/added.json', {}
287
- file 'data_bags/x/modified.json', { 'foo' => 'bar' }
288
- file 'data_bags/x/unmodified.json', {}
319
+ before do
320
+ file 'data_bags/x/added.json', {}
321
+ file 'data_bags/x/modified.json', { 'foo' => 'bar' }
322
+ file 'data_bags/x/unmodified.json', {}
323
+ end
289
324
 
290
325
  it 'knife upload of the modified file succeeds' do
291
326
  knife('upload /data_bags/x/modified.json').should_succeed <<EOM
@@ -348,10 +383,15 @@ EOM
348
383
  knife('diff --name-status /data_bags').should_succeed ''
349
384
  end
350
385
  context 'when cwd is the /data_bags directory' do
351
- cwd 'data_bags'
386
+
387
+ before do
388
+ cwd 'data_bags'
389
+ end
390
+
352
391
  it 'knife upload fails' do
353
392
  knife('upload').should_fail "FATAL: Must specify at least one argument. If you want to upload everything in this directory, type \"knife upload .\"\n", :stdout => /USAGE/
354
393
  end
394
+
355
395
  it 'knife upload --purge . uploads everything' do
356
396
  knife('upload --purge .').should_succeed <<EOM
357
397
  Created x/added.json
@@ -376,10 +416,17 @@ EOM
376
416
  # upload of a file is designed not to work at present. Make sure that is the
377
417
  # case.
378
418
  when_the_chef_server 'has a cookbook' do
379
- cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'z.rb' => '' }
419
+
420
+ before do
421
+ cookbook 'x', '1.0.0', { 'z.rb' => '' }
422
+ end
423
+
380
424
  when_the_repository 'has a modified, extra and missing file for the cookbook' do
381
- file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
382
- file 'cookbooks/x/y.rb', 'hi'
425
+ before do
426
+ file 'cookbooks/x/metadata.rb', cb_metadata("x", "1.0.0", "#modified")
427
+ file 'cookbooks/x/y.rb', 'hi'
428
+ end
429
+
383
430
  it 'knife upload of any individual file fails' do
384
431
  knife('upload /cookbooks/x/metadata.rb').should_fail "ERROR: /cookbooks/x/metadata.rb cannot be updated.\n"
385
432
  knife('upload /cookbooks/x/y.rb').should_fail "ERROR: /cookbooks/x cannot have a child created under it.\n"
@@ -402,7 +449,11 @@ EOM
402
449
  end
403
450
  end
404
451
  when_the_repository 'has a missing file for the cookbook' do
405
- file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
452
+
453
+ before do
454
+ file 'cookbooks/x/metadata.rb', cb_metadata('x', '1.0.0')
455
+ end
456
+
406
457
  it 'knife upload of the cookbook succeeds' do
407
458
  knife('upload /cookbooks/x').should_succeed <<EOM
408
459
  Updated /cookbooks/x
@@ -411,9 +462,13 @@ EOM
411
462
  end
412
463
  end
413
464
  when_the_repository 'has an extra file for the cookbook' do
414
- file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
415
- file 'cookbooks/x/z.rb', ''
416
- file 'cookbooks/x/blah.rb', ''
465
+
466
+ before do
467
+ file 'cookbooks/x/metadata.rb', cb_metadata('x', '1.0.0')
468
+ file 'cookbooks/x/z.rb', ''
469
+ file 'cookbooks/x/blah.rb', ''
470
+ end
471
+
417
472
  it 'knife upload of the cookbook succeeds' do
418
473
  knife('upload /cookbooks/x').should_succeed <<EOM
419
474
  Updated /cookbooks/x
@@ -423,26 +478,31 @@ EOM
423
478
  end
424
479
 
425
480
  when_the_repository 'has a different file in the cookbook' do
426
- file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
481
+ before do
482
+ file 'cookbooks/x/metadata.rb', cb_metadata('x', '1.0.0')
483
+ end
427
484
 
428
485
  it 'knife upload --freeze freezes the cookbook' do
429
486
  knife('upload --freeze /cookbooks/x').should_succeed <<EOM
430
487
  Updated /cookbooks/x
431
488
  EOM
432
489
  # Modify a file and attempt to upload
433
- file 'cookbooks/x/metadata.rb', 'version "1.0.0" # This is different'
490
+ file 'cookbooks/x/metadata.rb', "name 'x'; version '1.0.0'#different"
434
491
  knife('upload /cookbooks/x').should_fail "ERROR: /cookbooks failed to write: Cookbook x is frozen\n"
435
492
  end
436
493
  end
437
494
  end
438
495
 
439
496
  when_the_chef_server 'has a frozen cookbook' do
440
- cookbook 'frozencook', '1.0.0', {
441
- 'metadata.rb' => 'version "1.0.0"'
442
- }, :frozen => true
497
+ before do
498
+ cookbook 'frozencook', '1.0.0', {}, :frozen => true
499
+ end
443
500
 
444
501
  when_the_repository 'has an update to said cookbook' do
445
- file 'cookbooks/frozencook/metadata.rb', 'version "1.0.0" # This is different'
502
+
503
+ before do
504
+ file 'cookbooks/frozencook/metadata.rb', cb_metadata("frozencook", "1.0.0", "# This is different")
505
+ end
446
506
 
447
507
  it 'knife upload fails to upload the frozen cookbook' do
448
508
  knife('upload /cookbooks/frozencook').should_fail "ERROR: /cookbooks failed to write: Cookbook frozencook is frozen\n"
@@ -456,12 +516,16 @@ EOM
456
516
  end
457
517
 
458
518
  when_the_repository 'has a cookbook' do
459
- file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
460
- file 'cookbooks/x/onlyin1.0.0.rb', 'old_text'
519
+ before do
520
+ file 'cookbooks/x/metadata.rb', cb_metadata('x', '1.0.0')
521
+ file 'cookbooks/x/onlyin1.0.0.rb', 'old_text'
522
+ end
461
523
 
462
524
  when_the_chef_server 'has a later version for the cookbook' do
463
- cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => '' }
464
- cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
525
+ before do
526
+ cookbook 'x', '1.0.0', { 'onlyin1.0.0.rb' => '' }
527
+ cookbook 'x', '1.0.1', { 'onlyin1.0.1.rb' => 'hi' }
528
+ end
465
529
 
466
530
  it 'knife upload /cookbooks/x uploads the local version' do
467
531
  knife('diff --name-status /cookbooks').should_succeed <<EOM
@@ -481,8 +545,11 @@ EOM
481
545
  end
482
546
 
483
547
  when_the_chef_server 'has an earlier version for the cookbook' do
484
- cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => ''}
485
- cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
548
+ before do
549
+ cookbook 'x', '1.0.0', { 'onlyin1.0.0.rb' => ''}
550
+ cookbook 'x', '0.9.9', { 'onlyin0.9.9.rb' => 'hi' }
551
+ end
552
+
486
553
  it 'knife upload /cookbooks/x uploads the local version' do
487
554
  knife('upload --purge /cookbooks/x').should_succeed <<EOM
488
555
  Updated /cookbooks/x
@@ -492,7 +559,9 @@ EOM
492
559
  end
493
560
 
494
561
  when_the_chef_server 'has a later version for the cookbook, and no current version' do
495
- cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
562
+ before do
563
+ cookbook 'x', '1.0.1', { 'onlyin1.0.1.rb' => 'hi' }
564
+ end
496
565
 
497
566
  it 'knife upload /cookbooks/x uploads the local version' do
498
567
  knife('diff --name-status /cookbooks').should_succeed <<EOM
@@ -512,7 +581,9 @@ EOM
512
581
  end
513
582
 
514
583
  when_the_chef_server 'has an earlier version for the cookbook, and no current version' do
515
- cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
584
+ before do
585
+ cookbook 'x', '0.9.9', { 'onlyin0.9.9.rb' => 'hi' }
586
+ end
516
587
 
517
588
  it 'knife upload /cookbooks/x uploads the new version' do
518
589
  knife('upload --purge /cookbooks/x').should_succeed <<EOM
@@ -524,17 +595,41 @@ EOM
524
595
  end
525
596
 
526
597
  when_the_chef_server 'has an environment' do
527
- environment 'x', {}
598
+ before do
599
+ environment 'x', {}
600
+ end
601
+
528
602
  when_the_repository 'has an environment with bad JSON' do
529
- file 'environments/x.json', '{'
603
+ before do
604
+ file 'environments/x.json', '{'
605
+ end
606
+
530
607
  it 'knife upload tries and fails' do
531
- knife('upload /environments/x.json').should_fail "WARN: Parse error reading #{path_to('environments/x.json')} as JSON: A JSON text must at least contain two octets!\nERROR: /environments/x.json failed to write: Parse error reading JSON: A JSON text must at least contain two octets!\n"
532
- knife('diff --name-status /environments/x.json').should_succeed "M\t/environments/x.json\n", :stderr => "WARN: Parse error reading #{path_to('environments/x.json')} as JSON: A JSON text must at least contain two octets!\n"
608
+ error1 = <<-EOH
609
+ WARN: Parse error reading #{path_to('environments/x.json')} as JSON: parse error: premature EOF
610
+ {
611
+ (right here) ------^
612
+
613
+ ERROR: /environments/x.json failed to write: Parse error reading JSON: parse error: premature EOF
614
+ {
615
+ (right here) ------^
616
+ EOH
617
+
618
+ warn = <<-EOH
619
+ WARN: Parse error reading #{path_to('environments/x.json')} as JSON: parse error: premature EOF
620
+ {
621
+ (right here) ------^
622
+
623
+ EOH
624
+ knife('upload /environments/x.json').should_fail(error1)
625
+ knife('diff --name-status /environments/x.json').should_succeed("M\t/environments/x.json\n", :stderr => warn)
533
626
  end
534
627
  end
535
628
 
536
629
  when_the_repository 'has the same environment with the wrong name in the file' do
537
- file 'environments/x.json', { 'name' => 'y' }
630
+ before do
631
+ file 'environments/x.json', { 'name' => 'y' }
632
+ end
538
633
  it 'knife upload fails' do
539
634
  knife('upload /environments/x.json').should_fail "ERROR: /environments/x.json failed to write: Name must be 'x' (is 'y')\n"
540
635
  knife('diff --name-status /environments/x.json').should_succeed "M\t/environments/x.json\n"
@@ -542,7 +637,9 @@ EOM
542
637
  end
543
638
 
544
639
  when_the_repository 'has the same environment with no name in the file' do
545
- file 'environments/x.json', { 'description' => 'hi' }
640
+ before do
641
+ file 'environments/x.json', { 'description' => 'hi' }
642
+ end
546
643
  it 'knife upload succeeds' do
547
644
  knife('upload /environments/x.json').should_succeed "Updated /environments/x.json\n"
548
645
  knife('diff --name-status /environments/x.json').should_succeed ''
@@ -551,16 +648,11 @@ EOM
551
648
  end
552
649
 
553
650
  when_the_chef_server 'is empty' do
554
- when_the_repository 'has an environment with bad JSON' do
555
- file 'environments/x.json', '{'
556
- it 'knife upload tries and fails' do
557
- knife('upload /environments/x.json').should_fail "ERROR: /environments failed to create_child: Parse error reading JSON creating child 'x.json': A JSON text must at least contain two octets!\n"
558
- knife('diff --name-status /environments/x.json').should_succeed "A\t/environments/x.json\n"
559
- end
560
- end
561
651
 
562
652
  when_the_repository 'has an environment with the wrong name in the file' do
563
- file 'environments/x.json', { 'name' => 'y' }
653
+ before do
654
+ file 'environments/x.json', { 'name' => 'y' }
655
+ end
564
656
  it 'knife upload fails' do
565
657
  knife('upload /environments/x.json').should_fail "ERROR: /environments failed to create_child: Error creating 'x.json': Name must be 'x' (is 'y')\n"
566
658
  knife('diff --name-status /environments/x.json').should_succeed "A\t/environments/x.json\n"
@@ -568,7 +660,10 @@ EOM
568
660
  end
569
661
 
570
662
  when_the_repository 'has an environment with no name in the file' do
571
- file 'environments/x.json', { 'description' => 'hi' }
663
+
664
+ before do
665
+ file 'environments/x.json', { 'description' => 'hi' }
666
+ end
572
667
  it 'knife upload succeeds' do
573
668
  knife('upload /environments/x.json').should_succeed "Created /environments/x.json\n"
574
669
  knife('diff --name-status /environments/x.json').should_succeed ''
@@ -576,7 +671,9 @@ EOM
576
671
  end
577
672
 
578
673
  when_the_repository 'has a data bag with no id in the file' do
579
- file 'data_bags/bag/x.json', { 'foo' => 'bar' }
674
+ before do
675
+ file 'data_bags/bag/x.json', { 'foo' => 'bar' }
676
+ end
580
677
  it 'knife upload succeeds' do
581
678
  knife('upload /data_bags/bag/x.json').should_succeed "Created /data_bags/bag\nCreated /data_bags/bag/x.json\n"
582
679
  knife('diff --name-status /data_bags/bag/x.json').should_succeed ''
@@ -587,22 +684,27 @@ EOM
587
684
 
588
685
  with_versioned_cookbooks do
589
686
  when_the_chef_server "has one of each thing" do
590
- client 'x', {}
591
- cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' }
592
- data_bag 'x', { 'y' => {} }
593
- environment 'x', {}
594
- node 'x', {}
595
- role 'x', {}
596
- user 'x', {}
687
+
688
+ before do
689
+ client 'x', {}
690
+ cookbook 'x', '1.0.0'
691
+ data_bag 'x', { 'y' => {} }
692
+ environment 'x', {}
693
+ node 'x', {}
694
+ role 'x', {}
695
+ user 'x', {}
696
+ end
597
697
 
598
698
  when_the_repository 'has only top-level directories' do
599
- directory 'clients'
600
- directory 'cookbooks'
601
- directory 'data_bags'
602
- directory 'environments'
603
- directory 'nodes'
604
- directory 'roles'
605
- directory 'users'
699
+ before do
700
+ directory 'clients'
701
+ directory 'cookbooks'
702
+ directory 'data_bags'
703
+ directory 'environments'
704
+ directory 'nodes'
705
+ directory 'roles'
706
+ directory 'users'
707
+ end
606
708
 
607
709
  it 'knife upload does nothing' do
608
710
  knife('upload /').should_succeed ''
@@ -641,17 +743,19 @@ EOM
641
743
  end
642
744
 
643
745
  when_the_repository 'has an identical copy of each thing' do
644
- file 'clients/chef-validator.json', { 'validator' => true, 'public_key' => ChefZero::PUBLIC_KEY }
645
- file 'clients/chef-webui.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
646
- file 'clients/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
647
- file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
648
- file 'data_bags/x/y.json', {}
649
- file 'environments/_default.json', { 'description' => 'The default Chef environment' }
650
- file 'environments/x.json', {}
651
- file 'nodes/x.json', {}
652
- file 'roles/x.json', {}
653
- file 'users/admin.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
654
- file 'users/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
746
+ before do
747
+ file 'clients/chef-validator.json', { 'validator' => true, 'public_key' => ChefZero::PUBLIC_KEY }
748
+ file 'clients/chef-webui.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
749
+ file 'clients/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
750
+ file 'cookbooks/x-1.0.0/metadata.rb', cb_metadata('x', '1.0.0')
751
+ file 'data_bags/x/y.json', {}
752
+ file 'environments/_default.json', { 'description' => 'The default Chef environment' }
753
+ file 'environments/x.json', {}
754
+ file 'nodes/x.json', {}
755
+ file 'roles/x.json', {}
756
+ file 'users/admin.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
757
+ file 'users/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
758
+ end
655
759
 
656
760
  it 'knife upload makes no changes' do
657
761
  knife('upload /cookbooks/x-1.0.0').should_succeed ''
@@ -664,7 +768,9 @@ EOM
664
768
  end
665
769
 
666
770
  context 'except the role file' do
667
- file 'roles/x.json', { 'description' => 'blarghle' }
771
+ before do
772
+ file 'roles/x.json', { 'description' => 'blarghle' }
773
+ end
668
774
 
669
775
  it 'knife upload changes the role' do
670
776
  knife('upload /').should_succeed "Updated /roles/x.json\n"
@@ -673,7 +779,9 @@ EOM
673
779
  end
674
780
 
675
781
  context 'except the role file is textually different, but not ACTUALLY different' do
676
- file 'roles/x.json', <<EOM
782
+
783
+ before do
784
+ file 'roles/x.json', <<EOM
677
785
  {
678
786
  "chef_type": "role",
679
787
  "default_attributes": {
@@ -690,6 +798,8 @@ EOM
690
798
  ]
691
799
  }
692
800
  EOM
801
+ end
802
+
693
803
  it 'knife upload / does not change anything' do
694
804
  knife('upload /').should_succeed ''
695
805
  knife('diff --name-status /').should_succeed ''
@@ -697,16 +807,18 @@ EOM
697
807
  end
698
808
 
699
809
  context 'as well as one extra copy of each thing' do
700
- file 'clients/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
701
- file 'cookbooks/x-1.0.0/blah.rb', ''
702
- file 'cookbooks/x-2.0.0/metadata.rb', 'version "2.0.0"'
703
- file 'cookbooks/y-1.0.0/metadata.rb', 'version "1.0.0"'
704
- file 'data_bags/x/z.json', {}
705
- file 'data_bags/y/zz.json', {}
706
- file 'environments/y.json', {}
707
- file 'nodes/y.json', {}
708
- file 'roles/y.json', {}
709
- file 'users/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
810
+ before do
811
+ file 'clients/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
812
+ file 'cookbooks/x-1.0.0/blah.rb', ''
813
+ file 'cookbooks/x-2.0.0/metadata.rb', cb_metadata('x', '2.0.0')
814
+ file 'cookbooks/y-1.0.0/metadata.rb', cb_metadata('y', '1.0.0')
815
+ file 'data_bags/x/z.json', {}
816
+ file 'data_bags/y/zz.json', {}
817
+ file 'environments/y.json', {}
818
+ file 'nodes/y.json', {}
819
+ file 'roles/y.json', {}
820
+ file 'users/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
821
+ end
710
822
 
711
823
  it 'knife upload adds the new files' do
712
824
  knife('upload /').should_succeed <<EOM
@@ -763,7 +875,9 @@ EOM
763
875
  end
764
876
 
765
877
  context 'when current directory is top level' do
766
- cwd '.'
878
+ before do
879
+ cwd '.'
880
+ end
767
881
  it 'knife upload with no parameters reports an error' do
768
882
  knife('upload').should_fail "FATAL: Must specify at least one argument. If you want to upload everything in this directory, type \"knife upload .\"\n", :stdout => /USAGE/
769
883
  end
@@ -774,8 +888,10 @@ EOM
774
888
  # Test upload of an item when the other end doesn't even have the container
775
889
  when_the_chef_server 'is empty' do
776
890
  when_the_repository 'has two data bag items' do
777
- file 'data_bags/x/y.json', {}
778
- file 'data_bags/x/z.json', {}
891
+ before do
892
+ file 'data_bags/x/y.json', {}
893
+ file 'data_bags/x/z.json', {}
894
+ end
779
895
 
780
896
  it 'knife upload of one data bag item itself succeeds' do
781
897
  knife('upload /data_bags/x/y.json').should_succeed <<EOM
@@ -790,11 +906,15 @@ EOM
790
906
  end
791
907
 
792
908
  when_the_chef_server 'has three data bag items' do
793
- data_bag 'x', { 'deleted' => {}, 'modified' => {}, 'unmodified' => {} }
909
+ before do
910
+ data_bag 'x', { 'deleted' => {}, 'modified' => {}, 'unmodified' => {} }
911
+ end
794
912
  when_the_repository 'has a modified, unmodified, added and deleted data bag item' do
795
- file 'data_bags/x/added.json', {}
796
- file 'data_bags/x/modified.json', { 'foo' => 'bar' }
797
- file 'data_bags/x/unmodified.json', {}
913
+ before do
914
+ file 'data_bags/x/added.json', {}
915
+ file 'data_bags/x/modified.json', { 'foo' => 'bar' }
916
+ file 'data_bags/x/unmodified.json', {}
917
+ end
798
918
 
799
919
  it 'knife upload of the modified file succeeds' do
800
920
  knife('upload /data_bags/x/modified.json').should_succeed <<EOM
@@ -857,7 +977,9 @@ EOM
857
977
  knife('diff --name-status /data_bags').should_succeed ''
858
978
  end
859
979
  context 'when cwd is the /data_bags directory' do
860
- cwd 'data_bags'
980
+ before do
981
+ cwd 'data_bags'
982
+ end
861
983
  it 'knife upload fails' do
862
984
  knife('upload').should_fail "FATAL: Must specify at least one argument. If you want to upload everything in this directory, type \"knife upload .\"\n", :stdout => /USAGE/
863
985
  end
@@ -885,11 +1007,15 @@ EOM
885
1007
  # upload of a file is designed not to work at present. Make sure that is the
886
1008
  # case.
887
1009
  when_the_chef_server 'has a cookbook' do
888
- cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'z.rb' => '' }
1010
+ before do
1011
+ cookbook 'x', '1.0.0', { 'z.rb' => '' }
1012
+ end
889
1013
 
890
1014
  when_the_repository 'has a modified, extra and missing file for the cookbook' do
891
- file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
892
- file 'cookbooks/x-1.0.0/y.rb', 'hi'
1015
+ before do
1016
+ file 'cookbooks/x-1.0.0/metadata.rb', cb_metadata('x', '1.0.0', '#modified')
1017
+ file 'cookbooks/x-1.0.0/y.rb', 'hi'
1018
+ end
893
1019
 
894
1020
  it 'knife upload of any individual file fails' do
895
1021
  knife('upload /cookbooks/x-1.0.0/metadata.rb').should_fail "ERROR: /cookbooks/x-1.0.0/metadata.rb cannot be updated.\n"
@@ -916,7 +1042,9 @@ EOM
916
1042
  end
917
1043
 
918
1044
  when_the_repository 'has a missing file for the cookbook' do
919
- file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
1045
+ before do
1046
+ file 'cookbooks/x-1.0.0/metadata.rb', cb_metadata('x', "1.0.0")
1047
+ end
920
1048
 
921
1049
  it 'knife upload of the cookbook succeeds' do
922
1050
  knife('upload /cookbooks/x-1.0.0').should_succeed <<EOM
@@ -927,9 +1055,11 @@ EOM
927
1055
  end
928
1056
 
929
1057
  when_the_repository 'has an extra file for the cookbook' do
930
- file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
931
- file 'cookbooks/x-1.0.0/z.rb', ''
932
- file 'cookbooks/x-1.0.0/blah.rb', ''
1058
+ before do
1059
+ file 'cookbooks/x-1.0.0/metadata.rb', cb_metadata('x', '1.0.0')
1060
+ file 'cookbooks/x-1.0.0/z.rb', ''
1061
+ file 'cookbooks/x-1.0.0/blah.rb', ''
1062
+ end
933
1063
 
934
1064
  it 'knife upload of the cookbook succeeds' do
935
1065
  knife('upload /cookbooks/x-1.0.0').should_succeed <<EOM
@@ -941,12 +1071,16 @@ EOM
941
1071
  end
942
1072
 
943
1073
  when_the_repository 'has a cookbook' do
944
- file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
945
- file 'cookbooks/x-1.0.0/onlyin1.0.0.rb', 'old_text'
1074
+ before do
1075
+ file 'cookbooks/x-1.0.0/metadata.rb', cb_metadata('x', '1.0.0')
1076
+ file 'cookbooks/x-1.0.0/onlyin1.0.0.rb', 'old_text'
1077
+ end
946
1078
 
947
1079
  when_the_chef_server 'has a later version for the cookbook' do
948
- cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => '' }
949
- cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
1080
+ before do
1081
+ cookbook 'x', '1.0.0', { 'onlyin1.0.0.rb' => '' }
1082
+ cookbook 'x', '1.0.1', { 'onlyin1.0.1.rb' => 'hi' }
1083
+ end
950
1084
 
951
1085
  it 'knife upload /cookbooks uploads the local version' do
952
1086
  knife('diff --name-status /cookbooks').should_succeed <<EOM
@@ -962,8 +1096,10 @@ EOM
962
1096
  end
963
1097
 
964
1098
  when_the_chef_server 'has an earlier version for the cookbook' do
965
- cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => ''}
966
- cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
1099
+ before do
1100
+ cookbook 'x', '1.0.0', { 'onlyin1.0.0.rb' => ''}
1101
+ cookbook 'x', '0.9.9', { 'onlyin0.9.9.rb' => 'hi' }
1102
+ end
967
1103
  it 'knife upload /cookbooks uploads the local version' do
968
1104
  knife('upload --purge /cookbooks').should_succeed <<EOM
969
1105
  Updated /cookbooks/x-1.0.0
@@ -974,7 +1110,9 @@ EOM
974
1110
  end
975
1111
 
976
1112
  when_the_chef_server 'has a later version for the cookbook, and no current version' do
977
- cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
1113
+ before do
1114
+ cookbook 'x', '1.0.1', { 'onlyin1.0.1.rb' => 'hi' }
1115
+ end
978
1116
 
979
1117
  it 'knife upload /cookbooks/x uploads the local version' do
980
1118
  knife('diff --name-status /cookbooks').should_succeed <<EOM
@@ -990,7 +1128,9 @@ EOM
990
1128
  end
991
1129
 
992
1130
  when_the_chef_server 'has an earlier version for the cookbook, and no current version' do
993
- cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
1131
+ before do
1132
+ cookbook 'x', '0.9.9', { 'onlyin0.9.9.rb' => 'hi' }
1133
+ end
994
1134
 
995
1135
  it 'knife upload /cookbooks/x uploads the new version' do
996
1136
  knife('upload --purge /cookbooks').should_succeed <<EOM
@@ -1003,17 +1143,14 @@ EOM
1003
1143
  end
1004
1144
 
1005
1145
  when_the_chef_server 'has an environment' do
1006
- environment 'x', {}
1007
- when_the_repository 'has an environment with bad JSON' do
1008
- file 'environments/x.json', '{'
1009
- it 'knife upload tries and fails' do
1010
- knife('upload /environments/x.json').should_fail "WARN: Parse error reading #{path_to('environments/x.json')} as JSON: A JSON text must at least contain two octets!\nERROR: /environments/x.json failed to write: Parse error reading JSON: A JSON text must at least contain two octets!\n"
1011
- knife('diff --name-status /environments/x.json').should_succeed "M\t/environments/x.json\n", :stderr => "WARN: Parse error reading #{path_to('environments/x.json')} as JSON: A JSON text must at least contain two octets!\n"
1012
- end
1146
+ before do
1147
+ environment 'x', {}
1013
1148
  end
1014
1149
 
1015
1150
  when_the_repository 'has the same environment with the wrong name in the file' do
1016
- file 'environments/x.json', { 'name' => 'y' }
1151
+ before do
1152
+ file 'environments/x.json', { 'name' => 'y' }
1153
+ end
1017
1154
  it 'knife upload fails' do
1018
1155
  knife('upload /environments/x.json').should_fail "ERROR: /environments/x.json failed to write: Name must be 'x' (is 'y')\n"
1019
1156
  knife('diff --name-status /environments/x.json').should_succeed "M\t/environments/x.json\n"
@@ -1021,7 +1158,9 @@ EOM
1021
1158
  end
1022
1159
 
1023
1160
  when_the_repository 'has the same environment with no name in the file' do
1024
- file 'environments/x.json', { 'description' => 'hi' }
1161
+ before do
1162
+ file 'environments/x.json', { 'description' => 'hi' }
1163
+ end
1025
1164
  it 'knife upload succeeds' do
1026
1165
  knife('upload /environments/x.json').should_succeed "Updated /environments/x.json\n"
1027
1166
  knife('diff --name-status /environments/x.json').should_succeed ''
@@ -1030,16 +1169,11 @@ EOM
1030
1169
  end
1031
1170
 
1032
1171
  when_the_chef_server 'is empty' do
1033
- when_the_repository 'has an environment with bad JSON' do
1034
- file 'environments/x.json', '{'
1035
- it 'knife upload tries and fails' do
1036
- knife('upload /environments/x.json').should_fail "ERROR: /environments failed to create_child: Parse error reading JSON creating child 'x.json': A JSON text must at least contain two octets!\n"
1037
- knife('diff --name-status /environments/x.json').should_succeed "A\t/environments/x.json\n"
1038
- end
1039
- end
1040
1172
 
1041
1173
  when_the_repository 'has an environment with the wrong name in the file' do
1042
- file 'environments/x.json', { 'name' => 'y' }
1174
+ before do
1175
+ file 'environments/x.json', { 'name' => 'y' }
1176
+ end
1043
1177
  it 'knife upload fails' do
1044
1178
  knife('upload /environments/x.json').should_fail "ERROR: /environments failed to create_child: Error creating 'x.json': Name must be 'x' (is 'y')\n"
1045
1179
  knife('diff --name-status /environments/x.json').should_succeed "A\t/environments/x.json\n"
@@ -1047,7 +1181,9 @@ EOM
1047
1181
  end
1048
1182
 
1049
1183
  when_the_repository 'has an environment with no name in the file' do
1050
- file 'environments/x.json', { 'description' => 'hi' }
1184
+ before do
1185
+ file 'environments/x.json', { 'description' => 'hi' }
1186
+ end
1051
1187
  it 'knife upload succeeds' do
1052
1188
  knife('upload /environments/x.json').should_succeed "Created /environments/x.json\n"
1053
1189
  knife('diff --name-status /environments/x.json').should_succeed ''
@@ -1055,7 +1191,9 @@ EOM
1055
1191
  end
1056
1192
 
1057
1193
  when_the_repository 'has a data bag with no id in the file' do
1058
- file 'data_bags/bag/x.json', { 'foo' => 'bar' }
1194
+ before do
1195
+ file 'data_bags/bag/x.json', { 'foo' => 'bar' }
1196
+ end
1059
1197
  it 'knife upload succeeds' do
1060
1198
  knife('upload /data_bags/bag/x.json').should_succeed "Created /data_bags/bag\nCreated /data_bags/bag/x.json\n"
1061
1199
  knife('diff --name-status /data_bags/bag/x.json').should_succeed ''
@@ -1065,9 +1203,14 @@ EOM
1065
1203
  end # with versioned cookbooks
1066
1204
 
1067
1205
  when_the_chef_server 'has a user' do
1068
- user 'x', {}
1206
+ before do
1207
+ user 'x', {}
1208
+ end
1209
+
1069
1210
  when_the_repository 'has the same user with json_class in it' do
1070
- file 'users/x.json', { 'admin' => true, 'json_class' => 'Chef::WebUIUser' }
1211
+ before do
1212
+ file 'users/x.json', { 'admin' => true, 'json_class' => 'Chef::WebUIUser' }
1213
+ end
1071
1214
  it 'knife upload /users/x.json succeeds' do
1072
1215
  knife('upload /users/x.json').should_succeed "Updated /users/x.json\n"
1073
1216
  end