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
@@ -1,202 +0,0 @@
1
- require 'MrMurano/version'
2
- require 'MrMurano/Config'
3
- require 'MrMurano/Product-1P-Device'
4
- require '_workspace'
5
-
6
- RSpec.describe MrMurano::Product1PDevice, '#sn_rid tests' do
7
- include_context "WORKSPACE"
8
- before(:example) do
9
- $cfg = MrMurano::Config.new
10
- $cfg.load
11
- $project = MrMurano::ProjectFile.new
12
- $project.load
13
- $cfg['net.host'] = 'bizapi.hosted.exosite.io'
14
- $cfg['product.id'] = 'XYZ'
15
- $cfg['product.spec'] = 'XYZ.yaml'
16
-
17
- @prd = MrMurano::Product1PDevice.new
18
- allow(@prd).to receive(:token).and_return("TTTTTTTTTT")
19
- @mrp = instance_double("MrMurano::Product")
20
- allow(MrMurano::Product).to receive(:new).and_return(@mrp)
21
- end
22
-
23
- it "gets rid from sn" do
24
- expect(@mrp).to receive(:list).once.and_return([
25
- {:sn=>"12",
26
- :status=>"activated",
27
- :rid=>"77cbf643ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"}])
28
- ret = @prd.sn_rid("12")
29
- expect(ret).to eq("77cbf643ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ")
30
- end
31
-
32
- it "gets rid from sn on page two" do
33
- expect(@mrp).to receive(:list).twice.and_return(
34
- [{:sn=>"14",
35
- :status=>"notactivated"}],
36
- [{:sn=>"12",
37
- :status=>"activated",
38
- :rid=>"77cbf643ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"}])
39
-
40
- ret = @prd.sn_rid("12")
41
- expect(ret).to eq("77cbf643ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ")
42
- end
43
-
44
- it "doesn't find the sn" do
45
- expect(@mrp).to receive(:list).twice.and_return(
46
- [{:sn=>"14",
47
- :status=>"notactivated"}],
48
- [])
49
-
50
- expect {
51
- @prd.sn_rid("12")
52
- }.to raise_error "Identifier Not Found: 12"
53
- end
54
-
55
- it "gets model_rid" do
56
- expect(@mrp).to receive(:info).once.and_return({:modelrid=>"1234567890"})
57
- ret = @prd.model_rid
58
- expect(ret).to eq("1234567890")
59
- end
60
- it "raises with bad model_rid" do
61
- expect(@mrp).to receive(:info).once.and_return({:mid=>"1234567890"})
62
- expect {
63
- @prd.model_rid
64
- }.to raise_error(/^Bad info; .*/)
65
- end
66
- end
67
-
68
- RSpec.describe MrMurano::Product1PDevice do
69
- include_context "WORKSPACE"
70
- before(:example) do
71
- $cfg = MrMurano::Config.new
72
- $cfg.load
73
- $project = MrMurano::ProjectFile.new
74
- $project.load
75
- $cfg['net.host'] = 'bizapi.hosted.exosite.io'
76
- $cfg['product.id'] = 'XYZ'
77
- $cfg['product.spec'] = 'XYZ.yaml'
78
-
79
- @prd = MrMurano::Product1PDevice.new
80
- allow(@prd).to receive(:token).and_return("TTTTTTTTTT")
81
- allow(@prd).to receive(:sn_rid).and_return("LLLLLLLLLL")
82
- end
83
-
84
- it "initializes" do
85
- uri = @prd.endPoint('')
86
- expect(uri.to_s).to eq("https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process")
87
- end
88
-
89
- it "gets info" do
90
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
91
- with(body: {:auth=>{:client_id=>"LLLLLLLLLL"},
92
- :calls=>[{:id=>1,
93
- :procedure=>"info",
94
- :arguments=>["LLLLLLLLLL", {}]} ]}).
95
- to_return(body: [{:id=>1, :status=>"ok", :result=>{:comments=>[]}}])
96
-
97
- ret = @prd.info("12")
98
- expect(ret).to eq({:comments=>[]})
99
- end
100
-
101
- it "lists resources" do
102
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
103
- with(body: {:auth=>{:client_id=>"LLLLLLLLLL"},
104
- :calls=>[{:id=>1,
105
- :procedure=>"info",
106
- :arguments=>["LLLLLLLLLL", {}]} ]}).
107
- to_return(body: [{:id=>1, :status=>"ok", :result=>{:aliases=>{
108
- :s2143rt4regf=>["one"],:njilh32o78rnq=>["two"]}}}])
109
-
110
- ret = @prd.list("12")
111
- expect(ret).to eq({"one"=>"s2143rt4regf", "two"=>"njilh32o78rnq"})
112
- end
113
-
114
- context "reads resources" do
115
- it "single" do
116
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
117
- with(body: {:auth=>{:client_id=>"LLLLLLLLLL"},
118
- :calls=>[{:id=>1,
119
- :procedure=>"read",
120
- :arguments=>[{"alias"=>"one"}, {}]} ]}).
121
- to_return(body: [{:id=>1, :status=>"ok", :result=>[ [12345678,10] ]}])
122
- ret = @prd.read("12", "one")
123
- expect(ret).to eq([10])
124
- end
125
-
126
- it "multiple" do
127
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
128
- with(body: {:auth=>{:client_id=>"LLLLLLLLLL"},
129
- :calls=>[{:id=>1,
130
- :procedure=>"read",
131
- :arguments=>[{"alias"=>"two"}, {}]},
132
- {:id=>2,
133
- :procedure=>"read",
134
- :arguments=>[{"alias"=>"three"}, {}]},
135
- {:id=>3,
136
- :procedure=>"read",
137
- :arguments=>[{"alias"=>"one"}, {}]},
138
- ]}).
139
- to_return(body: [
140
- {:id=>1, :status=>"ok", :result=>[ [12345678,10] ]},
141
- {:id=>2, :status=>"ok", :result=>[ [12345678,15] ]},
142
- {:id=>3, :status=>"ok", :result=>[ [12345678,20] ]},
143
- ])
144
- ret = @prd.read("12", ["two","three","one"])
145
- expect(ret).to eq([10,15,20])
146
- end
147
-
148
- end
149
-
150
- it "gets tree info for device" do
151
- # this makes three https calls, info on root, info and read on children
152
-
153
- # root info.
154
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
155
- with(body: {:auth=>{:client_id=>"LLLLLLLLLL"},
156
- :calls=>[{:id=>1,
157
- :procedure=>"info",
158
- :arguments=>["LLLLLLLLLL", {}]} ]}).
159
- to_return(body: [{:id=>1, :status=>"ok", :result=>{:aliases=>{
160
- :s2143rt4regf=>["one"],:njilh32o78rnq=>["two"]}}}])
161
-
162
- # children info
163
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
164
- with(body: {:auth=>{:client_id=>"LLLLLLLLLL"},
165
- :calls=>[{:id=>1,
166
- :procedure=>"info",
167
- :arguments=>["s2143rt4regf", {}]},
168
- {:id=>2,
169
- :procedure=>"info",
170
- :arguments=>["njilh32o78rnq", {}]}
171
- ]}).
172
- to_return(body: [
173
- {:id=>1, :status=>"ok", :result=>{:basic=>{:type=>"dataport"}}},
174
- {:id=>2, :status=>"ok", :result=>{:basic=>{:type=>"dataport"}}}
175
- ])
176
-
177
- # children read
178
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
179
- with(body: {:auth=>{:client_id=>"LLLLLLLLLL"},
180
- :calls=>[{:id=>1,
181
- :procedure=>"read",
182
- :arguments=>["s2143rt4regf", {}]},
183
- {:id=>2,
184
- :procedure=>"read",
185
- :arguments=>["njilh32o78rnq", {}]},
186
- ]}).
187
- to_return(body: [
188
- {:id=>1, :status=>"ok", :result=>[ [12345678,10] ]},
189
- {:id=>2, :status=>"ok", :result=>[ [12345678,15] ]},
190
- ])
191
-
192
- ret = @prd.twee('12')
193
- expect(ret).to eq({:children=>[{:basic=>{:type=>"dataport"},
194
- :rid=>:s2143rt4regf, :alias=>"one", :value=>10},
195
- {:basic=>{:type=>"dataport"},
196
- :rid=>:njilh32o78rnq, :alias=>"two",
197
- :value=>15}]})
198
- end
199
-
200
- end
201
-
202
- # vim: set ai et sw=2 ts=2 :
@@ -1,175 +0,0 @@
1
- require 'MrMurano/version'
2
- require 'MrMurano/Config'
3
- require 'MrMurano/Product-Resources'
4
- require '_workspace'
5
-
6
- RSpec.describe MrMurano::ProductResources, "#1PshimTests" do
7
- include_context "WORKSPACE"
8
- before(:example) do
9
- $cfg = MrMurano::Config.new
10
- $cfg.load
11
- $cfg['net.host'] = 'bizapi.hosted.exosite.io'
12
- $cfg['product.id'] = 'XYZ'
13
- $cfg['product.spec'] = 'XYZ.yaml'
14
-
15
- @prd = MrMurano::ProductResources.new
16
- allow(@prd).to receive(:token).and_return("TTTTTTTTTT")
17
- allow(@prd).to receive(:model_rid).and_return("LLLLLLLLLL")
18
- end
19
-
20
- context "do_rpc" do
21
- # Note, do_rpc is private.
22
- it "Accepts an object" do
23
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
24
- to_return(body: [{
25
- :id=>1, :status=>"ok", :result=>{}
26
- }])
27
-
28
- ret = nil
29
- @prd.instance_eval{ ret = do_rpc({:id=>1}) }
30
- expect(ret).to eq({})
31
- end
32
-
33
- it "Accepts an Array" do
34
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
35
- to_return(body: [{:id=>1, :status=>"ok", :result=>{:one=>1}},
36
- {:id=>2, :status=>"ok", :result=>{:two=>2}}])
37
-
38
- ret = nil
39
- @prd.instance_eval{ ret = do_rpc([{:id=>1}, {:id=>2}]) }
40
- expect(ret).to eq({:one=>1})
41
- # yes it only returns first.
42
- end
43
-
44
- it "returns res if not Array" do
45
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
46
- to_return(body: {:not=>'an array'}.to_json)
47
-
48
- ret = nil
49
- @prd.instance_eval{ ret = do_rpc({:id=>1}) }
50
- expect(ret).to eq({:not=>'an array'})
51
- end
52
-
53
- it "returns res if count less than 1" do
54
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
55
- to_return(body: [])
56
-
57
- ret = nil
58
- @prd.instance_eval{ ret = do_rpc({:id=>1}) }
59
- expect(ret).to eq([])
60
- end
61
-
62
- it "returns res[0] if not Hash" do
63
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
64
- to_return(body: ["foo"])
65
-
66
- ret = nil
67
- @prd.instance_eval{ ret = do_rpc({:id=>1}) }
68
- expect(ret).to eq("foo")
69
- end
70
-
71
- it "returns res[0] if not status ok" do
72
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
73
- to_return(body: [{:id=>1, :status=>'error'}])
74
-
75
- ret = nil
76
- @prd.instance_eval{ ret = do_rpc({:id=>1}) }
77
- expect(ret).to eq({:id=>1, :status=>'error'})
78
- end
79
- end
80
-
81
- context "do_mrpc" do
82
- # Note, do_rpc is private.
83
- it "Accepts an object" do
84
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
85
- to_return(body: [{
86
- :id=>1, :status=>"ok", :result=>{}
87
- }])
88
-
89
- ret = nil
90
- @prd.instance_eval{ ret = do_mrpc({:id=>1}) }
91
- expect(ret).to eq([{:id=>1, :status=>"ok", :result=>{}}])
92
- end
93
-
94
- it "Accepts an Array" do
95
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
96
- to_return(body: [{:id=>1, :status=>"ok", :result=>{:one=>1}},
97
- {:id=>2, :status=>"ok", :result=>{:two=>2}}])
98
-
99
- ret = nil
100
- @prd.instance_eval{ ret = do_mrpc([{:id=>1}, {:id=>2}]) }
101
- expect(ret).to eq([{:id=>1, :status=>"ok", :result=>{:one=>1}},
102
- {:id=>2, :status=>"ok", :result=>{:two=>2}}])
103
- end
104
-
105
- it "fills in all ids if missing" do
106
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
107
- to_return(body: [{:id=>1, :status=>"ok", :result=>{:one=>1}},
108
- {:id=>2, :status=>"ok", :result=>{:two=>2}},
109
- {:id=>3, :status=>"ok", :result=>{:three=>3}}])
110
-
111
- ret = nil
112
- @prd.instance_eval{ ret = do_mrpc([{}, {}, {}]) }
113
- expect(ret).to eq([{:id=>1, :status=>"ok", :result=>{:one=>1}},
114
- {:id=>2, :status=>"ok", :result=>{:two=>2}},
115
- {:id=>3, :status=>"ok", :result=>{:three=>3}}])
116
- end
117
-
118
- it "fills in missing ids" do
119
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
120
- with(body: {:auth=>{:client_id=>"LLLLLLLLLL"},
121
- :calls=>[{:id=>5, :procedure=>"info"},
122
- {:id=>4, :procedure=>"info"},
123
- {:id=>6, :procedure=>"info"} ]}).
124
- to_return(body: [{:id=>5, :status=>"ok", :result=>{:one=>1}},
125
- {:id=>4, :status=>"ok", :result=>{:two=>2}},
126
- {:id=>6, :status=>"ok", :result=>{:three=>3}}])
127
-
128
- ret = nil
129
- @prd.instance_eval{ ret = do_mrpc([{:procedure=>"info"},
130
- {:procedure=>"info", :id=>4},
131
- {:procedure=>"info"}]) }
132
- expect(ret).to eq([{:id=>5, :status=>"ok", :result=>{:one=>1}},
133
- {:id=>4, :status=>"ok", :result=>{:two=>2}},
134
- {:id=>6, :status=>"ok", :result=>{:three=>3}}])
135
- end
136
-
137
- it "returns res if not Array" do
138
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
139
- to_return(body: {:not=>'an array'}.to_json)
140
-
141
- ret = nil
142
- @prd.instance_eval{ ret = do_mrpc({:id=>1}) }
143
- expect(ret).to eq({:not=>'an array'})
144
- end
145
-
146
- it "returns res if count less than 1" do
147
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
148
- to_return(body: [])
149
-
150
- ret = nil
151
- @prd.instance_eval{ ret = do_mrpc({:id=>1}) }
152
- expect(ret).to eq([])
153
- end
154
-
155
- it "returns res[0] if not Hash" do
156
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
157
- to_return(body: ["foo"])
158
-
159
- ret = nil
160
- @prd.instance_eval{ ret = do_mrpc({:id=>1}) }
161
- expect(ret).to eq(["foo"])
162
- end
163
-
164
- it "returns res[0] if not status ok" do
165
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/proxy/onep:v1/rpc/process").
166
- to_return(body: [{:id=>1, :status=>'error'}])
167
-
168
- ret = nil
169
- @prd.instance_eval{ ret = do_mrpc({:id=>1}) }
170
- expect(ret).to eq([{:id=>1, :status=>'error'}])
171
- end
172
- end
173
- end
174
-
175
- # vim: set ai et sw=2 ts=2 :
@@ -1,153 +0,0 @@
1
- require 'MrMurano/version'
2
- require 'MrMurano/Config'
3
- require 'MrMurano/Product'
4
- require '_workspace'
5
-
6
- RSpec.describe MrMurano::Product, "#product" do
7
- include_context "WORKSPACE"
8
- before(:example) do
9
- $cfg = MrMurano::Config.new
10
- $cfg.load
11
- $cfg['net.host'] = 'bizapi.hosted.exosite.io'
12
- $cfg['product.id'] = 'XYZ'
13
-
14
- @prd = MrMurano::Product.new
15
- allow(@prd).to receive(:token).and_return("TTTTTTTTTT")
16
- end
17
-
18
- it "returns info" do
19
- stub_request(:get, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/info").
20
- with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
21
- 'Content-Type'=>'application/json'}).
22
- to_return(body: {
23
- "id"=> "<id>",
24
- "bizid"=>"<bizid>",
25
- "label"=> "<label>",
26
- "endpoint"=> "<endpoint>",
27
- "rid"=> "<rid>",
28
- "modelrid"=> "<rid>",
29
- "resources"=> [{
30
- "alias"=> "<alias>",
31
- "format"=> "<format>",
32
- "rid"=> "<rid>"
33
- }]
34
- }.to_json)
35
-
36
- ret = @prd.info()
37
- expect(ret).to eq({
38
- :id=> "<id>",
39
- :bizid=>"<bizid>",
40
- :label=> "<label>",
41
- :endpoint=> "<endpoint>",
42
- :rid=> "<rid>",
43
- :modelrid=> "<rid>",
44
- :resources=> [{
45
- :alias=> "<alias>",
46
- :format=> "<format>",
47
- :rid=> "<rid>"
48
- }]
49
- })
50
- end
51
-
52
- it "Can list devices" do
53
- stub_request(:get, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/device/").
54
- with(query: {'limit'=>50, 'offset'=>0}).
55
- with(headers: {'Authorization'=>'token TTTTTTTTTT',
56
- 'Content-Type'=>'application/json'}).
57
- to_return(body: [{:sn=>"009",
58
- :status=>"activated",
59
- :rid=>"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}].to_json)
60
- ret = @prd.list()
61
- expect(ret).to eq([{:sn=>"009",
62
- :status=>"activated",
63
- :rid=>"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}])
64
- end
65
-
66
- it "can enable" do
67
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/device/42").
68
- with(headers: {'Authorization'=>'token TTTTTTTTTT',
69
- 'Content-Type'=>'application/json'}).
70
- to_return(body: {:sn=> "<sn>", :status=> "<status>", :rid=> "<devicerid>"}.to_json)
71
-
72
- ret = @prd.enable(42)
73
- expect(ret).to eq({:sn=> "<sn>", :status=> "<status>", :rid=> "<devicerid>"})
74
- end
75
-
76
- it "can update definition" do
77
- rbody = [
78
- {:alias=>"state",
79
- :rid=>"755857c8df71bb0cfe82773b8ba35236ae70fd77"},
80
- {:alias=>"temperature",
81
- :rid=>"6eee2542ec5f1dc7d27e46b90f3dc054a8dadab7"},
82
- {:alias=>"uptime",
83
- :rid=>"196c2077557c1924b0d8b75c6c1f6df104f251a6"},
84
- {:alias=>"humidity",
85
- :rid=>"49e7d53b6ed3c80ece619ac4878fbdb0bb95aa80"}
86
- ]
87
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/definition").
88
- with(headers: {'Authorization'=>'token TTTTTTTTTT',
89
- 'Content-Type'=>'text/yaml'}).
90
- to_return(body: rbody.to_json)
91
-
92
- # Open test file sepc.yaml
93
- pth = (@testdir + 'spec/fixtures/product_spec_files/lightbulb.yaml').realpath
94
- ret = @prd.update(pth)
95
- expect(ret).to eq(rbody)
96
- end
97
-
98
- it "can write" do
99
- stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/product/XYZ/write/42").
100
- with(headers: {'Authorization'=>'token TTTTTTTTTT',
101
- 'Content-Type'=>'application/json'}).
102
- to_return(body: {:temp=> "ok", :humid=> "ok"}.to_json)
103
-
104
- ret = @prd.write(42, {:temp=>78, :humid=>50})
105
- expect(ret).to eq({:temp=> "ok", :humid=> "ok"})
106
- end
107
-
108
- context "converting a specFile" do
109
- it "can convert a file" do
110
- epth = (@testdir + 'spec/fixtures/product_spec_files/gwe.exoline.spec.yaml').realpath
111
- mpth = (@testdir + 'spec/fixtures/product_spec_files/gwe.murano.spec.yaml').realpath
112
- out = @prd.convert(epth)
113
- want = mpth.read
114
-
115
- expect(out).to eq(want)
116
- end
117
-
118
- it "can convert stdin" do
119
- epth = (@testdir + 'spec/fixtures/product_spec_files/gwe.exoline.spec.yaml').realpath
120
- mpth = (@testdir + 'spec/fixtures/product_spec_files/gwe.murano.spec.yaml').realpath
121
- epth.open do |fin|
122
- begin
123
- $stdin = fin
124
- out = @prd.convert('-')
125
- want = mpth.read
126
-
127
- expect(out).to eq(want)
128
- ensure
129
- $stdin = STDIN
130
- end
131
- end
132
- end
133
-
134
- it "converts a fully featured exoline spec file" do
135
- epth = (@testdir + 'spec/fixtures/product_spec_files/example.exoline.spec.yaml').realpath
136
- mpth = (@testdir + 'spec/fixtures/product_spec_files/example.murano.spec.yaml').realpath
137
- out = @prd.convert(epth)
138
- want = mpth.read
139
-
140
- expect(out).to eq(want)
141
- end
142
-
143
- it "raises when not an exoline spec" do
144
- expect {
145
- pth = @testdir + 'spec/fixtures/product_spec_files/example.murano.spec.yaml'
146
- @prd.convert(pth.realpath)
147
- }.to raise_exception('No dataports section found, or not an array')
148
- end
149
- end
150
-
151
- end
152
-
153
- # vim: set ai et sw=2 ts=2 :