Skip to content

Commit 6f1c4cd

Browse files
committed
Added more tests
1 parent 4ec8a36 commit 6f1c4cd

File tree

3 files changed

+125
-9
lines changed

3 files changed

+125
-9
lines changed

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
"@types/sinon": "^5.0.2",
3434
"chai": "^4.1.2",
3535
"coveralls": "^3.0.2",
36-
"graphql-tag": "^2.10.0",
36+
"graphql": "^14.0.2",
3737
"mocha": "^5.2.0",
3838
"nyc": "^13.0.1",
3939
"rimraf": "^2.6.2",
@@ -60,6 +60,7 @@
6060
},
6161
"dependencies": {
6262
"apollo-link": "^1.2.2",
63-
"graphql": "^14.0.2"
64-
}
63+
"graphql-tag": "^2.10.0"
64+
},
65+
"peerDependencies": {}
6566
}

src/__tests__/index-test.ts

Lines changed: 117 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import {ApolloLink, execute, FetchResult, GraphQLRequest, Observable} from 'apollo-link';
22
import {expect} from 'chai';
3-
import { parse } from 'graphql';
43
import gql from 'graphql-tag';
54
import sinon from 'sinon';
6-
import SlicknodeLink from '../index';
5+
import SlicknodeLink, {REFRESH_TOKEN_MUTATION} from '../index';
6+
import {IAuthTokenSet} from '../types';
77

88
describe('SlicknodeLink', () => {
99
it('forwards request to next link', (done) => {
@@ -66,4 +66,119 @@ describe('SlicknodeLink', () => {
6666
error: done,
6767
});
6868
});
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+
});
69184
});

src/index.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {ApolloLink, createOperation, FetchResult, NextLink, Observable, Operation} from 'apollo-link';
2-
import {parse} from 'graphql/language/parser';
2+
import gql from 'graphql-tag';
33
import MemoryStorage from './storage/MemoryStorage';
44
import {IAuthTokenSet, ISlicknodeLinkOptions, IStorage} from './types';
55

@@ -14,7 +14,7 @@ declare var global: {
1414
localStorage: IStorage;
1515
};
1616

17-
export const REFRESH_TOKEN_MUTATION = `mutation refreshToken($token: String!) {
17+
export const REFRESH_TOKEN_MUTATION = gql`mutation refreshToken($token: String!) {
1818
refreshAuthToken(input: {refreshToken: $token}) {
1919
accessToken
2020
refreshToken
@@ -23,7 +23,7 @@ export const REFRESH_TOKEN_MUTATION = `mutation refreshToken($token: String!) {
2323
}
2424
}`;
2525

26-
export const LOGOUT_MUTATION = `mutation logout($refreshToken: String) {
26+
export const LOGOUT_MUTATION = gql`mutation logout($refreshToken: String) {
2727
logoutUser(input:{refreshToken:$refreshToken}) {
2828
success
2929
}
@@ -232,7 +232,7 @@ export default class SlicknodeLink extends ApolloLink {
232232
if (!accessToken && refreshToken) {
233233
this.debug('No valid access token found, obtaining new AuthTokenSet with refresh token');
234234
const refreshOperation = createOperation({}, {
235-
query: parse(REFRESH_TOKEN_MUTATION),
235+
query: REFRESH_TOKEN_MUTATION,
236236
variables: {
237237
token: refreshToken,
238238
},

0 commit comments

Comments
 (0)