MuranoCLI 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +28 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +21 -0
  5. data/Gemfile +27 -0
  6. data/LICENSE.txt +19 -0
  7. data/MuranoCLI.gemspec +50 -0
  8. data/MuranoCLI.iss +50 -0
  9. data/README.markdown +208 -0
  10. data/Rakefile +188 -0
  11. data/TODO.taskpaper +122 -0
  12. data/bin/mr +8 -0
  13. data/bin/murano +84 -0
  14. data/docs/demo.md +109 -0
  15. data/lib/MrMurano/Account.rb +211 -0
  16. data/lib/MrMurano/Config-Migrate.rb +47 -0
  17. data/lib/MrMurano/Config.rb +286 -0
  18. data/lib/MrMurano/Mock.rb +63 -0
  19. data/lib/MrMurano/Product-1P-Device.rb +145 -0
  20. data/lib/MrMurano/Product-Resources.rb +195 -0
  21. data/lib/MrMurano/Product.rb +358 -0
  22. data/lib/MrMurano/ProjectFile.rb +349 -0
  23. data/lib/MrMurano/Solution-Cors.rb +46 -0
  24. data/lib/MrMurano/Solution-Endpoint.rb +177 -0
  25. data/lib/MrMurano/Solution-File.rb +150 -0
  26. data/lib/MrMurano/Solution-ServiceConfig.rb +140 -0
  27. data/lib/MrMurano/Solution-Services.rb +326 -0
  28. data/lib/MrMurano/Solution-Users.rb +129 -0
  29. data/lib/MrMurano/Solution.rb +59 -0
  30. data/lib/MrMurano/SubCmdGroupContext.rb +49 -0
  31. data/lib/MrMurano/SyncUpDown.rb +565 -0
  32. data/lib/MrMurano/commands/assign.rb +57 -0
  33. data/lib/MrMurano/commands/businessList.rb +45 -0
  34. data/lib/MrMurano/commands/completion.rb +152 -0
  35. data/lib/MrMurano/commands/config.rb +67 -0
  36. data/lib/MrMurano/commands/content.rb +130 -0
  37. data/lib/MrMurano/commands/cors.rb +30 -0
  38. data/lib/MrMurano/commands/domain.rb +17 -0
  39. data/lib/MrMurano/commands/gb.rb +33 -0
  40. data/lib/MrMurano/commands/init.rb +138 -0
  41. data/lib/MrMurano/commands/keystore.rb +157 -0
  42. data/lib/MrMurano/commands/logs.rb +78 -0
  43. data/lib/MrMurano/commands/mock.rb +63 -0
  44. data/lib/MrMurano/commands/password.rb +88 -0
  45. data/lib/MrMurano/commands/postgresql.rb +41 -0
  46. data/lib/MrMurano/commands/product.rb +14 -0
  47. data/lib/MrMurano/commands/productCreate.rb +39 -0
  48. data/lib/MrMurano/commands/productDelete.rb +33 -0
  49. data/lib/MrMurano/commands/productDevice.rb +84 -0
  50. data/lib/MrMurano/commands/productDeviceIdCmds.rb +86 -0
  51. data/lib/MrMurano/commands/productList.rb +45 -0
  52. data/lib/MrMurano/commands/productWrite.rb +27 -0
  53. data/lib/MrMurano/commands/show.rb +80 -0
  54. data/lib/MrMurano/commands/solution.rb +14 -0
  55. data/lib/MrMurano/commands/solutionCreate.rb +39 -0
  56. data/lib/MrMurano/commands/solutionDelete.rb +34 -0
  57. data/lib/MrMurano/commands/solutionList.rb +45 -0
  58. data/lib/MrMurano/commands/status.rb +92 -0
  59. data/lib/MrMurano/commands/sync.rb +60 -0
  60. data/lib/MrMurano/commands/timeseries.rb +115 -0
  61. data/lib/MrMurano/commands/tsdb.rb +271 -0
  62. data/lib/MrMurano/commands/usage.rb +23 -0
  63. data/lib/MrMurano/commands/zshcomplete.erb +112 -0
  64. data/lib/MrMurano/commands.rb +32 -0
  65. data/lib/MrMurano/hash.rb +20 -0
  66. data/lib/MrMurano/http.rb +153 -0
  67. data/lib/MrMurano/makePretty.rb +75 -0
  68. data/lib/MrMurano/schema/pf-v1.0.0.yaml +114 -0
  69. data/lib/MrMurano/schema/sf-v0.2.0.yaml +77 -0
  70. data/lib/MrMurano/schema/sf-v0.3.0.yaml +78 -0
  71. data/lib/MrMurano/template/mock.erb +9 -0
  72. data/lib/MrMurano/template/projectFile.murano.erb +81 -0
  73. data/lib/MrMurano/verbosing.rb +99 -0
  74. data/lib/MrMurano/version.rb +4 -0
  75. data/lib/MrMurano.rb +20 -0
  76. data/spec/Account-Passwords_spec.rb +242 -0
  77. data/spec/Account_spec.rb +272 -0
  78. data/spec/ConfigFile_spec.rb +50 -0
  79. data/spec/ConfigMigrate_spec.rb +89 -0
  80. data/spec/Config_spec.rb +409 -0
  81. data/spec/Http_spec.rb +204 -0
  82. data/spec/MakePretties_spec.rb +118 -0
  83. data/spec/Mock_spec.rb +53 -0
  84. data/spec/ProductBase_spec.rb +113 -0
  85. data/spec/ProductContent_spec.rb +162 -0
  86. data/spec/ProductResources_spec.rb +329 -0
  87. data/spec/Product_1P_Device_spec.rb +202 -0
  88. data/spec/Product_1P_RPC_spec.rb +175 -0
  89. data/spec/Product_spec.rb +153 -0
  90. data/spec/ProjectFile_spec.rb +324 -0
  91. data/spec/Solution-Cors_spec.rb +164 -0
  92. data/spec/Solution-Endpoint_spec.rb +581 -0
  93. data/spec/Solution-File_spec.rb +212 -0
  94. data/spec/Solution-ServiceConfig_spec.rb +202 -0
  95. data/spec/Solution-ServiceDevice_spec.rb +176 -0
  96. data/spec/Solution-ServiceEventHandler_spec.rb +385 -0
  97. data/spec/Solution-ServiceModules_spec.rb +465 -0
  98. data/spec/Solution-UsersRoles_spec.rb +207 -0
  99. data/spec/Solution_spec.rb +92 -0
  100. data/spec/SyncRoot_spec.rb +83 -0
  101. data/spec/SyncUpDown_spec.rb +495 -0
  102. data/spec/Verbosing_spec.rb +279 -0
  103. data/spec/_workspace.rb +27 -0
  104. data/spec/cmd_assign_spec.rb +51 -0
  105. data/spec/cmd_business_spec.rb +59 -0
  106. data/spec/cmd_common.rb +72 -0
  107. data/spec/cmd_config_spec.rb +68 -0
  108. data/spec/cmd_content_spec.rb +71 -0
  109. data/spec/cmd_cors_spec.rb +50 -0
  110. data/spec/cmd_device_spec.rb +96 -0
  111. data/spec/cmd_domain_spec.rb +32 -0
  112. data/spec/cmd_init_spec.rb +30 -0
  113. data/spec/cmd_keystore_spec.rb +97 -0
  114. data/spec/cmd_password_spec.rb +62 -0
  115. data/spec/cmd_status_spec.rb +239 -0
  116. data/spec/cmd_syncdown_spec.rb +86 -0
  117. data/spec/cmd_syncup_spec.rb +62 -0
  118. data/spec/cmd_usage_spec.rb +36 -0
  119. data/spec/fixtures/.mrmuranorc +9 -0
  120. data/spec/fixtures/ProjectFiles/invalid.yaml +9 -0
  121. data/spec/fixtures/ProjectFiles/only_meta.yaml +24 -0
  122. data/spec/fixtures/ProjectFiles/with_routes.yaml +27 -0
  123. data/spec/fixtures/SolutionFiles/0.2.0.json +20 -0
  124. data/spec/fixtures/SolutionFiles/0.2.0_invalid.json +18 -0
  125. data/spec/fixtures/SolutionFiles/0.2.json +21 -0
  126. data/spec/fixtures/SolutionFiles/0.3.0.json +20 -0
  127. data/spec/fixtures/SolutionFiles/0.3.0_invalid.json +19 -0
  128. data/spec/fixtures/SolutionFiles/0.3.json +20 -0
  129. data/spec/fixtures/SolutionFiles/basic.json +20 -0
  130. data/spec/fixtures/SolutionFiles/secret.json +6 -0
  131. data/spec/fixtures/configfile +9 -0
  132. data/spec/fixtures/dumped_config +42 -0
  133. data/spec/fixtures/mrmuranorc_deleted_bob +8 -0
  134. data/spec/fixtures/mrmuranorc_tool_bob +3 -0
  135. data/spec/fixtures/product_spec_files/example.exoline.spec.yaml +116 -0
  136. data/spec/fixtures/product_spec_files/example.murano.spec.yaml +14 -0
  137. data/spec/fixtures/product_spec_files/gwe.exoline.spec.yaml +21 -0
  138. data/spec/fixtures/product_spec_files/gwe.murano.spec.yaml +16 -0
  139. data/spec/fixtures/product_spec_files/lightbulb-no-state.yaml +11 -0
  140. data/spec/fixtures/product_spec_files/lightbulb.yaml +14 -0
  141. data/spec/fixtures/roles-three.yaml +11 -0
  142. data/spec/fixtures/syncable_content/assets/icon.png +0 -0
  143. data/spec/fixtures/syncable_content/assets/index.html +0 -0
  144. data/spec/fixtures/syncable_content/assets/js/script.js +0 -0
  145. data/spec/fixtures/syncable_content/modules/table_util.lua +58 -0
  146. data/spec/fixtures/syncable_content/routes/manyRoutes.lua +11 -0
  147. data/spec/fixtures/syncable_content/routes/singleRoute.lua +5 -0
  148. data/spec/fixtures/syncable_content/services/devdata.lua +18 -0
  149. data/spec/fixtures/syncable_content/services/timers.lua +4 -0
  150. data/spec/spec_helper.rb +119 -0
  151. metadata +498 -0
@@ -0,0 +1,279 @@
1
+ require 'highline/import'
2
+ require 'MrMurano/version'
3
+ require 'MrMurano/hash'
4
+ require 'MrMurano/verbosing'
5
+ require 'MrMurano/Config'
6
+ require '_workspace'
7
+
8
+ class VTst
9
+ include MrMurano::Verbose
10
+ def initialize
11
+ @token = nil
12
+ end
13
+ end
14
+ RSpec.describe MrMurano::Verbose do
15
+ include_context "WORKSPACE"
16
+
17
+ before(:example) do
18
+ $cfg = MrMurano::Config.new
19
+ $cfg.load
20
+ @tst = VTst.new
21
+ end
22
+
23
+ it "verboses" do
24
+ $cfg['tool.verbose'] = true
25
+ expect($terminal).to receive(:say).with('hello').once
26
+ @tst.verbose "hello"
27
+ end
28
+
29
+ it "is quiet" do
30
+ expect($terminal).to_not receive(:say)
31
+ @tst.verbose "hello"
32
+ end
33
+
34
+ it "debugs" do
35
+ $cfg['tool.debug'] = true
36
+ expect($terminal).to receive(:say).with('hello').once
37
+ @tst.debug "hello"
38
+ end
39
+
40
+ it "warns" do
41
+ expect($stderr).to receive(:puts).with("\e[33mhello\e[0m").once
42
+ @tst.warning "hello"
43
+ end
44
+
45
+ it "errors" do
46
+ expect($stderr).to receive(:puts).with("\e[31mhello\e[0m").once
47
+ @tst.error "hello"
48
+ end
49
+
50
+ context "tabularize" do
51
+ context "generating CSV" do
52
+ before(:example) do
53
+ $cfg['tool.outformat'] = 'csv'
54
+ end
55
+
56
+ it "takes Array" do
57
+ $stdout = StringIO.new
58
+
59
+ @tst.tabularize([[1,2,3,4,5,6,7],[10,20,30,40,50,60,70]])
60
+
61
+ expect($stdout.string).to eq("1,2,3,4,5,6,7\n10,20,30,40,50,60,70\n")
62
+ end
63
+
64
+ it "ducks to_a" do
65
+ $stdout = StringIO.new
66
+
67
+ class DuckToATest
68
+ def to_a
69
+ [[12],[13]]
70
+ end
71
+ end
72
+ @tst.tabularize(DuckToATest.new)
73
+
74
+ expect($stdout.string).to eq("12\n13\n")
75
+ end
76
+
77
+ it "ducks each" do
78
+ $stdout = StringIO.new
79
+
80
+ class DuckEachTest
81
+ def each(&block)
82
+ yield [22]
83
+ yield [44]
84
+ end
85
+ end
86
+ @tst.tabularize(DuckEachTest.new)
87
+
88
+ expect($stdout.string).to eq("22\n44\n")
89
+ end
90
+
91
+ context "takes Hash" do
92
+ before(:example) do
93
+ @hsh = {
94
+ :headers => [:one, :two, :three],
95
+ :title => "Test output",
96
+ :rows => [[1,2,3], [10,20,30]]
97
+ }
98
+ $stdout = StringIO.new
99
+ end
100
+ it "has all" do
101
+ @tst.tabularize(@hsh)
102
+ expect($stdout.string).to eq("one,two,three\n1,2,3\n10,20,30\n")
103
+ end
104
+
105
+ it "is empty" do
106
+ @tst.tabularize({})
107
+ expect($stdout.string).to eq("\n")
108
+ end
109
+
110
+ it "no headers" do
111
+ @hsh.delete :headers
112
+ @tst.tabularize(@hsh)
113
+ expect($stdout.string).to eq("1,2,3\n10,20,30\n")
114
+ end
115
+
116
+ it "no title" do
117
+ @hsh.delete :title
118
+ @tst.tabularize(@hsh)
119
+ expect($stdout.string).to eq("one,two,three\n1,2,3\n10,20,30\n")
120
+ end
121
+
122
+ it "no rows" do
123
+ @hsh.delete :rows
124
+ @tst.tabularize(@hsh)
125
+ expect($stdout.string).to eq("one,two,three\n\n")
126
+ end
127
+ end
128
+
129
+ it "errors if it can't" do
130
+ $stdout = StringIO.new
131
+ expect(@tst).to receive(:error).with("Don't know how to tabularize data.").once
132
+ @tst.tabularize(12)
133
+ end
134
+
135
+ it "takes Array, to custom stream" do
136
+ $stdout = StringIO.new
137
+ outer = StringIO.new
138
+
139
+ @tst.tabularize([[1,2,3,4,5,6,7],[10,20,30,40,50,60,70]], outer)
140
+
141
+ expect(outer.string).to eq("1,2,3,4,5,6,7\n10,20,30,40,50,60,70\n")
142
+ expect($stdout.string).to eq('')
143
+ end
144
+ end
145
+
146
+ context "generating a table" do
147
+ it "takes Array" do
148
+ $stdout = StringIO.new
149
+ @tst.tabularize([[1,2,3,4,5,6,7],[10,20,30,40,50,60,70]])
150
+ expect($stdout.string).to eq(
151
+ %{+----+----+----+----+----+----+----+
152
+ | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
153
+ | 10 | 20 | 30 | 40 | 50 | 60 | 70 |
154
+ +----+----+----+----+----+----+----+
155
+ }.gsub(/^\s+/,'')
156
+ )
157
+ end
158
+
159
+ context "takes Hash" do
160
+ before(:example) do
161
+ @hsh = {
162
+ :headers => [:one, :two, :three],
163
+ :title => "Test output",
164
+ :rows => [[1,2,3], [10,20,30]]
165
+ }
166
+ $stdout = StringIO.new
167
+ end
168
+ it "has all" do
169
+ @tst.tabularize(@hsh)
170
+ expect($stdout.string).to eq(
171
+ %{+-----+-----+-------+
172
+ | Test output |
173
+ +-----+-----+-------+
174
+ | one | two | three |
175
+ +-----+-----+-------+
176
+ | 1 | 2 | 3 |
177
+ | 10 | 20 | 30 |
178
+ +-----+-----+-------+
179
+ }.gsub(/^\s+/,'')
180
+ )
181
+ end
182
+
183
+ it "is empty" do
184
+ @tst.tabularize({})
185
+ expect($stdout.string).to eq("++\n++\n")
186
+ end
187
+
188
+ it "no headers" do
189
+ @hsh.delete :headers
190
+ @tst.tabularize(@hsh)
191
+ expect($stdout.string).to eq(
192
+ %{+----+----+----+
193
+ | Test output |
194
+ +----+----+----+
195
+ | 1 | 2 | 3 |
196
+ | 10 | 20 | 30 |
197
+ +----+----+----+
198
+ }.gsub(/^\s+/,'')
199
+ )
200
+ end
201
+
202
+ it "no title" do
203
+ @hsh.delete :title
204
+ @tst.tabularize(@hsh)
205
+ expect($stdout.string).to eq(
206
+ %{+-----+-----+-------+
207
+ | one | two | three |
208
+ +-----+-----+-------+
209
+ | 1 | 2 | 3 |
210
+ | 10 | 20 | 30 |
211
+ +-----+-----+-------+
212
+ }.gsub(/^\s+/,'')
213
+ )
214
+ end
215
+
216
+ it "no rows" do
217
+ @hsh.delete :rows
218
+ @tst.tabularize(@hsh)
219
+ expect($stdout.string).to eq(
220
+ %{+-----+-----+-------+
221
+ | Test output |
222
+ +-----+-----+-------+
223
+ | one | two | three |
224
+ +-----+-----+-------+
225
+ +-----+-----+-------+
226
+ }
227
+ )
228
+ end
229
+ end
230
+ end
231
+ end
232
+
233
+ context "outf" do
234
+ before(:example) do
235
+ @data = {
236
+ :one => "three",
237
+ :two => [ { :one => 3 }, { :one => 4} ]
238
+ }
239
+ $stdout = StringIO.new
240
+ end
241
+
242
+ it "outputs yaml" do
243
+ $cfg['tool.outformat'] = 'yaml'
244
+ @tst.outf(@data)
245
+ expect($stdout.string).to eq("---\none: three\ntwo:\n- one: 3\n- one: 4\n")
246
+ end
247
+
248
+ it "outputs json" do
249
+ $cfg['tool.outformat'] = 'json'
250
+ @tst.outf(@data)
251
+ expect($stdout.string).to eq("{\"one\":\"three\",\"two\":[{\"one\":3},{\"one\":4}]}\n")
252
+ end
253
+
254
+ it "outputs ruby" do
255
+ $cfg['tool.outformat'] = 'pp'
256
+ @tst.outf(@data)
257
+ expect($stdout.string).to eq("{:one=>\"three\", :two=>[{:one=>3}, {:one=>4}]}\n")
258
+ end
259
+
260
+ it "outputs as String" do
261
+ @tst.outf(@data)
262
+ expect($stdout.string).to eq("{:one=>\"three\", :two=>[{:one=>3}, {:one=>4}]}\n")
263
+ end
264
+
265
+ it "outputs as Array" do
266
+ @tst.outf([1,2,3,4,5])
267
+ expect($stdout.string).to eq("1\n2\n3\n4\n5\n")
268
+ end
269
+
270
+ it "returns to block" do
271
+ @tst.outf(@data) do |dd, ios|
272
+ ios.puts "pop"
273
+ end
274
+ expect($stdout.string).to eq("pop\n")
275
+ end
276
+ end
277
+
278
+ end
279
+ # vim: set ai et sw=2 ts=2 :
@@ -0,0 +1,27 @@
1
+ require 'pathname'
2
+ require 'fileutils'
3
+ require 'tmpdir'
4
+
5
+ RSpec.shared_context "WORKSPACE" do
6
+
7
+ around(:example) do |ex|
8
+ @testdir = Pathname.new(Dir.pwd).realpath
9
+ Dir.mktmpdir do |hdir|
10
+ @tmpdir = hdir
11
+ saved_home = ENV['HOME']
12
+ # Set ENV to override output of Dir.home
13
+ ENV['HOME'] = File.join(hdir, 'home')
14
+ FileUtils.mkpath(ENV['HOME'])
15
+ Dir.chdir(hdir) do
16
+ @projectDir = File.join(ENV['HOME'], 'work', 'project')
17
+ FileUtils.mkpath(@projectDir)
18
+ Dir.chdir(@projectDir) do
19
+ ex.run
20
+ end
21
+ end
22
+ ENV['HOME'] = saved_home
23
+ end
24
+ end
25
+ end
26
+
27
+ # vim: set ai et sw=2 ts=2 :
@@ -0,0 +1,51 @@
1
+ require 'fileutils'
2
+ require 'open3'
3
+ require 'pathname'
4
+ require 'cmd_common'
5
+
6
+ RSpec.describe 'murano assign', :cmd, :needs_password do
7
+ include_context "CI_CMD"
8
+
9
+ before(:example) do
10
+ @project_name = rname('assigntest')
11
+ out, err, status = Open3.capture3(capcmd('murano', 'solution', 'create', @project_name, '--save'))
12
+ expect(err).to eq('')
13
+ expect(out.chomp).to match(/^[a-zA-Z0-9]+$/)
14
+ expect(status.exitstatus).to eq(0)
15
+
16
+ out, err, status = Open3.capture3(capcmd('murano', 'product', 'create', @project_name, '--save'))
17
+ expect(err).to eq('')
18
+ expect(out.chomp).to match(/^[a-zA-Z0-9]+$/)
19
+ expect(status.exitstatus).to eq(0)
20
+ end
21
+ after(:example) do
22
+ out, err, status = Open3.capture3(capcmd('murano', 'solution', 'delete', @project_name))
23
+ expect(out).to eq('')
24
+ expect(err).to eq('')
25
+ expect(status.exitstatus).to eq(0)
26
+
27
+ out, err, status = Open3.capture3(capcmd('murano', 'product', 'delete', @project_name))
28
+ expect(out).to eq('')
29
+ expect(err).to eq('')
30
+ expect(status.exitstatus).to eq(0)
31
+ end
32
+
33
+ it "status" do
34
+ out, err, status = Open3.capture3(capcmd('murano', 'assign', 'set'))
35
+ expect(out).to eq('')
36
+ expect(err).to eq('')
37
+ expect(status.exitstatus).to eq(0)
38
+
39
+ out, err, status = Open3.capture3(capcmd('murano', 'assign', 'list'))
40
+ expect(err).to eq('')
41
+ olines = out.lines
42
+ expect(olines[0]).to match(/^(\+-+){2}\+$/)
43
+ expect(olines[1]).to match(/^\| Label\s+\| ModelID\s+\|$/)
44
+ expect(olines[2]).to match(/^(\+-+){2}\+$/)
45
+ expect(olines[-1]).to match(/^(\+-+){2}\+$/)
46
+ expect(status.exitstatus).to eq(0)
47
+ end
48
+
49
+ end
50
+
51
+ # vim: set ai et sw=2 ts=2 :
@@ -0,0 +1,59 @@
1
+ require 'fileutils'
2
+ require 'open3'
3
+ require 'pathname'
4
+ require 'cmd_common'
5
+
6
+ RSpec.describe 'murano business', :cmd, :needs_password do
7
+ include_context "CI_CMD"
8
+
9
+ context "list" do
10
+ it "as table" do
11
+ out, err, status = Open3.capture3(capcmd('murano', 'business', 'list'))
12
+ expect(err).to eq("")
13
+ olines = out.lines
14
+ expect(olines[0]).to match(/^(\+-+){3}\+$/)
15
+ expect(olines[1]).to match(/^\| bizid\s+\| role\s+\| name\s+\|$/)
16
+ expect(olines[2]).to match(/^(\+-+){3}\+$/)
17
+ expect(olines[-1]).to match(/^(\+-+){3}\+$/)
18
+ expect(status.exitstatus).to eq(0)
19
+ end
20
+
21
+ it "as json" do
22
+ out, err, status = Open3.capture3(capcmd('murano', 'business', 'list', '-c', 'outformat=json'))
23
+ expect(err).to eq("")
24
+ expect{JSON.parse(out)}.to_not raise_error
25
+ expect(status.exitstatus).to eq(0)
26
+ end
27
+
28
+ it "only ids" do
29
+ out, err, status = Open3.capture3(capcmd('murano', 'business', 'list', '--idonly'))
30
+ expect(err).to eq("")
31
+ expect(out).to match(/^(\S+\s)*\S+$/)
32
+ expect(status.exitstatus).to eq(0)
33
+ end
34
+
35
+ it "output to file" do
36
+ out, err, status = Open3.capture3(capcmd('murano', 'business', 'list', '--idonly', '-o', 'bob'))
37
+ expect(err).to eq("")
38
+ expect(out).to eq('')
39
+ expect(status.exitstatus).to eq(0)
40
+ expect(File.exist?('bob')).to be true
41
+ data = IO.read('bob')
42
+ expect(data).to match(/^(\S+\s)*\S+$/)
43
+ end
44
+
45
+ it "all fields" do
46
+ out, err, status = Open3.capture3(capcmd('murano', 'business', 'list', '--all'))
47
+ expect(err).to eq("")
48
+ olines = out.lines
49
+ expect(olines[0]).to match(/^(\+-+)+\+$/)
50
+ expect(olines[1]).to match(/^(\| \S+\s+)+\|$/)
51
+ expect(olines[2]).to match(/^(\+-+)+\+$/)
52
+ expect(olines[-1]).to match(/^(\+-+)+\+$/)
53
+ expect(status.exitstatus).to eq(0)
54
+ end
55
+
56
+ end
57
+ end
58
+
59
+ # vim: set ai et sw=2 ts=2 :
@@ -0,0 +1,72 @@
1
+ require 'pathname'
2
+ require 'shellwords'
3
+ require 'timeout'
4
+ require 'tmpdir'
5
+
6
+ RSpec.shared_context "CI_CMD" do
7
+ def capcmd(*args)
8
+ args = [args] unless args.kind_of? Array
9
+ args.flatten!
10
+ testdir = File.realpath(@testdir.to_s)
11
+ if ENV['CI_MR_EXE'].nil? then
12
+ args[0] = File.join(testdir, 'bin', args[0])
13
+ args.unshift("ruby", "-I#{File.join(testdir, 'lib')}")
14
+ else
15
+ args[0] = File.join(testdir, (args[0] + '.exe'))
16
+ end
17
+ args.push '--trace'
18
+ args.push '-c', 'fullerror'
19
+
20
+ if Gem.win_platform? then
21
+ cmd = args.map do |i|
22
+ case i
23
+ when /[ ]/
24
+ %{"#{i}"}
25
+ when /[\*#]/
26
+ i.gsub(/([\*#])/,'^\1')
27
+ else
28
+ i
29
+ end
30
+ end.join(' ')
31
+ else
32
+ cmd = Shellwords.join(args)
33
+ end
34
+ #pp cmd
35
+ cmd
36
+ end
37
+
38
+ def rname(name)
39
+ "#{name}-#{Random.new.rand.hash.abs.to_s(16)}"
40
+ end
41
+
42
+ around(:example) do |ex|
43
+ @testdir = Pathname.new(Dir.pwd).realpath
44
+ Dir.mktmpdir do |hdir|
45
+ ENV['HOME'] = hdir
46
+ Dir.chdir(hdir) do
47
+ Dir.mkdir('.murano')
48
+ unless ENV['MURANO_USER'].nil? then
49
+ File.open(File.join('.murano', 'config'), 'a') do |io|
50
+ io << "[user]\n"
51
+ io << "name = #{ENV['MURANO_USER']}\n"
52
+ end
53
+ end
54
+ unless ENV['MURANO_BUSINESS'].nil? then
55
+ File.open(File.join('.murano', 'config'), 'a') do |io|
56
+ io << "[business]\n"
57
+ io << "id = #{ENV['MURANO_BUSINESS']}\n"
58
+ end
59
+ end
60
+ @tmpdir = File.join(hdir, 'project')
61
+ Dir.mkdir(@tmpdir)
62
+ Dir.chdir(@tmpdir) do
63
+ Timeout::timeout(300) do
64
+ ex.run
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ # vim: set ai et sw=2 ts=2 :