index.ios.spec.js 9.76 KB
Newer Older
Lidan Hifi's avatar
Lidan Hifi committed
1
"use strict";
2
let expect = require("chai").use(require("sinon-chai")).expect;
3 4
import proxyquire from "proxyquire";
import sinon from "sinon";
Lidan Hifi's avatar
Lidan Hifi committed
5

6 7
/* eslint-disable no-unused-vars */

Lidan Hifi's avatar
Lidan Hifi committed
8
describe("NotificationsIOS", () => {
9
  let deviceEvents = [
10 11
    "pushKitRegistered",
    "remoteNotificationsRegistered",
12
    "remoteNotificationsRegistrationFailed",
13 14 15 16 17
    "notificationReceivedForeground",
    "notificationReceivedBackground",
    "notificationOpened"
  ];

18 19 20 21 22 23 24 25
  /*eslint-disable indent*/
  let deviceAddEventListener,
      deviceRemoveEventListener,
      nativeAppAddEventListener,
      nativeAppRemoveEventListener,
      nativeRequestPermissionsWithCategories,
      nativeAbandonPermissions,
      nativeRegisterPushKit,
26
      nativeBackgroundTimeRemaining,
27
      nativeConsumeBackgroundQueue,
28 29
      nativeLocalNotification,
      nativeCancelLocalNotification,
30 31 32
      nativeCancelAllLocalNotifications,
      nativeSetBadgesCount;

33
  let NotificationsIOS, NotificationAction, NotificationCategory;
34
  let someHandler = () => {};
35
  let constantGuid = "some-random-uuid";
36
  /*eslint-enable indent*/
37 38

  before(() => {
39 40 41 42
    deviceAddEventListener = sinon.spy();
    deviceRemoveEventListener = sinon.spy();
    nativeAppAddEventListener = sinon.spy();
    nativeAppRemoveEventListener = sinon.spy();
43 44 45 46
    nativeRequestPermissionsWithCategories = sinon.spy();
    nativeAbandonPermissions = sinon.spy();
    nativeRegisterPushKit = sinon.spy();
    nativeBackgroundTimeRemaining = sinon.spy();
47
    nativeConsumeBackgroundQueue = sinon.spy();
48
    nativeLocalNotification = sinon.spy();
49 50
    nativeCancelLocalNotification = sinon.spy();
    nativeCancelAllLocalNotifications = sinon.spy();
51
    nativeSetBadgesCount = sinon.spy();
52 53

    let libUnderTest = proxyquire("../index.ios", {
54 55 56
      "uuid": {
        v4: () => constantGuid
      },
57 58
      "react-native": {
        NativeModules: {
59
          RNNotifications: {
60 61 62
            requestPermissionsWithCategories: nativeRequestPermissionsWithCategories,
            abandonPermissions: nativeAbandonPermissions,
            registerPushKit: nativeRegisterPushKit,
63
            backgroundTimeRemaining: nativeBackgroundTimeRemaining,
64
            consumeBackgroundQueue: nativeConsumeBackgroundQueue,
65 66
            localNotification: nativeLocalNotification,
            cancelLocalNotification: nativeCancelLocalNotification,
67 68
            cancelAllLocalNotifications: nativeCancelAllLocalNotifications,
            setBadgesCount: nativeSetBadgesCount
69
          }
70
        },
71 72 73 74 75 76 77
        NativeAppEventEmitter: {
          addListener: (...args) => {
            nativeAppAddEventListener(...args);

            return { remove: nativeAppRemoveEventListener };
          }
        },
78 79
        DeviceEventEmitter: {
          addListener: (...args) => {
80
            deviceAddEventListener(...args);
81

82
            return { remove: deviceRemoveEventListener };
83 84 85 86
          }
        },
        "@noCallThru": true
      }
87 88
    });

89
    NotificationsIOS = libUnderTest.default;
90 91
    NotificationAction = libUnderTest.NotificationAction;
    NotificationCategory = libUnderTest.NotificationCategory;
92 93 94
  });

  afterEach(() => {
95 96 97 98
    deviceAddEventListener.reset();
    deviceRemoveEventListener.reset();
    nativeAppAddEventListener.reset();
    nativeAppRemoveEventListener.reset();
99 100 101 102
    nativeRequestPermissionsWithCategories.reset();
    nativeAbandonPermissions.reset();
    nativeRegisterPushKit.reset();
    nativeBackgroundTimeRemaining.reset();
103
    nativeConsumeBackgroundQueue.reset();
104
    nativeLocalNotification.reset();
105 106
    nativeCancelLocalNotification.reset();
    nativeCancelAllLocalNotifications.reset();
107 108 109
  });

  after(() => {
110 111 112 113
    deviceAddEventListener = null;
    deviceRemoveEventListener = null;
    nativeAppAddEventListener = null;
    nativeAppRemoveEventListener = null;
114 115 116 117
    nativeRequestPermissionsWithCategories = null;
    nativeAbandonPermissions = null;
    nativeRegisterPushKit = null;
    nativeBackgroundTimeRemaining = null;
118
    nativeConsumeBackgroundQueue = null;
119
    nativeLocalNotification = null;
120 121
    nativeCancelLocalNotification = null;
    nativeCancelAllLocalNotifications = null;
122 123

    NotificationsIOS = null;
124 125
    NotificationAction = null;
    NotificationCategory = null;
126 127
  });

Lidan Hifi's avatar
Lidan Hifi committed
128 129 130
  describe("Add Event Listener", () => {
    deviceEvents.forEach(event => {
      it(`should subscribe the given handler to device event: ${event}`, () => {
131
        NotificationsIOS.addEventListener(event, someHandler);
132

133
        expect(deviceAddEventListener).to.have.been.calledWith(event, sinon.match.func);
134 135 136
      });
    });

Lidan Hifi's avatar
Lidan Hifi committed
137
    it("should not subscribe to unknown device events", () => {
138
      NotificationsIOS.addEventListener("someUnsupportedEvent", someHandler);
139

140
      expect(deviceAddEventListener).to.not.have.been.called;
141 142 143
    });
  });

Lidan Hifi's avatar
Lidan Hifi committed
144 145 146
  describe("Remove Event Listener", () => {
    deviceEvents.forEach(event => {
      it(`should unsubscribe the given handler from device event: ${event}`, () => {
147 148
        NotificationsIOS.addEventListener(event, someHandler);
        NotificationsIOS.removeEventListener(event, someHandler);
149

150
        expect(deviceRemoveEventListener).to.have.been.calledOnce;
151 152 153
      });
    });

Lidan Hifi's avatar
Lidan Hifi committed
154
    it("should not unsubscribe to unknown device events", () => {
155
      let someUnsupportedEvent = "someUnsupportedEvent";
156 157
      NotificationsIOS.addEventListener(someUnsupportedEvent, someHandler);
      NotificationsIOS.removeEventListener(someUnsupportedEvent, someHandler);
158

159
      expect(deviceRemoveEventListener).to.not.have.been.called;
160
    });
Lidan Hifi's avatar
Lidan Hifi committed
161
  });
162

163
  describe("Notification actions handling", () => {
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
    let someAction, someCategory;

    let actionOpts = {
      activationMode: "foreground",
      title: "someAction",
      behavior: "default",
      identifier: "SOME_ACTION"
    };

    beforeEach(() => {
      someAction = new NotificationAction(actionOpts, () => {});

      someCategory = new NotificationCategory({
        identifier: "SOME_CATEGORY",
        actions: [someAction],
        context: "default"
      });
    });

183 184 185
    describe("register push notifications", () => {
      it("should call native request permissions with array of categories", () => {
        NotificationsIOS.requestPermissions([someCategory]);
186

187
        expect(nativeRequestPermissionsWithCategories).to.have.been.calledWith([{
188 189 190 191 192
          identifier: "SOME_CATEGORY",
          actions: [actionOpts],
          context: "default"
        }]);
      });
193

194 195
      it("should call native request permissions with empty array if no categories specified", () => {
        NotificationsIOS.requestPermissions();
196

197
        expect(nativeRequestPermissionsWithCategories).to.have.been.calledWith([]);
198
      });
199

200
      it("should subscribe to 'notificationActionReceived' event once, with a single event handler", () => {
201
        NotificationsIOS.requestPermissions([someCategory]);
202 203

        expect(nativeAppAddEventListener).to.have.been.calledOnce;
204
        expect(nativeAppAddEventListener).to.have.been.calledWith("notificationActionReceived", sinon.match.func);
205
      });
206 207
    });

208
    describe("reset categories", () => {
209
      it("should remove 'notificationActionReceived' event handler", () => {
210
        NotificationsIOS.resetCategories();
211

212 213
        expect(nativeAppRemoveEventListener).to.have.been.calledOnce;
      });
214
    });
215 216 217 218 219 220 221 222 223

    describe("set badges count", () => {
      it("should call native setBadgesCount", () => {
        NotificationsIOS.setBadgesCount(44);

        expect(nativeSetBadgesCount).to.have.been.calledWith(44);
      });
    });

224
  });
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243

  describe("register push kit for background notifications", function () {
    it("should call native register push kit method", function () {
      NotificationsIOS.registerPushKit();

      expect(nativeRegisterPushKit).to.have.been.called;
    });
  });

  describe("Abandon push notifications permissions", () => {
    it("should call native abandon permissions method", () => {
      NotificationsIOS.abandonPermissions();

      expect(nativeAbandonPermissions).to.have.been.called;
    });
  });

  describe("Get background remaining time", () => {
    it("should call native background remaining time method", () => {
244
      let someCallback = (time) => { };
245

246 247 248
      NotificationsIOS.backgroundTimeRemaining(someCallback);

      expect(nativeBackgroundTimeRemaining).to.have.been.calledWith(someCallback);
249 250
    });
  });
251

252
  describe("Consume background queue which holds background notificiations and actions until js thread is ready", () => {
253 254 255 256 257 258
    it("should call native consume background queue method", () => {
      NotificationsIOS.consumeBackgroundQueue();

      expect(nativeConsumeBackgroundQueue).to.have.been.called;
    });
  });
259

260 261 262 263 264 265
  describe("Dispatch local notification", () => {
    it("should return generated notification guid", () => {
      expect(NotificationsIOS.localNotification({})).to.equal(constantGuid);
    });

    it("should call native local notification method with generated notification guid and notification object", () => {
266 267 268 269 270 271 272 273 274 275 276 277 278
      let someLocalNotification = {
        alertBody: "some body",
        alertTitle: "some title",
        alertAction: "some action",
        soundName: "sound",
        category: "SOME_CATEGORY",
        userInfo: {
          "key": "value"
        }
      };

      NotificationsIOS.localNotification(someLocalNotification);

279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
      expect(nativeLocalNotification).to.have.been.calledWith(someLocalNotification, constantGuid);
    });
  });

  describe("Cancel local notification", () => {
    it("should call native cancel local notification method", () => {
      NotificationsIOS.cancelLocalNotification(constantGuid);

      expect(nativeCancelLocalNotification).to.have.been.calledWith(constantGuid);
    });
  });

  describe("Cancel all local notifications", () => {
    it("should call native cancel all local notifications method", () => {
      NotificationsIOS.cancelAllLocalNotifications();

      expect(nativeCancelAllLocalNotifications).to.have.been.calledWith();
296 297
    });
  });
Lidan Hifi's avatar
Lidan Hifi committed
298
});