MuranoCLI 2.2.4 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. checksums.yaml +4 -4
  2. data/.agignore +3 -0
  3. data/.gitignore +18 -1
  4. data/.rubocop.yml +222 -0
  5. data/.trustme.sh +185 -0
  6. data/.trustme.vim +24 -0
  7. data/Gemfile +23 -4
  8. data/LICENSE.txt +1 -1
  9. data/MuranoCLI.gemspec +43 -8
  10. data/README.markdown +9 -11
  11. data/Rakefile +187 -143
  12. data/TODO.taskpaper +2 -2
  13. data/bin/murano +51 -52
  14. data/docs/basic_example.rst +436 -0
  15. data/docs/completions/murano_completion-bash +3484 -0
  16. data/docs/demo.md +32 -32
  17. data/docs/develop.rst +391 -0
  18. data/lib/MrMurano.rb +21 -7
  19. data/lib/MrMurano/Account.rb +159 -174
  20. data/lib/MrMurano/Business.rb +381 -0
  21. data/lib/MrMurano/Config-Migrate.rb +32 -26
  22. data/lib/MrMurano/Config.rb +407 -128
  23. data/lib/MrMurano/Content.rb +191 -0
  24. data/lib/MrMurano/Gateway.rb +489 -0
  25. data/lib/MrMurano/Keystore.rb +48 -0
  26. data/lib/MrMurano/Passwords.rb +103 -0
  27. data/lib/MrMurano/ProjectFile.rb +121 -79
  28. data/lib/MrMurano/ReCommander.rb +114 -10
  29. data/lib/MrMurano/Setting.rb +90 -0
  30. data/lib/MrMurano/Solution-ServiceConfig.rb +89 -45
  31. data/lib/MrMurano/Solution-Services.rb +461 -166
  32. data/lib/MrMurano/Solution-Users.rb +70 -31
  33. data/lib/MrMurano/Solution.rb +372 -13
  34. data/lib/MrMurano/SolutionId.rb +73 -0
  35. data/lib/MrMurano/SyncRoot.rb +137 -0
  36. data/lib/MrMurano/SyncUpDown.rb +594 -284
  37. data/lib/MrMurano/Webservice-Cors.rb +71 -0
  38. data/lib/MrMurano/Webservice-Endpoint.rb +234 -0
  39. data/lib/MrMurano/Webservice-File.rb +193 -0
  40. data/lib/MrMurano/Webservice.rb +51 -0
  41. data/lib/MrMurano/commands.rb +18 -15
  42. data/lib/MrMurano/commands/business.rb +300 -6
  43. data/lib/MrMurano/commands/completion-bash.erb +166 -0
  44. data/lib/MrMurano/commands/{zshcomplete.erb → completion-zsh.erb} +0 -0
  45. data/lib/MrMurano/commands/completion.rb +76 -39
  46. data/lib/MrMurano/commands/config.rb +108 -44
  47. data/lib/MrMurano/commands/content.rb +115 -72
  48. data/lib/MrMurano/commands/cors.rb +29 -14
  49. data/lib/MrMurano/commands/devices.rb +286 -0
  50. data/lib/MrMurano/commands/domain.rb +52 -12
  51. data/lib/MrMurano/commands/gb.rb +24 -9
  52. data/lib/MrMurano/commands/globals.rb +64 -0
  53. data/lib/MrMurano/commands/init.rb +377 -155
  54. data/lib/MrMurano/commands/keystore.rb +92 -82
  55. data/lib/MrMurano/commands/link.rb +300 -0
  56. data/lib/MrMurano/commands/login.rb +74 -11
  57. data/lib/MrMurano/commands/logs.rb +63 -32
  58. data/lib/MrMurano/commands/mock.rb +57 -29
  59. data/lib/MrMurano/commands/password.rb +57 -39
  60. data/lib/MrMurano/commands/postgresql.rb +127 -94
  61. data/lib/MrMurano/commands/settings.rb +203 -0
  62. data/lib/MrMurano/commands/show.rb +79 -38
  63. data/lib/MrMurano/commands/solution.rb +423 -5
  64. data/lib/MrMurano/commands/solution_picker.rb +547 -0
  65. data/lib/MrMurano/commands/status.rb +195 -61
  66. data/lib/MrMurano/commands/sync.rb +78 -39
  67. data/lib/MrMurano/commands/timeseries.rb +71 -55
  68. data/lib/MrMurano/commands/tsdb.rb +113 -87
  69. data/lib/MrMurano/commands/usage.rb +57 -15
  70. data/lib/MrMurano/hash.rb +100 -10
  71. data/lib/MrMurano/http.rb +187 -43
  72. data/lib/MrMurano/makePretty.rb +16 -14
  73. data/lib/MrMurano/optparse.rb +2178 -0
  74. data/lib/MrMurano/progress.rb +138 -0
  75. data/lib/MrMurano/schema/resource-v1.0.0.yaml +32 -0
  76. data/lib/MrMurano/template/projectFile.murano.erb +16 -13
  77. data/lib/MrMurano/verbosing.rb +166 -29
  78. data/lib/MrMurano/version.rb +30 -1
  79. data/spec/Account-Passwords_spec.rb +21 -4
  80. data/spec/Account_spec.rb +69 -146
  81. data/spec/Business_spec.rb +290 -0
  82. data/spec/ConfigFile_spec.rb +1 -0
  83. data/spec/ConfigMigrate_spec.rb +12 -8
  84. data/spec/Config_spec.rb +40 -34
  85. data/spec/Content_spec.rb +363 -0
  86. data/spec/GatewayBase_spec.rb +54 -0
  87. data/spec/GatewayDevice_spec.rb +321 -0
  88. data/spec/GatewayResource_spec.rb +266 -0
  89. data/spec/GatewaySettings_spec.rb +120 -0
  90. data/spec/Http_spec.rb +18 -8
  91. data/spec/Mock_spec.rb +2 -2
  92. data/spec/ProjectFile_spec.rb +25 -14
  93. data/spec/Setting_spec.rb +110 -0
  94. data/spec/Solution-ServiceConfig_spec.rb +44 -5
  95. data/spec/Solution-ServiceEventHandler_spec.rb +23 -14
  96. data/spec/Solution-ServiceModules_spec.rb +47 -37
  97. data/spec/Solution-UsersRoles_spec.rb +10 -8
  98. data/spec/Solution_spec.rb +17 -8
  99. data/spec/SyncRoot_spec.rb +46 -20
  100. data/spec/SyncUpDown_spec.rb +437 -201
  101. data/spec/Verbosing_spec.rb +12 -4
  102. data/spec/{Solution-Cors_spec.rb → Webservice-Cors_spec.rb} +23 -20
  103. data/spec/{Solution-Endpoint_spec.rb → Webservice-Endpoint_spec.rb} +43 -41
  104. data/spec/{Solution-File_spec.rb → Webservice-File_spec.rb} +44 -33
  105. data/spec/Webservice-Setting_spec.rb +89 -0
  106. data/spec/_workspace.rb +4 -4
  107. data/spec/cmd_business_spec.rb +9 -4
  108. data/spec/cmd_common.rb +44 -1
  109. data/spec/cmd_content_spec.rb +43 -17
  110. data/spec/cmd_cors_spec.rb +4 -4
  111. data/spec/cmd_device_spec.rb +61 -16
  112. data/spec/cmd_domain_spec.rb +29 -6
  113. data/spec/cmd_init_spec.rb +281 -126
  114. data/spec/cmd_keystore_spec.rb +3 -3
  115. data/spec/cmd_link_spec.rb +98 -0
  116. data/spec/cmd_password_spec.rb +1 -1
  117. data/spec/cmd_setting_application_spec.rb +260 -0
  118. data/spec/cmd_setting_product_spec.rb +220 -0
  119. data/spec/cmd_status_spec.rb +223 -114
  120. data/spec/cmd_syncdown_spec.rb +115 -35
  121. data/spec/cmd_syncup_spec.rb +68 -15
  122. data/spec/cmd_usage_spec.rb +35 -8
  123. data/spec/fixtures/dumped_config +6 -4
  124. data/spec/fixtures/gateway_resource_files/resources.notyaml +12 -0
  125. data/spec/fixtures/gateway_resource_files/resources.yaml +13 -0
  126. data/spec/fixtures/gateway_resource_files/resources_invalid.yaml +13 -0
  127. data/spec/fixtures/mrmuranorc_deleted_bob +0 -2
  128. data/spec/fixtures/product_spec_files/lightbulb.yaml +20 -13
  129. data/spec/fixtures/{syncable_content → syncable_conflict}/services/devdata.lua +1 -1
  130. data/spec/fixtures/{syncable_content → syncable_conflict}/services/timers.lua +0 -0
  131. data/spec/spec_helper.rb +5 -0
  132. metadata +262 -171
  133. data/bin/mr +0 -8
  134. data/lib/MrMurano/Product-1P-Device.rb +0 -145
  135. data/lib/MrMurano/Product-Resources.rb +0 -205
  136. data/lib/MrMurano/Product.rb +0 -358
  137. data/lib/MrMurano/Solution-Cors.rb +0 -47
  138. data/lib/MrMurano/Solution-Endpoint.rb +0 -191
  139. data/lib/MrMurano/Solution-File.rb +0 -166
  140. data/lib/MrMurano/commands/assign.rb +0 -57
  141. data/lib/MrMurano/commands/businessList.rb +0 -45
  142. data/lib/MrMurano/commands/product.rb +0 -14
  143. data/lib/MrMurano/commands/productCreate.rb +0 -39
  144. data/lib/MrMurano/commands/productDelete.rb +0 -33
  145. data/lib/MrMurano/commands/productDevice.rb +0 -87
  146. data/lib/MrMurano/commands/productDeviceIdCmds.rb +0 -89
  147. data/lib/MrMurano/commands/productList.rb +0 -45
  148. data/lib/MrMurano/commands/productWrite.rb +0 -27
  149. data/lib/MrMurano/commands/solutionCreate.rb +0 -41
  150. data/lib/MrMurano/commands/solutionDelete.rb +0 -34
  151. data/lib/MrMurano/commands/solutionList.rb +0 -45
  152. data/spec/ProductBase_spec.rb +0 -113
  153. data/spec/ProductContent_spec.rb +0 -162
  154. data/spec/ProductResources_spec.rb +0 -329
  155. data/spec/Product_1P_Device_spec.rb +0 -202
  156. data/spec/Product_1P_RPC_spec.rb +0 -175
  157. data/spec/Product_spec.rb +0 -153
  158. data/spec/Solution-ServiceDevice_spec.rb +0 -176
  159. data/spec/cmd_assign_spec.rb +0 -51
@@ -0,0 +1,89 @@
1
+ require 'tempfile'
2
+ require 'yaml'
3
+ require 'MrMurano/version'
4
+ require 'MrMurano/ProjectFile'
5
+ require 'MrMurano/SyncRoot'
6
+ require 'MrMurano/Webservice-Cors'
7
+ require '_workspace'
8
+
9
+ RSpec.describe MrMurano::Webservice::Settings do
10
+ include_context "WORKSPACE"
11
+ before(:example) do
12
+ MrMurano::SyncRoot.instance.reset
13
+ $cfg = MrMurano::Config.new
14
+ $cfg.load
15
+ $cfg['net.host'] = 'bizapi.hosted.exosite.io'
16
+ $cfg['application.id'] = 'XYZ'
17
+
18
+ @srv = MrMurano::Webservice::Settings.new
19
+ allow(@srv).to receive(:token).and_return("TTTTTTTTTT")
20
+
21
+ @baseURI = "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/cors"
22
+ end
23
+
24
+ it "initializes" do
25
+ uri = @srv.endpoint('/')
26
+ expect(uri.to_s).to eq("#{@baseURI}/")
27
+ end
28
+
29
+ context "when server gives string" do
30
+ context "fetches" do
31
+ it "as a hash" do
32
+ cors = {:origin=>true,
33
+ :methods=>["HEAD","GET","POST","PUT","DELETE","OPTIONS","PATCH"],
34
+ :headers=>["Content-Type","Cookie","Authorization"],
35
+ :credentials=>true}
36
+ body = cors
37
+ stub_request(:get, "#{@baseURI}").
38
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
39
+ 'Content-Type'=>'application/json'}).
40
+ to_return(body: body.to_json)
41
+
42
+ ret = @srv.cors
43
+ expect(ret).to eq(cors)
44
+ end
45
+ end
46
+ end
47
+
48
+ context "when server gives object" do
49
+ context "fetches" do
50
+ it "as a hash" do
51
+ cors = {:origin=>true,
52
+ :methods=>["HEAD","GET","POST","PUT","DELETE","OPTIONS","PATCH"],
53
+ :headers=>["Content-Type","Cookie","Authorization"],
54
+ :credentials=>true}
55
+ body = cors
56
+ stub_request(:get, "#{@baseURI}").
57
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
58
+ 'Content-Type'=>'application/json'}).
59
+ to_return(body: body.to_json)
60
+
61
+ ret = @srv.cors
62
+ expect(ret).to eq(cors)
63
+ end
64
+ end
65
+ end
66
+
67
+ context "uploads" do
68
+ before(:example) do
69
+ $project = MrMurano::ProjectFile.new
70
+ $project.load
71
+ @cors = {:origin=>true,
72
+ :methods=>["HEAD","GET","POST","PUT","DELETE","OPTIONS","PATCH"],
73
+ :headers=>["Content-Type","Cookie","Authorization"],
74
+ :credentials=>true}
75
+ end
76
+ it "sets" do
77
+ stub_request(:put, "#{@baseURI}").
78
+ with(:body=>@cors.to_json,
79
+ :headers=>{'Authorization'=>'token TTTTTTTTTT',
80
+ 'Content-Type'=>'application/json'}).
81
+ to_return(body: "")
82
+
83
+ ret = @srv.cors=(@cors)
84
+ expect(ret).to eq(@cors)
85
+ end
86
+ end
87
+
88
+ end
89
+ # vim: set ai et sw=2 ts=2 :
@@ -1,5 +1,5 @@
1
- require 'pathname'
2
1
  require 'fileutils'
2
+ require 'pathname'
3
3
  require 'tmpdir'
4
4
 
5
5
  RSpec.shared_context "WORKSPACE" do
@@ -13,9 +13,9 @@ RSpec.shared_context "WORKSPACE" do
13
13
  ENV['HOME'] = File.join(hdir, 'home')
14
14
  FileUtils.mkpath(ENV['HOME'])
15
15
  Dir.chdir(hdir) do
16
- @projectDir = File.join(ENV['HOME'], 'work', 'project')
17
- FileUtils.mkpath(@projectDir)
18
- Dir.chdir(@projectDir) do
16
+ @project_dir = File.join(ENV['HOME'], 'work', 'project')
17
+ FileUtils.mkpath(@project_dir)
18
+ Dir.chdir(@project_dir) do
19
19
  ex.run
20
20
  end
21
21
  end
@@ -1,3 +1,10 @@
1
+ # Last Modified: 2017.08.17 /coding: utf-8
2
+ # frozen_string_literal: probably not yet
3
+
4
+ # Copyright © 2016-2017 Exosite LLC.
5
+ # License: MIT. See LICENSE.txt.
6
+ # vim:tw=0:ts=2:sw=2:et:ai
7
+
1
8
  require 'fileutils'
2
9
  require 'open3'
3
10
  require 'pathname'
@@ -42,8 +49,8 @@ RSpec.describe 'murano business', :cmd, :needs_password do
42
49
  expect(data).to match(/^(\S+\s)*\S+$/)
43
50
  end
44
51
 
45
- it "all fields" do
46
- out, err, status = Open3.capture3(capcmd('murano', 'business', 'list', '--all'))
52
+ it "fewer fields" do
53
+ out, err, status = Open3.capture3(capcmd('murano', 'business', 'list', '--brief'))
47
54
  expect(err).to eq("")
48
55
  olines = out.lines
49
56
  expect(olines[0]).to match(/^(\+-+)+\+$/)
@@ -52,8 +59,6 @@ RSpec.describe 'murano business', :cmd, :needs_password do
52
59
  expect(olines[-1]).to match(/^(\+-+)+\+$/)
53
60
  expect(status.exitstatus).to eq(0)
54
61
  end
55
-
56
62
  end
57
63
  end
58
64
 
59
- # vim: set ai et sw=2 ts=2 :
@@ -2,6 +2,7 @@ require 'pathname'
2
2
  require 'shellwords'
3
3
  require 'timeout'
4
4
  require 'tmpdir'
5
+ require 'MrMurano/Config'
5
6
 
6
7
  RSpec.shared_context "CI_CMD" do
7
8
  def capcmd(*args)
@@ -16,6 +17,8 @@ RSpec.shared_context "CI_CMD" do
16
17
  end
17
18
  args.push '--trace'
18
19
  args.push '-c', 'fullerror'
20
+ # The spinner output would make it hard to write expects().
21
+ args.push '--no-progress'
19
22
 
20
23
  if Gem.win_platform? then
21
24
  cmd = args.map do |i|
@@ -36,7 +39,45 @@ RSpec.shared_context "CI_CMD" do
36
39
  end
37
40
 
38
41
  def rname(name)
39
- "#{name}-#{Random.new.rand.hash.abs.to_s(16)}"
42
+ #"#{name}-#{Random.new.rand.hash.abs.to_s(16)}"
43
+ # MUR-2454: Product name may only contain letters and numbers.
44
+ #"#{name}#{Random.new.rand.hash.abs.to_s(16)}"
45
+ # MUR-XXXX: Product name must be lowercase.
46
+ # 2017-06-01: From [cr]: "I'll be having bizapi convert to lower case
47
+ # in the short term, and pegasus is updating to allow upper case."
48
+ # LATER: Remove .downcase once PAAS fixed.
49
+ "#{name.downcase}#{Random.new.rand.hash.abs.to_s(16)}"
50
+ end
51
+
52
+ def mk_symlink
53
+ # Make it easy to debug tests, e.g., add breakpoint before capcmd('murano', ...)
54
+ # run test, then open another terminal window and `cd /tmp/murcli-test`.
55
+ # NOTE: When run on Jenkins, Dir.tmpdir() returns the path to the project directory!
56
+ # Since this is for DEVs only, we can hack around this.
57
+ tmpdir = Dir.tmpdir()
58
+ return unless tmpdir == '/tmp'
59
+ @dev_symlink = File.join(tmpdir, "murcli-test")
60
+ FileUtils.rm(@dev_symlink, :force => true)
61
+ begin
62
+ FileUtils.ln_s(Dir.pwd, @dev_symlink)
63
+ rescue NotImplementedError => err
64
+ # This happens on Windows...
65
+ require 'rbconfig'
66
+ # Check the platform, e.g., "linux-gnu", or other.
67
+ is_windows = (RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/)
68
+ $stderr.puts(
69
+ "Unexpected: ln_s failed on non-Windows machine / host_os: #{RbConfig::CONFIG['host_os']} / err: #{err}"
70
+ ) unless is_windows
71
+ end
72
+ end
73
+
74
+ def rm_symlink
75
+ FileUtils.rm(@dev_symlink, :force => true) if defined?(@dev_symlink)
76
+ end
77
+
78
+ before(:example) do
79
+ $cfg = MrMurano::Config.new
80
+ $cfg.load
40
81
  end
41
82
 
42
83
  around(:example) do |ex|
@@ -48,9 +89,11 @@ RSpec.shared_context "CI_CMD" do
48
89
  @tmpdir = File.join(hdir, 'project')
49
90
  Dir.mkdir(@tmpdir)
50
91
  Dir.chdir(@tmpdir) do
92
+ mk_symlink
51
93
  Timeout::timeout(300) do
52
94
  ex.run
53
95
  end
96
+ rm_symlink
54
97
  end
55
98
  end
56
99
  end
@@ -1,49 +1,68 @@
1
1
  require 'fileutils'
2
2
  require 'open3'
3
3
  require 'pathname'
4
+ require 'yaml'
4
5
  require 'cmd_common'
5
6
 
6
7
  RSpec.describe 'murano content', :cmd, :needs_password do
7
8
  include_context "CI_CMD"
8
9
 
9
10
  before(:example) do
10
- @project_name = rname('contestTest')
11
- out, err, status = Open3.capture3(capcmd('murano', 'product', 'create', @project_name, '--save'))
11
+ @product_name = rname('contestTest')
12
+ out, err, status = Open3.capture3(capcmd('murano', 'product', 'create', @product_name, '--save'))
12
13
  expect(err).to eq('')
13
14
  expect(out.chomp).to match(/^[a-zA-Z0-9]+$/)
14
15
  expect(status.exitstatus).to eq(0)
15
16
  end
16
17
  after(:example) do
17
- out, err, status = Open3.capture3(capcmd('murano', 'product', 'delete', @project_name))
18
+ out, err, status = Open3.capture3(capcmd('murano', 'solution', 'delete', '--yes', @product_name))
18
19
  expect(out).to eq('')
19
20
  expect(err).to eq('')
20
21
  expect(status.exitstatus).to eq(0)
21
22
  end
22
23
 
23
-
24
24
  it "life cycle" do
25
25
  out, err, status = Open3.capture3(capcmd('murano', 'content', 'list'))
26
- expect(out).to eq('')
27
- expect(err).to eq('')
26
+ #expect(out.lines).to match([
27
+ # a_string_matching(/^(\+-+){2}\+$/),
28
+ # a_string_matching(/^\| Name\s+\| Size\s+\|$/),
29
+ # a_string_matching(/^(\+-+){2}\+$/),
30
+ # a_string_matching(/^(\+-+){2}\+$/),
31
+ #])
32
+ #expect(err).to eq('')
33
+ expect(out.lines).to match([])
34
+ expect(err).to eq("\e[33mDid not find any content\e[0m\n")
28
35
  expect(status.exitstatus).to eq(0)
29
36
 
30
- FileUtils.copy(File.join(@testdir, 'spec/fixtures/dumped_config'), 'dumped_config')
31
- out, err, status = Open3.capture3(capcmd('murano', 'content', 'upload', 'myFile', 'dumped_config', '--meta', 'random junk'))
37
+ FileUtils.copy(File.join(@testdir, 'spec/fixtures/dumped_config'), 'myFile')
38
+ out, err, status = Open3.capture3(capcmd('murano', 'content', 'upload', 'myFile', '--tags', 'random=junk'))
32
39
  expect(out).to eq('')
33
40
  expect(err).to eq('')
34
41
  expect(status.exitstatus).to eq(0)
35
42
 
36
43
  out, err, status = Open3.capture3(capcmd('murano', 'content', 'list'))
37
- expect(out).to eq("myFile\n")
38
44
  expect(err).to eq('')
45
+ expect(out.lines).to match([
46
+ a_string_matching(/^(\+-+){2}\+$/),
47
+ a_string_matching(/^\| Name\s+\| Size\s+\|$/),
48
+ a_string_matching(/^(\+-+){2}\+$/),
49
+ a_string_matching(/^\| myFile\s+\| \d+\s+\|$/),
50
+ a_string_matching(/^(\+-+){2}\+$/),
51
+ ])
39
52
  expect(status.exitstatus).to eq(0)
40
53
 
41
54
  out, err, status = Open3.capture3(capcmd('murano', 'content', 'info', 'myFile'))
42
55
  expect(err).to eq('')
43
- olines = out.lines
44
- expect(olines[0]).to match(/^(\+-+){5}\+$/)
45
- expect(olines[1]).to match(/^\| \S+\s+\| \d+\s+\| \d+\s+\| random junk\s+\| (false|true)\s+\|$/)
46
- expect(olines[2]).to match(/^(\+-+){5}\+$/)
56
+ expect{out = YAML.load(out)}.to_not raise_error
57
+ expect(out).to match(
58
+ 'type' => a_kind_of(String),
59
+ 'length' => a_kind_of(Integer),
60
+ 'last_modified' => a_kind_of(String),
61
+ 'id' => 'myFile',
62
+ 'tags' => {
63
+ 'random' => 'junk',
64
+ }
65
+ )
47
66
  expect(status.exitstatus).to eq(0)
48
67
 
49
68
  out, err, status = Open3.capture3(capcmd('murano', 'content', 'download', 'myFile', '-o', 'testDown'))
@@ -51,18 +70,25 @@ RSpec.describe 'murano content', :cmd, :needs_password do
51
70
  expect(err).to eq('')
52
71
  expect(status.exitstatus).to eq(0)
53
72
  expect(File.exist?('testDown')).to be true
54
- dcf = IO.read('dumped_config')
73
+ dcf = IO.read('myFile')
55
74
  tdf = IO.read('testDown')
56
75
  expect(tdf).to eq(dcf)
57
76
 
58
- out, err, status = Open3.capture3(capcmd('murano', 'content', 'delete', 'myFile'))
77
+ out, err, status = Open3.capture3(capcmd('murano', 'content', 'delete', 'myFile', '-y'))
59
78
  expect(out).to eq('')
60
79
  expect(err).to eq('')
61
80
  expect(status.exitstatus).to eq(0)
62
81
 
63
82
  out, err, status = Open3.capture3(capcmd('murano', 'content', 'list'))
64
- expect(out).to eq('')
65
- expect(err).to eq('')
83
+ #expect(out.lines).to match([
84
+ # a_string_matching(/^(\+-+){2}\+$/),
85
+ # a_string_matching(/^\| Name\s+\| Size\s+\|$/),
86
+ # a_string_matching(/^(\+-+){2}\+$/),
87
+ # a_string_matching(/^(\+-+){2}\+$/),
88
+ #])
89
+ #expect(err).to eq('')
90
+ expect(out.lines).to match([])
91
+ expect(err).to eq("\e[33mDid not find any content\e[0m\n")
66
92
  expect(status.exitstatus).to eq(0)
67
93
  end
68
94
 
@@ -8,14 +8,14 @@ RSpec.describe 'murano cors', :cmd, :needs_password do
8
8
  include_context "CI_CMD"
9
9
 
10
10
  before(:example) do
11
- @project_name = rname('corstest')
12
- out, err, status = Open3.capture3(capcmd('murano', 'solution', 'create', @project_name, '--save'))
11
+ @product_name = rname('corstest')
12
+ out, err, status = Open3.capture3(capcmd('murano', 'application', 'create', @product_name, '--save'))
13
13
  expect(err).to eq('')
14
14
  expect(out.chomp).to match(/^[a-zA-Z0-9]+$/)
15
15
  expect(status.exitstatus).to eq(0)
16
16
  end
17
17
  after(:example) do
18
- out, err, status = Open3.capture3(capcmd('murano', 'solution', 'delete', @project_name))
18
+ out, err, status = Open3.capture3(capcmd('murano', 'solution', 'delete', @product_name, '-y'))
19
19
  expect(out).to eq('')
20
20
  expect(err).to eq('')
21
21
  expect(status.exitstatus).to eq(0)
@@ -28,7 +28,7 @@ RSpec.describe 'murano cors', :cmd, :needs_password do
28
28
  expect(status.exitstatus).to eq(0)
29
29
  end
30
30
 
31
- it "sets cors" do
31
+ it "sets CORS" do
32
32
  File.open('cors.yaml', 'wb') do |io|
33
33
  io << {:origin=>['http://localhost:*']}.to_json
34
34
  end
@@ -1,3 +1,10 @@
1
+ # Last Modified: 2017.08.16 /coding: utf-8
2
+ # frozen_string_literal: probably not yet
3
+
4
+ # Copyright © 2016-2017 Exosite LLC.
5
+ # License: MIT. See LICENSE.txt.
6
+ # vim:tw=0:ts=2:sw=2:et:ai
7
+
1
8
  require 'fileutils'
2
9
  require 'open3'
3
10
  require 'pathname'
@@ -7,14 +14,14 @@ RSpec.describe 'murano device', :cmd, :needs_password do
7
14
  include_context "CI_CMD"
8
15
 
9
16
  before(:example) do
10
- @project_name = rname('deviceTest')
11
- out, err, status = Open3.capture3(capcmd('murano', 'product', 'create', @project_name, '--save'))
17
+ @product_name = rname('deviceTest')
18
+ out, err, status = Open3.capture3(capcmd('murano', 'product', 'create', @product_name, '--save'))
12
19
  expect(err).to eq('')
13
20
  expect(out.chomp).to match(/^[a-zA-Z0-9]+$/)
14
21
  expect(status.exitstatus).to eq(0)
15
22
  end
16
23
  after(:example) do
17
- out, err, status = Open3.capture3(capcmd('murano', 'product', 'delete', @project_name))
24
+ out, err, status = Open3.capture3(capcmd('murano', 'solution', 'delete', '-y', @product_name))
18
25
  expect(out).to eq('')
19
26
  expect(err).to eq('')
20
27
  expect(status.exitstatus).to eq(0)
@@ -30,13 +37,39 @@ RSpec.describe 'murano device', :cmd, :needs_password do
30
37
  expect(err).to eq('')
31
38
  olines = out.lines
32
39
  expect(olines[0]).to match(/^(\+-+){3}\+$/)
33
- expect(olines[1]).to match(/^\| SN\s+\| Status\s+\| RID\s+\|$/)
40
+ expect(olines[1]).to match(/^\| Identifier\s+\| Status\s+\| Online\s+\|$/)
34
41
  expect(olines[2]).to match(/^(\+-+){3}\+$/)
35
- expect(olines[3]).to match(/^\| 12345\s+\| notactivated\s+\| \h{40}\s+\|$/)
42
+ expect(olines[3]).to match(/^\| 12345\s+\| whitelisted\s+\| false\s+\|$/)
36
43
  expect(olines[4]).to match(/^(\+-+){3}\+$/)
37
44
  expect(status.exitstatus).to eq(0)
38
45
  end
39
46
 
47
+ it "enables a batch" do
48
+ File.open('ids.csv', 'w') do |io|
49
+ io << "ID\n"
50
+ io << "1234\n"
51
+ io << "1235\n"
52
+ io << "1236\n"
53
+ end
54
+
55
+ out, err, status = Open3.capture3(capcmd('murano', 'product', 'device', 'enable', '--file', 'ids.csv'))
56
+ expect(out).to eq('')
57
+ expect(err).to eq('')
58
+ expect(status.exitstatus).to eq(0)
59
+
60
+ out, err, status = Open3.capture3(capcmd('murano', 'product', 'device', 'list'))
61
+ expect(err).to eq('')
62
+ olines = out.lines
63
+ expect(olines[0]).to match(/^(\+-+){3}\+$/)
64
+ expect(olines[1]).to match(/^\| Identifier\s+\| Status\s+\| Online\s+\|$/)
65
+ expect(olines[2]).to match(/^(\+-+){3}\+$/)
66
+ expect(olines[3]).to match(/^\| 1234\s+\| whitelisted\s+\| false\s+\|$/)
67
+ expect(olines[4]).to match(/^\| 1235\s+\| whitelisted\s+\| false\s+\|$/)
68
+ expect(olines[5]).to match(/^\| 1236\s+\| whitelisted\s+\| false\s+\|$/)
69
+ expect(olines[6]).to match(/^(\+-+){3}\+$/)
70
+ expect(status.exitstatus).to eq(0)
71
+ end
72
+
40
73
  it "activates" do
41
74
  out, err, status = Open3.capture3(capcmd('murano', 'product', 'device', 'enable', '12345'))
42
75
  expect(out).to eq('')
@@ -44,17 +77,23 @@ RSpec.describe 'murano device', :cmd, :needs_password do
44
77
  expect(status.exitstatus).to eq(0)
45
78
 
46
79
  out, err, status = Open3.capture3(capcmd('murano', 'product', 'device', 'activate', '12345'))
47
- expect(out.chomp).to match(/^\h{40}$/)
80
+ # 2017-06-01: This used to return hex, e.g., /^\h{40}$/, but now returns
81
+ # a-zA-Z0-9 (but not \w, which also includes underscore).
82
+ #expect(out.chomp).to match(/^\h{40}$/)
83
+ expect(out.chomp).to match(/^[a-zA-Z0-9]{40}$/)
48
84
  expect(err).to eq('')
49
85
  expect(status.exitstatus).to eq(0)
50
86
  end
51
87
 
52
88
  it "writes and reads" do
53
89
  FileUtils.mkpath('specs')
54
- FileUtils.copy(File.join(@testdir, 'spec/fixtures/product_spec_files/lightbulb.yaml'), 'specs/resources.yaml')
90
+ FileUtils.copy(
91
+ File.join(@testdir, 'spec/fixtures/product_spec_files/lightbulb.yaml'),
92
+ 'specs/resources.yaml',
93
+ )
55
94
 
56
- out, err, status = Open3.capture3(capcmd('murano', 'syncup', '--specs'))
57
- expect(out).to eq('')
95
+ out, err, status = Open3.capture3(capcmd('murano', 'syncup', '--resources'))
96
+ expect(out).to eq("Adding item state\nAdding item temperature\nAdding item uptime\nAdding item humidity\nUpdating product resources\n")
58
97
  expect(err).to eq('')
59
98
  expect(status.exitstatus).to eq(0)
60
99
 
@@ -64,7 +103,9 @@ RSpec.describe 'murano device', :cmd, :needs_password do
64
103
  expect(status.exitstatus).to eq(0)
65
104
 
66
105
  out, err, status = Open3.capture3(capcmd('murano', 'product', 'device', 'activate', '12345'))
67
- expect(out.chomp).to match(/^\h{40}$/)
106
+ # 2017-06-01: This used to return hex, e.g., /^\h{40}$/, but now returns
107
+ # a-zA-Z0-9 (but not \w, which also includes underscore).
108
+ expect(out.chomp).to match(/^[a-zA-Z0-9]{40}$/)
68
109
  expect(err).to eq('')
69
110
  expect(status.exitstatus).to eq(0)
70
111
 
@@ -79,18 +120,22 @@ RSpec.describe 'murano device', :cmd, :needs_password do
79
120
  # expect(olines[-1]).to match(/^(\+-+){4}\+$/)
80
121
  # expect(status.exitstatus).to eq(0)
81
122
 
82
- out, err, status = Open3.capture3(capcmd('murano', 'product', 'device', 'write', '12345', 'state', '42'))
83
- expect(out).to eq("state: ok\n")
123
+ out, err, status = Open3.capture3(capcmd('murano', 'product', 'device', 'write', '12345', 'state=42'))
124
+ expect(out).to eq('')
84
125
  expect(err).to eq('')
85
126
  expect(status.exitstatus).to eq(0)
86
127
 
87
128
  out, err, status = Open3.capture3(capcmd('murano', 'product', 'device', 'read', '12345', 'state'))
88
- expect(out.strip).to eq('42')
129
+ #expect(out.strip).to eq('42')
89
130
  expect(err).to eq('')
131
+ expect(out.lines).to match_array([
132
+ /^(\+-+){4}\+$/,
133
+ /^\| Alias\s+\| Reported\s+\| Set\s+\| Timestamp\s+\|$/,
134
+ /^(\+-+){4}\+$/,
135
+ /^\| state\s+\| \s+\| 42\s+\| \d+\s+\|$/,
136
+ /^(\+-+){4}\+$/,
137
+ ])
90
138
  expect(status.exitstatus).to eq(0)
91
-
92
139
  end
93
-
94
140
  end
95
141
 
96
- # vim: set ai et sw=2 ts=2 :