1
|
|
|
const test = require('unit.js'); |
2
|
|
|
const testThat = test.promise; |
3
|
|
|
const sinon = require('sinon'); |
4
|
|
|
const chai = require('chai'); |
5
|
|
|
const chaiAsPromised = require('chai-as-promised'); |
6
|
|
|
const expect = chai.expect; |
7
|
|
|
const rewire = require('rewire'); |
8
|
|
|
const cookie = rewire('../lib/cookieAuthentication.js'); |
9
|
|
|
const requestify = require('requestify'); |
10
|
|
|
const getBaseUrl = cookie.__get__('getBaseUrl'); |
11
|
|
|
const extract = cookie.__get__('extractSessionCookie'); |
12
|
|
|
let sandbox = null; |
13
|
|
|
|
14
|
|
|
before(() => chai.use(chaiAsPromised)); |
15
|
|
|
|
16
|
|
|
beforeEach(() => sandbox = sinon.sandbox.create()); |
17
|
|
|
|
18
|
|
|
afterEach(() => sandbox.restore()); |
19
|
|
|
|
20
|
|
|
|
21
|
|
|
describe('getBaseUrl', () => { |
22
|
|
|
it('getBaseUrl() returns base url if valid url', () => testThat |
23
|
|
|
.given(() => 'http://www.dummyserver:23456/rest/api/2/issue/ID-5') |
24
|
|
|
.when((url) => getBaseUrl(url)) |
25
|
|
|
.then((baseUrl) => expect(baseUrl).to.equal('http://www.dummyserver:23456/rest/')) |
26
|
|
|
); |
27
|
|
|
it('getBaseUrl() throw error if missing url', () => testThat |
28
|
|
|
.given() |
29
|
|
|
.when(() => () => getBaseUrl()) |
30
|
|
|
.then((func) => expect(func).to.throw(Error)) |
31
|
|
|
); |
32
|
|
|
it('getBaseUrl() throw error if invalid url', () => testThat |
33
|
|
|
.given(() => 'http://www.dummyserver:23456/bla/bla/bla') |
34
|
|
|
.when((url) => () => getBaseUrl(url)) |
35
|
|
|
.then((func) => expect(func).to.throw(Error)) |
36
|
|
|
); |
37
|
|
|
}); |
38
|
|
|
|
39
|
|
|
describe('extractSessionCookie', () => { |
40
|
|
|
it('extractSessionCookie() throw error if cookie name not specified', () => testThat |
41
|
|
|
.given(() => 'fake="KHG8768"') |
42
|
|
|
.when((cookie) => () => extract(cookie)) |
43
|
|
|
.then((func) => expect(func).to.throw(Error)) |
44
|
|
|
); |
45
|
|
|
it('extractSessionCookie() throw error if cookies not specified', () => testThat |
46
|
|
|
.given() |
47
|
|
|
.when(() => () => extract()) |
48
|
|
|
.then((func) => expect(func).to.throw(Error)) |
49
|
|
|
); |
50
|
|
|
it('extractSessionCookie() throw error if cookies is not an array', () => testThat |
51
|
|
|
.given(() => ({cookies: 'fake="KHG987J"', name: 'fake'})) |
52
|
|
|
.then((data) => () => extract(data.cookies, data.name)) |
53
|
|
|
.then((func) => expect(func).to.throw(Error)) |
54
|
|
|
); |
55
|
|
|
it('extractSessionCookie() returns sessionCookie when only one cookie', () => testThat |
56
|
|
|
.given(() => ({cookies: ['cookie1="LKJHLKJ8768H"'], name: 'cookie1'})) |
57
|
|
|
.when((data) => extract(data.cookies, data.name)) |
58
|
|
|
.then((cookie) => expect(cookie).to.equal('cookie1="LKJHLKJ8768H"')) |
59
|
|
|
); |
60
|
|
|
it('extractSessionCookie() throw error if cookie name not found in cookies', () => testThat |
61
|
|
|
.given(() => ({cookies: ['cookie1="LKJHLKJ8768H"'], name: 'cookie2'})) |
62
|
|
|
.when((data) => () => extract(data.cookies, data.name)) |
63
|
|
|
.then((func) => expect(func).to.throw(Error)) |
64
|
|
|
); |
65
|
|
|
it('extractSessionCookie() returns sessionCookie when multiple cookies', () => testThat |
66
|
|
|
.given(() => ({cookies: ['cookie1="LKJHLKJ8768H"', 'cookie2="KJHG76KHJB"', 'cookie3="JRS8MLKJKJF"', 'cookie4="JH8976HGFCJ"'], name: 'cookie3'})) |
67
|
|
|
.when((data) => extract(data.cookies, data.name)) |
68
|
|
|
.then((cookie) => expect(cookie).to.equal('cookie3="JRS8MLKJKJF"')) |
69
|
|
|
); |
70
|
|
|
it('extractSessionCookie() returns sessionCookie when multiple cookies and empty cookie with cookie name ignored', () => testThat |
71
|
|
|
.given(() => ({cookies: ['cookie1="LKJHLKJ8768H"', 'cookie2="KJHG76KHJB"', 'cookie3=""', 'cookie3="JH8976HGFCJ"'], name: 'cookie3'})) |
72
|
|
|
.when((data) => extract(data.cookies, data.name)) |
73
|
|
|
.then((cookie) => expect(cookie).to.equal('cookie3="JH8976HGFCJ"')) |
74
|
|
|
); |
75
|
|
|
}); |
76
|
|
|
|
77
|
|
|
describe('getHeader', () => { |
78
|
|
|
it('getHeaders() builds header including cookie', () => testThat |
79
|
|
|
.given(() => 'cookiename=cookievalue') |
80
|
|
|
.when((sessionCookie) => cookie.getHeader(sessionCookie)) |
81
|
|
|
.then((header) => { |
82
|
|
|
expect(header).to.have.property('cookie', 'cookiename=cookievalue'); |
83
|
|
|
expect(header).to.have.property('Cache-Control', 'public, max-age=60'); |
84
|
|
|
}) |
85
|
|
|
); |
86
|
|
|
}); |
87
|
|
|
|
88
|
|
|
describe('login', () => { |
89
|
|
|
it('login() rejects with if url not set', () => { |
90
|
|
|
return expect(cookie.login('user', 'password')).to.eventually.be.rejected |
91
|
|
|
.then((error) => { |
92
|
|
|
expect(error).to.be.an.instanceof(Error); |
93
|
|
|
}); |
94
|
|
|
}); |
95
|
|
|
it('login() rejects if no cookie is in header', () => { |
96
|
|
|
sandbox.stub(requestify, 'post', () => { |
97
|
|
|
let headers = {'set-cookie': ''}; |
98
|
|
|
let response = '{"session": {"name": "studio.crowd.tokenkey"}}'; |
99
|
|
|
return Promise.resolve({code: 200, headers: headers, body: response}); |
100
|
|
|
}); |
101
|
|
|
expect(cookie.login('dummy-user', 'dummy-password', 'http://www.dummyurl/rest/api/2/issue/ID-78')).to.eventually.be.rejected; |
102
|
|
|
}); |
103
|
|
|
it('login() returns session Cookie', () => { |
104
|
|
|
sandbox.stub(requestify, 'post', () => { |
105
|
|
|
let headers = {'set-cookie': ['atlassian.xsrf.token=BGJJ-I70H-EYI8-6QPB|2ae8e3125acff97369f184a4530b59f9d983c12d|lout; Path=/; Secure', 'JSESSIONID=913F47DAFCA6D7FF09A65537D5BD3C5C; Path=/; Secure; HttpOnly', 'studio.crowd.tokenkey=""; Domain=.ulyssjira2.atlassian.net; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/; Secure; HttpOnly', 'studio.crowd.tokenkey=gW34EFQfK8Kbwpp6HkHmng00; Domain=.ulyssjira2.atlassian.net; Path=/; Secure; HttpOnly']}; |
106
|
|
|
let response = '{"session": {"name": "studio.crowd.tokenkey"}, "loginInfo": {"failedLoginCount": 1, "loginCount": 230, "lastFailedLoginTime": "2017-01-17T10:20:43.467+0100", "previousLoginTime": "2017-01-17T17:11:46.798+0100"}}'; |
107
|
|
|
return Promise.resolve({code: 200, headers: headers, body: response}); |
108
|
|
|
}); |
109
|
|
|
return expect(cookie.login('dummy-user', 'dummy-password', 'http://www.dummyurl/rest/api/2/issue/ID-78')).to.eventually.be.fulfilled |
110
|
|
|
.then((cookie) => { |
111
|
|
|
expect(cookie).to.equal('studio.crowd.tokenkey=gW34EFQfK8Kbwpp6HkHmng00'); |
112
|
|
|
}); |
113
|
|
|
}); |
114
|
|
|
}); |
115
|
|
|
|