1 import * as request from 'supertest'
3 import { ServerInfo } from '../server/servers'
4 import { getClient } from '../server/clients'
6 type Client = { id: string, secret: string }
7 type User = { username: string, password: string }
8 type Server = { url: string, client: Client, user: User }
10 function login (url: string, client: Client, user: User, expectedStatus = 200) {
11 const path = '/api/v1/users/token'
15 client_secret: client.secret,
16 username: user.username,
17 password: user.password,
18 response_type: 'code',
19 grant_type: 'password',
27 .expect(expectedStatus)
30 function logout (url: string, token: string, expectedStatus = 200) {
31 const path = '/api/v1/users/revoke-token'
35 .set('Authorization', 'Bearer ' + token)
37 .expect(expectedStatus)
40 async function serverLogin (server: Server) {
41 const res = await login(server.url, server.client, server.user, 200)
43 return res.body.access_token as string
46 function refreshToken (server: ServerInfo, refreshToken: string, expectedStatus = 200) {
47 const path = '/api/v1/users/token'
50 client_id: server.client.id,
51 client_secret: server.client.secret,
52 refresh_token: refreshToken,
53 response_type: 'code',
54 grant_type: 'refresh_token'
57 return request(server.url)
61 .expect(expectedStatus)
64 async function userLogin (server: Server, user: User, expectedStatus = 200) {
65 const res = await login(server.url, server.client, user, expectedStatus)
67 return res.body.access_token as string
70 async function getAccessToken (url: string, username: string, password: string) {
71 const resClient = await getClient(url)
73 id: resClient.body.client_id,
74 secret: resClient.body.client_secret
77 const user = { username, password }
80 const res = await login(url, client, user)
81 return res.body.access_token
83 throw new Error('Cannot authenticate. Please check your username/password.')
87 function setAccessTokensToServers (servers: ServerInfo[]) {
88 const tasks: Promise<any>[] = []
90 for (const server of servers) {
91 const p = serverLogin(server).then(t => { server.accessToken = t })
95 return Promise.all(tasks)
98 function loginUsingExternalToken (server: Server, username: string, externalAuthToken: string, expectedStatus = 200) {
99 const path = '/api/v1/users/token'
102 client_id: server.client.id,
103 client_secret: server.client.secret,
105 response_type: 'code',
106 grant_type: 'password',
111 return request(server.url)
115 .expect(expectedStatus)
118 // ---------------------------------------------------------------------------
127 setAccessTokensToServers,
131 loginUsingExternalToken