|
1 | 1 | import { DeferredPromise } from "../src"; |
2 | 2 | import { IllegalStateError } from "../src/IllegalStateError"; |
3 | 3 |
|
| 4 | +function extractError<ErrorType extends Error>(fn: () => void): ErrorType { |
| 5 | + try { |
| 6 | + fn(); |
| 7 | + } catch (error) { |
| 8 | + return error as ErrorType; |
| 9 | + } |
| 10 | +} |
| 11 | + |
4 | 12 | describe("Promise-compliance", () => { |
5 | 13 | it('can be listened to with ".then()"', (done) => { |
6 | 14 | expect.assertions(1); |
@@ -100,30 +108,46 @@ describe("resolve()", () => { |
100 | 108 | expect(promise.result).toBe(123); |
101 | 109 | }); |
102 | 110 |
|
103 | | - it("throws when resolving an already resolved promise", () => { |
| 111 | + it("throws when resolving an already resolved promise", async () => { |
104 | 112 | const promise = new DeferredPromise<number>(); |
105 | 113 | expect(promise.state).toBe("pending"); |
| 114 | + |
106 | 115 | promise.resolve(123); |
| 116 | + expect(promise.state).toBe("resolved"); |
107 | 117 |
|
108 | | - expect(() => promise.resolve(456)).toThrow( |
109 | | - new IllegalStateError( |
110 | | - "Cannot resolve a DeferredPromise: illegal state", |
111 | | - "resolved" |
112 | | - ) |
| 118 | + const stateError = extractError<IllegalStateError>(() => { |
| 119 | + promise.resolve(456); |
| 120 | + }); |
| 121 | + |
| 122 | + // Throws an illegal state error. |
| 123 | + expect(stateError).toBeInstanceOf(IllegalStateError); |
| 124 | + expect(stateError.message).toBe( |
| 125 | + "Cannot resolve a DeferredPromise: illegal state" |
113 | 126 | ); |
| 127 | + expect(stateError.state).toBe("resolved"); |
| 128 | + |
| 129 | + // The state remains resolved. |
| 130 | + expect(promise.state).toBe("resolved"); |
114 | 131 | }); |
115 | 132 |
|
116 | 133 | it("throws when resolving an already rejected promise", () => { |
117 | 134 | const promise = new DeferredPromise<number>().catch(() => {}); |
118 | 135 | expect(promise.state).toBe("pending"); |
119 | | - promise.reject(); |
| 136 | + promise.reject("first reason"); |
| 137 | + |
| 138 | + const stateError = extractError<IllegalStateError>(() => { |
| 139 | + promise.reject("second reason"); |
| 140 | + }); |
120 | 141 |
|
121 | | - expect(() => promise.resolve(123)).toThrow( |
122 | | - new IllegalStateError( |
123 | | - "Cannot resolve a DeferredPromise: illegal state", |
124 | | - "rejected" |
125 | | - ) |
| 142 | + expect(stateError).toBeInstanceOf(IllegalStateError); |
| 143 | + expect(stateError.message).toBe( |
| 144 | + "Cannot reject a DeferredPromise: illegal state" |
126 | 145 | ); |
| 146 | + expect(stateError.state).toBe("rejected"); |
| 147 | + |
| 148 | + // The state remains rejected. |
| 149 | + expect(promise.state).toBe("rejected"); |
| 150 | + expect(promise.rejectionReason).toBe("first reason"); |
127 | 151 | }); |
128 | 152 | }); |
129 | 153 |
|
|
0 commit comments