Skip to content
This repository
tree: e54fcc480f
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 150 lines (106 sloc) 5.078 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
//
// BasicEventHandling.m
// libPusher
//
// Created by Luke Redpath on 13/12/2011.
// Copyright 2011 LJR Software Limited. All rights reserved.
//

#import "SpecHelper.h"

#define kTEST_EVENT_NAME @"libpusher-specs-test-event"
#define kTEST_CHANNEL @"libpusher-specs-test-channel"

SPEC_BEGIN(BasicEventHandling)

describe(@"A pusher channel", ^{
  
  __block PTPusher *client = nil;
  
  registerMatchers(@"PT");
  enableClientDebugging();
  
  beforeAll(^{
    client = newTestClient();
  });
  
  afterAll(^{
    [client disconnect];
    waitForClientToDisconnect(client);
  });
  
  context(@"when publishing events", ^{
    it(@"will yield events to block handlers bound to the channel", ^{
      __block PTPusherEvent *theEvent = nil;
      
      PTPusherChannel *channel = [client subscribeToChannelNamed:kTEST_CHANNEL];
      
      [channel bindToEventNamed:kTEST_EVENT_NAME handleWithBlock:^(PTPusherEvent *event) {
        theEvent = [event retain];
      }];
      
      onConnect(^{
        sendTestEventOnChannel(kTEST_CHANNEL, kTEST_EVENT_NAME);
      });
      
      [[expectFutureValue(theEvent) shouldEventuallyBeforeTimingOutAfter(5)] beEventNamed:kTEST_EVENT_NAME];
    });
    
    it(@"will yield events to block handlers bound to the client", ^{
      __block PTPusherEvent *theEvent = nil;
      
      [client subscribeToChannelNamed:kTEST_CHANNEL];
      
      [client bindToEventNamed:kTEST_EVENT_NAME handleWithBlock:^(PTPusherEvent *event) {
        theEvent = [event retain];
      }];
      
      onConnect(^{
        sendTestEventOnChannel(kTEST_CHANNEL, kTEST_EVENT_NAME);
      });
      
      [[expectFutureValue(theEvent) shouldEventuallyBeforeTimingOutAfter(5)] beEventNamed:kTEST_EVENT_NAME];
    });
    
    it(@"will not yield events to handlers who have had their bindings removed", ^{
__block PTPusherEvent *theEvent = nil;
      __block PTPusherEvent *theEventFromUnboundBlock = nil;
      
      [client subscribeToChannelNamed:kTEST_CHANNEL];
      
      PTPusherEventBinding *binding = [client bindToEventNamed:kTEST_EVENT_NAME handleWithBlock:^(PTPusherEvent *event) {
        theEventFromUnboundBlock = event;
      }];
      
      // we'll use this one to confirm the event has been dispatched
      [client bindToEventNamed:kTEST_EVENT_NAME handleWithBlock:^(PTPusherEvent *event) {
        theEvent = [event retain];
      }];
      
      [client removeBinding:binding];
      
      onConnect(^{
        sendTestEventOnChannel(kTEST_CHANNEL, kTEST_EVENT_NAME);
      });
      
      [[expectFutureValue(theEvent) shouldEventuallyBeforeTimingOutAfter(5)] beEventNamed:kTEST_EVENT_NAME];
      [[theReturnValueOfBlock(^{ return theEventFromUnboundBlock; }) should] beNil];
    });
    
    it(@"will not yield events to handlers after all bindings have been removed", ^{
__block PTPusherEvent *theEvent = nil;
      __block PTPusherEvent *theEventFromUnboundBlock = nil;
      
      [client subscribeToChannelNamed:kTEST_CHANNEL];
      
      [client bindToEventNamed:kTEST_EVENT_NAME handleWithBlock:^(PTPusherEvent *event) {
        theEventFromUnboundBlock = event;
      }];
      
      [client removeAllBindings];
      
      // we'll use this one to confirm the event has been dispatched
      [client bindToEventNamed:kTEST_EVENT_NAME handleWithBlock:^(PTPusherEvent *event) {
        theEvent = [event retain];
      }];
      
      onConnect(^{
        sendTestEventOnChannel(kTEST_CHANNEL, kTEST_EVENT_NAME);
      });
      
      [[expectFutureValue(theEvent) shouldEventuallyBeforeTimingOutAfter(5)] beEventNamed:kTEST_EVENT_NAME];
      [[theReturnValueOfBlock(^{ return theEventFromUnboundBlock; }) should] beNil];
    });
    
    it(@"will notify observers of channel events using NSNotification", ^{
      __block PTPusherEvent *theEvent = nil;
      
      PTPusherChannel *channel = [client subscribeToChannelNamed:kTEST_CHANNEL];
      
      [[NSNotificationCenter defaultCenter] addObserver:PTPusherEventReceivedNotification object:channel usingBlock:^(NSNotification *note) {
        theEvent = [[note.userInfo objectForKey:PTPusherEventUserInfoKey] retain];
      }];
      
      onConnect(^{
        sendTestEventOnChannel(kTEST_CHANNEL, kTEST_EVENT_NAME);
      });
      
      [[expectFutureValue(theEvent) shouldEventuallyBeforeTimingOutAfter(5)] beEventNamed:kTEST_EVENT_NAME];
    });
    
    it(@"will notify observers of all client events using NSNotification", ^{
      __block PTPusherEvent *theEvent = nil;
      
      [client subscribeToChannelNamed:kTEST_CHANNEL];
      
      [[NSNotificationCenter defaultCenter] addObserver:PTPusherEventReceivedNotification object:client usingBlock:^(NSNotification *note) {
        theEvent = [[note.userInfo objectForKey:PTPusherEventUserInfoKey] retain];
      }];
      
      onConnect(^{
        sendTestEventOnChannel(kTEST_CHANNEL, kTEST_EVENT_NAME);
      });
      
      [[expectFutureValue(theEvent) shouldEventuallyBeforeTimingOutAfter(5)] beEventNamed:kTEST_EVENT_NAME];
    });
  });
});

SPEC_END
Something went wrong with that request. Please try again.