jscas-server
Version:
An implementation of Apereo's CAS protocol
272 lines (256 loc) • 5.44 kB
JavaScript
'use strict'
const test = require('tap').test
const clone = require('clone')
const nock = require('nock')
const nullLogger = require('../../nullLogger')
const plugin = require('../../../lib/routes/logout')
const serverProto = {
jscasPlugins: {
theme: {},
ticketRegistry: {}
},
jscasTGTCookie: 'tgt-cookie',
jscasInterface: {},
register (plugin) {},
get (path, handler) {
this.getHandler = handler
}
}
test('returns logout view for missing tgt', (t) => {
t.plan(4)
const server = clone(serverProto)
server.jscasPlugins.theme = {
logout () {
return 'logout view'
}
}
const options = {
cookie: {
expires: 1000
}
}
const req = {
log: nullLogger,
cookies: {},
session: {}
}
const reply = {
type (val) {
t.is(val, 'text/html')
return this
},
setCookie (name, val, options) {
t.is(name, 'tgt-cookie')
t.is(val, null)
return this
}
}
plugin(server, options, async () => {
const result = await server.getHandler(req, reply)
t.is(result, 'logout view')
})
})
test('returns logout view for invalid service url', (t) => {
t.plan(6)
const server = clone(serverProto)
server.jscasPlugins.theme = {
logout () {
return 'logout view'
}
}
server.jscasInterface = {
getService: async function (url) {
t.is(url, 'invalid')
return undefined
}
}
const options = {
cookie: {
expires: 1000
}
}
const req = {
log: nullLogger,
cookies: {
'tgt-cookie': '123456'
},
session: {},
query: {
service: 'invalid'
}
}
const reply = {
type (val) {
t.is(val, 'text/html')
return this
},
setCookie (name, val, options) {
t.is(name, 'tgt-cookie')
t.is(val, null)
return this
}
}
plugin(server, options, async () => {
const result = await server.getHandler(req, reply)
t.is(result, 'logout view')
t.is(req.session.isAuthenticated, false)
})
})
test('returns logout view for service retrieval exception', (t) => {
t.plan(6)
const server = clone(serverProto)
server.jscasPlugins.theme = {
logout () {
return 'logout view'
}
}
server.jscasInterface = {
getService: async function (url) {
t.is(url, 'invalid')
throw Error('broken interface')
}
}
const options = {
cookie: {
expires: 1000
}
}
const req = {
log: nullLogger,
cookies: {
'tgt-cookie': '123456'
},
session: {},
query: {
service: 'invalid'
}
}
const reply = {
type (val) {
t.is(val, 'text/html')
return this
},
setCookie (name, val, options) {
t.is(name, 'tgt-cookie')
t.is(val, null)
return this
}
}
plugin(server, options, async () => {
const result = await server.getHandler(req, reply)
t.is(result, 'logout view')
t.is(req.session.isAuthenticated, false)
})
})
test('returns redirect for valid service url', (t) => {
t.plan(7)
const server = clone(serverProto)
server.jscasPlugins.theme = {
logout () {
return 'logout view'
}
}
server.jscasInterface = {
getService: async function (url) {
t.is(url, 'http://example.com')
return {name: 'foo', url}
}
}
const options = {
cookie: {
expires: 1000
}
}
const req = {
log: nullLogger,
cookies: {
'tgt-cookie': '123456'
},
session: {},
query: {
service: 'http://example.com'
}
}
const reply = {
setCookie (name, val, options) {
t.is(name, 'tgt-cookie')
t.is(val, null)
return this
},
redirect (code, url) {
t.is(code, 303)
t.is(url, 'http://example.com')
return 'redirect'
}
}
plugin(server, options, async () => {
const result = await server.getHandler(req, reply)
t.is(result, 'redirect')
t.is(req.session.isAuthenticated, false)
})
})
test('returns redirect for valid service url and sends slo reqs', (t) => {
t.plan(10)
const server = clone(serverProto)
server.jscasPlugins.theme = {
logout () {
return 'logout view'
}
}
server.jscasInterface = {
getService: async function (url) {
t.is(url, 'http://example.com')
return {name: 'foo', url}
}
}
server.jscasPlugins.ticketRegistry = {
invalidateTGT: async function (tgtId) {
t.is(tgtId, '123456')
},
servicesLogForTGT: async function (tgtId) {
t.is(tgtId, '123456')
return [{
logoutUrl: 'http://example.com',
serviceTicketId: '123456'
}]
}
}
const options = {
cookie: {
expires: 1000
}
}
const req = {
log: nullLogger,
cookies: {
'tgt-cookie': '123456'
},
session: {},
query: {
service: 'http://example.com'
}
}
const reply = {
setCookie (name, val, options) {
t.is(name, 'tgt-cookie')
t.is(val, null)
return this
},
redirect (code, url) {
t.is(code, 303)
t.is(url, 'http://example.com')
return 'redirect'
}
}
nock('http://example.com')
.post('/', (body) => {
t.match(body, /samlp:LogoutRequest/)
return true
})
.reply(200)
plugin(server, options, async () => {
const result = await server.getHandler(req, reply)
t.is(result, 'redirect')
t.is(req.session.isAuthenticated, false)
})
})