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 async function userLogin (server: Server, user: User, expectedStatus = 200) {
47 const res = await login(server.url, server.client, user, expectedStatus)
49 return res.body.access_token as string
52 async function getAccessToken (url: string, username: string, password: string) {
53 const resClient = await getClient(url)
55 id: resClient.body.client_id,
56 secret: resClient.body.client_secret
59 const user = { username, password }
62 const res = await login(url, client, user)
63 return res.body.access_token
65 throw new Error('Cannot authenticate. Please check your username/password.')
69 function setAccessTokensToServers (servers: ServerInfo[]) {
70 const tasks: Promise<any>[] = []
72 for (const server of servers) {
73 const p = serverLogin(server).then(t => { server.accessToken = t })
77 return Promise.all(tasks)
80 // ---------------------------------------------------------------------------
88 setAccessTokensToServers,