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,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 :