cf_script 0.0.1.beta.1

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 (205) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/CHANGELOG.md +0 -0
  4. data/Gemfile +12 -0
  5. data/LICENSE +22 -0
  6. data/README.md +84 -0
  7. data/Rakefile +33 -0
  8. data/cf_script.gemspec +34 -0
  9. data/lib/cf_script/callbacks.rb +43 -0
  10. data/lib/cf_script/command/base.rb +57 -0
  11. data/lib/cf_script/command/cf/apps/app.rb +19 -0
  12. data/lib/cf_script/command/cf/apps/apps.rb +44 -0
  13. data/lib/cf_script/command/cf/apps/env.rb +20 -0
  14. data/lib/cf_script/command/cf/apps/push.rb +47 -0
  15. data/lib/cf_script/command/cf/apps/restage.rb +19 -0
  16. data/lib/cf_script/command/cf/apps/restart.rb +19 -0
  17. data/lib/cf_script/command/cf/apps/set_env.rb +18 -0
  18. data/lib/cf_script/command/cf/apps/start.rb +19 -0
  19. data/lib/cf_script/command/cf/apps/stop.rb +19 -0
  20. data/lib/cf_script/command/cf/apps/unset_env.rb +18 -0
  21. data/lib/cf_script/command/cf/apps.rb +55 -0
  22. data/lib/cf_script/command/cf/general/api.rb +36 -0
  23. data/lib/cf_script/command/cf/general/auth.rb +28 -0
  24. data/lib/cf_script/command/cf/general/login.rb +42 -0
  25. data/lib/cf_script/command/cf/general/logout.rb +15 -0
  26. data/lib/cf_script/command/cf/general/target.rb +64 -0
  27. data/lib/cf_script/command/cf/general.rb +15 -0
  28. data/lib/cf_script/command/cf/routes/check_route.rb +17 -0
  29. data/lib/cf_script/command/cf/routes/create_route.rb +19 -0
  30. data/lib/cf_script/command/cf/routes/delete_route.rb +19 -0
  31. data/lib/cf_script/command/cf/routes/map_route.rb +30 -0
  32. data/lib/cf_script/command/cf/routes/routes.rb +40 -0
  33. data/lib/cf_script/command/cf/routes/unmap_route.rb +30 -0
  34. data/lib/cf_script/command/cf/routes.rb +17 -0
  35. data/lib/cf_script/command/cf/spaces/space.rb +36 -0
  36. data/lib/cf_script/command/cf/spaces/spaces.rb +23 -0
  37. data/lib/cf_script/command/cf/spaces.rb +9 -0
  38. data/lib/cf_script/command/error.rb +5 -0
  39. data/lib/cf_script/command/line.rb +105 -0
  40. data/lib/cf_script/command/registry.rb +50 -0
  41. data/lib/cf_script/command/runner.rb +97 -0
  42. data/lib/cf_script/command.rb +44 -0
  43. data/lib/cf_script/config.rb +60 -0
  44. data/lib/cf_script/executor/non_blocking.rb +107 -0
  45. data/lib/cf_script/executor/recorder.rb +16 -0
  46. data/lib/cf_script/executor/simple.rb +17 -0
  47. data/lib/cf_script/executor.rb +5 -0
  48. data/lib/cf_script/manifest.rb +38 -0
  49. data/lib/cf_script/object/api_endpoint.rb +10 -0
  50. data/lib/cf_script/object/app_info.rb +69 -0
  51. data/lib/cf_script/object/app_list.rb +24 -0
  52. data/lib/cf_script/object/app_spec.rb +55 -0
  53. data/lib/cf_script/object/attribute.rb +18 -0
  54. data/lib/cf_script/object/attribute_list.rb +40 -0
  55. data/lib/cf_script/object/instance_status.rb +29 -0
  56. data/lib/cf_script/object/route_info.rb +14 -0
  57. data/lib/cf_script/object/space.rb +17 -0
  58. data/lib/cf_script/object/target.rb +23 -0
  59. data/lib/cf_script/object.rb +24 -0
  60. data/lib/cf_script/output/buffer.rb +74 -0
  61. data/lib/cf_script/output/parser/attributes.rb +44 -0
  62. data/lib/cf_script/output/parser/section.rb +15 -0
  63. data/lib/cf_script/output/parser/table.rb +46 -0
  64. data/lib/cf_script/output/parser.rb +15 -0
  65. data/lib/cf_script/output/tests.rb +51 -0
  66. data/lib/cf_script/output/utils.rb +13 -0
  67. data/lib/cf_script/output.rb +62 -0
  68. data/lib/cf_script/scope/app/env.rb +15 -0
  69. data/lib/cf_script/scope/app/routes.rb +21 -0
  70. data/lib/cf_script/scope/app/state.rb +33 -0
  71. data/lib/cf_script/scope/app/utils.rb +32 -0
  72. data/lib/cf_script/scope/app.rb +94 -0
  73. data/lib/cf_script/scope/proxy.rb +36 -0
  74. data/lib/cf_script/scope/script.rb +59 -0
  75. data/lib/cf_script/scope/space.rb +9 -0
  76. data/lib/cf_script/scope/target.rb +90 -0
  77. data/lib/cf_script/scope.rb +68 -0
  78. data/lib/cf_script/ui.rb +261 -0
  79. data/lib/cf_script/utils.rb +19 -0
  80. data/lib/cf_script/version.rb +3 -0
  81. data/lib/cf_script.rb +105 -0
  82. data/test/fixtures/commands/apps/app/good.yml +18 -0
  83. data/test/fixtures/commands/apps/app/not_found.yml +8 -0
  84. data/test/fixtures/commands/apps/app/running.yml +19 -0
  85. data/test/fixtures/commands/apps/apps/good.yml +14 -0
  86. data/test/fixtures/commands/apps/apps/no_apps.yml +10 -0
  87. data/test/fixtures/commands/apps/env/empty.yml +37 -0
  88. data/test/fixtures/commands/apps/env/good.yml +41 -0
  89. data/test/fixtures/commands/apps/push/good.yml +60 -0
  90. data/test/fixtures/commands/apps/restage/good.yml +48 -0
  91. data/test/fixtures/commands/apps/restage/not_found.yml +8 -0
  92. data/test/fixtures/commands/apps/restart/good.yml +35 -0
  93. data/test/fixtures/commands/apps/restart/not_found.yml +8 -0
  94. data/test/fixtures/commands/apps/set_env/empty.yml +5 -0
  95. data/test/fixtures/commands/apps/set_env/good.yml +9 -0
  96. data/test/fixtures/commands/apps/set_env/not_found.yml +8 -0
  97. data/test/fixtures/commands/apps/start/good.yml +32 -0
  98. data/test/fixtures/commands/apps/start/not_found.yml +8 -0
  99. data/test/fixtures/commands/apps/start/with_container.yml +98 -0
  100. data/test/fixtures/commands/apps/stop/good.yml +8 -0
  101. data/test/fixtures/commands/apps/stop/not_found.yml +8 -0
  102. data/test/fixtures/commands/apps/unset_env/empty.yml +5 -0
  103. data/test/fixtures/commands/apps/unset_env/good.yml +9 -0
  104. data/test/fixtures/commands/apps/unset_env/not_found.yml +8 -0
  105. data/test/fixtures/commands/common/fail.yml +5 -0
  106. data/test/fixtures/commands/common/no_endpoint.yml +11 -0
  107. data/test/fixtures/commands/common/no_login.yml +8 -0
  108. data/test/fixtures/commands/general/api/bad_argument.yml +9 -0
  109. data/test/fixtures/commands/general/api/bad_endpoint.yml +9 -0
  110. data/test/fixtures/commands/general/api/good.yml +7 -0
  111. data/test/fixtures/commands/general/api/not_set.yml +7 -0
  112. data/test/fixtures/commands/general/api/set.yml +7 -0
  113. data/test/fixtures/commands/general/auth/empty.yml +5 -0
  114. data/test/fixtures/commands/general/auth/good.yml +10 -0
  115. data/test/fixtures/commands/general/auth/rejected.yml +10 -0
  116. data/test/fixtures/commands/general/login/good.yml +8 -0
  117. data/test/fixtures/commands/general/login/rejected.yml +23 -0
  118. data/test/fixtures/commands/general/logout/good.yml +8 -0
  119. data/test/fixtures/commands/general/target/empty.yml +5 -0
  120. data/test/fixtures/commands/general/target/good.yml +11 -0
  121. data/test/fixtures/commands/general/target/no_space.yml +10 -0
  122. data/test/fixtures/commands/general/target/not_found.yml +9 -0
  123. data/test/fixtures/commands/general/target/production.yml +11 -0
  124. data/test/fixtures/commands/general/target/staging.yml +11 -0
  125. data/test/fixtures/commands/general/target/staging_org.yml +11 -0
  126. data/test/fixtures/commands/general/target/test.yml +11 -0
  127. data/test/fixtures/commands/routes/check_route/good.yml +9 -0
  128. data/test/fixtures/commands/routes/check_route/no_domain.yml +9 -0
  129. data/test/fixtures/commands/routes/check_route/no_route.yml +9 -0
  130. data/test/fixtures/commands/routes/create_route/exists.yml +9 -0
  131. data/test/fixtures/commands/routes/create_route/good.yml +8 -0
  132. data/test/fixtures/commands/routes/delete_route/good.yml +8 -0
  133. data/test/fixtures/commands/routes/delete_route/not_exist.yml +8 -0
  134. data/test/fixtures/commands/routes/map_route/good.yml +10 -0
  135. data/test/fixtures/commands/routes/map_route/host_taken.yml +10 -0
  136. data/test/fixtures/commands/routes/map_route/invalid.yml +9 -0
  137. data/test/fixtures/commands/routes/map_route/no_app.yml +8 -0
  138. data/test/fixtures/commands/routes/map_route/no_domain.yml +9 -0
  139. data/test/fixtures/commands/routes/routes/good.yml +14 -0
  140. data/test/fixtures/commands/routes/unmap_route/good.yml +8 -0
  141. data/test/fixtures/commands/routes/unmap_route/no_app.yml +8 -0
  142. data/test/fixtures/commands/routes/unmap_route/no_domain.yml +9 -0
  143. data/test/fixtures/commands/spaces/space/empty.yml +5 -0
  144. data/test/fixtures/commands/spaces/space/good.yml +16 -0
  145. data/test/fixtures/commands/spaces/space/staging.yml +16 -0
  146. data/test/fixtures/commands/spaces/spaces/empty.yml +5 -0
  147. data/test/fixtures/commands/spaces/spaces/good.yml +12 -0
  148. data/test/lib/cf_script/command/base_test.rb +21 -0
  149. data/test/lib/cf_script/command/cf/apps/app_test.rb +56 -0
  150. data/test/lib/cf_script/command/cf/apps/apps_test.rb +81 -0
  151. data/test/lib/cf_script/command/cf/apps/env_test.rb +55 -0
  152. data/test/lib/cf_script/command/cf/apps/push_test.rb +46 -0
  153. data/test/lib/cf_script/command/cf/apps/restage_test.rb +47 -0
  154. data/test/lib/cf_script/command/cf/apps/restart_test.rb +47 -0
  155. data/test/lib/cf_script/command/cf/apps/set_env_test.rb +38 -0
  156. data/test/lib/cf_script/command/cf/apps/start_test.rb +55 -0
  157. data/test/lib/cf_script/command/cf/apps/stop_test.rb +35 -0
  158. data/test/lib/cf_script/command/cf/apps/unset_env_test.rb +38 -0
  159. data/test/lib/cf_script/command/cf/general/api_test.rb +55 -0
  160. data/test/lib/cf_script/command/cf/general/auth_test.rb +76 -0
  161. data/test/lib/cf_script/command/cf/general/login_test.rb +80 -0
  162. data/test/lib/cf_script/command/cf/general/logout_test.rb +34 -0
  163. data/test/lib/cf_script/command/cf/general/target_test.rb +110 -0
  164. data/test/lib/cf_script/command/cf/routes/check_route_test.rb +31 -0
  165. data/test/lib/cf_script/command/cf/routes/create_route_test.rb +19 -0
  166. data/test/lib/cf_script/command/cf/routes/delete_route_test.rb +19 -0
  167. data/test/lib/cf_script/command/cf/routes/map_route_test.rb +56 -0
  168. data/test/lib/cf_script/command/cf/routes/routes_test.rb +24 -0
  169. data/test/lib/cf_script/command/cf/routes/unmap_route_test.rb +36 -0
  170. data/test/lib/cf_script/command/cf/spaces/space_test.rb +55 -0
  171. data/test/lib/cf_script/command/cf/spaces/spaces_test.rb +47 -0
  172. data/test/lib/cf_script/command/line_test.rb +59 -0
  173. data/test/lib/cf_script/object/api_endpoint_test.rb +19 -0
  174. data/test/lib/cf_script/object/app_info_test.rb +127 -0
  175. data/test/lib/cf_script/object/app_list_test.rb +51 -0
  176. data/test/lib/cf_script/object/attribute_list_test.rb +42 -0
  177. data/test/lib/cf_script/object/attribute_test.rb +29 -0
  178. data/test/lib/cf_script/object/instance_status_test.rb +37 -0
  179. data/test/lib/cf_script/object/space_test.rb +31 -0
  180. data/test/lib/cf_script/object/target_test.rb +41 -0
  181. data/test/lib/cf_script/output/buffer_test.rb +73 -0
  182. data/test/lib/cf_script/output/parser/attributes_test.rb +102 -0
  183. data/test/lib/cf_script/output/parser/section_test.rb +60 -0
  184. data/test/lib/cf_script/output/parser/table_test.rb +108 -0
  185. data/test/lib/cf_script/output/tests_test.rb +91 -0
  186. data/test/lib/cf_script/output_test.rb +134 -0
  187. data/test/lib/cf_script/scope/app/state_test.rb +61 -0
  188. data/test/lib/cf_script/scope/app_test.rb +101 -0
  189. data/test/lib/cf_script/scope/script_test.rb +88 -0
  190. data/test/lib/cf_script/scope/space_test.rb +27 -0
  191. data/test/lib/cf_script/scope/target_test.rb +158 -0
  192. data/test/lib/cf_script/scope_test.rb +41 -0
  193. data/test/lib/cf_script/utils_test.rb +20 -0
  194. data/test/lib/cf_script_test.rb +73 -0
  195. data/test/support/assertions.rb +14 -0
  196. data/test/support/helpers/config_context.rb +19 -0
  197. data/test/support/helpers/fixture_executor.rb +79 -0
  198. data/test/support/helpers/mock_execution.rb +58 -0
  199. data/test/support/helpers/object_helpers.rb +29 -0
  200. data/test/support/helpers/output_sink.rb +25 -0
  201. data/test/support/helpers.rb +3 -0
  202. data/test/support/shared_examples/command_object.rb +38 -0
  203. data/test/support/shared_examples.rb +30 -0
  204. data/test/test_helper.rb +34 -0
  205. metadata +321 -0
@@ -0,0 +1,59 @@
1
+ require 'test_helper'
2
+
3
+ describe CfScript::Command::Line do
4
+ subject { CfScript::Command::Line }
5
+
6
+ it "initializes bin, name, args, options, and flags" do
7
+ line = subject.new({ foo: :bar}, 'bin', :test, :dummy, [:arg1, :arg2, { i: 1, o: 2, flags: [:s] }])
8
+
9
+ assert_equal 'bin', line.bin
10
+ assert_equal :dummy, line.name
11
+ assert_equal [:arg1, :arg2], line.args
12
+ assert_equal({ i: 1, o: 2 }, line.options)
13
+ assert_equal [:s], line.flags
14
+ end
15
+
16
+ describe "line" do
17
+ it "returns a formatted command line" do
18
+ line = subject.new({}, 'cf', :test, :dummy, [:arg1, :arg2, { i: 1, o: 2, flags: [:s] }])
19
+
20
+ assert_equal 'cf dummy arg1 arg2 -i 1 -o 2 -s', line.line
21
+ end
22
+
23
+ it "formats long flag names" do
24
+ line = subject.new({}, 'cf', :test, :dummy, [:arg1, { i: 1, flags: [:some_thing] }])
25
+
26
+ assert_equal 'cf dummy arg1 -i 1 --some-thing', line.line
27
+ end
28
+
29
+ it "pass preformatted flags as is" do
30
+ line = subject.new({}, 'cf', :test, :dummy, [:arg1, { i: 1, flags: ['--one', '--foo-bar'] }])
31
+
32
+ assert_equal 'cf dummy arg1 -i 1 --one --foo-bar', line.line
33
+ end
34
+ end
35
+
36
+ it "hides password for auth command" do
37
+ line = subject.new({}, 'cf', :test, :auth, ['username', 'password'])
38
+
39
+ assert_equal 'cf auth username [PASSWORD HIDDEN]', line.hide_sensitive
40
+ end
41
+
42
+ it "hides password for login command" do
43
+ options = [
44
+ { p: 'word', u: 'name', a: 'work' },
45
+ { u: 'name', p: 'word', a: 'work' },
46
+ { u: 'name', a: 'work', p: 'word' },
47
+ ]
48
+
49
+ options.each do |test|
50
+ line = subject.new({}, 'cf', :test, :login, [test])
51
+ text = line.hide_sensitive
52
+
53
+ assert_match /cf login /, text
54
+ assert_match /-p \[PASSWORD HIDDEN\]/, text
55
+ assert_match /-u name/, text
56
+ assert_match /-a work/, text
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,19 @@
1
+ require 'test_helper'
2
+
3
+ describe CfScript::ApiEndpoint do
4
+ subject { CfScript::ApiEndpoint }
5
+
6
+ it "initializes all attributes to sensible defaults" do
7
+ api_endpoint = subject.new
8
+
9
+ assert_equal nil, api_endpoint.url
10
+ assert_equal nil, api_endpoint.version
11
+ end
12
+
13
+ it "sets all given attributes" do
14
+ api_endpoint = subject.new('URL', '123')
15
+
16
+ assert_equal 'URL', api_endpoint.url
17
+ assert_equal '123', api_endpoint.version
18
+ end
19
+ end
@@ -0,0 +1,127 @@
1
+ require 'test_helper'
2
+
3
+ describe CfScript::AppInfo do
4
+ include ObjectHelpers
5
+
6
+ attr_reader :urls
7
+ attr_reader :last_uploaded
8
+ attr_reader :buildpack
9
+
10
+ attr_accessor :empty_attrs
11
+ attr_accessor :apps_attrs
12
+ attr_accessor :app_attrs
13
+ attr_accessor :instance_attrs
14
+
15
+ def setup
16
+ @urls = 'projects.example.com, projects.example.io'
17
+ @last_uploaded = 'Fri Dec 25 00:00:00 UTC 2015'
18
+ @buildpack = 'https://github.com/cloudfoundry/binary-buildpack.git'
19
+
20
+ @empty_attrs = CfScript::AttributeList.new
21
+
22
+ @apps_attrs = build_attribute_list(
23
+ requested_state: 'started',
24
+ instances: '1/2',
25
+ memory: '1G',
26
+ disk: '2G',
27
+ urls: @urls,
28
+ )
29
+
30
+ @app_attrs = build_attribute_list(
31
+ requested_state: 'started',
32
+ instances: '1/2',
33
+ usage: '1G x 1 instances',
34
+ urls: @urls,
35
+ last_uploaded: @last_uploaded,
36
+ stack: 'cflinuxfs2',
37
+ buildpack: @buildpack,
38
+ )
39
+ end
40
+
41
+ it "initializes missing attributes to sensible defaults" do
42
+ info = CfScript::AppInfo.new('name', empty_attrs)
43
+
44
+ assert_equal 'name', info.name
45
+ assert_equal nil, info.requested_state
46
+ assert_equal nil, info.instances
47
+ assert_equal [], info.urls
48
+ assert_equal nil, info.usage
49
+ assert_equal nil, info.last_uploaded
50
+ assert_equal nil, info.stack
51
+ assert_equal nil, info.buildpack
52
+ assert_equal nil, info.memory
53
+ assert_equal nil, info.disk
54
+ end
55
+
56
+ it "sets apps command attributes when given" do
57
+ info = CfScript::AppInfo.new('projects', apps_attrs)
58
+
59
+ assert_equal 'projects', info.name
60
+ assert_equal 'started', info.requested_state
61
+ assert_equal '1/2', info.instances
62
+ assert_equal 2, info.urls.length
63
+ assert_equal 'projects.example.com', info.urls.first
64
+ assert_equal 'projects.example.io', info.urls.last
65
+ assert_equal nil, info.usage
66
+ assert_equal nil, info.last_uploaded
67
+ assert_equal nil, info.stack
68
+ assert_equal nil, info.buildpack
69
+ assert_equal '1G', info.memory
70
+ assert_equal '2G', info.disk
71
+ end
72
+
73
+ it "sets app command attributes when given" do
74
+ info = CfScript::AppInfo.new('projects', app_attrs)
75
+
76
+ assert_equal 'projects', info.name
77
+ assert_equal 'started', info.requested_state
78
+ assert_equal '1/2', info.instances
79
+ assert_equal 2, info.urls.length
80
+ assert_equal 'projects.example.com', info.urls.first
81
+ assert_equal 'projects.example.io', info.urls.last
82
+ assert_equal '1G x 1 instances', info.usage
83
+ assert_equal last_uploaded, info.last_uploaded
84
+ assert_equal 'cflinuxfs2', info.stack
85
+ assert_equal buildpack, info.buildpack
86
+ assert_equal '1G', info.memory # Extracted from usage
87
+ assert_equal nil, info.disk
88
+ end
89
+
90
+ it "defines state method that return value of requested_state" do
91
+ info = CfScript::AppInfo.new('projects', app_attrs)
92
+
93
+ assert_respond_to info, :state
94
+ assert_equal 'started', info.state
95
+ end
96
+
97
+ it "defines started? and stopped? methods and hot?, cold? aliases" do
98
+ info = CfScript::AppInfo.new('projects', app_attrs)
99
+
100
+ assert_respond_to info, :started?
101
+ assert_respond_to info, :hot?
102
+
103
+ assert_respond_to info, :stopped?
104
+ assert_respond_to info, :cold?
105
+
106
+ assert info.started?
107
+ assert info.hot?
108
+
109
+ refute info.stopped?
110
+ refute info.cold?
111
+ end
112
+
113
+ it "defines set_intance_status method that takes attribute lists and builds InstanceStatus objects" do
114
+ info = CfScript::AppInfo.new('projects', app_attrs)
115
+
116
+ info.set_instance_status [
117
+ build_instance_status_attrs(index: '0'),
118
+ build_instance_status_attrs(index: '1'),
119
+ build_instance_status_attrs(index: '2'),
120
+ ]
121
+
122
+ assert_equal 3, info.instance_status.length
123
+ assert_equal '0', info.instance_status[0].index
124
+ assert_equal '1', info.instance_status[1].index
125
+ assert_equal '2', info.instance_status[2].index
126
+ end
127
+ end
@@ -0,0 +1,51 @@
1
+ require 'test_helper'
2
+
3
+ describe CfScript::AppList do
4
+ include ObjectHelpers
5
+
6
+ attr_accessor :list
7
+
8
+ def setup
9
+ one_attrs = build_attribute_list(
10
+ requested_state: 'started',
11
+ urls: 'example.com',
12
+ )
13
+
14
+ two_attrs = build_attribute_list(
15
+ requested_state: 'stopped',
16
+ urls: 'example.com',
17
+ )
18
+
19
+ @list = CfScript::AppList.new([
20
+ CfScript::AppInfo.new('one-worker', one_attrs),
21
+ CfScript::AppInfo.new('two-engine', two_attrs),
22
+ ])
23
+ end
24
+
25
+ it "initializes list to an empty Array" do
26
+ app_list = CfScript::AppList.new
27
+
28
+ assert_equal 0, app_list.length
29
+ end
30
+
31
+ it "selects by prefix" do
32
+ list.select!(ending_with: 'worker')
33
+
34
+ assert_equal 1, list.length
35
+ assert_equal 'one-worker', list.first.name
36
+ end
37
+
38
+ it "selects by suffix" do
39
+ list.select!(starting_with: 'two')
40
+
41
+ assert_equal 1, list.length
42
+ assert_equal 'two-engine', list.first.name
43
+ end
44
+
45
+ it "selects by state" do
46
+ list.select!(state: 'stopped')
47
+
48
+ assert_equal 1, list.length
49
+ assert_equal 'two-engine', list.first.name
50
+ end
51
+ end
@@ -0,0 +1,42 @@
1
+ require 'test_helper'
2
+
3
+ describe CfScript::AttributeList do
4
+ subject {
5
+ CfScript::AttributeList.new([
6
+ CfScript::Attribute.new('one', 'UNO'),
7
+ CfScript::Attribute.new('two', 'DUE'),
8
+ ])
9
+ }
10
+
11
+ it "defines << method that adds attributes to the list" do
12
+ subject << CfScript::Attribute.new('six', 'SEI')
13
+
14
+ assert_equal 3, subject.length
15
+ end
16
+
17
+ it "raises an exception when duplicate attributes are added" do
18
+ e = assert_raises(RuntimeError) {
19
+ subject << CfScript::Attribute.new('one', 'DUPLICATE')
20
+ }
21
+
22
+ assert_equal "Duplicate attribute 'one'", e.message
23
+ end
24
+
25
+ it "delegates [] method to the underlying Hash" do
26
+ assert_equal 'UNO', subject['one'].value
27
+ end
28
+
29
+ it "defines a names method that returns an Array of attribute names" do
30
+ assert_equal ['one', 'two'], subject.names
31
+ end
32
+
33
+ it "defines a values method that returns an Array of attribute values" do
34
+ assert_equal ['UNO', 'DUE'], subject.values
35
+ end
36
+
37
+ it "defines a to_h method that returns a Hash representation of the attributes" do
38
+ expected = { 'one' => 'UNO', 'two' => 'DUE' }
39
+
40
+ assert_equal expected, subject.to_h
41
+ end
42
+ end
@@ -0,0 +1,29 @@
1
+ require 'test_helper'
2
+
3
+ describe CfScript::Attribute do
4
+ subject { CfScript::Attribute }
5
+
6
+ it "preserves the name and value as given" do
7
+ { :foo => :bar,
8
+ 'foo' => 'bar'
9
+ }.each do |name, value|
10
+ var = subject.new(name, value)
11
+
12
+ assert_equal name, var.name
13
+ assert_equal value, var.value
14
+ end
15
+ end
16
+
17
+ it "defines to_a methods that splits the value on commas + zero or more space" do
18
+ var = subject.new('list', 'a, b, c,d')
19
+
20
+ assert_equal ['a', 'b', 'c', 'd'], var.to_a
21
+ end
22
+
23
+ it "defines a to_s that returns a formatted string representation" do
24
+ var = subject.new(:foo, :bar)
25
+
26
+ assert_equal "foo: bar", var.to_s
27
+ assert_equal "foo: bar", var.inspect
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ require 'test_helper'
2
+
3
+ describe CfScript::InstanceStatus do
4
+ include ObjectHelpers
5
+
6
+ attr_accessor :instance_status
7
+
8
+ def setup
9
+ @instance_status = build_instance_status
10
+ end
11
+
12
+ it "initializes all attributes to sensible defaults" do
13
+ status = CfScript::InstanceStatus.new
14
+
15
+ assert_equal nil, status.index
16
+ assert_equal nil, status.state
17
+ assert_equal nil, status.since
18
+ assert_equal nil, status.cpu
19
+ assert_equal nil, status.memory
20
+ assert_equal nil, status.disk
21
+ assert_equal nil, status.details
22
+ end
23
+
24
+ it "initializes given attributes" do
25
+ assert_equal '0', @instance_status.index
26
+ assert_equal '1', @instance_status.state
27
+ assert_equal '2', @instance_status.since
28
+ assert_equal '3', @instance_status.cpu
29
+ assert_equal '4', @instance_status.memory
30
+ assert_equal '5', @instance_status.disk
31
+ assert_equal '6', @instance_status.details
32
+ end
33
+
34
+ it "shows requested attributes" do
35
+ assert_equal 'since: 2, memory: 4', @instance_status.show(:since, :memory)
36
+ end
37
+ end
@@ -0,0 +1,31 @@
1
+ require 'test_helper'
2
+
3
+ describe CfScript::Space do
4
+ subject { CfScript::Space }
5
+
6
+ it "initializes all attributes to sensible defaults" do
7
+ space = subject.new('outer-space')
8
+
9
+ assert_equal 'outer-space', space.name
10
+
11
+ assert_equal nil, space.org
12
+
13
+ assert_equal [], space.apps
14
+ assert_equal [], space.domains
15
+ assert_equal [], space.services
16
+ assert_equal [], space.security_groups
17
+ end
18
+
19
+ it "sets all given attributes" do
20
+ space = subject.new('space', 'ORG', [:app], [:domain], [:service], [:security])
21
+
22
+ assert_equal 'space', space.name
23
+
24
+ assert_equal 'ORG', space.org
25
+
26
+ assert_equal [:app], space.apps
27
+ assert_equal [:domain], space.domains
28
+ assert_equal [:service], space.services
29
+ assert_equal [:security], space.security_groups
30
+ end
31
+ end
@@ -0,0 +1,41 @@
1
+ require 'test_helper'
2
+
3
+ describe CfScript::Target do
4
+ subject { CfScript::Target }
5
+
6
+ it "initializes all attributes to sensible defaults" do
7
+ target = subject.new
8
+
9
+ assert_equal '', target.api_endpoint
10
+ assert_equal '', target.org
11
+ assert_equal '', target.space
12
+ assert_equal nil, target.user
13
+ end
14
+
15
+ describe "to_options" do
16
+ it "returns an empty Hash when org and space are not set" do
17
+ options = subject.new.to_options
18
+
19
+ assert_instance_of Hash, options
20
+ assert_equal({}, options)
21
+ end
22
+
23
+ it "returns a Hash with org and space when set" do
24
+ options = subject.new('api', 'ORG', 'SPACE', 'user@example.com').to_options
25
+
26
+ assert_equal({ o: 'ORG', s: 'SPACE' }, options)
27
+ end
28
+
29
+ it "returns a Hash with org when set" do
30
+ options = subject.new('api', 'ORG').to_options
31
+
32
+ assert_equal({ o: 'ORG' }, options)
33
+ end
34
+
35
+ it "returns a Hash with the space when set" do
36
+ options = subject.new('api', '', 'SPACE').to_options
37
+
38
+ assert_equal({ s: 'SPACE' }, options)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,73 @@
1
+ require 'test_helper'
2
+
3
+ describe CfScript::Output::Buffer do
4
+ attr_accessor :buffer
5
+ attr_accessor :raw_text
6
+
7
+ def setup
8
+ @raw_text = "\e[4;31;42mline 1\e[0m\n" +
9
+ "\e[4;32;44mline 2\e[0m\n" +
10
+ "\e[4;34;41mline 3\e[0m\n"
11
+
12
+ @buffer = CfScript::Output::Buffer.new(@raw_text)
13
+ end
14
+
15
+ it "responds to raw and returns a original text" do
16
+ assert buffer.respond_to?(:raw)
17
+ assert_equal raw_text, buffer.raw
18
+ end
19
+
20
+ it "responds to content and returns a sanitized copy" do
21
+ assert buffer.respond_to?(:content)
22
+ assert_equal "line 1\nline 2\nline 3\n", buffer.content
23
+ end
24
+
25
+ it "responds to lines and returns sanitized lines" do
26
+ assert buffer.respond_to?(:lines)
27
+ assert_equal ['line 1', 'line 2', 'line 3'], buffer.lines
28
+ end
29
+
30
+ it "responds to last_line and returns last line content" do
31
+ assert_equal 'line 3', buffer.last_line
32
+ end
33
+
34
+ it "responds to subscript and returns matching range" do
35
+ assert_equal '1', buffer[5]
36
+ assert_equal 'line 2', buffer[7..12]
37
+ assert_equal 'line 3', buffer[14..-2]
38
+ end
39
+
40
+ it "responds to each_line and yields each line" do
41
+ buffer.each_line.with_index do |line, index|
42
+ assert_equal buffer.lines[index], line.strip
43
+ end
44
+ end
45
+
46
+ it "responds to from and returns text from matching line" do
47
+ assert_equal "line 2\nline 3", buffer.from('2')
48
+ end
49
+
50
+ it "responds to lines_from and returns lines from matching line" do
51
+ assert_equal ['line 2','line 3'], buffer.lines_from('2')
52
+ end
53
+
54
+ it "responds to match and returns MatchData object" do
55
+ assert_instance_of MatchData, buffer.match(/2/)
56
+ assert_equal nil, buffer.match(/4/)
57
+ end
58
+
59
+ it "responds to matches? and returns true or false" do
60
+ assert buffer.matches?(/2/)
61
+ refute buffer.matches?(/4/)
62
+ end
63
+
64
+ it "responds to contains? and returns true or false" do
65
+ assert buffer.contains?('2')
66
+ refute buffer.contains?('4')
67
+ end
68
+
69
+ it "responds to last_line_matches? and returns true or false" do
70
+ assert buffer.last_line_matches?(/3/)
71
+ refute buffer.last_line_matches?(/4/)
72
+ end
73
+ end
@@ -0,0 +1,102 @@
1
+ require 'test_helper'
2
+
3
+ describe CfScript::Output::Parser::Attributes do
4
+ attr_accessor :parser
5
+
6
+ attr_accessor :text_buffer
7
+ attr_accessor :line_buffer
8
+ attr_accessor :line_regexp
9
+
10
+ class AttributesParserTest
11
+ include CfScript::Utils
12
+ include CfScript::Output::Parser::Attributes
13
+ include CfScript::Output::Parser::Section
14
+ end
15
+
16
+ def setup
17
+ @parser = AttributesParserTest.new
18
+
19
+ @text_buffer = "" +
20
+ "one: first \n" +
21
+ " two: second \n" +
22
+ "tre : last\n"
23
+
24
+ @line_buffer = "one: first , two: second, tre: last "
25
+ @line_regexp = /one: (?<one>[^,]+), two: (?<two>[^,]+), tre: (?<tre>.+)/
26
+ end
27
+
28
+ describe "parse_attribute" do
29
+ it "returns an Attribute object" do
30
+ attr = parser.parse_attribute(text_buffer.lines[0])
31
+
32
+ assert_instance_of CfScript::Attribute, attr
33
+ assert_equal 'one', attr.name
34
+ assert_equal 'first', attr.value
35
+ end
36
+
37
+ it "symbolizes attribute names when specified" do
38
+ attr = parser.parse_attribute(text_buffer.lines[0], true)
39
+
40
+ assert_equal :one, attr.name
41
+ end
42
+
43
+ it "strips preceeding/following whitespace" do
44
+ tests = [
45
+ ['one', 'first'],
46
+ ['two', 'second'],
47
+ ['tre', 'last'],
48
+ ]
49
+
50
+ tests.each_with_index do |pair, index|
51
+ attr = parser.parse_attribute(text_buffer.lines[index])
52
+
53
+ assert_equal pair.first, attr.name
54
+ assert_equal pair.last, attr.value
55
+ end
56
+ end
57
+ end
58
+
59
+ describe "parse_attribute_list" do
60
+ it "returns an AttributeList object" do
61
+ list = parser.parse_attribute_list(text_buffer)
62
+
63
+ assert_instance_of CfScript::AttributeList, list
64
+ assert_equal 3, list.length
65
+ end
66
+
67
+ it "symbolizes attribute names when specified" do
68
+ list = parser.parse_attribute_list(text_buffer, true)
69
+
70
+ assert_equal [:one, :two, :tre], list.names
71
+ end
72
+ end
73
+
74
+ describe "parse_line_attributes" do
75
+ it "returns an AttributeList object" do
76
+ list = parser.parse_line_attributes(line_buffer, line_regexp)
77
+
78
+ assert_instance_of CfScript::AttributeList, list
79
+ assert_equal 3, list.length
80
+ end
81
+
82
+ it "symbolizes attribute names" do
83
+ list = parser.parse_line_attributes(line_buffer, line_regexp)
84
+
85
+ assert_equal [:one, :two, :tre], list.names
86
+ end
87
+
88
+ it "strips preceeding/following whitespace" do
89
+ tests = [
90
+ [:one, 'first'],
91
+ [:two, 'second'],
92
+ [:tre, 'last'],
93
+ ]
94
+
95
+ list = parser.parse_line_attributes(line_buffer, line_regexp)
96
+ tests.each_with_index do |pair, index|
97
+ assert_equal pair.first, list[list.names[index]].name
98
+ assert_equal pair.last, list[list.names[index]].value
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,60 @@
1
+ require 'test_helper'
2
+
3
+ describe CfScript::Output::Parser::Section do
4
+ attr_accessor :parser
5
+
6
+ attr_accessor :text_buffer
7
+
8
+ class SectionParserTest
9
+ include CfScript::Utils
10
+ include CfScript::Output::Parser::Attributes
11
+ include CfScript::Output::Parser::Section
12
+ end
13
+
14
+ def setup
15
+ @parser = SectionParserTest.new
16
+
17
+ @text_buffer = "\n" +
18
+ "Something else going on here\n" +
19
+ "Section Title:\n" +
20
+ " one: 1\n" +
21
+ " two: 2\n" +
22
+ " tre: 3\n" +
23
+ "\nSomething else"
24
+ end
25
+
26
+ describe "extract_section" do
27
+ it "returns extracted text" do
28
+ section = parser.extract_section(text_buffer, 'Section Title')
29
+
30
+ assert_equal " one: 1\n two: 2\n tre: 3", section
31
+ end
32
+ end
33
+
34
+ describe "parse_section_attributes" do
35
+ it "calls parse_attribute_list" do
36
+ parser.stub :parse_attribute_list, 'called' do
37
+ assert_equal 'called', parser.parse_section_attributes(text_buffer, 'Section Title')
38
+ end
39
+ end
40
+
41
+ it "returns an AttributeList object" do
42
+ list = parser.parse_section_attributes(text_buffer, 'Section Title')
43
+
44
+ assert_instance_of CfScript::AttributeList, list
45
+ assert_equal 3, list.length
46
+ end
47
+
48
+ it "doesn't symbolize attribute names" do
49
+ list = parser.parse_section_attributes(text_buffer, 'Section Title')
50
+
51
+ assert_equal ['one', 'two', 'tre'], list.names
52
+ end
53
+
54
+ it "returns nil if the section title is not found" do
55
+ list = parser.parse_section_attributes(text_buffer, 'NOPE')
56
+
57
+ assert_equal nil, list
58
+ end
59
+ end
60
+ end