UNPKG

5.04 kBPlain TextView Raw
1import { mock, IMockedPromise } from './mockAsync';
2import { rlFakeAsync } from './fakeAsync';
3
4interface ITestType {
5 value: number;
6}
7
8interface ITestDataService {
9 promise1: IMockedPromise<ITestType>;
10 promise2: IMockedPromise<ITestType>;
11}
12
13describe('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});