{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/utils/testing.ts"],"names":[],"mappings":"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","sourcesContent":["import { get, post, login, logout } from '../lib/api'\nimport { apiUser, botUser, mockUser } from './config'\nimport {\n IMessageAPI,\n IMessageUpdateAPI,\n IMessageResultAPI,\n INewUserAPI,\n IUserResultAPI,\n IRoomResultAPI,\n IChannelResultAPI\n} from './interfaces'\n\n/** Define common attributes for DRY tests */\nexport const testChannelName = 'tests'\n\n/** Get information about a user */\nexport async function userInfo (username: string): Promise<IUserResultAPI> {\n return get('users.info', { username }, true)\n}\n\n/** Create a user and catch the error if they exist already */\nexport async function createUser (user: INewUserAPI): Promise<IUserResultAPI> {\n return post('users.create', user, true, /already in use/i)\n}\n\n/** Get information about a channel */\nexport async function channelInfo (roomName: string): Promise<IChannelResultAPI> {\n return get('channels.info', { roomName }, true)\n}\n\n/** Create a room for tests and catch the error if it exists already */\nexport async function createChannel (\n name: string,\n members: string[] = [],\n readOnly: boolean = false\n): Promise<IChannelResultAPI> {\n return post('channels.create', { name, members, readOnly }, true)\n}\n\n/** Send message from mock user to channel for tests to listen and respond */\nexport async function sendFromUser (payload: any): Promise<IMessageResultAPI> {\n const testChannel = await channelInfo(testChannelName)\n const messageDefaults: IMessageAPI = { roomId: testChannel.channel._id }\n const data: IMessageAPI = Object.assign({}, messageDefaults, payload)\n await login({ username: mockUser.username, password: mockUser.password })\n return post('chat.postMessage', data, true)\n}\n\n/** Update message sent from mock user */\nexport async function updateFromUser (payload: IMessageUpdateAPI): Promise<IMessageResultAPI> {\n await login({ username: mockUser.username, password: mockUser.password })\n return post('chat.update', payload, true)\n}\n\n/** Create a direct message session with the mock user */\nexport async function setupDirectFromUser (): Promise<IRoomResultAPI> {\n await login({ username: mockUser.username, password: mockUser.password })\n return post('im.create', { username: botUser.username }, true)\n}\n\n/** Initialise testing instance with the required users for SDK/bot tests */\nexport async function setup () {\n console.log('\\nPreparing instance for tests...')\n try {\n // Verify API user can login\n const loginInfo = await login(apiUser)\n if (loginInfo.status !== 'success') {\n throw new Error(`API user (${apiUser.username}) could not login`)\n } else {\n console.log(`API user (${apiUser.username}) logged in`)\n }\n\n // Verify or create user for bot\n let botInfo = await userInfo(botUser.username)\n if (!botInfo.success) {\n console.log(`Bot user (${botUser.username}) not found`)\n botInfo = await createUser(botUser)\n if (!botInfo.success) {\n throw new Error(`Bot user (${botUser.username}) could not be created`)\n } else {\n console.log(`Bot user (${botUser.username}) created`)\n }\n } else {\n console.log(`Bot user (${botUser.username}) exists`)\n }\n\n // Verify or create mock user for talking to bot\n let mockInfo = await userInfo(mockUser.username)\n if (!mockInfo.success) {\n console.log(`Mock user (${mockUser.username}) not found`)\n mockInfo = await createUser(mockUser)\n if (!mockInfo.success) {\n throw new Error(`Mock user (${mockUser.username}) could not be created`)\n } else {\n console.log(`Mock user (${mockUser.username}) created`)\n }\n } else {\n console.log(`Mock user (${mockUser.username}) exists`)\n }\n\n // Verify or create channel for tests\n let testChannelInfo = await channelInfo(testChannelName)\n if (!testChannelInfo.success) {\n console.log(`Test channel (${testChannelName}) not found`)\n testChannelInfo = await createChannel(testChannelName)\n if (!testChannelInfo.success) {\n throw new Error(`Test channel (${testChannelName}) could not be created`)\n } else {\n console.log(`Test channel (${testChannelName}) created`)\n }\n } else {\n console.log(`Test channel (${testChannelName}) exists`)\n }\n\n await logout()\n } catch (e) {\n throw e\n }\n}\n"]}
\ No newline at end of file
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/utils/testing.ts"],"names":[],"mappings":"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","sourcesContent":["import { get, post, login, logout } from '../lib/api'\nimport { apiUser, botUser, mockUser } from './config'\nimport {\n IMessageAPI,\n IMessageUpdateAPI,\n IMessageResultAPI,\n INewUserAPI,\n IUserResultAPI,\n IRoomResultAPI,\n IChannelResultAPI,\n IMessageReceiptAPI\n} from './interfaces'\n\n/** Define common attributes for DRY tests */\nexport const testChannelName = 'tests'\n\n/** Get information about a user */\nexport async function userInfo (username: string): Promise<IUserResultAPI> {\n return get('users.info', { username }, true)\n}\n\n/** Create a user and catch the error if they exist already */\nexport async function createUser (user: INewUserAPI): Promise<IUserResultAPI> {\n return post('users.create', user, true, /already in use/i)\n}\n\n/** Get information about a channel */\nexport async function channelInfo (query: { roomName?: string, roomId?: string }): Promise<IChannelResultAPI> {\n return get('channels.info', query, true)\n}\n\n/** Create a room for tests and catch the error if it exists already */\nexport async function createChannel (\n name: string,\n members: string[] = [],\n readOnly: boolean = false\n): Promise<IChannelResultAPI> {\n return post('channels.create', { name, members, readOnly }, true)\n}\n\n/** Send message from mock user to channel for tests to listen and respond */\n/** @todo Sometimes the post request completes before the change event emits\n * the message to the streamer. That's why the interval is used for proof\n * of receipt. It would be better for the endpoint to not resolve until\n * server side handling is complete. Would require PR to core.\n */\nexport async function sendFromUser (payload: any): Promise<IMessageResultAPI> {\n const user = await login({ username: mockUser.username, password: mockUser.password })\n const endpoint = (payload.roomId && payload.roomId.indexOf(user.data.userId) !== -1)\n ? 'dm.history'\n : 'channels.history'\n const roomId = (payload.roomId)\n ? payload.roomId\n : (await channelInfo({ roomName: testChannelName })).channel._id\n const messageDefaults: IMessageAPI = { roomId }\n const data: IMessageAPI = Object.assign({}, messageDefaults, payload)\n const oldest = new Date().toISOString()\n const result = await post('chat.postMessage', data, true)\n const proof = new Promise((resolve, reject) => {\n let looked = 0\n const look = setInterval(async () => {\n const { messages } = await get(endpoint, { roomId, oldest })\n const found = messages.some((message: IMessageReceiptAPI) => {\n return result.message._id === message._id\n })\n if (found || looked > 10) {\n clearInterval(look)\n if (found) resolve()\n else reject('API send from user, proof of receipt timeout')\n }\n looked++\n }, 100)\n })\n await proof\n return result\n}\n\n/** Update message sent from mock user */\nexport async function updateFromUser (payload: IMessageUpdateAPI): Promise<IMessageResultAPI> {\n await login({ username: mockUser.username, password: mockUser.password })\n return post('chat.update', payload, true)\n}\n\n/** Create a direct message session with the mock user */\nexport async function setupDirectFromUser (): Promise<IRoomResultAPI> {\n await login({ username: mockUser.username, password: mockUser.password })\n return post('im.create', { username: botUser.username }, true)\n}\n\n/** Initialise testing instance with the required users for SDK/bot tests */\nexport async function setup () {\n console.log('\\nPreparing instance for tests...')\n try {\n // Verify API user can login\n const loginInfo = await login(apiUser)\n if (loginInfo.status !== 'success') {\n throw new Error(`API user (${apiUser.username}) could not login`)\n } else {\n console.log(`API user (${apiUser.username}) logged in`)\n }\n\n // Verify or create user for bot\n let botInfo = await userInfo(botUser.username)\n if (!botInfo.success) {\n console.log(`Bot user (${botUser.username}) not found`)\n botInfo = await createUser(botUser)\n if (!botInfo.success) {\n throw new Error(`Bot user (${botUser.username}) could not be created`)\n } else {\n console.log(`Bot user (${botUser.username}) created`)\n }\n } else {\n console.log(`Bot user (${botUser.username}) exists`)\n }\n\n // Verify or create mock user for talking to bot\n let mockInfo = await userInfo(mockUser.username)\n if (!mockInfo.success) {\n console.log(`Mock user (${mockUser.username}) not found`)\n mockInfo = await createUser(mockUser)\n if (!mockInfo.success) {\n throw new Error(`Mock user (${mockUser.username}) could not be created`)\n } else {\n console.log(`Mock user (${mockUser.username}) created`)\n }\n } else {\n console.log(`Mock user (${mockUser.username}) exists`)\n }\n\n // Verify or create channel for tests\n let testChannelInfo = await channelInfo({ roomName: testChannelName })\n if (!testChannelInfo.success) {\n console.log(`Test channel (${testChannelName}) not found`)\n testChannelInfo = await createChannel(testChannelName)\n if (!testChannelInfo.success) {\n throw new Error(`Test channel (${testChannelName}) could not be created`)\n } else {\n console.log(`Test channel (${testChannelName}) created`)\n }\n } else {\n console.log(`Test channel (${testChannelName}) exists`)\n }\n\n await logout()\n } catch (e) {\n throw e\n }\n}\n"]}