wamp_client 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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