1 | import { mock, IMockedPromise } from './mockAsync';
|
2 | import { rlFakeAsync } from './fakeAsync';
|
3 |
|
4 | interface ITestType {
|
5 | value: number;
|
6 | }
|
7 |
|
8 | interface ITestDataService {
|
9 | promise1: IMockedPromise<ITestType>;
|
10 | promise2: IMockedPromise<ITestType>;
|
11 | }
|
12 |
|
13 | describe('mockPromise', () => {
|
14 | it('should create a promise that resolves when flushed', rlFakeAsync(() => {
|
15 | let mockedPromise: IMockedPromise<ITestType> = mock.promise({ value: 10 });
|
16 | mockedPromise()
|
17 | .then((result: ITestType) => {
|
18 | expect(result.value).to.equal(10);
|
19 | });
|
20 |
|
21 | mockedPromise.flush();
|
22 | }));
|
23 |
|
24 | it('should create a promise that resolves with dynamic content when flushed', rlFakeAsync(() => {
|
25 | let mockedPromise: IMockedPromise<ITestType> = mock.promise((value1: number, value2: number) => {
|
26 | return { value: value1 + value2 };
|
27 | });
|
28 |
|
29 | mockedPromise(5, 3)
|
30 | .then((result: ITestType) => {
|
31 | expect(result.value).to.equal(8);
|
32 | });
|
33 |
|
34 | mockedPromise.flush();
|
35 | }));
|
36 |
|
37 | it('should create a promise that is rejected', rlFakeAsync(() => {
|
38 | let mockedPromise: IMockedPromise<ITestType> = mock.rejectedPromise<ITestType>(new Error('an error'));
|
39 |
|
40 | mockedPromise()
|
41 | .then(() => {
|
42 | assert.fail(null, null, 'Promise should be rejected, not resolved');
|
43 | }, (error: Error) => {
|
44 | expect(error.message).to.equal('an error');
|
45 | });
|
46 |
|
47 | mockedPromise.flush();
|
48 | }));
|
49 |
|
50 | it('should create a promise and set it to be rejected', rlFakeAsync(() => {
|
51 | let mockedPromise: IMockedPromise<ITestType> = mock.promise<ITestType>({ value: 3 });
|
52 | mockedPromise.reject(new Error('error message'));
|
53 |
|
54 | mockedPromise()
|
55 | .then(() => {
|
56 | assert.fail(null, null, 'Promise should be rejected, not resolved');
|
57 | }, (error: Error) => {
|
58 | expect(error.message).to.equal('error message');
|
59 | });
|
60 |
|
61 | mockedPromise.flush();
|
62 | }));
|
63 |
|
64 | it('should be able to reuse mocked promises', rlFakeAsync(() => {
|
65 | let mockedPromise: IMockedPromise<ITestType> = mock.promise<ITestType>({ value: 3 }, true);
|
66 | mockedPromise.reject(new Error('error message'));
|
67 |
|
68 | mockedPromise()
|
69 | .then(() => null, (error: Error) => {
|
70 | mockedPromise.rejected = false;
|
71 |
|
72 | mockedPromise()
|
73 | .then((result: ITestType) => {
|
74 | expect(result.value).to.equal(3);
|
75 | });
|
76 |
|
77 | mockedPromise.flush();
|
78 | });
|
79 |
|
80 | mockedPromise.flush();
|
81 | }));
|
82 |
|
83 | it('should allow unique parameters with successive calls', rlFakeAsync(() => {
|
84 | let mockedPromise: IMockedPromise<ITestType> = mock.promise((value1: number, value2: number) => {
|
85 | return { value: value1 + value2 };
|
86 | }, true);
|
87 |
|
88 | mockedPromise(5, 3)
|
89 | .then((result: ITestType) => {
|
90 | expect(result.value).to.equal(8);
|
91 |
|
92 | mockedPromise(8, 2)
|
93 | .then((result: ITestType) => {
|
94 | expect(result.value).to.equal(10);
|
95 | });
|
96 |
|
97 | mockedPromise.flush();
|
98 | });
|
99 |
|
100 | mockedPromise.flush();
|
101 | }));
|
102 |
|
103 | it('should reuse a pending promise when sharing', (): void => {
|
104 | let mockedPromise: IMockedPromise<ITestType> = mock.promise({ value: 3 }, true);
|
105 | expect(mockedPromise()).to.equal(mockedPromise());
|
106 | });
|
107 |
|
108 | it('should not reuse a pending promise by default or not sharing', (): void => {
|
109 | let mockedPromise: IMockedPromise<ITestType> = mock.promise({ value: 3 });
|
110 | expect(mockedPromise()).to.not.equal(mockedPromise());
|
111 |
|
112 | mockedPromise = mock.promise({ value: 3 }, false);
|
113 | expect(mockedPromise()).to.not.equal(mockedPromise());
|
114 | });
|
115 |
|
116 | it('should flush all requests on an unshared promise', rlFakeAsync((): void => {
|
117 | let mockedPromise: IMockedPromise<number> = mock.promise(result => result);
|
118 | Promise.all<number>([
|
119 | mockedPromise(5),
|
120 | mockedPromise(10),
|
121 | ]).then(([result1, result2]: number[]): void => {
|
122 | expect(result1).to.equal(5);
|
123 | expect(result2).to.equal(10);
|
124 | });
|
125 |
|
126 | mockedPromise.flush();
|
127 | }));
|
128 |
|
129 | it('should spy on the promise function', (): void => {
|
130 | let mockedPromise: IMockedPromise<ITestType> = mock.promise({ value: 3 });
|
131 | mockedPromise(6);
|
132 | sinon.assert.calledOnce(mockedPromise);
|
133 | sinon.assert.calledWith(mockedPromise, 6);
|
134 | });
|
135 |
|
136 | it('should flush all promises on an object', rlFakeAsync((): void => {
|
137 | let service: ITestDataService = {
|
138 | promise1: mock.promise({ value: 3 }),
|
139 | promise2: mock.promise({ value: 4 }),
|
140 | };
|
141 | Promise.all<ITestType>([
|
142 | service.promise1(),
|
143 | service.promise2(),
|
144 | ]).then(([result1, result2]: ITestType[]): void => {
|
145 | expect(result1.value).to.equal(3);
|
146 | expect(result2.value).to.equal(4);
|
147 | });
|
148 | mock.flushAll(service);
|
149 | }));
|
150 |
|
151 | it('should work with Promise.resolve and Promise.all', rlFakeAsync((): void => {
|
152 | const mockedPromises: IMockedPromise<number>[] = [
|
153 | mock.promise(5),
|
154 | mock.promise(10),
|
155 | ];
|
156 |
|
157 | const whens: Promise<number>[] = mockedPromises.map((mocked: IMockedPromise<number>) => Promise.resolve(mocked()));
|
158 |
|
159 | Promise.all<number>(whens).then(([result1, result2]: number[]): void => {
|
160 | expect(result1).to.equal(5);
|
161 | expect(result2).to.equal(10);
|
162 | });
|
163 |
|
164 | mock.flushAll(mockedPromises);
|
165 | }));
|
166 | });
|