wamp_client 0.0.1

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,1004 @@
1
+ require 'spec_helper'
2
+
3
+ describe WampClient::Session do
4
+ let (:transport) { SpecHelper::TestTransport.new({}) }
5
+ let (:session) { WampClient::Session.new(transport) }
6
+
7
+ describe 'establishment' do
8
+
9
+ before(:each) do
10
+ @join_count = 0
11
+ session.on_join do |details|
12
+ @join_count += 1
13
+ end
14
+ @leave_count = 0
15
+ session.on_leave do |reason, details|
16
+ @leave_count += 1
17
+ end
18
+ end
19
+
20
+ it 'performs a tx-hello/rx-welcome' do
21
+
22
+ session.join('test')
23
+
24
+ # Check generated message
25
+ expect(transport.messages.count).to eq(1)
26
+ expect(transport.messages[0][0]).to eq(WampClient::Message::Types::HELLO)
27
+ expect(transport.messages[0][1]).to eq('test') # Realm Test
28
+ expect(transport.messages[0][2][:roles]).not_to be_nil # Roles exists
29
+
30
+ # Check State
31
+ expect(session.id).to be_nil
32
+ expect(session.is_open?).to eq(false)
33
+ expect(session.realm).to eq('test')
34
+ expect(@join_count).to eq(0)
35
+ expect(@leave_count).to eq(0)
36
+
37
+ # Send welcome message
38
+ welcome = WampClient::Message::Welcome.new(1234, {})
39
+ transport.receive_message(welcome.payload)
40
+
41
+ # Check new state of session
42
+ expect(session.id).to eq(1234)
43
+ expect(session.is_open?).to eq(true)
44
+ expect(session.realm).to eq('test')
45
+ expect(@join_count).to eq(1)
46
+ expect(@leave_count).to eq(0)
47
+
48
+ # Check Exception
49
+ expect { session.join('test') }.to raise_exception("Session must be closed to call 'join'")
50
+
51
+ end
52
+
53
+ it 'performs a tx-hello/rx-abort' do
54
+
55
+ session.join('test')
56
+
57
+ # Send abort message
58
+ abort = WampClient::Message::Abort.new({}, 'test.reason')
59
+ transport.receive_message(abort.payload)
60
+
61
+ # Check new state of session
62
+ expect(session.id).to be_nil
63
+ expect(session.is_open?).to eq(false)
64
+ expect(@join_count).to eq(0)
65
+ expect(@leave_count).to eq(1)
66
+
67
+ end
68
+
69
+ it 'performs a connect then client initiated goodbye' do
70
+
71
+ # Check Exception
72
+ expect { session.leave('felt.like.it') }.to raise_exception("Session must be opened to call 'leave'")
73
+
74
+ session.join('test')
75
+ welcome = WampClient::Message::Welcome.new(1234, {})
76
+ transport.receive_message(welcome.payload)
77
+
78
+ # Leave the session
79
+ session.leave('felt.like.it')
80
+
81
+ # Check state
82
+ expect(transport.messages.count).to eq(2)
83
+ expect(session.id).to eq(1234)
84
+ expect(session.realm).to eq('test')
85
+ expect(session.is_open?).to eq(true)
86
+ expect(session._goodbye_sent).to eq(true)
87
+ expect(@leave_count).to eq(0)
88
+
89
+ # Send Goodbye response from server
90
+ goodbye = WampClient::Message::Goodbye.new({}, 'wamp.error.goodbye_and_out')
91
+ transport.receive_message(goodbye.payload)
92
+
93
+ # Check state
94
+ expect(transport.messages.count).to eq(2)
95
+ expect(session.id).to be_nil
96
+ expect(session.is_open?).to eq(false)
97
+ expect(session.realm).to be_nil
98
+ expect(session._goodbye_sent).to eq(false)
99
+ expect(@leave_count).to eq(1)
100
+
101
+ end
102
+
103
+ it 'performs a connect then server initiated goodbye' do
104
+
105
+ session.join('test')
106
+ welcome = WampClient::Message::Welcome.new(1234, {})
107
+ transport.receive_message(welcome.payload)
108
+
109
+ # Send Goodbye from server
110
+ goodbye = WampClient::Message::Goodbye.new({}, 'felt.like.it')
111
+ transport.receive_message(goodbye.payload)
112
+
113
+ # Check state
114
+ expect(transport.messages.count).to eq(2)
115
+ expect(transport.messages[1][0]).to eq(WampClient::Message::Types::GOODBYE)
116
+ expect(transport.messages[1][2]).to eq('wamp.error.goodbye_and_out') # Realm Test
117
+ expect(session.id).to be_nil
118
+ expect(session.is_open?).to eq(false)
119
+ expect(session.realm).to be_nil
120
+ expect(session._goodbye_sent).to eq(false)
121
+ expect(@leave_count).to eq(1)
122
+
123
+ end
124
+
125
+ end
126
+
127
+ describe 'subscribe' do
128
+
129
+ before(:each) do
130
+ # Check Exception
131
+ expect { session.subscribe('test.topic', nil, {test: 1}) }.to raise_exception("Session must be open to call 'subscribe'")
132
+
133
+ session.join('test')
134
+ welcome = WampClient::Message::Welcome.new(1234, {})
135
+ transport.receive_message(welcome.payload)
136
+ transport.messages = []
137
+ end
138
+
139
+ it 'adds subscribe request to queue' do
140
+ session.subscribe('test.topic', lambda {}, {test: 1})
141
+
142
+ expect(session._requests[:subscribe].count).to eq(1)
143
+ request_id = session._requests[:subscribe].keys.first
144
+
145
+ # Check the transport messages
146
+ expect(transport.messages.count).to eq(1)
147
+ expect(transport.messages[0][0]).to eq(WampClient::Message::Types::SUBSCRIBE)
148
+ expect(transport.messages[0][1]).to eq(request_id)
149
+ expect(transport.messages[0][2]).to eq({test: 1})
150
+ expect(transport.messages[0][3]).to eq('test.topic')
151
+
152
+ # Check the request dictionary
153
+ expect(session._requests[:subscribe][request_id][:t]).to eq('test.topic')
154
+ expect(session._requests[:subscribe][request_id][:o]).to eq({test: 1})
155
+
156
+ # Check the subscriptions
157
+ expect(session._subscriptions.count).to eq(0)
158
+ end
159
+
160
+ it 'confirms subscription' do
161
+ count = 0
162
+ session.subscribe('test.topic', lambda {}, {test: 1}) do |subscription, error, details|
163
+ count += 1
164
+
165
+ expect(subscription).not_to be_nil
166
+ expect(subscription.id).to eq(3456)
167
+ expect(error).to be_nil
168
+ expect(details).to eq({topic: 'test.topic', type: 'subscribe'})
169
+ end
170
+
171
+ request_id = session._requests[:subscribe].keys.first
172
+
173
+ expect(count).to eq(0)
174
+
175
+ # Generate server response
176
+ subscribed = WampClient::Message::Subscribed.new(request_id, 3456)
177
+ transport.receive_message(subscribed.payload)
178
+
179
+ expect(count).to eq(1)
180
+
181
+ # Check that the requests are empty
182
+ expect(session._requests[:subscribe].count).to eq(0)
183
+
184
+ # Check the subscriptions
185
+ expect(session._subscriptions.count).to eq(1)
186
+ expect(session._subscriptions[3456].topic).to eq('test.topic')
187
+ expect(session._subscriptions[3456].options).to eq({test: 1})
188
+
189
+ end
190
+
191
+ it 'errors confirming a subscription' do
192
+ count = 0
193
+ session.subscribe('test.topic', lambda {}, {test: 1}) do |subscription, error, details|
194
+ count += 1
195
+
196
+ expect(subscription).to be_nil
197
+ expect(error[:error]).to eq('this.failed')
198
+ expect(details).to eq({fail: true, topic: 'test.topic', type: 'subscribe'})
199
+ end
200
+
201
+ request_id = session._requests[:subscribe].keys.first
202
+
203
+ # Generate server response
204
+ error = WampClient::Message::Error.new(WampClient::Message::Types::SUBSCRIBE,
205
+ request_id, {fail: true}, 'this.failed')
206
+ transport.receive_message(error.payload)
207
+
208
+ expect(count).to eq(1)
209
+
210
+ # Check that the requests are empty
211
+ expect(session._requests[:subscribe].count).to eq(0)
212
+
213
+ # Check the subscriptions
214
+ expect(session._subscriptions.count).to eq(0)
215
+ end
216
+
217
+ it 'receives an event' do
218
+
219
+ count = 0
220
+ handler = lambda do |args, kwargs, details|
221
+ count += 1
222
+
223
+ expect(details).to eq({test:1, publication:7890})
224
+ expect(args).to eq([2])
225
+ expect(kwargs).to eq({param: 'value'})
226
+ end
227
+
228
+ session.subscribe('test.topic', handler, {test: 1})
229
+ request_id = session._requests[:subscribe].keys.first
230
+
231
+ expect(count).to eq(0)
232
+
233
+ # Generate server response
234
+ subscribed = WampClient::Message::Subscribed.new(request_id, 3456)
235
+ transport.receive_message(subscribed.payload)
236
+
237
+ expect(count).to eq(0)
238
+
239
+ # Generate server event
240
+ event = WampClient::Message::Event.new(3456, 7890, {test:1}, [2], {param: 'value'})
241
+ transport.receive_message(event.payload)
242
+
243
+ expect(count).to eq(1)
244
+
245
+ end
246
+
247
+ end
248
+
249
+ describe 'unsubscribe' do
250
+
251
+ before(:each) do
252
+ # Check Exception
253
+ expect { session.unsubscribe(nil) }.to raise_exception("Session must be open to call 'unsubscribe'")
254
+
255
+ session.join('test')
256
+ welcome = WampClient::Message::Welcome.new(1234, {})
257
+ transport.receive_message(welcome.payload)
258
+
259
+ session.subscribe('test.topic', lambda {}, {test: 1}) do |subscription, error, details|
260
+ @subscription = subscription
261
+ end
262
+
263
+ # Get the request ID
264
+ @request_id = session._requests[:subscribe].keys.first
265
+
266
+ # Generate server response
267
+ subscribed = WampClient::Message::Subscribed.new(@request_id, 3456)
268
+ transport.receive_message(subscribed.payload)
269
+
270
+ transport.messages = []
271
+ end
272
+
273
+ it 'adds unsubscribe request to the queue' do
274
+ session.unsubscribe(@subscription)
275
+
276
+ @request_id = session._requests[:unsubscribe].keys.first
277
+
278
+ # Check the transport messages
279
+ expect(transport.messages.count).to eq(1)
280
+ expect(transport.messages[0][0]).to eq(WampClient::Message::Types::UNSUBSCRIBE)
281
+ expect(transport.messages[0][1]).to eq(@request_id)
282
+ expect(transport.messages[0][2]).to eq(@subscription.id)
283
+
284
+ # Check the request dictionary
285
+ expect(session._requests[:unsubscribe][@request_id]).not_to be_nil
286
+
287
+ # Check the subscriptions
288
+ expect(session._subscriptions.count).to eq(1)
289
+
290
+ end
291
+
292
+ it 'grants an unsubscription' do
293
+
294
+ count = 0
295
+ session.unsubscribe(@subscription) do |subscription, error, details|
296
+ count += 1
297
+
298
+ expect(subscription.id).to eq(@subscription.id)
299
+ expect(error).to be_nil
300
+ expect(details).to eq({topic: 'test.topic', type: 'unsubscribe'})
301
+ end
302
+
303
+ @request_id = session._requests[:unsubscribe].keys.first
304
+
305
+ expect(count).to eq(0)
306
+
307
+ # Generate Server Response
308
+ unsubscribed = WampClient::Message::Unsubscribed.new(@request_id)
309
+ transport.receive_message(unsubscribed.payload)
310
+
311
+ # Check the request dictionary
312
+ expect(session._requests[:unsubscribe].count).to eq(0)
313
+
314
+ # Check the subscriptions
315
+ expect(session._subscriptions.count).to eq(0)
316
+
317
+ end
318
+
319
+ it 'confirms an unsubscription' do
320
+
321
+ @subscription.unsubscribe
322
+
323
+ @request_id = session._requests[:unsubscribe].keys.first
324
+
325
+ # Generate Server Response
326
+ unsubscribed = WampClient::Message::Unsubscribed.new(@request_id)
327
+ transport.receive_message(unsubscribed.payload)
328
+
329
+ # Check the request dictionary
330
+ expect(session._requests[:unsubscribe].count).to eq(0)
331
+
332
+ # Check the subscriptions
333
+ expect(session._subscriptions.count).to eq(0)
334
+
335
+ end
336
+
337
+ it 'errors confirming an unsubscription' do
338
+
339
+ count = 0
340
+ session.unsubscribe(@subscription) do |subscription, error, details|
341
+ count += 1
342
+
343
+ expect(subscription).to be_nil
344
+ expect(error[:error]).to eq('this.failed')
345
+ expect(details).to eq({fail: true, topic: 'test.topic', type: 'unsubscribe'})
346
+ end
347
+
348
+ @request_id = session._requests[:unsubscribe].keys.first
349
+
350
+ expect(count).to eq(0)
351
+
352
+ # Generate Server Response
353
+ error = WampClient::Message::Error.new(WampClient::Message::Types::UNSUBSCRIBE,
354
+ @request_id, {fail: true}, 'this.failed')
355
+ transport.receive_message(error.payload)
356
+
357
+ expect(count).to eq(1)
358
+
359
+ # Check the request dictionary
360
+ expect(session._requests[:unsubscribe].count).to eq(0)
361
+
362
+ # Check the subscriptions
363
+ expect(session._subscriptions.count).to eq(1)
364
+
365
+ end
366
+
367
+ end
368
+
369
+ describe 'publish' do
370
+
371
+ before(:each) do
372
+ # Check Exception
373
+ expect { session.publish('test.topic') }.to raise_exception("Session must be open to call 'publish'")
374
+
375
+ session.join('test')
376
+ welcome = WampClient::Message::Welcome.new(1234, {})
377
+ transport.receive_message(welcome.payload)
378
+
379
+ transport.messages = []
380
+ end
381
+
382
+ it 'adds a publish to the publish request queue' do
383
+ session.publish('test.topic', nil, nil, {acknowledge:true})
384
+
385
+ @request_id = session._requests[:publish].keys.first
386
+
387
+ # Check the transport messages
388
+ expect(transport.messages.count).to eq(1)
389
+ expect(transport.messages[0][0]).to eq(WampClient::Message::Types::PUBLISH)
390
+ expect(transport.messages[0][1]).to eq(@request_id)
391
+ expect(transport.messages[0][2]).to eq({acknowledge:true})
392
+
393
+ # Check the request dictionary
394
+ expect(session._requests[:publish][@request_id]).not_to be_nil
395
+
396
+ end
397
+
398
+ it 'publishes with no confirmation' do
399
+
400
+ expect(transport.messages.count).to eq(0)
401
+
402
+ session.publish('test.topic', nil, nil, {})
403
+
404
+ expect(transport.messages.count).to eq(1)
405
+
406
+ # Check the request dictionary
407
+ expect(session._requests[:publish].count).to eq(0)
408
+
409
+ end
410
+
411
+ it 'publishes with confirmation' do
412
+
413
+ expect(transport.messages.count).to eq(0)
414
+
415
+ count = 0
416
+ session.publish('test.topic', nil, nil, {acknowledge: true}) do |publication, error, details|
417
+ count += 1
418
+
419
+ expect(publication).not_to be_nil
420
+ expect(error).to be_nil
421
+ expect(details).to eq({topic: 'test.topic', type: 'publish', publication: 5678})
422
+ end
423
+
424
+ @request_id = session._requests[:publish].keys.first
425
+
426
+ expect(count).to eq(0)
427
+
428
+ # Generate Server Response
429
+ published = WampClient::Message::Published.new(@request_id, 5678)
430
+ transport.receive_message(published.payload)
431
+
432
+ # Check the request dictionary
433
+ expect(session._requests[:publish].count).to eq(0)
434
+
435
+ expect(count).to eq(1)
436
+
437
+ end
438
+
439
+ it 'errors confirming a publish' do
440
+
441
+ count = 0
442
+ session.publish('test.topic', nil, nil, {acknowledge: true}) do |publication, error, details|
443
+ count += 1
444
+
445
+ expect(publication).to be_nil
446
+ expect(error[:error]).to eq('this.failed')
447
+ expect(details).to eq({fail: true, topic: 'test.topic', type: 'publish'})
448
+ end
449
+
450
+ @request_id = session._requests[:publish].keys.first
451
+
452
+ expect(count).to eq(0)
453
+
454
+ # Generate Server Response
455
+ error = WampClient::Message::Error.new(WampClient::Message::Types::PUBLISH,
456
+ @request_id, {fail: true}, 'this.failed')
457
+ transport.receive_message(error.payload)
458
+
459
+ expect(count).to eq(1)
460
+
461
+ # Check the request dictionary
462
+ expect(session._requests[:publish].count).to eq(0)
463
+
464
+ end
465
+
466
+ end
467
+
468
+ describe 'register' do
469
+
470
+ before(:each) do
471
+ # Check Exception
472
+ expect { session.register('test.procedure', nil, {test: 1}) }.to raise_exception("Session must be open to call 'register'")
473
+
474
+ session.join('test')
475
+ welcome = WampClient::Message::Welcome.new(1234, {})
476
+ transport.receive_message(welcome.payload)
477
+ transport.messages = []
478
+ end
479
+
480
+ it 'adds register request to queue' do
481
+ session.register('test.procedure', lambda {}, {test: 1})
482
+
483
+ expect(session._requests[:register].count).to eq(1)
484
+ request_id = session._requests[:register].keys.first
485
+
486
+ # Check the transport messages
487
+ expect(transport.messages.count).to eq(1)
488
+ expect(transport.messages[0][0]).to eq(WampClient::Message::Types::REGISTER)
489
+ expect(transport.messages[0][1]).to eq(request_id)
490
+ expect(transport.messages[0][2]).to eq({test: 1})
491
+ expect(transport.messages[0][3]).to eq('test.procedure')
492
+
493
+ # Check the request dictionary
494
+ expect(session._requests[:register][request_id][:p]).to eq('test.procedure')
495
+ expect(session._requests[:register][request_id][:o]).to eq({test: 1})
496
+
497
+ # Check the subscriptions
498
+ expect(session._registrations.count).to eq(0)
499
+ end
500
+
501
+ it 'confirms register' do
502
+ count = 0
503
+
504
+ session.register('test.procedure', lambda {}, {test: 1}) do |registration, error, details|
505
+ count += 1
506
+
507
+ expect(registration).not_to be_nil
508
+ expect(registration.id).to eq(3456)
509
+ expect(error).to be_nil
510
+ expect(details).to eq({procedure: 'test.procedure', type: 'register'})
511
+ end
512
+ request_id = session._requests[:register].keys.first
513
+
514
+ expect(count).to eq(0)
515
+
516
+ # Generate server response
517
+ registered = WampClient::Message::Registered.new(request_id, 3456)
518
+ transport.receive_message(registered.payload)
519
+
520
+ expect(count).to eq(1)
521
+
522
+ # Check that the requests are empty
523
+ expect(session._requests[:register].count).to eq(0)
524
+
525
+ # Check the subscriptions
526
+ expect(session._registrations.count).to eq(1)
527
+ expect(session._registrations[3456].procedure).to eq('test.procedure')
528
+ expect(session._registrations[3456].options).to eq({test: 1})
529
+
530
+ end
531
+
532
+ it 'errors confirming a registration' do
533
+ count = 0
534
+ session.register('test.procedure', lambda {}, {test: 1}) do |registration, error, details|
535
+ count += 1
536
+
537
+ expect(registration).to be_nil
538
+ expect(error[:error]).to eq('this.failed')
539
+ expect(details).to eq({fail: true, procedure: 'test.procedure', type: 'register'})
540
+ end
541
+
542
+ request_id = session._requests[:register].keys.first
543
+
544
+ # Generate server response
545
+ error = WampClient::Message::Error.new(WampClient::Message::Types::REGISTER,
546
+ request_id, {fail: true}, 'this.failed')
547
+ transport.receive_message(error.payload)
548
+
549
+ expect(count).to eq(1)
550
+
551
+ # Check that the requests are empty
552
+ expect(session._requests[:register].count).to eq(0)
553
+
554
+ # Check the subscriptions
555
+ expect(session._registrations.count).to eq(0)
556
+ end
557
+
558
+ end
559
+
560
+ describe 'invocation' do
561
+ before(:each) do
562
+ # Check Exception
563
+ expect { session.register('test.procedure', nil, {test: 1}) }.to raise_exception("Session must be open to call 'register'")
564
+
565
+ session.join('test')
566
+ welcome = WampClient::Message::Welcome.new(1234, {})
567
+ transport.receive_message(welcome.payload)
568
+
569
+ # Register
570
+ @response = 'response'
571
+ @throw_error = false
572
+ handler = lambda do |args, kwargs, details|
573
+
574
+ raise 'error' if @throw_error
575
+
576
+ @response
577
+ end
578
+
579
+ session.register('test.procedure', handler, {test: 1})
580
+ request_id = session._requests[:register].keys.first
581
+
582
+ # Generate server response
583
+ registered = WampClient::Message::Registered.new(request_id, 3456)
584
+ transport.receive_message(registered.payload)
585
+
586
+ transport.messages = []
587
+ end
588
+
589
+ it 'nil response' do
590
+
591
+ @response = nil
592
+
593
+ # Generate server event
594
+ invocation = WampClient::Message::Invocation.new(7890, 3456, {test:1}, [2], {param: 'value'})
595
+ transport.receive_message(invocation.payload)
596
+
597
+ # Check and make sure yield message was sent
598
+ expect(transport.messages.count).to eq(1)
599
+ expect(transport.messages[0][0]).to eq(WampClient::Message::Types::YIELD)
600
+ expect(transport.messages[0][1]).to eq(7890)
601
+ expect(transport.messages[0][2]).to eq({})
602
+ expect(transport.messages[0][3]).to be_nil
603
+
604
+ end
605
+
606
+ it 'normal response' do
607
+
608
+ @response = 'response'
609
+
610
+ # Generate server event
611
+ invocation = WampClient::Message::Invocation.new(7890, 3456, {test:1}, [2], {param: 'value'})
612
+ transport.receive_message(invocation.payload)
613
+
614
+ # Check and make sure yield message was sent
615
+ expect(transport.messages.count).to eq(1)
616
+ expect(transport.messages[0][0]).to eq(WampClient::Message::Types::YIELD)
617
+ expect(transport.messages[0][1]).to eq(7890)
618
+ expect(transport.messages[0][2]).to eq({})
619
+ expect(transport.messages[0][3]).to eq(['response'])
620
+
621
+ end
622
+
623
+ it 'call result response' do
624
+
625
+ @response = WampClient::CallResult.new(['test'], {test:1})
626
+
627
+ # Generate server event
628
+ invocation = WampClient::Message::Invocation.new(7890, 3456, {test:1}, [2], {param: 'value'})
629
+ transport.receive_message(invocation.payload)
630
+
631
+ # Check and make sure yield message was sent
632
+ expect(transport.messages.count).to eq(1)
633
+ expect(transport.messages[0][0]).to eq(WampClient::Message::Types::YIELD)
634
+ expect(transport.messages[0][1]).to eq(7890)
635
+ expect(transport.messages[0][2]).to eq({})
636
+ expect(transport.messages[0][3]).to eq(['test'])
637
+ expect(transport.messages[0][4]).to eq({test:1})
638
+
639
+ end
640
+
641
+ it 'call error response' do
642
+
643
+ @throw_error = true
644
+
645
+ # Generate server event
646
+ invocation = WampClient::Message::Invocation.new(7890, 3456, {test:1}, [2], {param: 'value'})
647
+ transport.receive_message(invocation.payload)
648
+
649
+ @throw_error = false
650
+
651
+ # Check and make sure yield message was sent
652
+ expect(transport.messages.count).to eq(1)
653
+ expect(transport.messages[0][0]).to eq(WampClient::Message::Types::ERROR)
654
+ expect(transport.messages[0][1]).to eq(WampClient::Message::Types::INVOCATION)
655
+ expect(transport.messages[0][2]).to eq(7890)
656
+ expect(transport.messages[0][3]).to eq({})
657
+ expect(transport.messages[0][4]).to eq('wamp.error.runtime')
658
+ expect(transport.messages[0][5]).to eq(['error'])
659
+
660
+ end
661
+ end
662
+
663
+ describe 'unregister' do
664
+
665
+ before(:each) do
666
+ # Check Exception
667
+ expect { session.unregister(nil) }.to raise_exception("Session must be open to call 'unregister'")
668
+
669
+ session.join('test')
670
+ welcome = WampClient::Message::Welcome.new(1234, {})
671
+ transport.receive_message(welcome.payload)
672
+
673
+ session.register('test.procedure', lambda {}, {test: 1}) do |registration, error, details|
674
+ @registration = registration
675
+ end
676
+
677
+ # Get the request ID
678
+ @request_id = session._requests[:register].keys.first
679
+
680
+ # Generate server response
681
+ registered = WampClient::Message::Registered.new(@request_id, 3456)
682
+ transport.receive_message(registered.payload)
683
+
684
+ transport.messages = []
685
+ end
686
+
687
+ it 'adds unregister request to the queue' do
688
+ session.unregister(@registration)
689
+
690
+ @request_id = session._requests[:unregister].keys.first
691
+
692
+ # Check the transport messages
693
+ expect(transport.messages.count).to eq(1)
694
+ expect(transport.messages[0][0]).to eq(WampClient::Message::Types::UNREGISTER)
695
+ expect(transport.messages[0][1]).to eq(@request_id)
696
+ expect(transport.messages[0][2]).to eq(@registration.id)
697
+
698
+ # Check the request dictionary
699
+ expect(session._requests[:unregister][@request_id]).not_to be_nil
700
+
701
+ # Check the subscriptions
702
+ expect(session._registrations.count).to eq(1)
703
+
704
+ end
705
+
706
+ it 'grants an unregister' do
707
+
708
+ count = 0
709
+ session.unregister(@registration) do |registration, error, details|
710
+ count += 1
711
+
712
+ expect(registration.id).to eq(@registration.id)
713
+ expect(error).to be_nil
714
+ expect(details).to eq({procedure: 'test.procedure', type: 'unregister'})
715
+ end
716
+
717
+ @request_id = session._requests[:unregister].keys.first
718
+
719
+ expect(count).to eq(0)
720
+
721
+ # Generate Server Response
722
+ unregistered = WampClient::Message::Unregistered.new(@request_id)
723
+ transport.receive_message(unregistered.payload)
724
+
725
+ # Check the request dictionary
726
+ expect(session._requests[:unregister].count).to eq(0)
727
+
728
+ # Check the subscriptions
729
+ expect(session._registrations.count).to eq(0)
730
+
731
+ end
732
+
733
+ it 'confirms an unregister' do
734
+
735
+ @registration.unregister
736
+
737
+ @request_id = session._requests[:unregister].keys.first
738
+
739
+ # Generate Server Response
740
+ unregistered = WampClient::Message::Unregistered.new(@request_id)
741
+ transport.receive_message(unregistered.payload)
742
+
743
+ # Check the request dictionary
744
+ expect(session._requests[:unregister].count).to eq(0)
745
+
746
+ # Check the subscriptions
747
+ expect(session._registrations.count).to eq(0)
748
+
749
+ end
750
+
751
+ it 'errors confirming an unregister' do
752
+
753
+ count = 0
754
+ session.unregister(@registration) do |registration, error, details|
755
+ count += 1
756
+
757
+ expect(registration).to be_nil
758
+ expect(error[:error]).to eq('this.failed')
759
+ expect(details).to eq({fail: true, procedure:'test.procedure', type: 'unregister'})
760
+ end
761
+
762
+ @request_id = session._requests[:unregister].keys.first
763
+
764
+ expect(count).to eq(0)
765
+
766
+ # Generate Server Response
767
+ error = WampClient::Message::Error.new(WampClient::Message::Types::UNREGISTER,
768
+ @request_id, {fail: true}, 'this.failed')
769
+ transport.receive_message(error.payload)
770
+
771
+ expect(count).to eq(1)
772
+
773
+ # Check the request dictionary
774
+ expect(session._requests[:unregister].count).to eq(0)
775
+
776
+ # Check the subscriptions
777
+ expect(session._registrations.count).to eq(1)
778
+
779
+ end
780
+
781
+ end
782
+
783
+ describe 'call' do
784
+
785
+ before(:each) do
786
+ # Check Exception
787
+ expect { session.call('test.procedure') }.to raise_exception("Session must be open to call 'call'")
788
+
789
+ session.join('test')
790
+ welcome = WampClient::Message::Welcome.new(1234, {})
791
+ transport.receive_message(welcome.payload)
792
+
793
+ transport.messages = []
794
+ end
795
+
796
+ it 'adds a call to the call request queue' do
797
+ session.call('test.procedure', nil, nil, {})
798
+
799
+ @request_id = session._requests[:call].keys.first
800
+
801
+ # Check the transport messages
802
+ expect(transport.messages.count).to eq(1)
803
+ expect(transport.messages[0][0]).to eq(WampClient::Message::Types::CALL)
804
+ expect(transport.messages[0][1]).to eq(@request_id)
805
+ expect(transport.messages[0][2]).to eq({})
806
+
807
+ # Check the request dictionary
808
+ expect(session._requests[:call][@request_id]).not_to be_nil
809
+
810
+ end
811
+
812
+ it 'calls and gets result' do
813
+
814
+ expect(transport.messages.count).to eq(0)
815
+
816
+ count = 0
817
+ session.call('test.procedure') do |result, error, details|
818
+ count += 1
819
+
820
+ expect(result).not_to be_nil
821
+ expect(result.args).to eq(['test'])
822
+ expect(result.kwargs).to eq({test:true})
823
+ expect(error).to be_nil
824
+ expect(details).to eq({procedure: 'test.procedure', type: 'call'})
825
+ end
826
+
827
+ @request_id = session._requests[:call].keys.first
828
+
829
+ expect(count).to eq(0)
830
+
831
+ # Generate Server Response
832
+ result = WampClient::Message::Result.new(@request_id, {}, ['test'], {test:true})
833
+ transport.receive_message(result.payload)
834
+
835
+ # Check the request dictionary
836
+ expect(session._requests[:call].count).to eq(0)
837
+
838
+ expect(count).to eq(1)
839
+
840
+ end
841
+
842
+ it 'errors calling a procedure' do
843
+
844
+ count = 0
845
+ session.call('test.procedure', nil, nil, {acknowledge: true}) do |result, error, details|
846
+ count += 1
847
+
848
+ expect(result).to be_nil
849
+ expect(error[:error]).to eq('this.failed')
850
+ expect(details).to eq({fail: true, procedure: 'test.procedure', type: 'call'})
851
+ end
852
+
853
+ @request_id = session._requests[:call].keys.first
854
+
855
+ expect(count).to eq(0)
856
+
857
+ # Generate Server Response
858
+ error = WampClient::Message::Error.new(WampClient::Message::Types::CALL,
859
+ @request_id, {fail: true}, 'this.failed')
860
+ transport.receive_message(error.payload)
861
+
862
+ expect(count).to eq(1)
863
+
864
+ # Check the request dictionary
865
+ expect(session._requests[:call].count).to eq(0)
866
+
867
+ end
868
+
869
+ end
870
+
871
+ describe 'progressive_call_results' do
872
+
873
+ before(:each) do
874
+ session.join('test')
875
+ welcome = WampClient::Message::Welcome.new(1234, {})
876
+ transport.receive_message(welcome.payload)
877
+
878
+ transport.messages = []
879
+ end
880
+
881
+ it 'caller ignores (should only get the first response' do
882
+
883
+ results = []
884
+ session.call('test.procedure', [], {}, {}) do |result, error, details|
885
+ results = results + result.args
886
+ end
887
+
888
+ @request_id = session._requests[:call].keys.first
889
+
890
+ # Send results
891
+ result = WampClient::Message::Result.new(@request_id, {progress:true}, ['test'])
892
+ transport.receive_message(result.payload)
893
+ transport.receive_message(result.payload)
894
+ transport.receive_message(result.payload)
895
+ transport.receive_message(result.payload)
896
+
897
+ # Send ending
898
+ result = WampClient::Message::Result.new(@request_id, {}, ['test'])
899
+ transport.receive_message(result.payload)
900
+
901
+ expect(results.count).to eq(1)
902
+
903
+ end
904
+
905
+ it 'caller support' do
906
+
907
+ results = []
908
+ session.call('test.procedure', [], {}, {receive_progress: true}) do |result, error, details|
909
+ results = results + result.args
910
+ end
911
+
912
+ @request_id = session._requests[:call].keys.first
913
+
914
+ # Send results
915
+ result = WampClient::Message::Result.new(@request_id, {progress:true}, ['test'])
916
+ transport.receive_message(result.payload)
917
+ transport.receive_message(result.payload)
918
+ transport.receive_message(result.payload)
919
+ transport.receive_message(result.payload)
920
+
921
+ # Send ending
922
+ result = WampClient::Message::Result.new(@request_id, {}, ['test'])
923
+ transport.receive_message(result.payload)
924
+
925
+ expect(results.count).to eq(5)
926
+
927
+ # Send More to ensure they are not appended
928
+ result = WampClient::Message::Result.new(@request_id, {progress:true}, ['test'])
929
+ transport.receive_message(result.payload)
930
+ transport.receive_message(result.payload)
931
+ transport.receive_message(result.payload)
932
+ transport.receive_message(result.payload)
933
+
934
+ # Ensure they were not appended
935
+ expect(results.count).to eq(5)
936
+
937
+ end
938
+
939
+ end
940
+
941
+ describe 'auth' do
942
+
943
+ let (:challenge) {"{ \"nonce\": \"LHRTC9zeOIrt_9U3\", \"authprovider\": \"userdb\", \"authid\": \"peter\", \"timestamp\": \"2014-06-22T16:36:25.448Z\", \"authrole\": \"user\", \"authmethod\": \"wampcra\", \"session\": 3251278072152162}"}
944
+ let (:secret) {'secret'}
945
+
946
+ before(:each) do
947
+ session.join('test')
948
+ transport.messages = []
949
+
950
+ session.on_challenge do |authmethod, extra|
951
+ expect(authmethod).to eq('wampcra')
952
+ WampClient::Auth::Cra.sign(secret, extra[:challenge])
953
+ end
954
+ end
955
+
956
+ it 'challenge => authenticate' do
957
+
958
+ # Send the challenge
959
+ challenge_msg = WampClient::Message::Challenge.new('wampcra', {challenge: challenge})
960
+ transport.receive_message(challenge_msg.payload)
961
+
962
+ # Check the transport messages
963
+ expect(transport.messages.count).to eq(1)
964
+ expect(transport.messages[0][0]).to eq(WampClient::Message::Types::AUTHENTICATE)
965
+ expect(transport.messages[0][1]).to eq('Pji30JC9tb/T9tbEwxw5i0RyRa5UVBxuoIVTgT7hnkE=')
966
+ expect(transport.messages[0][2]).to eq({})
967
+
968
+ end
969
+
970
+ it 'accepts a wampcra challenge' do
971
+
972
+ # Send the challenge
973
+ challenge_msg = WampClient::Message::Challenge.new('wampcra', {challenge: challenge})
974
+ transport.receive_message(challenge_msg.payload)
975
+
976
+ # Send welcome message
977
+ welcome = WampClient::Message::Welcome.new(1234, {})
978
+ transport.receive_message(welcome.payload)
979
+
980
+ # Check new state of session
981
+ expect(session.id).to eq(1234)
982
+ expect(transport.messages.count).to eq(1)
983
+
984
+ end
985
+
986
+ it 'rejects a wampcra challenge' do
987
+
988
+ # Send the challenge
989
+ challenge_msg = WampClient::Message::Challenge.new('wampcra', {challenge: challenge})
990
+ transport.receive_message(challenge_msg.payload)
991
+
992
+ # Send abort message
993
+ abort = WampClient::Message::Abort.new({}, 'test.reason')
994
+ transport.receive_message(abort.payload)
995
+
996
+ # Check new state of session
997
+ expect(session.id).to be_nil
998
+ expect(transport.messages.count).to eq(1)
999
+
1000
+ end
1001
+
1002
+ end
1003
+
1004
+ end