@@ -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