Home Manual Reference Source Test Repository

spec-js/Subscription-spec.js

"use strict";
var chai_1 = require('chai');
var Rx = require('../dist/cjs/Rx');
var Observable = Rx.Observable;
var Subscription = Rx.Subscription;
/** @test {Subscription} */
describe('Subscription', function () {
    it('should not leak', function (done) {
        var tearDowns = [];
        var source1 = Observable.create(function (observer) {
            return function () {
                tearDowns.push(1);
            };
        });
        var source2 = Observable.create(function (observer) {
            return function () {
                tearDowns.push(2);
                throw new Error('oops, I am a bad unsubscribe!');
            };
        });
        var source3 = Observable.create(function (observer) {
            return function () {
                tearDowns.push(3);
            };
        });
        var subscription = Observable.merge(source1, source2, source3).subscribe();
        setTimeout(function () {
            chai_1.expect(function () {
                subscription.unsubscribe();
            }).to.throw(Rx.UnsubscriptionError);
            chai_1.expect(tearDowns).to.deep.equal([1, 2, 3]);
            done();
        });
    });
    it('should not leak when adding a bad custom subscription to a subscription', function (done) {
        var tearDowns = [];
        var sub = new Subscription();
        var source1 = Observable.create(function (observer) {
            return function () {
                tearDowns.push(1);
            };
        });
        var source2 = Observable.create(function (observer) {
            return function () {
                tearDowns.push(2);
                sub.add(({
                    unsubscribe: function () {
                        chai_1.expect(sub.closed).to.be.true;
                        throw new Error('Who is your daddy, and what does he do?');
                    }
                }));
            };
        });
        var source3 = Observable.create(function (observer) {
            return function () {
                tearDowns.push(3);
            };
        });
        sub.add(Observable.merge(source1, source2, source3).subscribe());
        setTimeout(function () {
            chai_1.expect(function () {
                sub.unsubscribe();
            }).to.throw(Rx.UnsubscriptionError);
            chai_1.expect(tearDowns).to.deep.equal([1, 2, 3]);
            done();
        });
    });
    describe('Subscription.add()', function () {
        it('Should returns the self if the self is passed', function () {
            var sub = new Subscription();
            var ret = sub.add(sub);
            chai_1.expect(ret).to.equal(sub);
        });
        it('Should returns Subscription.EMPTY if it is passed', function () {
            var sub = new Subscription();
            var ret = sub.add(Subscription.EMPTY);
            chai_1.expect(ret).to.equal(Subscription.EMPTY);
        });
        it('Should returns Subscription.EMPTY if it is called with `void` value', function () {
            var sub = new Subscription();
            var ret = sub.add(undefined);
            chai_1.expect(ret).to.equal(Subscription.EMPTY);
        });
        it('Should returns a new Subscription created with teardown function if it is passed a function', function () {
            var sub = new Subscription();
            var isCalled = false;
            var ret = sub.add(function () {
                isCalled = true;
            });
            ret.unsubscribe();
            chai_1.expect(isCalled).to.equal(true);
        });
        it('Should wrap the AnonymousSubscription and return a subscription that unsubscribes and removes it when unsubbed', function () {
            var sub = new Subscription();
            var called = false;
            var arg = {
                unsubscribe: function () { return called = true; },
            };
            var ret = sub.add(arg);
            chai_1.expect(called).to.equal(false);
            chai_1.expect(sub._subscriptions.length).to.equal(1);
            ret.unsubscribe();
            chai_1.expect(called).to.equal(true);
            chai_1.expect(sub._subscriptions.length).to.equal(0);
        });
        it('Should returns the passed one if passed a AnonymousSubscription having not function `unsubscribe` member', function () {
            var sub = new Subscription();
            var arg = {
                isUnsubscribed: false,
                unsubscribe: undefined,
            };
            var ret = sub.add(arg);
            chai_1.expect(ret).to.equal(arg);
        });
        it('Should returns the passed one if the self has been unsubscribed', function () {
            var main = new Subscription();
            main.unsubscribe();
            var child = new Subscription();
            var ret = main.add(child);
            chai_1.expect(ret).to.equal(child);
        });
        it('Should unsubscribe the passed one if the self has been unsubscribed', function () {
            var main = new Subscription();
            main.unsubscribe();
            var isCalled = false;
            var child = new Subscription(function () {
                isCalled = true;
            });
            main.add(child);
            chai_1.expect(isCalled).to.equal(true);
        });
    });
});
//# sourceMappingURL=Subscription-spec.js.map