subscribe.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import assert from 'assert';
  2. import { testMethodProperty } from './properties.js';
  3. describe('subscribe', () => {
  4. it('is a method of Observable.prototype', () => {
  5. testMethodProperty(Observable.prototype, 'subscribe', {
  6. configurable: true,
  7. writable: true,
  8. length: 1,
  9. });
  10. });
  11. it('accepts an observer argument', () => {
  12. let observer;
  13. let nextValue;
  14. new Observable(x => observer = x).subscribe({
  15. next(v) { nextValue = v },
  16. });
  17. observer.next(1);
  18. assert.equal(nextValue, 1);
  19. });
  20. it('accepts a next function argument', () => {
  21. let observer;
  22. let nextValue;
  23. new Observable(x => observer = x).subscribe(
  24. v => nextValue = v
  25. );
  26. observer.next(1);
  27. assert.equal(nextValue, 1);
  28. });
  29. it('accepts an error function argument', () => {
  30. let observer;
  31. let errorValue;
  32. let error = {};
  33. new Observable(x => observer = x).subscribe(
  34. null,
  35. e => errorValue = e
  36. );
  37. observer.error(error);
  38. assert.equal(errorValue, error);
  39. });
  40. it('accepts a complete function argument', () => {
  41. let observer;
  42. let completed = false;
  43. new Observable(x => observer = x).subscribe(
  44. null,
  45. null,
  46. () => completed = true
  47. );
  48. observer.complete();
  49. assert.equal(completed, true);
  50. });
  51. it('uses function overload if first argument is null', () => {
  52. let observer;
  53. let completed = false;
  54. new Observable(x => observer = x).subscribe(
  55. null,
  56. null,
  57. () => completed = true
  58. );
  59. observer.complete();
  60. assert.equal(completed, true);
  61. });
  62. it('uses function overload if first argument is undefined', () => {
  63. let observer;
  64. let completed = false;
  65. new Observable(x => observer = x).subscribe(
  66. undefined,
  67. null,
  68. () => completed = true
  69. );
  70. observer.complete();
  71. assert.equal(completed, true);
  72. });
  73. it('uses function overload if first argument is a primative', () => {
  74. let observer;
  75. let completed = false;
  76. new Observable(x => observer = x).subscribe(
  77. 'abc',
  78. null,
  79. () => completed = true
  80. );
  81. observer.complete();
  82. assert.equal(completed, true);
  83. });
  84. it('enqueues a job to send error if subscriber throws', async () => {
  85. let error = {};
  86. let errorValue = undefined;
  87. new Observable(() => { throw error }).subscribe({
  88. error(e) { errorValue = e },
  89. });
  90. assert.equal(errorValue, undefined);
  91. await null;
  92. assert.equal(errorValue, error);
  93. });
  94. it('does not send error if unsubscribed', async () => {
  95. let error = {};
  96. let errorValue = undefined;
  97. let subscription = new Observable(() => { throw error }).subscribe({
  98. error(e) { errorValue = e },
  99. });
  100. subscription.unsubscribe();
  101. assert.equal(errorValue, undefined);
  102. await null;
  103. assert.equal(errorValue, undefined);
  104. });
  105. it('accepts a cleanup function from the subscriber function', () => {
  106. let cleanupCalled = false;
  107. let subscription = new Observable(() => {
  108. return () => cleanupCalled = true;
  109. }).subscribe();
  110. subscription.unsubscribe();
  111. assert.equal(cleanupCalled, true);
  112. });
  113. it('accepts a subscription object from the subscriber function', () => {
  114. let cleanupCalled = false;
  115. let subscription = new Observable(() => {
  116. return {
  117. unsubscribe() { cleanupCalled = true },
  118. };
  119. }).subscribe();
  120. subscription.unsubscribe();
  121. assert.equal(cleanupCalled, true);
  122. });
  123. });