|
1 | 1 | import {ApolloLink, execute, FetchResult, GraphQLRequest, Observable} from 'apollo-link'; |
2 | 2 | import {expect} from 'chai'; |
3 | | -import { parse } from 'graphql'; |
4 | 3 | import gql from 'graphql-tag'; |
5 | 4 | import sinon from 'sinon'; |
6 | | -import SlicknodeLink from '../index'; |
| 5 | +import SlicknodeLink, {REFRESH_TOKEN_MUTATION} from '../index'; |
| 6 | +import {IAuthTokenSet} from '../types'; |
7 | 7 |
|
8 | 8 | describe('SlicknodeLink', () => { |
9 | 9 | it('forwards request to next link', (done) => { |
@@ -66,4 +66,119 @@ describe('SlicknodeLink', () => { |
66 | 66 | error: done, |
67 | 67 | }); |
68 | 68 | }); |
| 69 | + |
| 70 | + it('uses accessToken form auth token set', (done) => { |
| 71 | + const data = { |
| 72 | + test: true, |
| 73 | + }; |
| 74 | + const authTokenSet: IAuthTokenSet = { |
| 75 | + accessToken: 'accessToken1', |
| 76 | + accessTokenLifetime: 20, |
| 77 | + refreshToken: 'refresh1', |
| 78 | + refreshTokenLifetime: 100, |
| 79 | + }; |
| 80 | + const slicknodeLink = new SlicknodeLink(); |
| 81 | + slicknodeLink.setAuthTokenSet(authTokenSet); |
| 82 | + |
| 83 | + const link = ApolloLink.from([ |
| 84 | + slicknodeLink, |
| 85 | + new ApolloLink((operation) => { |
| 86 | + expect(operation.getContext()).to.deep.equal({ |
| 87 | + headers: { |
| 88 | + Authorization: `Bearer ${authTokenSet.accessToken}`, |
| 89 | + }, |
| 90 | + }); |
| 91 | + done(); |
| 92 | + return null; |
| 93 | + }), |
| 94 | + ]); |
| 95 | + const query = gql`{test}`; |
| 96 | + const request: GraphQLRequest = { |
| 97 | + query, |
| 98 | + variables: {}, |
| 99 | + }; |
| 100 | + const observable = execute(link, request); |
| 101 | + observable.subscribe({ |
| 102 | + next(result: FetchResult) { |
| 103 | + expect(result.data).to.equal(data); |
| 104 | + }, |
| 105 | + error: done, |
| 106 | + }); |
| 107 | + }); |
| 108 | + |
| 109 | + it('does not use expired accessToken form auth token set', (done) => { |
| 110 | + const data = { |
| 111 | + test: true, |
| 112 | + }; |
| 113 | + const authTokenSet: IAuthTokenSet = { |
| 114 | + accessToken: 'accessToken1', |
| 115 | + accessTokenLifetime: -20, |
| 116 | + refreshToken: 'refresh1', |
| 117 | + refreshTokenLifetime: -100, |
| 118 | + }; |
| 119 | + const slicknodeLink = new SlicknodeLink(); |
| 120 | + slicknodeLink.setAuthTokenSet(authTokenSet); |
| 121 | + |
| 122 | + const link = ApolloLink.from([ |
| 123 | + slicknodeLink, |
| 124 | + new ApolloLink((operation) => { |
| 125 | + expect(operation.getContext()).to.deep.equal({ |
| 126 | + headers: {}, |
| 127 | + }); |
| 128 | + done(); |
| 129 | + return null; |
| 130 | + }), |
| 131 | + ]); |
| 132 | + const query = gql`{test}`; |
| 133 | + const request: GraphQLRequest = { |
| 134 | + query, |
| 135 | + variables: {}, |
| 136 | + }; |
| 137 | + const observable = execute(link, request); |
| 138 | + observable.subscribe({ |
| 139 | + next(result: FetchResult) { |
| 140 | + expect(result.data).to.equal(data); |
| 141 | + }, |
| 142 | + error: done, |
| 143 | + }); |
| 144 | + }); |
| 145 | + |
| 146 | + it('executes refreshToken request in subsequent links', (done) => { |
| 147 | + const data = { |
| 148 | + test: true, |
| 149 | + }; |
| 150 | + const authTokenSet: IAuthTokenSet = { |
| 151 | + accessToken: 'accessToken1', |
| 152 | + accessTokenLifetime: -20, |
| 153 | + refreshToken: 'refresh1', |
| 154 | + refreshTokenLifetime: 100, |
| 155 | + }; |
| 156 | + const slicknodeLink = new SlicknodeLink(); |
| 157 | + slicknodeLink.setAuthTokenSet(authTokenSet); |
| 158 | + |
| 159 | + const link = ApolloLink.from([ |
| 160 | + slicknodeLink, |
| 161 | + new ApolloLink((operation) => { |
| 162 | + expect(operation.query).to.deep.equal(gql`${REFRESH_TOKEN_MUTATION}`); |
| 163 | + expect(operation.variables).to.deep.equal({ |
| 164 | + token: authTokenSet.refreshToken, |
| 165 | + }); |
| 166 | + expect(operation.getContext()).to.deep.equal({}); |
| 167 | + done(); |
| 168 | + return null; |
| 169 | + }), |
| 170 | + ]); |
| 171 | + const query = gql`{test}`; |
| 172 | + const request: GraphQLRequest = { |
| 173 | + query, |
| 174 | + variables: {}, |
| 175 | + }; |
| 176 | + const observable = execute(link, request); |
| 177 | + observable.subscribe({ |
| 178 | + next(result: FetchResult) { |
| 179 | + expect(result.data).to.equal(data); |
| 180 | + }, |
| 181 | + error: done, |
| 182 | + }); |
| 183 | + }); |
69 | 184 | }); |
0 commit comments