Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3a699bc

Browse files
committed
Merge remote-tracking branch 'origin/zodern-solution-for-async-stubs' into feature/solving-meteor-callasync-stubvaluepromise
# Conflicts: # packages/ddp-client/client/client_convenience.js # packages/ddp-client/package.js
2 parents 52c2e25 + 17d026f commit 3a699bc

File tree

3 files changed

+271
-0
lines changed

3 files changed

+271
-0
lines changed

packages/ddp-client/package.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,7 @@ Package.onTest((api) => {
6060
api.addFiles('test/livedata_tests.js');
6161
api.addFiles('test/livedata_test_service.js');
6262
api.addFiles('test/random_stream_tests.js');
63+
api.addFiles('test/async_stubs/client.js', 'client');
64+
api.addFiles('test/async_stubs/server_setup.js', 'server');
6365
api.addFiles('test/livedata_callAsync_tests.js');
6466
});
Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
2+
let events = [];
3+
Meteor.methods({
4+
'sync-stub'() {
5+
events.push('sync-stub');
6+
return 'sync-stub-result'
7+
},
8+
async 'async-stub'() {
9+
events.push('start async-stub');
10+
await 0;
11+
events.push('end async-stub');
12+
return 'async-stub-result'
13+
},
14+
callAsyncFromSyncStub() {
15+
events.push('callAsyncFromSyncStub');
16+
Meteor.callAsync('async-stub');
17+
},
18+
async callSyncStubFromAsyncStub() {
19+
events.push('start callSyncStubFromAsyncStub');
20+
await 0
21+
let result = Meteor.call('sync-stub');
22+
events.push('end callSyncStubFromAsyncStub');
23+
return result;
24+
},
25+
callSyncStubFromSyncStub() {
26+
events.push('callSyncStubFromSyncStub');
27+
return Meteor.call('sync-stub');
28+
},
29+
callAsyncStubFromAsyncStub() {
30+
events.push('callAsyncStubFromAsyncStub');
31+
return Meteor.callAsync('async-stub');
32+
}
33+
});
34+
35+
Tinytest.addAsync('applyAsync - server only', async function (test) {
36+
let serverResolver;
37+
let serverPromise = new Promise((resolve) => {
38+
serverResolver = resolve;
39+
});
40+
41+
let stubResult = await Meteor.applyAsync('server-only-sync', [], { returnStubValue: true }, (err, result) => {
42+
console.log(err);
43+
if (!err) {
44+
serverResolver(result);
45+
}
46+
});
47+
48+
let serverResult = await serverPromise;
49+
50+
test.equal(stubResult, undefined);
51+
test.equal(serverResult, 'sync-result');
52+
});
53+
54+
Tinytest.addAsync('applyAsync - sync stub', async function (test) {
55+
let serverResolver;
56+
let serverPromise = new Promise((resolve) => {
57+
serverResolver = resolve;
58+
});
59+
60+
let stubResult = await Meteor.applyAsync('sync-stub', [], {
61+
returnStubValue: true
62+
}, (err, result) => {
63+
console.log(err);
64+
if (!err) {
65+
serverResolver(result);
66+
}
67+
});
68+
69+
let serverResult = await serverPromise;
70+
71+
test.equal(stubResult, 'sync-stub-result');
72+
test.equal(serverResult, 'sync-server-result');
73+
});
74+
75+
Tinytest.addAsync('applyAsync - callAsync', async function (test) {
76+
let serverResult = await Meteor.callAsync('async-stub');
77+
78+
test.equal(serverResult, 'async-server-result');
79+
});
80+
81+
Tinytest.addAsync('applyAsync - callAsync twice', async function (test) {
82+
events = [];
83+
let promise1 = Meteor.callAsync('async-stub');
84+
let promise2 = Meteor.callAsync('async-stub');
85+
86+
let results = await Promise.all([promise1, promise2]);
87+
88+
test.equal(events, ['start async-stub', 'end async-stub', 'start async-stub', 'end async-stub']);
89+
test.equal(results, ['async-server-result', 'async-server-result']);
90+
});
91+
92+
// Broken in Meteor 2.13: https://github.com/meteor/meteor/issues/12889#issue-1998128607
93+
Tinytest.addAsync('applyAsync - callAsync from async stub', async function (test) {
94+
await Meteor.callAsync('getAndResetEvents');
95+
events = [];
96+
let serverResolver;
97+
let serverPromise = new Promise((resolve) => {
98+
serverResolver = resolve;
99+
});
100+
let stubResult = await Meteor.applyAsync('callAsyncStubFromAsyncStub', [], { returnStubValue: true }, (err, result) => {
101+
if (!err) {
102+
serverResolver(result);
103+
}
104+
});
105+
let serverResult = await serverPromise;
106+
107+
let serverEvents = await Meteor.callAsync('getAndResetEvents');
108+
109+
test.equal(stubResult, 'async-stub-result');
110+
test.equal(serverResult, 'server result');
111+
test.equal(events, ['callAsyncStubFromAsyncStub', 'start async-stub', 'end async-stub']);
112+
test.equal(serverEvents, ['callAsyncStubFromAsyncStub']);
113+
});
114+
115+
116+
Tinytest.addAsync('applyAsync - callAsync in then', async function (test) {
117+
await Meteor.callAsync('getAndResetEvents');
118+
119+
events = [];
120+
let result = await Meteor.callAsync('async-stub').then(() => Meteor.callAsync('async-stub'));
121+
let serverEvents = await Meteor.callAsync('getAndResetEvents');
122+
123+
test.equal(events, ['start async-stub', 'end async-stub', 'start async-stub', 'end async-stub']);
124+
test.equal(serverEvents, ['async-stub', 'async-stub']);
125+
test.equal(result, 'async-server-result');
126+
});
127+
128+
Tinytest.addAsync('applyAsync - call from async stub', async function (test) {
129+
await Meteor.callAsync('getAndResetEvents');
130+
events = [];
131+
let serverResolver;
132+
let serverPromise = new Promise((resolve) => {
133+
serverResolver = resolve;
134+
});
135+
let stubResult = await Meteor.applyAsync('callSyncStubFromAsyncStub', [], { returnStubValue: true }, (err, result) => {
136+
if (!err) {
137+
serverResolver(result);
138+
}
139+
});
140+
let serverResult = await serverPromise;
141+
142+
let serverEvents = await Meteor.callAsync('getAndResetEvents');
143+
144+
test.equal(stubResult, 'sync-stub-result');
145+
test.equal(serverResult, 'server result');
146+
test.equal(events, ['start callSyncStubFromAsyncStub', 'sync-stub', 'end callSyncStubFromAsyncStub']);
147+
test.equal(serverEvents, ['callSyncStubFromAsyncStub']);
148+
});
149+
150+
Tinytest.addAsync('apply - call from sync stub', async function (test) {
151+
await Meteor.callAsync('getAndResetEvents');
152+
events = [];
153+
let serverResolver;
154+
let serverPromise = new Promise((resolve) => {
155+
serverResolver = resolve;
156+
});
157+
let stubResult = Meteor.apply('callSyncStubFromSyncStub', [], { returnStubValue: true }, (err, result) => {
158+
if (!err) {
159+
serverResolver(result);
160+
}
161+
});
162+
let serverResult = await serverPromise;
163+
164+
let serverEvents = await Meteor.callAsync('getAndResetEvents');
165+
166+
test.equal(stubResult, 'sync-stub-result');
167+
test.equal(serverResult, 'server result');
168+
test.equal(events, ['callSyncStubFromSyncStub', 'sync-stub']);
169+
test.equal(serverEvents, ['callSyncStubFromSyncStub']);
170+
});
171+
172+
Tinytest.addAsync('apply - proper order with applyAsync', async function (test) {
173+
await Meteor.callAsync('getAndResetEvents');
174+
events = [];
175+
let serverResolver;
176+
let serverPromise = new Promise((resolve) => {
177+
serverResolver = resolve;
178+
});
179+
180+
let promise1 = Meteor.callAsync('callSyncStubFromAsyncStub');
181+
let stubResult = Meteor.apply('callSyncStubFromSyncStub', [], { returnStubValue: true }, (err, result) => {
182+
if (!err) {
183+
serverResolver(result);
184+
}
185+
});
186+
let promise2 = Meteor.callAsync('server-only-sync');
187+
let [
188+
serverResult,
189+
result1,
190+
result2
191+
] = await Promise.all([serverPromise, promise1, promise2]);
192+
193+
let serverEvents = await Meteor.callAsync('getAndResetEvents');
194+
195+
test.equal(stubResult, 'sync-stub-result');
196+
test.equal(serverResult, 'server result');
197+
test.equal(result1, 'server result');
198+
test.equal(result2, 'sync-result');
199+
test.equal(events, ['callSyncStubFromSyncStub', 'sync-stub', 'start callSyncStubFromAsyncStub', 'sync-stub', 'end callSyncStubFromAsyncStub']);
200+
test.equal(serverEvents, ['callSyncStubFromAsyncStub', 'callSyncStubFromSyncStub', 'server-only-sync']);
201+
});
202+
203+
Tinytest.addAsync('apply - wait', async function (test) {
204+
await Meteor.callAsync('getAndResetEvents');
205+
events = [];
206+
let serverResolver;
207+
let serverPromise = new Promise((resolve) => {
208+
serverResolver = resolve;
209+
});
210+
211+
let stubResult = Meteor.apply(
212+
'callSyncStubFromSyncStub',
213+
[],
214+
{ returnStubValue: true, wait: true },
215+
(err, result) => {
216+
if (!err) {
217+
serverResolver(result);
218+
}
219+
});
220+
221+
const serverResult = await serverPromise;
222+
223+
test.equal(stubResult, 'sync-stub-result');
224+
test.equal(serverResult, 'server result');
225+
});
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
let events = [];
2+
3+
Meteor.methods({
4+
getAndResetEvents() {
5+
let oldEvents = events;
6+
events = [];
7+
8+
return oldEvents;
9+
},
10+
'server-only-sync' () {
11+
events.push('server-only-sync');
12+
return 'sync-result';
13+
},
14+
async 'server-only-async' () {
15+
events.push('server-only-async');
16+
await 0
17+
return 'server-only-async-result';
18+
},
19+
'sync-stub' () {
20+
events.push('sync-stub');
21+
return 'sync-server-result'
22+
},
23+
'async-stub' () {
24+
events.push('async-stub');
25+
return 'async-server-result'
26+
},
27+
'callAsyncFromSyncStub'() {
28+
events.push('callAsyncFromSyncStub');
29+
},
30+
'callSyncStubFromAsyncStub'() {
31+
events.push('callSyncStubFromAsyncStub');
32+
33+
return 'server result';
34+
},
35+
'callSyncStubFromSyncStub'() {
36+
events.push('callSyncStubFromSyncStub');
37+
return 'server result';
38+
},
39+
'callAsyncStubFromAsyncStub'() {
40+
events.push('callAsyncStubFromAsyncStub');
41+
42+
return 'server result';
43+
}
44+
});

0 commit comments

Comments
 (0)