Skip to content

Commit 83129a7

Browse files
committed
Add unit tests, fix bug for unnamed mutation
1 parent 45c2585 commit 83129a7

File tree

2 files changed

+254
-2
lines changed

2 files changed

+254
-2
lines changed

src/SlicknodeLink.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,10 @@ export default class SlicknodeLink extends ApolloLink {
8787
const currentOperation: OperationDefinitionNode | null = definitions.find((operationDefinition) => {
8888
return (
8989
operationDefinition.kind === 'OperationDefinition' &&
90-
operationDefinition.name &&
91-
operationDefinition.name.value === operation.operationName
90+
(
91+
(operationDefinition.name && operationDefinition.name.value === operation.operationName) ||
92+
!operationDefinition.name
93+
)
9294
);
9395
}) as OperationDefinitionNode | null;
9496

src/__tests__/index-test.ts

Lines changed: 250 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,4 +181,254 @@ describe('SlicknodeLink', () => {
181181
error: done,
182182
});
183183
});
184+
185+
it('adds auth token set via unnamed mutation + directive', (done) => {
186+
const authTokenSet: IAuthTokenSet = {
187+
accessToken: 'accessToken1',
188+
accessTokenLifetime: 20,
189+
refreshToken: 'refresh1',
190+
refreshTokenLifetime: 100,
191+
};
192+
const data = {
193+
loginMutation: authTokenSet,
194+
};
195+
const slicknodeLink = new SlicknodeLink();
196+
197+
const link = ApolloLink.from([
198+
slicknodeLink,
199+
new ApolloLink(() => {
200+
return new Observable<FetchResult>((observer) => {
201+
observer.next({data});
202+
});
203+
}),
204+
]);
205+
const query = gql`mutation {
206+
loginMutation @authenticate {
207+
accessToken
208+
accessTokenLifetime
209+
refreshToken
210+
refreshTokenLifetime
211+
}
212+
}`;
213+
const request: GraphQLRequest = {
214+
query,
215+
variables: {},
216+
};
217+
const observable = execute(link, request);
218+
observable.subscribe({
219+
next(result: FetchResult) {
220+
expect(result.data).to.equal(data);
221+
expect(slicknodeLink.getAccessToken()).to.deep.equal(authTokenSet.accessToken);
222+
expect(slicknodeLink.getAccessTokenExpires()).to.be.above(
223+
authTokenSet.accessTokenLifetime * 1000 + Date.now() - 1000
224+
);
225+
expect(slicknodeLink.getAccessTokenExpires()).to.be.below(
226+
authTokenSet.accessTokenLifetime * 1000 + Date.now() + 1
227+
);
228+
expect(slicknodeLink.getRefreshToken()).to.deep.equal(authTokenSet.refreshToken);
229+
expect(slicknodeLink.getRefreshTokenExpires()).to.be.above(
230+
authTokenSet.refreshTokenLifetime * 1000 + Date.now() - 1000
231+
);
232+
expect(slicknodeLink.getRefreshTokenExpires()).to.be.below(
233+
authTokenSet.refreshTokenLifetime * 1000 + Date.now() + 1
234+
);
235+
done();
236+
},
237+
error: done,
238+
});
239+
});
240+
241+
it('adds auth token set via named mutation + directive', (done) => {
242+
const authTokenSet: IAuthTokenSet = {
243+
accessToken: 'accessToken1',
244+
accessTokenLifetime: 20,
245+
refreshToken: 'refresh1',
246+
refreshTokenLifetime: 100,
247+
};
248+
const data = {
249+
loginMutation: authTokenSet,
250+
};
251+
const slicknodeLink = new SlicknodeLink();
252+
253+
const link = ApolloLink.from([
254+
slicknodeLink,
255+
new ApolloLink(() => {
256+
return new Observable<FetchResult>((observer) => {
257+
observer.next({data});
258+
});
259+
}),
260+
]);
261+
const query = gql`mutation LoginMutation {
262+
loginMutation @authenticate {
263+
accessToken
264+
accessTokenLifetime
265+
refreshToken
266+
refreshTokenLifetime
267+
}
268+
}
269+
`;
270+
const request: GraphQLRequest = {
271+
query,
272+
variables: {},
273+
operationName: 'LoginMutation',
274+
};
275+
const observable = execute(link, request);
276+
observable.subscribe({
277+
next(result: FetchResult) {
278+
expect(result.data).to.equal(data);
279+
expect(slicknodeLink.getAccessToken()).to.deep.equal(authTokenSet.accessToken);
280+
expect(slicknodeLink.getAccessTokenExpires()).to.be.above(
281+
authTokenSet.accessTokenLifetime * 1000 + Date.now() - 1000
282+
);
283+
expect(slicknodeLink.getAccessTokenExpires()).to.be.below(
284+
authTokenSet.accessTokenLifetime * 1000 + Date.now() + 1
285+
);
286+
expect(slicknodeLink.getRefreshToken()).to.deep.equal(authTokenSet.refreshToken);
287+
expect(slicknodeLink.getRefreshTokenExpires()).to.be.above(
288+
authTokenSet.refreshTokenLifetime * 1000 + Date.now() - 1000
289+
);
290+
expect(slicknodeLink.getRefreshTokenExpires()).to.be.below(
291+
authTokenSet.refreshTokenLifetime * 1000 + Date.now() + 1
292+
);
293+
done();
294+
},
295+
error: done,
296+
});
297+
});
298+
299+
it('ignores invalid result from mutation field via authentication directive', (done) => {
300+
const data = {
301+
loginMutation: {},
302+
};
303+
const slicknodeLink = new SlicknodeLink();
304+
305+
const link = ApolloLink.from([
306+
slicknodeLink,
307+
new ApolloLink(() => {
308+
return new Observable<FetchResult>((observer) => {
309+
observer.next({data});
310+
});
311+
}),
312+
]);
313+
const query = gql`mutation {
314+
loginMutation @authenticate {
315+
accessToken
316+
accessTokenLifetime
317+
refreshToken
318+
refreshTokenLifetime
319+
}
320+
}`;
321+
const request: GraphQLRequest = {
322+
query,
323+
variables: {},
324+
};
325+
const observable = execute(link, request);
326+
observable.subscribe({
327+
next(result: FetchResult) {
328+
expect(result.data).to.equal(data);
329+
expect(slicknodeLink.getAccessToken()).to.be.null;
330+
expect(slicknodeLink.getAccessTokenExpires()).to.be.null;
331+
expect(slicknodeLink.getRefreshToken()).to.be.null;
332+
expect(slicknodeLink.getRefreshTokenExpires()).to.be.null;
333+
done();
334+
},
335+
error: done,
336+
});
337+
});
338+
339+
it('ignores authentication directive in query', (done) => {
340+
const authTokenSet: IAuthTokenSet = {
341+
accessToken: 'accessToken1',
342+
accessTokenLifetime: 20,
343+
refreshToken: 'refresh1',
344+
refreshTokenLifetime: 100,
345+
};
346+
const data = {
347+
loginMutation: authTokenSet,
348+
};
349+
const slicknodeLink = new SlicknodeLink();
350+
351+
const link = ApolloLink.from([
352+
slicknodeLink,
353+
new ApolloLink(() => {
354+
return new Observable<FetchResult>((observer) => {
355+
observer.next({data});
356+
});
357+
}),
358+
]);
359+
const query = gql`query LoginMutation {
360+
loginMutation @authenticate {
361+
accessToken
362+
accessTokenLifetime
363+
refreshToken
364+
refreshTokenLifetime
365+
}
366+
}
367+
`;
368+
const request: GraphQLRequest = {
369+
query,
370+
variables: {},
371+
operationName: 'LoginMutation',
372+
};
373+
const observable = execute(link, request);
374+
observable.subscribe({
375+
next(result: FetchResult) {
376+
expect(result.data).to.equal(data);
377+
expect(slicknodeLink.getAccessToken()).to.be.null;
378+
expect(slicknodeLink.getAccessTokenExpires()).to.be.null;
379+
expect(slicknodeLink.getRefreshToken()).to.be.null;
380+
expect(slicknodeLink.getRefreshTokenExpires()).to.be.null;
381+
done();
382+
},
383+
error: done,
384+
});
385+
});
386+
387+
it('ignores login mutation without authenticate directive', (done) => {
388+
const authTokenSet: IAuthTokenSet = {
389+
accessToken: 'accessToken1',
390+
accessTokenLifetime: 20,
391+
refreshToken: 'refresh1',
392+
refreshTokenLifetime: 100,
393+
};
394+
const data = {
395+
loginMutation: authTokenSet,
396+
};
397+
const slicknodeLink = new SlicknodeLink();
398+
399+
const link = ApolloLink.from([
400+
slicknodeLink,
401+
new ApolloLink(() => {
402+
return new Observable<FetchResult>((observer) => {
403+
observer.next({data});
404+
});
405+
}),
406+
]);
407+
const query = gql`mutation LoginMutation {
408+
loginMutation {
409+
accessToken
410+
accessTokenLifetime
411+
refreshToken
412+
refreshTokenLifetime
413+
}
414+
}
415+
`;
416+
const request: GraphQLRequest = {
417+
query,
418+
variables: {},
419+
operationName: 'LoginMutation',
420+
};
421+
const observable = execute(link, request);
422+
observable.subscribe({
423+
next(result: FetchResult) {
424+
expect(result.data).to.equal(data);
425+
expect(slicknodeLink.getAccessToken()).to.be.null;
426+
expect(slicknodeLink.getAccessTokenExpires()).to.be.null;
427+
expect(slicknodeLink.getRefreshToken()).to.be.null;
428+
expect(slicknodeLink.getRefreshTokenExpires()).to.be.null;
429+
done();
430+
},
431+
error: done,
432+
});
433+
});
184434
});

0 commit comments

Comments
 (0)