wabur 0.1.0d2 → 0.2.0d1

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.
@@ -0,0 +1,461 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << __dir__
5
+ $: << File.join(File.dirname(File.expand_path(__dir__)), 'lib')
6
+
7
+ require 'minitest'
8
+ require 'minitest/autorun'
9
+
10
+ require 'wab/impl'
11
+ require 'wab/io'
12
+
13
+
14
+ class IoEngineTest < Minitest::Test
15
+
16
+ class MirrorController < ::WAB::Controller
17
+ def initialize(shell)
18
+ super
19
+ end
20
+
21
+ def handle(data)
22
+ data
23
+ end
24
+
25
+ def create(path, query, data)
26
+ super
27
+ end
28
+
29
+ def read(path, query)
30
+ super
31
+ end
32
+
33
+ def update(path, query, data)
34
+ super
35
+ end
36
+
37
+ def delete(path, query)
38
+ super
39
+ end
40
+
41
+ end # MirrorController
42
+
43
+ def test_default_controller
44
+ run_fork_test([
45
+ [{
46
+ rid: 'rid-mirror',
47
+ api: 1,
48
+ body:{
49
+ kind: 'sample',
50
+ num: 7,
51
+ },
52
+ },
53
+ {rid:'rid-mirror', api:2, body:{kind:"sample", num:7}}]
54
+ ])
55
+ end
56
+
57
+ def test_create
58
+ run_fork_test([
59
+ [{
60
+ rid: 'rid-create',
61
+ api: 1,
62
+ body:{
63
+ op: 'NEW',
64
+ path: [ 'sample' ],
65
+ content: {
66
+ kind: 'sample',
67
+ num: 7,
68
+ },
69
+ },
70
+ },
71
+ {rid: '1', api: 3, body:{ insert:{ kind: 'sample', num: 7}}}],
72
+ [{
73
+ rid: '1',
74
+ api: 4,
75
+ body:{
76
+ ref: 123,
77
+ code: 0,
78
+ },
79
+ },
80
+ {rid: 'rid-create', api: 2, body:{ ref: 123, code: 0 }}]
81
+ ])
82
+ end
83
+
84
+ def test_create_with_where
85
+ run_fork_test([
86
+ [{
87
+ rid: 'rid-create-where',
88
+ api: 1,
89
+ body:{
90
+ op: 'NEW',
91
+ path: [ 'sample' ],
92
+ query: {
93
+ id: 12345
94
+ },
95
+ content: {
96
+ kind: 'sample',
97
+ id: 12345,
98
+ num: 7,
99
+ },
100
+ },
101
+ },
102
+ {
103
+ rid: '1',
104
+ api: 3,
105
+ body:{
106
+ where: ['AND', ['EQ', 'kind', "'sample"],['EQ', 'id', 12345]],
107
+ insert:{ kind: 'sample', id: 12345, num: 7}
108
+ }
109
+ }],
110
+ [{
111
+ rid: '1',
112
+ api: 4,
113
+ body:{
114
+ ref: 123,
115
+ code: 0,
116
+ },
117
+ },
118
+ {rid: 'rid-create-where', api: 2, body:{ ref: 123, code: 0 }}]
119
+ ])
120
+ end
121
+
122
+ def test_create_error
123
+ run_fork_test([
124
+ [{
125
+ rid: 'rid-create',
126
+ api: 1,
127
+ body:{
128
+ op: 'NEW',
129
+ path: [ 'sample' ],
130
+ content: {
131
+ kind: 'sample',
132
+ num: 7,
133
+ },
134
+ },
135
+ },
136
+ {rid: '1', api: 3, body:{ insert:{ kind: 'sample', num: 7}}}],
137
+ [{
138
+ rid: '1',
139
+ api: 4,
140
+ body:{
141
+ ref: 123,
142
+ code: -1,
143
+ error: "something went wrong"
144
+ },
145
+ },
146
+ {rid: 'rid-create', api: 2, body:{ code: -1, error: "error on sample create. something went wrong" }}]
147
+ ])
148
+ end
149
+
150
+ def test_read_by_id
151
+ run_fork_test([
152
+ [{
153
+ rid: 'rid-read-id',
154
+ api: 1,
155
+ body:{
156
+ op: 'GET',
157
+ path: [ 'sample', '12345' ]
158
+ },
159
+ },
160
+ {
161
+ rid: '1',
162
+ api: 3,
163
+ body:{
164
+ where: 12345,
165
+ select: '$'
166
+ }
167
+ }],
168
+ [{
169
+ rid: '1',
170
+ api: 4,
171
+ body:{
172
+ code: 0,
173
+ results:{
174
+ kind: 'sample',
175
+ id: 12345,
176
+ num: 7,
177
+ }
178
+ }
179
+ },
180
+ {rid: 'rid-read-id', api: 2, body:{ code: 0, results:[{ id: 12345, data: { kind: 'sample', id: 12345, num: 7}}]}}]
181
+ ])
182
+ end
183
+
184
+ def test_read_by_attrs
185
+ run_fork_test([
186
+ [{
187
+ rid: 'rid-read-attrs',
188
+ api: 1,
189
+ body:{
190
+ op: 'GET',
191
+ path: [ 'sample' ],
192
+ query: {
193
+ id: 12345
194
+ }
195
+ }
196
+ },
197
+ {
198
+ rid: '1',
199
+ api: 3,
200
+ body:{
201
+ where: ['AND', ['EQ', 'kind', "'sample"],['EQ', 'id', 12345]],
202
+ select: { id: '$ref', data: '$' }
203
+ }
204
+ }],
205
+ [{
206
+ rid: '1',
207
+ api: 4,
208
+ body:{
209
+ code: 0,
210
+ results:[{
211
+ id: 12345,
212
+ data: {
213
+ kind: 'sample',
214
+ id: 12345,
215
+ num: 7,
216
+ }
217
+ }]
218
+ }
219
+ },
220
+ {
221
+ rid: 'rid-read-attrs',
222
+ api: 2,
223
+ body: {
224
+ code: 0,
225
+ results:[{
226
+ id: 12345,
227
+ data: {
228
+ kind: 'sample',
229
+ id: 12345,
230
+ num: 7,
231
+ }
232
+ }]
233
+ }
234
+ }]
235
+ ])
236
+ end
237
+
238
+ def test_read_list
239
+ run_fork_test([
240
+ [{
241
+ rid: 'rid-read-list',
242
+ api: 1,
243
+ body:{
244
+ op: 'GET',
245
+ path: [ 'sample' ]
246
+ }
247
+ },
248
+ {
249
+ rid: '1',
250
+ api: 3,
251
+ body:{
252
+ where: ['EQ', 'kind', "'sample"],
253
+ select: { id: '$ref', data: '$' }
254
+ }
255
+ }],
256
+ [{
257
+ rid: '1',
258
+ api: 4,
259
+ body:{
260
+ code: 0,
261
+ results:[ 12345 ]
262
+ }
263
+ },
264
+ {
265
+ rid: 'rid-read-list',
266
+ api: 2,
267
+ body: {
268
+ code: 0,
269
+ results:[ 12345 ]
270
+ }
271
+ }]
272
+ ])
273
+ end
274
+
275
+ def test_update_by_id
276
+ run_fork_test([
277
+ [{
278
+ rid: 'rid-update-id',
279
+ api: 1,
280
+ body:{
281
+ op: 'MOD',
282
+ path: [ 'sample', '12345' ],
283
+ content: {
284
+ kind: 'sample',
285
+ id: 12345,
286
+ num: 7,
287
+ }
288
+ }
289
+ },
290
+ {
291
+ rid: '1',
292
+ api: 3,
293
+ body:{
294
+ where: 12345,
295
+ update: { kind: 'sample', id: 12345, num: 7}
296
+ }
297
+ }],
298
+ [{
299
+ rid: '1',
300
+ api: 4,
301
+ body:{
302
+ code: 0,
303
+ updated: [ 12345 ]
304
+ }
305
+ },
306
+ {rid: 'rid-update-id', api: 2, body:{ code: 0, updated: [12345] }}]
307
+ ])
308
+ end
309
+
310
+ def test_update_by_attrs
311
+ run_fork_test([
312
+ [{
313
+ rid: 'rid-update-attrs',
314
+ api: 1,
315
+ body:{
316
+ op: 'MOD',
317
+ path: [ 'sample' ],
318
+ query: {
319
+ id: 12345
320
+ },
321
+ content: {
322
+ kind: 'sample',
323
+ id: 12345,
324
+ num: 7,
325
+ }
326
+ }
327
+ },
328
+ {
329
+ rid: '1',
330
+ api: 3,
331
+ body:{
332
+ where: ['AND', ['EQ', 'kind', "'sample"],['EQ', 'id', 12345]],
333
+ update: { kind: 'sample', id: 12345, num: 7}
334
+ }
335
+ }],
336
+ [{
337
+ rid: '1',
338
+ api: 4,
339
+ body:{
340
+ code: 0,
341
+ updated: [ 12345 ]
342
+ }
343
+ },
344
+ {rid: 'rid-update-attrs', api: 2, body:{ code: 0, updated: [12345] }}]
345
+ ])
346
+ end
347
+
348
+ def test_delete_by_id
349
+ run_fork_test([
350
+ [{
351
+ rid: 'rid-delete-id',
352
+ api: 1,
353
+ body:{
354
+ op: 'DEL',
355
+ path: [ 'sample', '12345' ]
356
+ }
357
+ },
358
+ {
359
+ rid: '1',
360
+ api: 3,
361
+ body:{
362
+ where: 12345,
363
+ delete: nil
364
+ }
365
+ }],
366
+ [{
367
+ rid: '1',
368
+ api: 4,
369
+ body:{
370
+ code: 0,
371
+ deleted: [ 12345 ]
372
+ }
373
+ },
374
+ {rid: 'rid-delete-id', api: 2, body:{ code: 0, deleted: [12345] }}]
375
+ ])
376
+ end
377
+
378
+ def test_delete_by_attrs
379
+ run_fork_test([
380
+ [{
381
+ rid: 'rid-delete-attrs',
382
+ api: 1,
383
+ body:{
384
+ op: 'DEL',
385
+ path: [ 'sample' ],
386
+ query: {
387
+ id: 12345
388
+ }
389
+ }
390
+ },
391
+ {
392
+ rid: '1',
393
+ api: 3,
394
+ body:{
395
+ where: ['AND', ['EQ', 'kind', "'sample"],['EQ', 'id', 12345]],
396
+ delete: nil
397
+ }
398
+ }],
399
+ [{
400
+ rid: '1',
401
+ api: 4,
402
+ body:{
403
+ code: 0,
404
+ deleted: [ 12345 ]
405
+ }
406
+ },
407
+ {rid: 'rid-delete-attrs', api: 2, body:{ code: 0, deleted: [12345] }}]
408
+ ])
409
+ end
410
+
411
+ # Fork and create a shell in the child. For each pair in the script send the
412
+ # first message and wait for the second. Compare second for test success of
413
+ # failure.
414
+ def run_fork_test(script)
415
+ # Windows does not support fork
416
+ return if RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/
417
+
418
+ to_r, to_w = IO.pipe
419
+ from_r, from_w = IO.pipe
420
+
421
+ if fork.nil? # child
422
+ $stdin = to_r
423
+ to_w.close
424
+ $stdout = from_w
425
+ from_r.close
426
+
427
+ shell = ::WAB::IO::Shell.new(1, 'kind', 0)
428
+ shell.register_controller(nil, MirrorController.new(shell))
429
+ shell.start
430
+
431
+ Process.exit(0)
432
+ else
433
+ to_r.close
434
+ from_w.close
435
+
436
+ # Shell#data should be called instead but for this test a shell is not
437
+ # desired.
438
+ script.each { |pair|
439
+ to_w.puts(::WAB::Impl::Data.new(pair[0], false).json)
440
+ to_w.flush
441
+
442
+ reply = nil
443
+ Oj.strict_load(from_r, symbol_keys: true) { |msg| reply = msg; break }
444
+
445
+ # remove backtrace if an error
446
+ bt = nil
447
+ if !reply.nil? && !reply[:body].nil?
448
+ bt = reply[:body].delete(:backtrace)
449
+ end
450
+ begin
451
+ assert_equal(pair[1], reply)
452
+ rescue Exception => e
453
+ puts
454
+ puts bt
455
+ raise e
456
+ end
457
+ }
458
+ end
459
+ end
460
+
461
+ end
data/test/tests.rb ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.dirname(__FILE__)
5
+ $: << File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), 'lib')
6
+
7
+ require 'minitest'
8
+ require 'minitest/autorun'
9
+
10
+ require 'impl_test'
11
+
12
+ require 'ioshell_test'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wabur
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0d2
4
+ version: 0.2.0d1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Ohler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-07 00:00:00.000000000 Z
11
+ date: 2017-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj
@@ -73,17 +73,22 @@ extensions: []
73
73
  extra_rdoc_files:
74
74
  - README.md
75
75
  - pages/Architecture.md
76
- - pages/Plan.md
77
76
  - pages/Goals.md
77
+ - pages/Plan.md
78
78
  files:
79
79
  - LICENSE
80
80
  - README.md
81
81
  - lib/wab.rb
82
82
  - lib/wab/controller.rb
83
83
  - lib/wab/data.rb
84
+ - lib/wab/errors.rb
84
85
  - lib/wab/impl.rb
85
86
  - lib/wab/impl/data.rb
86
87
  - lib/wab/impl/shell.rb
88
+ - lib/wab/io.rb
89
+ - lib/wab/io/call.rb
90
+ - lib/wab/io/engine.rb
91
+ - lib/wab/io/shell.rb
87
92
  - lib/wab/model.rb
88
93
  - lib/wab/shell.rb
89
94
  - lib/wab/uuid.rb
@@ -94,6 +99,8 @@ files:
94
99
  - pages/Plan.md
95
100
  - test/data_test.rb
96
101
  - test/impl_test.rb
102
+ - test/ioshell_test.rb
103
+ - test/tests.rb
97
104
  homepage: http://github.com/ohler55/wabur
98
105
  licenses:
99
106
  - MIT
@@ -124,5 +131,7 @@ signing_key:
124
131
  specification_version: 4
125
132
  summary: Web Application Builder
126
133
  test_files:
127
- - test/impl_test.rb
128
134
  - test/data_test.rb
135
+ - test/impl_test.rb
136
+ - test/ioshell_test.rb
137
+ - test/tests.rb