index.ios.spec.js 12.5 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
  /*eslint-disable indent*/
  let deviceAddEventListener,
Ran Greenberg's avatar
Ran Greenberg committed
20 21 22 23 24 25 26 27 28 29 30 31
    deviceRemoveEventListener,
    nativeAppAddEventListener,
    nativeAppRemoveEventListener,
    nativeRequestPermissionsWithCategories,
    nativeAbandonPermissions,
    nativeRegisterPushKit,
    nativeBackgroundTimeRemaining,
    nativeConsumeBackgroundQueue,
    nativeLocalNotification,
    nativeCancelLocalNotification,
    nativeCancelAllLocalNotifications,
    nativeSetBadgesCount,
Ryan Eberhardt's avatar
Ryan Eberhardt committed
32
    nativeIsRegisteredForRemoteNotifications,
33 34 35 36
    nativeCheckPermissions,
    nativeRemoveAllDeliveredNotifications,
    nativeRemoveDeliveredNotifications,
    nativeGetDeliveredNotifications;
37

38
  let NotificationsIOS, NotificationAction, NotificationCategory;
39
  let someHandler = () => {};
40
  let constantGuid = "some-random-uuid";
41
  let identifiers = ["some-random-uuid", "other-random-uuid"];
42
  /*eslint-enable indent*/
43 44

  before(() => {
45 46 47 48
    deviceAddEventListener = sinon.spy();
    deviceRemoveEventListener = sinon.spy();
    nativeAppAddEventListener = sinon.spy();
    nativeAppRemoveEventListener = sinon.spy();
49 50 51 52
    nativeRequestPermissionsWithCategories = sinon.spy();
    nativeAbandonPermissions = sinon.spy();
    nativeRegisterPushKit = sinon.spy();
    nativeBackgroundTimeRemaining = sinon.spy();
53
    nativeConsumeBackgroundQueue = sinon.spy();
54
    nativeLocalNotification = sinon.spy();
55 56
    nativeCancelLocalNotification = sinon.spy();
    nativeCancelAllLocalNotifications = sinon.spy();
57
    nativeSetBadgesCount = sinon.spy();
Ran Greenberg's avatar
Ran Greenberg committed
58
    nativeIsRegisteredForRemoteNotifications = sinon.spy();
Ryan Eberhardt's avatar
Ryan Eberhardt committed
59
    nativeCheckPermissions = sinon.spy();
60 61 62
    nativeRemoveAllDeliveredNotifications = sinon.spy();
    nativeRemoveDeliveredNotifications = sinon.spy();
    nativeGetDeliveredNotifications = sinon.spy();
63 64

    let libUnderTest = proxyquire("../index.ios", {
65 66 67
      "uuid": {
        v4: () => constantGuid
      },
68 69
      "react-native": {
        NativeModules: {
70
          RNNotifications: {
71 72 73
            requestPermissionsWithCategories: nativeRequestPermissionsWithCategories,
            abandonPermissions: nativeAbandonPermissions,
            registerPushKit: nativeRegisterPushKit,
74
            backgroundTimeRemaining: nativeBackgroundTimeRemaining,
75
            consumeBackgroundQueue: nativeConsumeBackgroundQueue,
76 77
            localNotification: nativeLocalNotification,
            cancelLocalNotification: nativeCancelLocalNotification,
78
            cancelAllLocalNotifications: nativeCancelAllLocalNotifications,
Ran Greenberg's avatar
Ran Greenberg committed
79
            setBadgesCount: nativeSetBadgesCount,
Ryan Eberhardt's avatar
Ryan Eberhardt committed
80
            isRegisteredForRemoteNotifications: nativeIsRegisteredForRemoteNotifications,
81
            checkPermissions: nativeCheckPermissions,
82 83 84
            removeAllDeliveredNotifications: nativeRemoveAllDeliveredNotifications,
            removeDeliveredNotifications: nativeRemoveDeliveredNotifications,
            getDeliveredNotifications: nativeGetDeliveredNotifications
85
          }
86
        },
87 88 89 90 91 92 93
        NativeAppEventEmitter: {
          addListener: (...args) => {
            nativeAppAddEventListener(...args);

            return { remove: nativeAppRemoveEventListener };
          }
        },
94 95
        DeviceEventEmitter: {
          addListener: (...args) => {
96
            deviceAddEventListener(...args);
97

98
            return { remove: deviceRemoveEventListener };
99 100 101 102
          }
        },
        "@noCallThru": true
      }
103 104
    });

105
    NotificationsIOS = libUnderTest.default;
106 107
    NotificationAction = libUnderTest.NotificationAction;
    NotificationCategory = libUnderTest.NotificationCategory;
108 109 110
  });

  afterEach(() => {
111 112 113 114
    deviceAddEventListener.reset();
    deviceRemoveEventListener.reset();
    nativeAppAddEventListener.reset();
    nativeAppRemoveEventListener.reset();
115 116 117 118
    nativeRequestPermissionsWithCategories.reset();
    nativeAbandonPermissions.reset();
    nativeRegisterPushKit.reset();
    nativeBackgroundTimeRemaining.reset();
119
    nativeConsumeBackgroundQueue.reset();
120
    nativeLocalNotification.reset();
121 122
    nativeCancelLocalNotification.reset();
    nativeCancelAllLocalNotifications.reset();
Ran Greenberg's avatar
Ran Greenberg committed
123
    nativeIsRegisteredForRemoteNotifications.reset();
Ryan Eberhardt's avatar
Ryan Eberhardt committed
124
    nativeCheckPermissions.reset();
125 126 127
    nativeRemoveAllDeliveredNotifications.reset();
    nativeRemoveDeliveredNotifications.reset();
    nativeGetDeliveredNotifications.reset();
128 129 130
  });

  after(() => {
131 132 133 134
    deviceAddEventListener = null;
    deviceRemoveEventListener = null;
    nativeAppAddEventListener = null;
    nativeAppRemoveEventListener = null;
135 136 137 138
    nativeRequestPermissionsWithCategories = null;
    nativeAbandonPermissions = null;
    nativeRegisterPushKit = null;
    nativeBackgroundTimeRemaining = null;
139
    nativeConsumeBackgroundQueue = null;
140
    nativeLocalNotification = null;
141 142
    nativeCancelLocalNotification = null;
    nativeCancelAllLocalNotifications = null;
Ran Greenberg's avatar
Ran Greenberg committed
143
    nativeIsRegisteredForRemoteNotifications = null;
Ryan Eberhardt's avatar
Ryan Eberhardt committed
144
    nativeCheckPermissions = null;
145 146 147
    nativeRemoveAllDeliveredNotifications = null;
    nativeRemoveDeliveredNotifications = null;
    nativeGetDeliveredNotifications = null;
148 149

    NotificationsIOS = null;
150 151
    NotificationAction = null;
    NotificationCategory = null;
152 153
  });

Lidan Hifi's avatar
Lidan Hifi committed
154 155 156
  describe("Add Event Listener", () => {
    deviceEvents.forEach(event => {
      it(`should subscribe the given handler to device event: ${event}`, () => {
157
        NotificationsIOS.addEventListener(event, someHandler);
158

159
        expect(deviceAddEventListener).to.have.been.calledWith(event, sinon.match.func);
160 161 162
      });
    });

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

166
      expect(deviceAddEventListener).to.not.have.been.called;
167 168 169
    });
  });

Lidan Hifi's avatar
Lidan Hifi committed
170 171 172
  describe("Remove Event Listener", () => {
    deviceEvents.forEach(event => {
      it(`should unsubscribe the given handler from device event: ${event}`, () => {
173 174
        NotificationsIOS.addEventListener(event, someHandler);
        NotificationsIOS.removeEventListener(event, someHandler);
175

176
        expect(deviceRemoveEventListener).to.have.been.calledOnce;
177 178 179
      });
    });

Lidan Hifi's avatar
Lidan Hifi committed
180
    it("should not unsubscribe to unknown device events", () => {
181
      let someUnsupportedEvent = "someUnsupportedEvent";
182 183
      NotificationsIOS.addEventListener(someUnsupportedEvent, someHandler);
      NotificationsIOS.removeEventListener(someUnsupportedEvent, someHandler);
184

185
      expect(deviceRemoveEventListener).to.not.have.been.called;
186
    });
Lidan Hifi's avatar
Lidan Hifi committed
187
  });
188

189
  describe("Notification actions handling", () => {
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
    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"
      });
    });

209 210 211
    describe("register push notifications", () => {
      it("should call native request permissions with array of categories", () => {
        NotificationsIOS.requestPermissions([someCategory]);
212

213
        expect(nativeRequestPermissionsWithCategories).to.have.been.calledWith([{
214 215 216 217 218
          identifier: "SOME_CATEGORY",
          actions: [actionOpts],
          context: "default"
        }]);
      });
219

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

223
        expect(nativeRequestPermissionsWithCategories).to.have.been.calledWith([]);
224
      });
225

226
      it("should subscribe to 'notificationActionReceived' event once, with a single event handler", () => {
227
        NotificationsIOS.requestPermissions([someCategory]);
228 229

        expect(nativeAppAddEventListener).to.have.been.calledOnce;
230
        expect(nativeAppAddEventListener).to.have.been.calledWith("notificationActionReceived", sinon.match.func);
231
      });
232 233
    });

234
    describe("reset categories", () => {
235
      it("should remove 'notificationActionReceived' event handler", () => {
236
        NotificationsIOS.resetCategories();
237

238 239
        expect(nativeAppRemoveEventListener).to.have.been.calledOnce;
      });
240
    });
241 242 243 244 245 246 247 248 249

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

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

250
  });
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269

  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", () => {
270
      let someCallback = (time) => { };
271

272 273 274
      NotificationsIOS.backgroundTimeRemaining(someCallback);

      expect(nativeBackgroundTimeRemaining).to.have.been.calledWith(someCallback);
275 276
    });
  });
277

278
  describe("Consume background queue which holds background notificiations and actions until js thread is ready", () => {
279 280 281 282 283 284
    it("should call native consume background queue method", () => {
      NotificationsIOS.consumeBackgroundQueue();

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

286 287 288 289 290 291
  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", () => {
292 293 294 295 296 297 298 299 300 301 302 303 304
      let someLocalNotification = {
        alertBody: "some body",
        alertTitle: "some title",
        alertAction: "some action",
        soundName: "sound",
        category: "SOME_CATEGORY",
        userInfo: {
          "key": "value"
        }
      };

      NotificationsIOS.localNotification(someLocalNotification);

305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
      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();
322 323
    });
  });
Ran Greenberg's avatar
Ran Greenberg committed
324 325 326 327 328 329 330 331

  describe("Is registered for remote notifications ", () => {
    it("should call native is registered for remote notifications", () => {
      NotificationsIOS.isRegisteredForRemoteNotifications();
      expect(nativeIsRegisteredForRemoteNotifications).to.have.been.calledWith();

    });
  });
Ryan Eberhardt's avatar
Ryan Eberhardt committed
332 333 334 335 336 337 338 339

  describe("Check permissions ", () => {
    it("should call native check permissions", () => {
      NotificationsIOS.checkPermissions();
      expect(nativeCheckPermissions).to.have.been.calledWith();

    });
  });
340

341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364
  describe("Remove all delivered notifications", () => {
    it("should call native remove all delivered notifications method", () => {
      NotificationsIOS.removeAllDeliveredNotifications();

      expect(nativeRemoveAllDeliveredNotifications).to.have.been.calledWith();
    });
  });

  describe("Remove delivered notifications", () => {
    it("should call native remove delivered notifications method", () => {
      NotificationsIOS.removeDeliveredNotifications(identifiers);

      expect(nativeRemoveDeliveredNotifications).to.have.been.calledWith(identifiers);
    });
  });

  describe("Get delivered notifications", () => {
    it("should call native get delivered notifications method", () => {
      const callback = (notifications) => console.log(notifications);
      NotificationsIOS.getDeliveredNotifications(callback);

      expect(nativeGetDeliveredNotifications).to.have.been.calledWith(callback);
    });
  });
Lidan Hifi's avatar
Lidan Hifi committed
365
});