Skip to content

Commit

Permalink
test(timeoutWith): add subscription assertions
Browse files Browse the repository at this point in the history
Add subscription assertions on timeoutWith tests. The source observable must be unsubscribed when
the 'withObservable' is subscribed to. This is aligned to the behavior of timeout(With) in RxJS 4.
  • Loading branch information
staltz authored and benlesh committed Dec 8, 2015
1 parent 460d510 commit 04e1479
Showing 1 changed file with 180 additions and 39 deletions.
219 changes: 180 additions & 39 deletions spec/operators/timeoutWith-spec.js
Original file line number Diff line number Diff line change
@@ -1,119 +1,260 @@
/* globals describe, it, expect, expectObservable, hot, cold, rxTestScheduler */
/* globals describe, it, expect, expectObservable, expectSubscriptions, hot, cold, rxTestScheduler */
var Rx = require('../../dist/cjs/Rx');
var Observable = Rx.Observable;

describe('Observable.prototype.timeoutWith()', function () {
it('should timeout after a specified period then subscribe to the passed observable', function () {
var e1 = Observable.never();
var e2 = cold('--x--y--z--|');
var e1 = cold('-');
var e1subs = '^ ! ';
var e2 = cold('--x--y--z--|');
var e2subs = ' ^ !';
var expected = '-------x--y--z--|';

expectObservable(e1.timeoutWith(50, e2, rxTestScheduler)).toBe(expected);
var result = e1.timeoutWith(50, e2, rxTestScheduler);

expectObservable(result).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should timeout at a specified date then subscribe to the passed observable', function () {
var e1 = Observable.never();
var e2 = cold('--x--y--z--|');
var e1 = cold('-');
var e1subs = '^ ! ';
var e2 = cold( '--x--y--z--|');
var e2subs = ' ^ !';
var expected = '------------x--y--z--|';

expectObservable(e1.timeoutWith(new Date(rxTestScheduler.now() + 100), e2, rxTestScheduler)).toBe(expected);
var result = e1.timeoutWith(new Date(rxTestScheduler.now() + 100), e2, rxTestScheduler);

expectObservable(result).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should timeout after a specified period between emit then subscribe to the passed observable when source emits', function () {
it('should timeout after a specified period between emit then subscribe ' +
'to the passed observable when source emits', function () {
var e1 = hot('---a---b------c---|');
var e2 = cold('-x-y-|');
var expected = '---a---b----x-y-|';
var e1subs = '^ ! ';
var e2 = cold( '-x-y-| ');
var e2subs = ' ^ ! ';
var expected = '---a---b----x-y-| ';

expectObservable(e1.timeoutWith(40, e2, rxTestScheduler)).toBe(expected);
var result = e1.timeoutWith(40, e2, rxTestScheduler);

expectObservable(result).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should timeout after a specified period then subscribe to the passed observable when source is empty', function () {
var e1 = hot('-------------|');
var e2 = cold('----x----|');
it('should allow unsubscribing explicitly and early', function () {
var e1 = hot('---a---b-----c----|');
var e1subs = '^ ! ';
var e2 = cold( '-x---y| ');
var e2subs = ' ^ ! ';
var expected = '---a---b----x-- ';
var unsub = ' ! ';

var result = e1.timeoutWith(40, e2, rxTestScheduler);

expectObservable(result, unsub).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should not break unsubscription chain when unsubscribed explicitly', function () {
var e1 = hot('---a---b-----c----|');
var e1subs = '^ ! ';
var e2 = cold( '-x---y| ');
var e2subs = ' ^ ! ';
var expected = '---a---b----x-- ';
var unsub = ' ! ';

var result = e1
.mergeMap(function (x) { return Observable.of(x); })
.timeoutWith(40, e2, rxTestScheduler)
.mergeMap(function (x) { return Observable.of(x); });

expectObservable(result, unsub).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should not subscribe to withObservable after explicit unsubscription', function () {
var e1 = cold('---a------b------');
var e1subs = '^ ! ';
var e2 = cold( 'i---j---|');
var e2subs = [];
var expected = '---a-- ';
var unsub = ' ! ';

var result = e1
.mergeMap(function (x) { return Observable.of(x); })
.timeoutWith(50, e2, rxTestScheduler)
.mergeMap(function (x) { return Observable.of(x); });

expectObservable(result, unsub).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should timeout after a specified period then subscribe to the ' +
'passed observable when source is empty', function () {
var e1 = hot('-------------| ');
var e1subs = '^ ! ';
var e2 = cold( '----x----|');
var e2subs = ' ^ !';
var expected = '--------------x----|';

expectObservable(e1.timeoutWith(100, e2, rxTestScheduler)).toBe(expected);
var result = e1.timeoutWith(100, e2, rxTestScheduler);

expectObservable(result).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should timeout after a specified period between emit then never completes if other source does not complete', function () {
it('should timeout after a specified period between emit then never completes ' +
'if other source does not complete', function () {
var e1 = hot('--a--b--------c--d--|');
var e1subs = '^ ! ';
var e2 = cold('-');
var expected = '--a--b----';
var e2subs = ' ^ ';
var expected = '--a--b---- ';

expectObservable(e1.timeoutWith(40, e2, rxTestScheduler)).toBe(expected);
var result = e1.timeoutWith(40, e2, rxTestScheduler);

expectObservable(result).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should timeout after a specified period then subscribe to the passed observable when source raises error after timeout', function () {
var e1 = hot('-------------#');
var e2 = cold('----x----|');
it('should timeout after a specified period then subscribe to the ' +
'passed observable when source raises error after timeout', function () {
var e1 = hot('-------------# ');
var e1subs = '^ ! ';
var e2 = cold( '----x----|');
var e2subs = ' ^ !';
var expected = '--------------x----|';

expectObservable(e1.timeoutWith(100, e2, rxTestScheduler)).toBe(expected);
var result = e1.timeoutWith(100, e2, rxTestScheduler);

expectObservable(result).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should timeout after a specified period between emit then never completes if other source emits but not complete', function () {
var e1 = hot('-------------|');
var e2 = cold('----x----');
it('should timeout after a specified period between emit then never completes ' +
'if other source emits but not complete', function () {
var e1 = hot('-------------| ');
var e1subs = '^ ! ';
var e2 = cold('----x----');
var e2subs = ' ^ ';
var expected = '--------------x----';

expectObservable(e1.timeoutWith(100, e2, rxTestScheduler)).toBe(expected);
var result = e1.timeoutWith(100, e2, rxTestScheduler);

expectObservable(result).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should not timeout if source completes within timeout period', function () {
var e1 = hot('-----|');
var e2 = cold('----x----');
var e1subs = '^ !';
var e2 = cold( '----x----');
var e2subs = [];
var expected = '-----|';

expectObservable(e1.timeoutWith(100, e2, rxTestScheduler)).toBe(expected);
var result = e1.timeoutWith(100, e2, rxTestScheduler);

expectObservable(result).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should not timeout if source raises error within timeout period', function () {
var e1 = hot('-----#');
var e2 = cold('----x----|');
var e1subs = '^ !';
var e2 = cold( '----x----|');
var e2subs = [];
var expected = '-----#';

expectObservable(e1.timeoutWith(100, e2, rxTestScheduler)).toBe(expected);
var result = e1.timeoutWith(100, e2, rxTestScheduler);

expectObservable(result).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should not timeout if source emits within timeout period', function () {
var e1 = hot('--a--b--c--d--e--|');
var e1subs = '^ !';
var e2 = cold('----x----|');
var e2subs = [];
var expected = '--a--b--c--d--e--|';

expectObservable(e1.timeoutWith(50, e2, rxTestScheduler)).toBe(expected);
var result = e1.timeoutWith(50, e2, rxTestScheduler);

expectObservable(result).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should timeout after specified Date then subscribe to the passed observable', function () {
var e1 = hot('--a--b--c--d--e--|');
var e2 = cold('--z--|');
var expected = '--a--b---z--|';
var e1subs = '^ ! ';
var e2 = cold( '--z--| ');
var e2subs = ' ^ ! ';
var expected = '--a--b---z--| ';

var result = e1.timeoutWith(new Date(rxTestScheduler.now() + 70), e2, rxTestScheduler);

expectObservable(e1.timeoutWith(new Date(rxTestScheduler.now() + 70), e2, rxTestScheduler)).toBe(expected);
expectObservable(result).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should not timeout if source completes within specified Date', function () {
var e1 = hot('--a--b--c--d--e--|');
var e1subs = '^ !';
var e2 = cold('--x--|');
var e2subs = [];
var expected = '--a--b--c--d--e--|';

var timeoutValue = new Date(Date.now() + (expected.length + 2) * 10);

expectObservable(e1.timeoutWith(timeoutValue, e2, rxTestScheduler)).toBe(expected);
var result = e1.timeoutWith(timeoutValue, e2, rxTestScheduler);

expectObservable(result).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should not timeout if source raises error within specified Date', function () {
var e1 = hot('---a---#');
var e1subs = '^ !';
var e2 = cold('--x--|');
var e2subs = [];
var expected = '---a---#';

expectObservable(e1.timeoutWith(new Date(Date.now() + 100), e2, rxTestScheduler)).toBe(expected);
var result = e1.timeoutWith(new Date(Date.now() + 100), e2, rxTestScheduler);

expectObservable(result).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should timeout specified Date after specified Date then never completes if other source does not complete', function () {
it('should timeout specified Date after specified Date then never completes ' +
'if other source does not complete', function () {
var e1 = hot('---a---b---c---d---e---|');
var e1subs = '^ ! ';
var e2 = cold('-');
var expected = '---a---b--';
var e2subs = ' ^ ';
var expected = '---a---b--- ';

var result = e1.timeoutWith(new Date(rxTestScheduler.now() + 100), e2, rxTestScheduler);

expectObservable(e1.timeoutWith(new Date(rxTestScheduler.now() + 100), e2, rxTestScheduler)).toBe(expected);
expectObservable(result).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});
});

0 comments on commit 04e1479

Please sign in to comment.