observer-complete.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import assert from 'assert';
  2. import { testMethodProperty } from './properties.js';
  3. describe('observer.complete', () => {
  4. function getObserver(inner) {
  5. let observer;
  6. new Observable(x => { observer = x }).subscribe(inner);
  7. return observer;
  8. }
  9. it('is a method of SubscriptionObserver', () => {
  10. let observer = getObserver();
  11. testMethodProperty(Object.getPrototypeOf(observer), 'complete', {
  12. configurable: true,
  13. writable: true,
  14. length: 0,
  15. });
  16. });
  17. it('does not forward arguments', () => {
  18. let args;
  19. let observer = getObserver({ complete(...a) { args = a } });
  20. observer.complete(1);
  21. assert.deepEqual(args, []);
  22. });
  23. it('does not return a value', () => {
  24. let observer = getObserver({ complete() { return 1 } });
  25. assert.equal(observer.complete(), undefined);
  26. });
  27. it('does not forward when the subscription is complete', () => {
  28. let count = 0;
  29. let observer = getObserver({ complete() { count++ } });
  30. observer.complete();
  31. observer.complete();
  32. assert.equal(count, 1);
  33. });
  34. it('does not forward when the subscription is cancelled', () => {
  35. let count = 0;
  36. let observer;
  37. let subscription = new Observable(x => { observer = x }).subscribe({
  38. complete() { count++ },
  39. });
  40. subscription.unsubscribe();
  41. observer.complete();
  42. assert.equal(count, 0);
  43. });
  44. it('queues if the subscription is not initialized', async () => {
  45. let completed = false;
  46. new Observable(x => { x.complete() }).subscribe({
  47. complete() { completed = true },
  48. });
  49. assert.equal(completed, false);
  50. await null;
  51. assert.equal(completed, true);
  52. });
  53. it('queues if the observer is running', async () => {
  54. let observer;
  55. let completed = false
  56. new Observable(x => { observer = x }).subscribe({
  57. next() { observer.complete() },
  58. complete() { completed = true },
  59. });
  60. observer.next();
  61. assert.equal(completed, false);
  62. await null;
  63. assert.equal(completed, true);
  64. });
  65. it('closes the subscription before invoking inner observer', () => {
  66. let closed;
  67. let observer = getObserver({
  68. complete() { closed = observer.closed },
  69. });
  70. observer.complete();
  71. assert.equal(closed, true);
  72. });
  73. it('reports error if "complete" is not a method', () => {
  74. let observer = getObserver({ complete: 1 });
  75. observer.complete();
  76. assert.ok(hostError instanceof Error);
  77. });
  78. it('does not report error if "complete" is undefined', () => {
  79. let observer = getObserver({ complete: undefined });
  80. observer.complete();
  81. assert.ok(!hostError);
  82. });
  83. it('does not report error if "complete" is null', () => {
  84. let observer = getObserver({ complete: null });
  85. observer.complete();
  86. assert.ok(!hostError);
  87. });
  88. it('reports error if "complete" throws', () => {
  89. let error = {};
  90. let observer = getObserver({ complete() { throw error } });
  91. observer.complete();
  92. assert.equal(hostError, error);
  93. });
  94. it('calls the cleanup method after "complete"', () => {
  95. let calls = [];
  96. let observer;
  97. new Observable(x => {
  98. observer = x;
  99. return () => { calls.push('cleanup') };
  100. }).subscribe({
  101. complete() { calls.push('complete') },
  102. });
  103. observer.complete();
  104. assert.deepEqual(calls, ['complete', 'cleanup']);
  105. });
  106. it('calls the cleanup method if there is no "complete"', () => {
  107. let calls = [];
  108. let observer;
  109. new Observable(x => {
  110. observer = x;
  111. return () => { calls.push('cleanup') };
  112. }).subscribe({});
  113. observer.complete();
  114. assert.deepEqual(calls, ['cleanup']);
  115. });
  116. it('reports error if the cleanup function throws', () => {
  117. let error = {};
  118. let observer;
  119. new Observable(x => {
  120. observer = x;
  121. return () => { throw error };
  122. }).subscribe();
  123. observer.complete();
  124. assert.equal(hostError, error);
  125. });
  126. });