beaker 0.0.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +8 -0
  3. data/README.md +6 -6
  4. data/beaker.gemspec +6 -2
  5. data/lib/beaker.rb +1 -1
  6. data/lib/beaker/answers.rb +34 -7
  7. data/lib/beaker/answers/version20.rb +124 -0
  8. data/lib/beaker/answers/version28.rb +21 -0
  9. data/lib/beaker/answers/version30.rb +24 -5
  10. data/lib/beaker/cli.rb +55 -41
  11. data/lib/beaker/command.rb +2 -2
  12. data/lib/beaker/dsl/helpers.rb +320 -106
  13. data/lib/beaker/dsl/install_utils.rb +202 -81
  14. data/lib/beaker/dsl/roles.rb +40 -0
  15. data/lib/beaker/host.rb +28 -20
  16. data/lib/beaker/host/unix.rb +7 -4
  17. data/lib/beaker/host/unix/pkg.rb +42 -12
  18. data/lib/beaker/host/windows.rb +9 -5
  19. data/lib/beaker/host/windows/group.rb +1 -1
  20. data/lib/beaker/host/windows/pkg.rb +41 -8
  21. data/lib/beaker/hypervisor.rb +23 -10
  22. data/lib/beaker/hypervisor/aixer.rb +15 -19
  23. data/lib/beaker/hypervisor/blimper.rb +71 -72
  24. data/lib/beaker/hypervisor/fusion.rb +11 -10
  25. data/lib/beaker/hypervisor/solaris.rb +17 -23
  26. data/lib/beaker/hypervisor/vagrant.rb +27 -12
  27. data/lib/beaker/hypervisor/vcloud.rb +154 -138
  28. data/lib/beaker/hypervisor/vcloud_pooled.rb +97 -0
  29. data/lib/beaker/hypervisor/vsphere.rb +8 -5
  30. data/lib/beaker/hypervisor/vsphere_helper.rb +43 -33
  31. data/lib/beaker/network_manager.rb +16 -12
  32. data/lib/beaker/options/command_line_parser.rb +199 -0
  33. data/lib/beaker/options/hosts_file_parser.rb +39 -0
  34. data/lib/beaker/options/options_file_parser.rb +45 -0
  35. data/lib/beaker/options/options_hash.rb +294 -0
  36. data/lib/beaker/options/parser.rb +288 -0
  37. data/lib/beaker/options/pe_version_scraper.rb +35 -0
  38. data/lib/beaker/options/presets.rb +70 -0
  39. data/lib/beaker/shared.rb +2 -1
  40. data/lib/beaker/shared/host_handler.rb +7 -2
  41. data/lib/beaker/shared/repetition.rb +1 -0
  42. data/lib/beaker/shared/timed.rb +14 -0
  43. data/lib/beaker/test_case.rb +2 -38
  44. data/lib/beaker/test_suite.rb +11 -25
  45. data/lib/beaker/utils/repo_control.rb +6 -8
  46. data/lib/beaker/utils/setup_helper.rb +9 -20
  47. data/spec/beaker/answers_spec.rb +109 -0
  48. data/spec/beaker/command_spec.rb +2 -2
  49. data/spec/beaker/dsl/assertions_spec.rb +1 -3
  50. data/spec/beaker/dsl/helpers_spec.rb +519 -84
  51. data/spec/beaker/dsl/install_utils_spec.rb +265 -16
  52. data/spec/beaker/dsl/roles_spec.rb +31 -10
  53. data/spec/beaker/host/windows/group_spec.rb +55 -0
  54. data/spec/beaker/host_spec.rb +130 -40
  55. data/spec/beaker/hypervisor/aixer_spec.rb +34 -0
  56. data/spec/beaker/hypervisor/blimper_spec.rb +77 -0
  57. data/spec/beaker/hypervisor/fusion_spec.rb +26 -0
  58. data/spec/beaker/hypervisor/hypervisor_spec.rb +66 -0
  59. data/spec/beaker/hypervisor/solaris_spec.rb +39 -0
  60. data/spec/beaker/hypervisor/vagrant_spec.rb +105 -0
  61. data/spec/beaker/hypervisor/vcloud_pooled_spec.rb +60 -0
  62. data/spec/beaker/hypervisor/vcloud_spec.rb +70 -0
  63. data/spec/beaker/hypervisor/vsphere_helper_spec.rb +162 -0
  64. data/spec/beaker/hypervisor/vsphere_spec.rb +76 -0
  65. data/spec/beaker/options/command_line_parser_spec.rb +25 -0
  66. data/spec/beaker/options/data/LATEST +1 -0
  67. data/spec/beaker/options/data/badyaml.cfg +21 -0
  68. data/spec/beaker/options/data/hosts.cfg +21 -0
  69. data/spec/beaker/options/data/opts.txt +6 -0
  70. data/spec/beaker/options/hosts_file_parser_spec.rb +30 -0
  71. data/spec/beaker/options/options_file_parser_spec.rb +23 -0
  72. data/spec/beaker/options/options_hash_spec.rb +111 -0
  73. data/spec/beaker/options/parser_spec.rb +172 -0
  74. data/spec/beaker/options/pe_version_scaper_spec.rb +15 -0
  75. data/spec/beaker/options/presets_spec.rb +24 -0
  76. data/spec/beaker/puppet_command_spec.rb +54 -21
  77. data/spec/beaker/shared/error_handler_spec.rb +40 -0
  78. data/spec/beaker/shared/host_handler_spec.rb +104 -0
  79. data/spec/beaker/shared/repetition_spec.rb +72 -0
  80. data/spec/beaker/test_suite_spec.rb +3 -16
  81. data/spec/beaker/utils/ntp_control_spec.rb +42 -0
  82. data/spec/beaker/utils/repo_control_spec.rb +168 -0
  83. data/spec/beaker/utils/setup_helper_spec.rb +82 -0
  84. data/spec/beaker/utils/validator_spec.rb +58 -0
  85. data/spec/helpers.rb +97 -0
  86. data/spec/matchers.rb +39 -0
  87. data/spec/mock_blimpy.rb +48 -0
  88. data/spec/mock_fission.rb +60 -0
  89. data/spec/mock_vsphere.rb +310 -0
  90. data/spec/mock_vsphere_helper.rb +183 -0
  91. data/spec/mocks.rb +83 -0
  92. data/spec/spec_helper.rb +8 -1
  93. metadata +106 -13
  94. data/beaker.rb +0 -10
  95. data/lib/beaker/options_parsing.rb +0 -323
  96. data/lib/beaker/test_config.rb +0 -148
  97. data/spec/beaker/options_parsing_spec.rb +0 -37
  98. data/spec/mocks_and_helpers.rb +0 -34
@@ -0,0 +1,162 @@
1
+ require 'spec_helper'
2
+
3
+ module Beaker
4
+ describe VsphereHelper do
5
+ let( :logger ) { double('logger').as_null_object }
6
+ let( :vInfo ) { { :server => "vsphere.labs.net", :user => "vsphere@labs.com", :pass => "supersekritpassword" } }
7
+ let( :vsphere_helper ) { VsphereHelper.new ( vInfo.merge( { :logger => logger } ) ) }
8
+ let( :snaplist ) { { 'snap1' => { 'snap1sub1' => nil ,
9
+ 'snap1sub2' => nil },
10
+ 'snap2' => nil,
11
+ 'snap3' => { 'snap3sub1' => nil ,
12
+ 'snap3sub2' => nil ,
13
+ 'snap3sub3' => nil } } }
14
+ let( :vms ) { [ MockRbVmomiVM.new( 'mockvm1', snaplist ),
15
+ MockRbVmomiVM.new( 'mockvm2', snaplist ),
16
+ MockRbVmomiVM.new( 'mockvm3', snaplist ) ] }
17
+
18
+
19
+
20
+ before :each do
21
+ stub_const( "RbVmomi", MockRbVmomi )
22
+ end
23
+
24
+ describe "#load_config" do
25
+
26
+ it 'can load a .fog file' do
27
+ File.stub( :exists? ).and_return( true )
28
+ YAML.stub( :load_file ).and_return( fog_file_contents )
29
+
30
+ expect( VsphereHelper.load_config ).to be === vInfo
31
+
32
+ end
33
+
34
+ it 'raises an error when the .fog file is missing' do
35
+ File.stub( :exists? ).and_return( false )
36
+
37
+ expect{ VsphereHelper.load_config }.to raise_error( ArgumentError )
38
+
39
+ end
40
+
41
+ end
42
+
43
+ describe "#find_snapshot" do
44
+ it 'can find a given snapshot name' do
45
+ mockvm = MockRbVmomiVM.new( 'mockvm', snaplist )
46
+
47
+ expect( vsphere_helper.find_snapshot( mockvm, 'snap2' ) ).to be === mockvm.get_snapshot( 'snap2' )
48
+
49
+ end
50
+
51
+ end
52
+
53
+ describe "#find_customization" do
54
+ it 'returns the customization spec' do
55
+
56
+ expect( vsphere_helper.find_customization( 'name' ) ).to be === true
57
+
58
+ end
59
+
60
+ end
61
+
62
+ describe "#find_vms" do
63
+ it 'finds the list of vms' do
64
+ connection = vsphere_helper.instance_variable_get( :@connection )
65
+ connection.set_info( vms )
66
+
67
+ expect( vsphere_helper.find_vms( 'mockvm1' ) ).to be === {vms[0].name => vms[0]}
68
+ end
69
+
70
+ it 'returns {} when no vm is found' do
71
+ connection = vsphere_helper.instance_variable_get( :@connection )
72
+ connection.set_info( vms )
73
+
74
+ expect( vsphere_helper.find_vms( 'novm' ) ).to be === {}
75
+ end
76
+
77
+ end
78
+
79
+ describe "#find_datastore" do
80
+ it 'finds the datastore from the connection object' do
81
+ expect(vsphere_helper.find_datastore( 'datastorename' ) ).to be === true
82
+ end
83
+
84
+ end
85
+
86
+ describe "#find_folder" do
87
+ it 'can find a folder in the datacenter' do
88
+ connection = vsphere_helper.instance_variable_get( :@connection )
89
+
90
+ expect(vsphere_helper.find_folder( 'root' ) ).to be === connection.serviceInstance.find_datacenter.vmFolder
91
+ end
92
+
93
+ end
94
+
95
+ describe "#find_pool" do
96
+ it 'can find a pool in a folder in the datacenter' do
97
+ connection = vsphere_helper.instance_variable_get( :@connection )
98
+ connection.serviceInstance.find_datacenter.hostFolder = MockRbVmomi::VIM::Folder.new
99
+ connection.serviceInstance.find_datacenter.hostFolder.name = "/root"
100
+
101
+ expect(vsphere_helper.find_pool( 'root' ) ).to be === connection.serviceInstance.find_datacenter.hostFolder
102
+
103
+ end
104
+ it 'can find a pool in a clustercomputeresource in the datacenter' do
105
+ connection = vsphere_helper.instance_variable_get( :@connection )
106
+ connection.serviceInstance.find_datacenter.hostFolder = MockRbVmomi::VIM::ClusterComputeResource.new
107
+ connection.serviceInstance.find_datacenter.hostFolder.name = "/root"
108
+
109
+ expect(vsphere_helper.find_pool( 'root' ) ).to be === connection.serviceInstance.find_datacenter.hostFolder
110
+
111
+ end
112
+ it 'can find a pool in a resourcepool in the datacenter' do
113
+ connection = vsphere_helper.instance_variable_get( :@connection )
114
+ connection.serviceInstance.find_datacenter.hostFolder = MockRbVmomi::VIM::ResourcePool.new
115
+ connection.serviceInstance.find_datacenter.hostFolder.name = "/root"
116
+
117
+ expect(vsphere_helper.find_pool( 'root' ) ).to be === connection.serviceInstance.find_datacenter.hostFolder
118
+ end
119
+
120
+ end
121
+
122
+ describe "#wait_for_tasks" do
123
+ it "can wait for tasks to error" do
124
+ vsphere_helper.stub( :sleep ).and_return( true )
125
+ vms.each do |vm|
126
+ vm.info.state = 'error'
127
+ end
128
+
129
+ expect(vsphere_helper.wait_for_tasks( vms, 0, 5 ) ).to be === vms
130
+ end
131
+
132
+ it "can wait for tasks to succeed" do
133
+ vsphere_helper.stub( :sleep ).and_return( true )
134
+ vms.each do |vm|
135
+ vm.info.state = 'success'
136
+ end
137
+
138
+ expect(vsphere_helper.wait_for_tasks( vms, 0, 5 ) ).to be === vms
139
+ end
140
+
141
+ it "errors when tasks fail to error/success before timing out" do
142
+ vsphere_helper.stub( :sleep ).and_return( true )
143
+ vms.each do |vm|
144
+ vm.info.state = 'nope'
145
+ end
146
+
147
+ expect{ vsphere_helper.wait_for_tasks( vms, 0, 5 ) }.to raise_error
148
+ end
149
+
150
+ end
151
+
152
+ describe "#close" do
153
+ it 'closes the connection' do
154
+ connection = vsphere_helper.instance_variable_get( :@connection )
155
+ connection.should_receive( :close ).once
156
+
157
+ vsphere_helper.close
158
+ end
159
+ end
160
+
161
+ end
162
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ module Beaker
4
+ describe Vsphere do
5
+
6
+ before :each do
7
+ MockVsphereHelper.set_config( fog_file_contents )
8
+ MockVsphereHelper.set_vms( make_hosts() )
9
+ stub_const( "VsphereHelper", MockVsphereHelper )
10
+ end
11
+
12
+ describe "#provision" do
13
+
14
+ it 'provisions hosts' do
15
+ MockVsphereHelper.powerOff
16
+ vsphere = Beaker::Vsphere.new( make_hosts(), make_opts )
17
+
18
+ vsphere.provision
19
+
20
+ hosts = vsphere.instance_variable_get( :@vsphere_hosts )
21
+ hosts.each do |host|
22
+ expect( MockVsphereHelper.find_vm( host.name ).powerState ) == "poweredOn"
23
+ end
24
+
25
+ end
26
+
27
+ it 'raises an error if a vm is missing in Vsphere' do
28
+ MockVsphereHelper.powerOff
29
+ hosts = make_hosts()
30
+ hosts[0][:vmname] = 'unknown'
31
+ vsphere = Beaker::Vsphere.new( hosts, make_opts )
32
+
33
+ expect{ vsphere.provision }.to raise_error
34
+
35
+ end
36
+
37
+ it 'raises an error if a vm does not have a given snapshot name' do
38
+ MockVsphereHelper.powerOff
39
+ hosts = make_hosts()
40
+ hosts[0]["snapshot"] = 'unknown'
41
+ vsphere = Beaker::Vsphere.new( hosts, make_opts )
42
+
43
+ expect{ vsphere.provision }.to raise_error
44
+
45
+ end
46
+
47
+ end
48
+
49
+ describe "#cleanup" do
50
+
51
+ it "cleans up" do
52
+ MockVsphereHelper.powerOn
53
+ vsphere = Beaker::Vsphere.new( make_hosts(), make_opts )
54
+ vsphere.cleanup
55
+
56
+ hosts = vsphere.instance_variable_get( :@vsphere_hosts )
57
+ hosts.each do |host|
58
+ expect( MockVsphereHelper.find_vm( host.name ).powerState ) == "poweredOff"
59
+ end
60
+ end
61
+
62
+ it 'raises an error if a vm is missing in Vsphere' do
63
+ MockVsphereHelper.powerOn
64
+ hosts = make_hosts()
65
+ hosts[0][:vmname] = 'unknown'
66
+ vsphere = Beaker::Vsphere.new( hosts, make_opts )
67
+
68
+ expect{ vsphere.cleanup }.to raise_error
69
+
70
+ end
71
+
72
+ end
73
+
74
+ end
75
+
76
+ end
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+
3
+ module Beaker
4
+ module Options
5
+ describe CommandLineParser do
6
+
7
+ let(:parser) {Beaker::Options::CommandLineParser.new}
8
+ let(:test_opts) {["-h", "vcloud.cfg", "--debug", "--tests", "test.rb", "--help"]}
9
+ let(:full_opts) {["--hosts", "host.cfg", "--options", "opts_file", "--type", "pe", "--helper", "path_to_helper", "--load-path", "load_path", "--tests", "test1.rb,test2.rb,test3.rb", "--pre-suite", "pre_suite.rb", "--post-suite", "post_suite.rb", "--no-provision", "--preserve-hosts", "--root-keys", "--keyfile", "../.ssh/id_rsa", "--install", "gitrepopath", "-m", "module", "-q", "--no-xml", "--dry-run", "--no-ntp", "--repo-proxy", "--add-el-extras", "--config", "anotherfile.cfg", "--fail-mode", "fast", "--no-color"]}
10
+
11
+ it "can correctly read command line input" do
12
+ expect(parser.parse!(test_opts)).to be === {:hosts_file=>"vcloud.cfg", :debug=>true, :tests=>"test.rb", :help=>true}
13
+ end
14
+
15
+ it "supports all our command line options" do
16
+ expect(parser.parse!(full_opts)).to be === {:hosts_file=>"anotherfile.cfg", :options_file=>"opts_file", :type=>"pe", :helper=>"path_to_helper", :load_path=>"load_path", :tests=>"test1.rb,test2.rb,test3.rb", :pre_suite=>"pre_suite.rb", :post_suite=>"post_suite.rb", :provision=>false, :preserve_hosts=>true, :root_keys=>true, :keyfile=>"../.ssh/id_rsa", :install=>"gitrepopath", :modules=>"module", :quiet=>true, :xml=>false, :dry_run=>true, :timesync=>false, :repo_proxy=>true, :add_el_extras=>true, :fail_mode=>"fast", :color=>false}
17
+ end
18
+
19
+ it "can produce a usage description" do
20
+ expect{parser.usage}.to_not raise_error
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1 @@
1
+ 3.0.0
@@ -0,0 +1,21 @@
1
+ HOSTS:
2
+ pe-ubuntu-lucid:
3
+ roles:
4
+ - agent
5
+ - dashboard
6
+ - database
7
+ - master
8
+ vmname : pe-ubuntu-lucid
9
+ platform: ubuntu-10.04-i386
10
+ snapshot : clean-w-keys
11
+ hypervisor : fusion
12
+ pe-centos6:
13
+ roles:
14
+ - agent
15
+ vmname : pe-centos6
16
+ platform: el-6-i386
17
+ hypervisor : fusion
18
+ snapshot *** clean-w-keys
19
+ CONFIG:
20
+ nfs_server: none
21
+ consoleport: 443
@@ -0,0 +1,21 @@
1
+ HOSTS:
2
+ pe-ubuntu-lucid:
3
+ roles:
4
+ - agent
5
+ - dashboard
6
+ - database
7
+ - master
8
+ vmname : pe-ubuntu-lucid
9
+ platform: ubuntu-10.04-i386
10
+ snapshot : clean-w-keys
11
+ hypervisor : fusion
12
+ pe-centos6:
13
+ roles:
14
+ - agent
15
+ vmname : pe-centos6
16
+ platform: el-6-i386
17
+ hypervisor : fusion
18
+ snapshot: clean-w-keys
19
+ CONFIG:
20
+ nfs_server: none
21
+ consoleport: 443
@@ -0,0 +1,6 @@
1
+ {
2
+ :debug => true,
3
+ :tests => 'test.rb',
4
+ :pre_suite => [ 'pre-suite.rb'],
5
+ :post_suite => "post_suite1.rb,post_suite2.rb",
6
+ }
@@ -0,0 +1,30 @@
1
+ require "spec_helper"
2
+
3
+ module Beaker
4
+ module Options
5
+ describe HostsFileParser do
6
+
7
+ let(:parser) {HostsFileParser}
8
+ let(:filepath) {File.join(File.expand_path(File.dirname(__FILE__)), "data", "hosts.cfg")}
9
+
10
+ it "can correctly read a host file" do
11
+ FakeFS.deactivate!
12
+ config = parser.parse_hosts_file(filepath)
13
+ expect(config).to be === {:HOSTS=>{:"pe-ubuntu-lucid"=>{:roles=>["agent", "dashboard", "database", "master"], :vmname=>"pe-ubuntu-lucid", :platform=>"ubuntu-10.04-i386", :snapshot=>"clean-w-keys", :hypervisor=>"fusion"}, :"pe-centos6"=>{:roles=>["agent"], :vmname=>"pe-centos6", :platform=>"el-6-i386", :hypervisor=>"fusion", :snapshot=>"clean-w-keys"}}, :nfs_server=>"none", :consoleport=>443}
14
+ end
15
+
16
+ it "can merge CONFIG section into overall hash" do
17
+ FakeFS.deactivate!
18
+ config = parser.parse_hosts_file(filepath)
19
+ expect(config['CONFIG']).to be === nil
20
+ expect(config['consoleport']).to be === 443
21
+ end
22
+
23
+ it "raises an error on no file found" do
24
+ FakeFS.deactivate!
25
+ expect{parser.parse_hosts_file("not a valid path")}.to raise_error(ArgumentError)
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ module Beaker
4
+ module Options
5
+ describe OptionsFileParser do
6
+
7
+ let(:parser) {Beaker::Options::OptionsFileParser}
8
+ let(:simple_opts) {File.join(File.expand_path(File.dirname(__FILE__)), "data", "opts.txt")}
9
+
10
+ it "can correctly read options from a file" do
11
+ FakeFS.deactivate!
12
+ expect(parser.parse_options_file(simple_opts)).to be === {:debug=>true, :tests=>"test.rb", :pre_suite=>["pre-suite.rb"], :post_suite=>"post_suite1.rb,post_suite2.rb"}
13
+ end
14
+
15
+ it "raises an error on no file found" do
16
+ FakeFS.deactivate!
17
+ expect{parser.parse_options_file("not a valid path")}.to raise_error(ArgumentError)
18
+ end
19
+
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,111 @@
1
+ require "spec_helper"
2
+
3
+ module Beaker
4
+ module Options
5
+ describe OptionsHash do
6
+ let(:options) { Beaker::Options::OptionsHash.new }
7
+
8
+ #test options hash methods
9
+ it "converts all string keys to symbols when doing direct assignment" do
10
+ options['key'] = 'value'
11
+ expect(options.has_key?(:key)) === true and expect(options.has_key?('key')) === false
12
+ end
13
+
14
+ it "can look up by string or symbol key" do
15
+ options.merge({'key' => 'value'})
16
+ expect(options['key']) === 'value' and expect(options[:key]) === 'value'
17
+ end
18
+
19
+ it "supports is_pe?, defaults to pe" do
20
+ expect(options.is_pe?) === true
21
+ end
22
+
23
+ it "supports is_pe?, respects :type == foss" do
24
+ options[:type] = 'foss'
25
+ expect(options.is_pe?) === false
26
+ end
27
+
28
+ it "can delete by string of symbol key" do
29
+ options['key'] = 'value'
30
+ expect(options.delete('key')) === 'value' and expect(options.delete(:key)) === 'value'
31
+ end
32
+
33
+ it "when merged with a Hash remains an OptionsHash" do
34
+ options.merge({'key' => 'value'})
35
+ expect(options.is_a?(OptionsHash)) === true
36
+ end
37
+
38
+ it "when merged with a hash that contains a hash, the sub-hash becomes an OptionsHash" do
39
+ options.merge({'key' => {'subkey' => 'subvalue'}})
40
+ expect(options[:key].is_a?(OptionsHash)) === true and expect(options[:key][:subkey]) === 'subvalue'
41
+ end
42
+
43
+ context 'pretty prints itself' do
44
+
45
+ it 'in valid JSON' do
46
+ require 'json'
47
+
48
+ options['array'] = ['one', 'two', 'three']
49
+ options['hash'] = {'subkey' => { 'subsub' => 1 }}
50
+ options['nil'] = nil
51
+ options['number'] = 4
52
+ options['float'] = 1.0
53
+ options['string'] = 'string'
54
+ options['true'] = true
55
+
56
+ expect{ JSON.parse( options.dump ) }.to_not raise_error
57
+ end
58
+
59
+ context 'for non collection values shows' do
60
+ it 'non-string like values as bare words' do
61
+ expect( options.fmt_value( 4 ) ).to be == "4"
62
+ expect( options.fmt_value( 1.0 ) ).to be == "1.0"
63
+ expect( options.fmt_value( true ) ).to be == "true"
64
+ expect( options.fmt_value( false ) ).to be == "false"
65
+ end
66
+
67
+ it 'nil values as null' do
68
+ expect( options.fmt_value( nil ) ).to be == 'null'
69
+ end
70
+
71
+ it 'strings within double quotes' do
72
+ expect( options.fmt_value( 'thing' ) ).to be == '"thing"'
73
+ end
74
+ end
75
+
76
+ context 'for list like collections shows' do
77
+ it 'each element on a new line' do
78
+ fmt_list = options.fmt_value( %w{ one two three } )
79
+
80
+ expect( fmt_list ).to match(/^\s*"one",?$/)
81
+ expect( fmt_list ).to match(/^\s*"two",?$/)
82
+ expect( fmt_list ).to match(/^\s*"three",?$/)
83
+ end
84
+
85
+ it 'square brackets on either end of the list' do
86
+ fmt_list = options.fmt_value( %w{ one two three } )
87
+
88
+ expect( fmt_list ).to match( /\A\[\s*$/ )
89
+ expect( fmt_list ).to match( /^\s*\]\Z/ )
90
+ end
91
+ end
92
+
93
+ context 'for dict like collections shows' do
94
+ it 'each element on a new line' do
95
+ fmt_assoc = options.fmt_value( {:one => 'two', :two => 'three'} )
96
+
97
+ expect( fmt_assoc ).to match(/^\s*"one": "two",?$/)
98
+ expect( fmt_assoc ).to match(/^\s*"two": "three",?$/)
99
+ end
100
+
101
+ it 'curly braces on either end of the list' do
102
+ fmt_assoc = options.fmt_value( {:one => 'two', :two => 'three'} )
103
+
104
+ expect( fmt_assoc ).to match( /\A\{\s*$/ )
105
+ expect( fmt_assoc ).to match( /^\s*\}\Z/ )
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end