MuranoCLI 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,581 @@
1
+ require 'MrMurano/version'
2
+ require 'MrMurano/Solution-Endpoint'
3
+ require 'tempfile'
4
+ require '_workspace'
5
+
6
+ RSpec.describe MrMurano::Endpoint 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['solution.id'] = 'XYZ'
15
+
16
+ @srv = MrMurano::Endpoint.new
17
+ allow(@srv).to receive(:token).and_return("TTTTTTTTTT")
18
+ end
19
+
20
+ it "initializes" do
21
+ uri = @srv.endPoint('/')
22
+ expect(uri.to_s).to eq("https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint/")
23
+ end
24
+
25
+ context "lists" do
26
+ it "same content_type" do
27
+ body = [{:id=>"9K0",
28
+ :method=>"websocket",
29
+ :path=>"/api/v1/bar",
30
+ :content_type=>"application/json",
31
+ :script=>"--#ENDPOINT WEBSOCKET /api/v1/bar\nresponse.message = \"HI\"\n\n",
32
+ },
33
+ {:id=>"B76",
34
+ :method=>"websocket",
35
+ :path=>"/api/v1/foo/{id}",
36
+ :content_type=>"application/json",
37
+ :script=> "--#ENDPOINT WEBSOCKET /api/v1/foo/{id}\nresponse.message = \"HI\"\n\n-- BOB WAS HERE\n",
38
+ }]
39
+ stub_request(:get, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint").
40
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
41
+ 'Content-Type'=>'application/json'}).
42
+ to_return(body: body.to_json)
43
+
44
+ ret = @srv.list()
45
+ expect(ret).to eq(body)
46
+ end
47
+
48
+ it "missing headers" do
49
+ body = [{:id=>"9K0",
50
+ :method=>"websocket",
51
+ :path=>"/api/v1/bar",
52
+ :content_type=>"application/json",
53
+ :script=>"response.message = \"HI\"\n\n",
54
+ },
55
+ {:id=>"B76",
56
+ :method=>"websocket",
57
+ :path=>"/api/v1/foo/{id}",
58
+ :content_type=>"application/json",
59
+ :script=> "response.message = \"HI\"\n\n-- BOB WAS HERE\n",
60
+ }]
61
+ stub_request(:get, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint").
62
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
63
+ 'Content-Type'=>'application/json'}).
64
+ to_return(body: body.to_json)
65
+
66
+ ret = @srv.list()
67
+ expect(ret).to eq(body)
68
+ end
69
+
70
+ it "not default content_type" do
71
+ body = [{:id=>"9K0",
72
+ :method=>"websocket",
73
+ :path=>"/api/v1/bar",
74
+ :content_type=>"text/csv",
75
+ :script=>"--#ENDPOINT WEBSOCKET /api/v1/bar text/csv\nresponse.message = \"HI\"\n\n",
76
+ },
77
+ {:id=>"B76",
78
+ :method=>"websocket",
79
+ :path=>"/api/v1/foo/{id}",
80
+ :content_type=>"image/png",
81
+ :script=> "--#ENDPOINT WEBSOCKET /api/v1/foo/{id} image/png\nresponse.message = \"HI\"\n\n-- BOB WAS HERE\n",
82
+ }]
83
+ stub_request(:get, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint").
84
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
85
+ 'Content-Type'=>'application/json'}).
86
+ to_return(body: body.to_json)
87
+
88
+ ret = @srv.list()
89
+ expect(ret).to eq(body)
90
+ end
91
+
92
+ it "mismatched content_type header" do
93
+ body = [{:id=>"9K0",
94
+ :method=>"websocket",
95
+ :path=>"/api/v1/bar",
96
+ :content_type=>"text/csv",
97
+ :script=>"--#ENDPOINT WEBSOCKET /api/v1/bar\nresponse.message = \"HI\"\n\n",
98
+ },
99
+ {:id=>"B76",
100
+ :method=>"websocket",
101
+ :path=>"/api/v1/foo/{id}",
102
+ :content_type=>"image/png",
103
+ :script=> "--#ENDPOINT WEBSOCKET /api/v1/foo/{id}\nresponse.message = \"HI\"\n\n-- BOB WAS HERE\n",
104
+ }]
105
+ stub_request(:get, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint").
106
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
107
+ 'Content-Type'=>'application/json'}).
108
+ to_return(body: body.to_json)
109
+
110
+ ret = @srv.list()
111
+ expect(ret).to eq(body)
112
+ end
113
+
114
+ it "returns empty content type" do
115
+ body = [{:id=>"9K0",
116
+ :method=>"websocket",
117
+ :path=>"/api/v1/bar",
118
+ :content_type=>"",
119
+ :script=>"--#ENDPOINT WEBSOCKET /api/v1/bar\nresponse.message = \"HI\"\n\n",
120
+ },
121
+ {:id=>"B76",
122
+ :method=>"websocket",
123
+ :path=>"/api/v1/foo/{id}",
124
+ :content_type=>"image/png",
125
+ :script=> "--#ENDPOINT WEBSOCKET /api/v1/foo/{id}\nresponse.message = \"HI\"\n\n-- BOB WAS HERE\n",
126
+ }]
127
+ stub_request(:get, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint").
128
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
129
+ 'Content-Type'=>'application/json'}).
130
+ to_return(body: body.to_json)
131
+
132
+ ret = @srv.list()
133
+ body.first.merge!({:content_type=>'application/json'})
134
+ expect(ret).to eq(body)
135
+ end
136
+
137
+ it "returns missing content type" do
138
+ body = [{:id=>"9K0",
139
+ :method=>"websocket",
140
+ :path=>"/api/v1/bar",
141
+ :script=>"--#ENDPOINT WEBSOCKET /api/v1/bar\nresponse.message = \"HI\"\n\n",
142
+ },
143
+ {:id=>"B76",
144
+ :method=>"websocket",
145
+ :path=>"/api/v1/foo/{id}",
146
+ :content_type=>"image/png",
147
+ :script=> "--#ENDPOINT WEBSOCKET /api/v1/foo/{id}\nresponse.message = \"HI\"\n\n-- BOB WAS HERE\n",
148
+ }]
149
+ stub_request(:get, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint").
150
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
151
+ 'Content-Type'=>'application/json'}).
152
+ to_return(body: body.to_json)
153
+
154
+ ret = @srv.list()
155
+ body.first.merge!({:content_type=>'application/json'})
156
+ expect(ret).to eq(body)
157
+ end
158
+
159
+ end
160
+
161
+
162
+ context "fetches" do
163
+ it "fetches" do
164
+ body = {:id=>"9K0",
165
+ :method=>"websocket",
166
+ :path=>"/api/v1/bar",
167
+ :content_type=>"application/json",
168
+ :script=>"--#ENDPOINT WEBSOCKET /api/v1/bar\nresponse.message = \"HI\"\n",
169
+ }
170
+ stub_request(:get, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint/9K0").
171
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
172
+ 'Content-Type'=>'application/json'}).
173
+ to_return(body: body.to_json)
174
+
175
+ ret = @srv.fetch('9K0')
176
+ expect(ret).to eq(body[:script])
177
+ end
178
+
179
+ it "yields" do
180
+ body = {:id=>"9K0",
181
+ :method=>"websocket",
182
+ :path=>"/api/v1/bar",
183
+ :content_type=>"application/json",
184
+ :script=>"--#ENDPOINT WEBSOCKET /api/v1/bar\nresponse.message = \"HI\"\n",
185
+ }
186
+ stub_request(:get, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint/9K0").
187
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
188
+ 'Content-Type'=>'application/json'}).
189
+ to_return(body: body.to_json)
190
+
191
+ ret = nil
192
+ @srv.fetch('9K0') do |sc|
193
+ ret = sc
194
+ end
195
+ expect(ret).to eq(body[:script])
196
+ end
197
+
198
+ it "missing headers" do
199
+ body = {:id=>"9K0",
200
+ :method=>"websocket",
201
+ :path=>"/api/v1/bar",
202
+ :content_type=>"application/json",
203
+ :script=>"response.message = \"HI\"\n",
204
+ }
205
+ stub_request(:get, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint/9K0").
206
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
207
+ 'Content-Type'=>'application/json'}).
208
+ to_return(body: body.to_json)
209
+
210
+ ret = @srv.fetch('9K0')
211
+ expect(ret).to eq("--#ENDPOINT WEBSOCKET /api/v1/bar\nresponse.message = \"HI\"\n")
212
+ end
213
+
214
+ it "not default content_type" do
215
+ body = {:id=>"9K0",
216
+ :method=>"websocket",
217
+ :path=>"/api/v1/bar",
218
+ :content_type=>"text/csv",
219
+ :script=>"--#ENDPOINT WEBSOCKET /api/v1/bar text/csv\nresponse.message = \"HI\"\n",
220
+ }
221
+ stub_request(:get, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint/9K0").
222
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
223
+ 'Content-Type'=>'application/json'}).
224
+ to_return(body: body.to_json)
225
+
226
+ ret = @srv.fetch('9K0')
227
+ expect(ret).to eq(body[:script])
228
+ end
229
+
230
+ it "missing content_type header" do
231
+ body = {:id=>"9K0",
232
+ :method=>"websocket",
233
+ :path=>"/api/v1/bar",
234
+ :content_type=>"text/csv",
235
+ :script=>"--#ENDPOINT WEBSOCKET /api/v1/bar\nresponse.message = \"HI\"\n",
236
+ }
237
+ stub_request(:get, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint/9K0").
238
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
239
+ 'Content-Type'=>'application/json'}).
240
+ to_return(body: body.to_json)
241
+
242
+ ret = @srv.fetch('9K0')
243
+ expect(ret).to eq("--#ENDPOINT WEBSOCKET /api/v1/bar text/csv\nresponse.message = \"HI\"\n")
244
+ end
245
+
246
+ it "mismatched content_type header" do
247
+ body = {:id=>"9K0",
248
+ :method=>"websocket",
249
+ :path=>"/api/v1/bar",
250
+ :content_type=>"text/csv",
251
+ :script=>"--#ENDPOINT WEBSOCKET /api/v1/bar image/png\nresponse.message = \"HI\"\n",
252
+ }
253
+ stub_request(:get, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint/9K0").
254
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
255
+ 'Content-Type'=>'application/json'}).
256
+ to_return(body: body.to_json)
257
+
258
+ ret = @srv.fetch('9K0')
259
+ expect(ret).to eq("--#ENDPOINT WEBSOCKET /api/v1/bar text/csv\nresponse.message = \"HI\"\n")
260
+ end
261
+ end
262
+
263
+ it "removes" do
264
+ stub_request(:delete, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint/9K0").
265
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
266
+ 'Content-Type'=>'application/json'}).
267
+ to_return(body: "")
268
+
269
+ ret = @srv.remove('9K0')
270
+ expect(ret).to eq({})
271
+ end
272
+
273
+ context "uploads" do
274
+ around(:example) do |ex|
275
+ Tempfile.open('foo') do |tio|
276
+ tio << %{-- lua code is here
277
+ function foo(bar)
278
+ return bar + 1
279
+ end
280
+ }
281
+ tio.close
282
+ @tio_ = tio
283
+ ex.run
284
+ end
285
+ end
286
+
287
+ it "over old version" do
288
+ stub_request(:put, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint/9K0").
289
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
290
+ 'Content-Type'=>'application/json'}).
291
+ to_return(body: "")
292
+
293
+ ret = @srv.upload(@tio_.path, {:id=>"9K0",
294
+ :method=>"websocket",
295
+ :path=>"/api/v1/bar",
296
+ :content_type=>"application/json",
297
+ }, true)
298
+ expect(ret)
299
+ end
300
+
301
+ it "when nothing is there" do
302
+ stub_request(:put, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint/9K0").
303
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
304
+ 'Content-Type'=>'application/json'}).
305
+ to_return(status: 404)
306
+ stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint/").
307
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
308
+ 'Content-Type'=>'application/json'}).
309
+ to_return(body: "")
310
+
311
+ ret = @srv.upload(@tio_.path, {:id=>"9K0",
312
+ :method=>"websocket",
313
+ :path=>"/api/v1/bar",
314
+ :content_type=>"application/json",
315
+ }, false)
316
+ expect(ret)
317
+ end
318
+
319
+ it "without an itemkey" do
320
+ stub_request(:post, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint/").
321
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
322
+ 'Content-Type'=>'application/json'}).
323
+ to_return(body: "")
324
+
325
+ ret = @srv.upload(@tio_.path, {:method=>"websocket",
326
+ :path=>"/api/v1/bar",
327
+ :content_type=>"application/json",
328
+ }, false)
329
+ expect(ret)
330
+ end
331
+
332
+ it "Handles others errors" do
333
+ stub_request(:put, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/endpoint/9K0").
334
+ with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
335
+ 'Content-Type'=>'application/json'}).
336
+ to_return(status: 502, body: "{}")
337
+
338
+ expect(@srv).to receive(:error).and_return(nil)
339
+ ret = @srv.upload(@tio_.path, {:id=>"9K0",
340
+ :method=>"websocket",
341
+ :path=>"/api/v1/bar",
342
+ :content_type=>"application/json",
343
+ }, true)
344
+ expect(ret)
345
+ end
346
+ end
347
+
348
+ context "compares" do
349
+ before(:example) do
350
+ @iA = {:id=>"9K0",
351
+ :method=>"websocket",
352
+ :path=>"/api/v1/bar",
353
+ :content_type=>"application/json",
354
+ :script=>"--#ENDPOINT WEBSOCKET /api/v1/bar\nresponse.message = \"HI\"\n",
355
+ }
356
+ @iB = {:id=>"9K0",
357
+ :method=>"websocket",
358
+ :path=>"/api/v1/bar",
359
+ :content_type=>"application/json",
360
+ :script=>"--#ENDPOINT WEBSOCKET /api/v1/bar\nresponse.message = \"HI\"\n",
361
+ }
362
+ end
363
+ it "both have script" do
364
+ ret = @srv.docmp(@iA, @iB)
365
+ expect(ret).to eq(false)
366
+ end
367
+
368
+ it "iA is a local file" do
369
+ Tempfile.open('foo') do |tio|
370
+ tio << @iA[:script]
371
+ tio.close
372
+ iA = @iA.reject{|k,v| k == :script}.merge({
373
+ :local_path => Pathname.new(tio.path)
374
+ })
375
+ ret = @srv.docmp(iA, @iB)
376
+ expect(ret).to eq(false)
377
+
378
+ iB = @iB.dup
379
+ iB[:script] = "BOB"
380
+ ret = @srv.docmp(iA, iB)
381
+ expect(ret).to eq(true)
382
+ end
383
+ end
384
+
385
+ it "iB is a local file" do
386
+ Tempfile.open('foo') do |tio|
387
+ tio << @iB[:script]
388
+ tio.close
389
+ iB = @iB.reject{|k,v| k == :script}.merge({
390
+ :local_path => Pathname.new(tio.path)
391
+ })
392
+ ret = @srv.docmp(@iA, iB)
393
+ expect(ret).to eq(false)
394
+
395
+ iA = @iB.dup
396
+ iA[:script] = "BOB"
397
+ ret = @srv.docmp(iA, iB)
398
+ expect(ret).to eq(true)
399
+ end
400
+ end
401
+ end
402
+
403
+ context "Lookup functions" do
404
+ it "gets local name" do
405
+ ret = @srv.tolocalname({ :method=>'get', :path=>'one/two/three' }, nil)
406
+ expect(ret).to eq('one-two-three.get.lua')
407
+ end
408
+
409
+ it "gets synckey" do
410
+ ret = @srv.synckey({ :method=>'get', :path=>'one/two/three' })
411
+ expect(ret).to eq("GET_one/two/three")
412
+ end
413
+
414
+ it "gets searchfor" do
415
+ $cfg['endpoints.searchFor'] = %{a b c/**/d/*.bob}
416
+ ret = @srv.searchFor
417
+ expect(ret).to eq(["a", "b", "c/**/d/*.bob"])
418
+ end
419
+
420
+ it "gets ignoring" do
421
+ $cfg['endpoints.ignoring'] = %{a b c/**/d/*.bob}
422
+ ret = @srv.ignoring
423
+ expect(ret).to eq(["a", "b", "c/**/d/*.bob"])
424
+ end
425
+ end
426
+
427
+ context "toRemoteItem" do
428
+ it "reads one" do
429
+ Tempfile.open("foo") do |tio|
430
+ tio << %{--#ENDPOINT GET /one/two
431
+ return request
432
+
433
+ }.gsub(/^\s+/,'')
434
+ tio.close
435
+
436
+ ret = @srv.toRemoteItem(nil, tio.path)
437
+ e = {:method=>"GET",
438
+ :path=>"/one/two",
439
+ :content_type=>"application/json",
440
+ :local_path=>Pathname.new(tio.path),
441
+ :line=>0,
442
+ :script=>"--#ENDPOINT GET /one/two\nreturn request\n",
443
+ :line_end=>2
444
+ }
445
+ expect(ret).to eq([e])
446
+ end
447
+ end
448
+
449
+ it "reads many" do
450
+ Tempfile.open("foo") do |tio|
451
+ tio << %{--#ENDPOINT GET /one/two
452
+ return request
453
+ --#ENDPOINT PUT /one/two
454
+ return request
455
+
456
+ --#ENDPOINT DELETE /three/two
457
+ return request
458
+ }.gsub(/^\s+/,'')
459
+ tio.close
460
+
461
+ ret = @srv.toRemoteItem(nil, tio.path)
462
+
463
+ expect(ret).to eq([
464
+ {
465
+ :method=>"GET",
466
+ :path=>"/one/two",
467
+ :content_type=>"application/json",
468
+ :local_path=>Pathname.new(tio.path),
469
+ :line=>0,
470
+ :script=>"--#ENDPOINT GET /one/two\nreturn request\n",
471
+ :line_end=>2
472
+ },
473
+ {
474
+ :method=>"PUT",
475
+ :path=>"/one/two",
476
+ :content_type=>"application/json",
477
+ :local_path=>Pathname.new(tio.path),
478
+ :line=>2,
479
+ :script=>"--#ENDPOINT PUT /one/two\nreturn request\n",
480
+ :line_end=>4
481
+ },
482
+ {
483
+ :method=>"DELETE",
484
+ :path=>"/three/two",
485
+ :content_type=>"application/json",
486
+ :local_path=>Pathname.new(tio.path),
487
+ :line=>4,
488
+ :script=>"--#ENDPOINT DELETE /three/two\nreturn request\n",
489
+ :line_end=>6
490
+ }
491
+ ])
492
+ end
493
+ end
494
+
495
+ it "skips all when no header found" do
496
+ Tempfile.open("foo") do |tio|
497
+ tio << %{
498
+ return request
499
+
500
+ }.gsub(/^\s+/,'')
501
+ tio.close
502
+
503
+ ret = @srv.toRemoteItem(nil, tio.path)
504
+ expect(ret).to eq([])
505
+ end
506
+ end
507
+
508
+ it "skips junk at begining" do
509
+ Tempfile.open("foo") do |tio|
510
+ tio << %{
511
+ return flex
512
+ --#ENDPOINT GET /one/two
513
+ return request
514
+
515
+ }.gsub(/^\s+/,'')
516
+ tio.close
517
+
518
+ ret = @srv.toRemoteItem(nil, tio.path)
519
+ e = {:method=>"GET",
520
+ :path=>"/one/two",
521
+ :content_type=>"application/json",
522
+ :local_path=>Pathname.new(tio.path),
523
+ :line=>1,
524
+ :script=>"--#ENDPOINT GET /one/two\nreturn request\n",
525
+ :line_end=>3
526
+ }
527
+ expect(ret).to eq([e])
528
+ end
529
+ end
530
+ end
531
+
532
+ context "Matching" do
533
+ before(:example) do
534
+ @an_item = {
535
+ :method=>'get',
536
+ :path=>'/api/read/stuff',
537
+ :local_path=>Pathname.new('a/relative/path.lua'),
538
+ }
539
+ end
540
+ context "method" do
541
+ it "any path" do
542
+ ret = @srv.match(@an_item, '#get#')
543
+ expect(ret).to be true
544
+ ret = @srv.match(@an_item, '#post#')
545
+ expect(ret).to be false
546
+ end
547
+ it "exact path" do
548
+ ret = @srv.match(@an_item, '#get#/api/read/stuff')
549
+ expect(ret).to be true
550
+ ret = @srv.match(@an_item, '#post#/api/read/stuff')
551
+ expect(ret).to be false
552
+ end
553
+ it "path glob" do
554
+ ret = @srv.match(@an_item, '#get#/api/*/stuff')
555
+ expect(ret).to be true
556
+ ret = @srv.match(@an_item, '#get#/**/stuff')
557
+ expect(ret).to be true
558
+ end
559
+ end
560
+ context "any method" do
561
+ it "any path" do
562
+ ret = @srv.match(@an_item, '##')
563
+ expect(ret).to be true
564
+ end
565
+ it "exact path" do
566
+ ret = @srv.match(@an_item, '##/api/read/stuff')
567
+ expect(ret).to be true
568
+ ret = @srv.match(@an_item, '##/api/do/stuff')
569
+ expect(ret).to be false
570
+ end
571
+ it "path glob" do
572
+ ret = @srv.match(@an_item, '##/api/*/stuff')
573
+ expect(ret).to be true
574
+ ret = @srv.match(@an_item, '##/**/stuff')
575
+ expect(ret).to be true
576
+ end
577
+ end
578
+ end
579
+
580
+ end
581
+ # vim: set ai et sw=2 ts=2 :