UNPKG

botium-core

Version:
456 lines (408 loc) 20.2 kB
const path = require('path') const fs = require('fs') const assert = require('chai').assert const nock = require('nock') const BotDriver = require('../../../').BotDriver const Capabilities = require('../../../').Capabilities const echoConnector = ({ queueBotSays }) => { return { UserSays (msg) { const botMsg = { sender: 'bot', sourceData: msg.sourceData, messageText: msg.messageText } queueBotSays(botMsg) } } } describe('scripting.userinputs.mediaInputConvos', function () { describe('relative', function () { beforeEach(async function () { const myCaps = { [Capabilities.PROJECTNAME]: 'scripting.userinputs.mediaInputConvos', [Capabilities.CONTAINERMODE]: echoConnector, [Capabilities.SCRIPTING_ENABLE_MEMORY]: true } const driver = new BotDriver(myCaps) this.compiler = driver.BuildCompiler() this.container = await driver.Build() }) afterEach(async function () { this.container && await this.container.Clean() }) it('should fail on media with no arg', async function () { this.compiler.ReadScript(path.resolve(__dirname, 'convos'), 'mediaNoArg.convo.txt') try { await this.compiler.convos[0].Run(this.container) assert.fail('it should have failed') } catch (err) { assert.isTrue(err.message.indexOf('Line 3: MediaInput requires at least 1 and at most 2 arguments') > 0) } }) it('should add media in user message', async function () { this.compiler.ReadScript(path.resolve(__dirname, 'convos'), 'media.convo.txt') assert.equal(this.compiler.convos.length, 1) assert.equal(this.compiler.convos[0].conversation.length, 1) assert.equal(this.compiler.convos[0].conversation[0].userInputs.length, 1) assert.equal(this.compiler.convos[0].conversation[0].userInputs[0].name, 'MEDIA') assert.equal(this.compiler.convos[0].conversation[0].userInputs[0].args.length, 1) assert.equal(this.compiler.convos[0].conversation[0].userInputs[0].args[0], 'botium.png') const transcript = await this.compiler.convos[0].Run(this.container) assert.equal(transcript.steps.length, 1) assert.equal(transcript.steps[0].actual.media.length, 1) assert.isTrue(transcript.steps[0].actual.media[0].downloadUri.endsWith('test/scripting/userinputs/convos/botium.png')) assert.equal(transcript.steps[0].actual.media[0].mimeType, 'image/png') }) it('should fail when media is out of convo dir', async function () { this.compiler.ReadScript(path.resolve(__dirname, 'convos'), 'mediaOutOfConvoDir.convo.txt') try { await this.compiler.convos[0].Run(this.container) assert.fail('expected error') } catch (err) { assert.isTrue(err.message.startsWith('mediaoutofconvodir/Line 3: error sending to bot - The uri \'../botium.png\' is pointing out of the base directory')) } }) it('should add multi media in user message', async function () { this.compiler.ReadScript(path.resolve(__dirname, 'convos'), 'medias.convo.txt') const transcript = await this.compiler.convos[0].Run(this.container) assert.equal(transcript.steps.length, 1) assert.equal(transcript.steps[0].actual.media.length, 2) assert.isTrue(transcript.steps[0].actual.media[0].downloadUri.endsWith('test/scripting/userinputs/convos/test1.jpg')) assert.equal(transcript.steps[0].actual.media[0].mimeType, 'image/jpeg') assert.isTrue(transcript.steps[0].actual.media[1].downloadUri.endsWith('test/scripting/userinputs/convos/test2.jpg')) assert.equal(transcript.steps[0].actual.media[1].mimeType, 'image/jpeg') }) it('should expand media list in user message', async function () { this.compiler.ReadScript(path.resolve(__dirname, 'convos'), 'medialist.convo.txt') this.compiler.ExpandConvos() assert.equal(this.compiler.convos.length, 3) assert.equal(this.compiler.convos[0].conversation.length, 1) assert.equal(this.compiler.convos[0].conversation[0].userInputs.length, 1) assert.equal(this.compiler.convos[0].conversation[0].userInputs[0].args[0], 'test1.jpg') assert.equal(this.compiler.convos[1].conversation[0].userInputs[0].args[0], 'test2.jpg') assert.equal(this.compiler.convos[2].conversation[0].userInputs[0].args[0], 'test3.jpg') }) it('should expand media wc from convoDir in user message', async function () { this.compiler.ReadScript(path.resolve(__dirname, 'convos'), 'mediawc.convo.txt') this.compiler.ExpandConvos() assert.equal(this.compiler.convos.length, 3) assert.equal(this.compiler.convos[0].conversation.length, 1) assert.equal(this.compiler.convos[0].conversation[0].userInputs.length, 1) assert.equal(this.compiler.convos[0].conversation[0].userInputs[0].args[0], 'files/botium0.png') assert.equal(this.compiler.convos[1].conversation[0].userInputs[0].args[0], 'files/botium1.png') assert.equal(this.compiler.convos[2].conversation[0].userInputs[0].args[0], 'files/botium2.png') }) it('should use dataUri as media in user message', async function () { const mediaData = fs.readFileSync(path.resolve(__dirname, 'convos', 'files', 'botium0.png')) const mediaUri = `data:image/png;base64,${mediaData.toString('base64')}` const script = `should use dataUri as media in user message #me MEDIA ${mediaUri} ` this.compiler.Compile(script, 'SCRIPTING_FORMAT_TXT', 'SCRIPTING_TYPE_CONVO') assert.equal(this.compiler.convos.length, 1) assert.equal(this.compiler.convos[0].conversation.length, 1) assert.equal(this.compiler.convos[0].conversation[0].userInputs.length, 1) assert.equal(this.compiler.convos[0].conversation[0].userInputs[0].name, 'MEDIA') assert.equal(this.compiler.convos[0].conversation[0].userInputs[0].args.length, 1) assert.isTrue(this.compiler.convos[0].conversation[0].userInputs[0].args[0].startsWith('data:image/png')) const transcript = await this.compiler.convos[0].Run(this.container) assert.equal(transcript.steps.length, 1) assert.equal(transcript.steps[0].actual.media.length, 1) assert.isTrue(transcript.steps[0].actual.media[0].downloadUri.startsWith('data:image/png')) assert.equal(transcript.steps[0].actual.media[0].mimeType, 'image/png') }) }) describe('baseUri', function () { beforeEach(async function () { const myCaps = { [Capabilities.PROJECTNAME]: 'scripting.userinputs.mediaInputConvos', [Capabilities.CONTAINERMODE]: echoConnector, [Capabilities.SCRIPTING_ENABLE_MEMORY]: true, [Capabilities.USER_INPUTS]: [ { ref: 'MEDIA', src: 'MediaInput', args: { baseUri: 'https://www.botium.at' } } ] } const driver = new BotDriver(myCaps) this.compiler = driver.BuildCompiler() this.container = await driver.Build() }) afterEach(async function () { this.container && await this.container.Clean() }) it('should add media in user message', async function () { this.compiler.ReadScript(path.resolve(__dirname, 'convos'), 'media.convo.txt') assert.equal(this.compiler.convos.length, 1) assert.equal(this.compiler.convos[0].conversation.length, 1) assert.equal(this.compiler.convos[0].conversation[0].userInputs.length, 1) assert.equal(this.compiler.convos[0].conversation[0].userInputs[0].name, 'MEDIA') assert.equal(this.compiler.convos[0].conversation[0].userInputs[0].args.length, 1) assert.equal(this.compiler.convos[0].conversation[0].userInputs[0].args[0], 'botium.png') const transcript = await this.compiler.convos[0].Run(this.container) assert.equal(transcript.steps.length, 1) assert.equal(transcript.steps[0].actual.media.length, 1) assert.equal(transcript.steps[0].actual.media[0].downloadUri, 'https://www.botium.at/botium.png') assert.equal(transcript.steps[0].actual.media[0].mimeType, 'image/png') }) it('should add multi media in user message', async function () { this.compiler.ReadScript(path.resolve(__dirname, 'convos'), 'medias.convo.txt') const transcript = await this.compiler.convos[0].Run(this.container) assert.equal(transcript.steps.length, 1) assert.equal(transcript.steps[0].actual.media.length, 2) assert.equal(transcript.steps[0].actual.media[0].downloadUri, 'https://www.botium.at/test1.jpg') assert.equal(transcript.steps[0].actual.media[0].mimeType, 'image/jpeg') assert.equal(transcript.steps[0].actual.media[1].downloadUri, 'https://www.botium.at/test2.jpg') assert.equal(transcript.steps[0].actual.media[1].mimeType, 'image/jpeg') }) }) describe('baseUris', function () { beforeEach(async function () { const myCaps = { [Capabilities.PROJECTNAME]: 'scripting.userinputs.mediaInputConvos', [Capabilities.CONTAINERMODE]: echoConnector, [Capabilities.SCRIPTING_ENABLE_MEMORY]: true, [Capabilities.USER_INPUTS]: [ { ref: 'MEDIA', src: 'MediaInput', args: { baseUri: 'https://www.default.at', baseUris: { testset1: 'https://www.botium.at', testset2: 'https://www.google.at' } } } ] } const driver = new BotDriver(myCaps) this.compiler = driver.BuildCompiler() this.container = await driver.Build() }) afterEach(async function () { this.container && await this.container.Clean() }) it('should add media from test set baseUri in user message', async function () { this.compiler.ReadScript(path.resolve(__dirname, 'convos'), 'media.convo.txt') assert.equal(this.compiler.convos.length, 1) this.compiler.convos[0].sourceTag.testSetId = 'testset2' const transcript = await this.compiler.convos[0].Run(this.container) assert.equal(transcript.steps.length, 1) assert.equal(transcript.steps[0].actual.media.length, 1) assert.equal(transcript.steps[0].actual.media[0].downloadUri, 'https://www.google.at/botium.png') assert.equal(transcript.steps[0].actual.media[0].mimeType, 'image/png') }) it('should add media with default baseUri in user message', async function () { this.compiler.ReadScript(path.resolve(__dirname, 'convos'), 'media.convo.txt') assert.equal(this.compiler.convos.length, 1) this.compiler.convos[0].sourceTag.testSetId = 'testset3' const transcript = await this.compiler.convos[0].Run(this.container) assert.equal(transcript.steps.length, 1) assert.equal(transcript.steps[0].actual.media.length, 1) assert.isTrue(transcript.steps[0].actual.media[0].downloadUri.endsWith('https://www.default.at/botium.png')) assert.equal(transcript.steps[0].actual.media[0].mimeType, 'image/png') }) }) describe('baseUrisCustomSelector', function () { beforeEach(async function () { const myCaps = { [Capabilities.PROJECTNAME]: 'scripting.userinputs.mediaInputConvos', [Capabilities.CONTAINERMODE]: echoConnector, [Capabilities.SCRIPTING_ENABLE_MEMORY]: true, [Capabilities.USER_INPUTS]: [ { ref: 'MEDIA', src: 'MediaInput', args: { baseUris: { customval1: 'https://www.botium.at' }, baseSelector: 'sourceTag.customField' } } ] } const driver = new BotDriver(myCaps) this.compiler = driver.BuildCompiler() this.container = await driver.Build() }) afterEach(async function () { this.container && await this.container.Clean() }) it('should add media from custom test set baseUri in user message', async function () { this.compiler.ReadScript(path.resolve(__dirname, 'convos'), 'media.convo.txt') assert.equal(this.compiler.convos.length, 1) this.compiler.convos[0].sourceTag.customField = 'customval1' const transcript = await this.compiler.convos[0].Run(this.container) assert.equal(transcript.steps.length, 1) assert.equal(transcript.steps[0].actual.media.length, 1) assert.equal(transcript.steps[0].actual.media[0].downloadUri, 'https://www.botium.at/botium.png') assert.equal(transcript.steps[0].actual.media[0].mimeType, 'image/png') }) }) describe('baseDir', function () { beforeEach(async function () { const myCaps = { [Capabilities.PROJECTNAME]: 'scripting.userinputs.mediaInputConvos', [Capabilities.CONTAINERMODE]: echoConnector, [Capabilities.SCRIPTING_ENABLE_MEMORY]: true, [Capabilities.USER_INPUTS]: [ { ref: 'MEDIA', src: 'MediaInput', args: { downloadMedia: true, baseDir: path.join(__dirname, 'convos', 'files') } } ] } const driver = new BotDriver(myCaps) this.compiler = driver.BuildCompiler() this.container = await driver.Build() }) afterEach(async function () { this.container && await this.container.Clean() }) it('should expand media wc from baseDir in user message', async function () { this.compiler.ReadScript(path.resolve(__dirname, 'convos'), 'mediawcbasedir.convo.txt') this.compiler.ExpandConvos() assert.equal(this.compiler.convos.length, 3) assert.equal(this.compiler.convos[0].conversation.length, 1) assert.equal(this.compiler.convos[0].conversation[0].userInputs.length, 1) assert.equal(this.compiler.convos[0].conversation[0].userInputs[0].args[0], 'botium0.png') assert.equal(this.compiler.convos[1].conversation[0].userInputs[0].args[0], 'botium1.png') assert.equal(this.compiler.convos[2].conversation[0].userInputs[0].args[0], 'botium2.png') await this.container.Start() const transcript0 = await this.compiler.convos[0].Run(this.container) assert.equal(transcript0.steps.length, 1) assert.equal(transcript0.steps[0].actual.media.length, 1) assert.isTrue(transcript0.steps[0].actual.media[0].downloadUri.endsWith('files/botium0.png')) assert.equal(transcript0.steps[0].actual.media[0].mimeType, 'image/png') await this.container.Stop() await this.container.Start() const transcript1 = await this.compiler.convos[1].Run(this.container) assert.equal(transcript1.steps.length, 1) assert.equal(transcript1.steps[0].actual.media.length, 1) assert.isTrue(transcript1.steps[0].actual.media[0].downloadUri.endsWith('files/botium1.png')) assert.equal(transcript1.steps[0].actual.media[0].mimeType, 'image/png') await this.container.Stop() await this.container.Start() const transcript2 = await this.compiler.convos[2].Run(this.container) assert.equal(transcript2.steps.length, 1) assert.equal(transcript2.steps[0].actual.media.length, 1) assert.isTrue(transcript2.steps[0].actual.media[0].downloadUri.endsWith('files/botium2.png')) assert.equal(transcript2.steps[0].actual.media[0].mimeType, 'image/png') await this.container.Stop() }) it('should fail when media is out of baseDir', async function () { this.compiler.ReadScript(path.resolve(__dirname, 'convos'), 'mediaOutOfBasedir.convo.txt') try { await this.compiler.convos[0].Run(this.container) assert.fail('expected error') } catch (err) { assert.isTrue(err.message.startsWith('mediaoutofbasedir/Line 3: error sending to bot - The uri \'../*.png\' is pointing out of the base directory')) } }) it('should use dataUri as media in user message', async function () { const mediaData = fs.readFileSync(path.resolve(__dirname, 'convos', 'files', 'botium0.png')) const mediaUri = `data:image/png;base64,${mediaData.toString('base64')}` const script = `should use dataUri as media in user message #me MEDIA ${mediaUri} ` this.compiler.Compile(script, 'SCRIPTING_FORMAT_TXT', 'SCRIPTING_TYPE_CONVO') assert.equal(this.compiler.convos.length, 1) assert.equal(this.compiler.convos[0].conversation.length, 1) assert.equal(this.compiler.convos[0].conversation[0].userInputs.length, 1) assert.equal(this.compiler.convos[0].conversation[0].userInputs[0].name, 'MEDIA') assert.equal(this.compiler.convos[0].conversation[0].userInputs[0].args.length, 1) assert.isTrue(this.compiler.convos[0].conversation[0].userInputs[0].args[0].startsWith('data:image/png')) const transcript = await this.compiler.convos[0].Run(this.container) assert.equal(transcript.steps.length, 1) assert.equal(transcript.steps[0].actual.media.length, 1) assert.isTrue(transcript.steps[0].actual.media[0].downloadUri.startsWith('data:image/png')) assert.equal(transcript.steps[0].actual.media[0].mimeType, 'image/png') assert.isTrue(Buffer.isBuffer(transcript.steps[0].actual.media[0].buffer)) }) }) describe('mediaInputDownloadConvos.relative', function () { beforeEach(async function () { const myCaps = { [Capabilities.PROJECTNAME]: 'scripting.userinputs.mediaInputDownloadConvos', [Capabilities.CONTAINERMODE]: echoConnector, [Capabilities.SCRIPTING_ENABLE_MEMORY]: true, [Capabilities.USER_INPUTS]: [ { ref: 'MEDIA', src: 'MediaInput', args: { downloadMedia: true } } ] } const driver = new BotDriver(myCaps) this.compiler = driver.BuildCompiler() this.container = await driver.Build() }) afterEach(async function () { this.container && await this.container.Clean() }) it('should add media buffer in user message', async function () { this.compiler.ReadScript(path.resolve(__dirname, 'convos'), 'media.convo.txt') const transcript = await this.compiler.convos[0].Run(this.container) assert.equal(transcript.steps.length, 1) assert.equal(transcript.steps[0].actual.media.length, 1) assert.isTrue(transcript.steps[0].actual.media[0].downloadUri.endsWith('test/scripting/userinputs/convos/botium.png')) assert.equal(transcript.steps[0].actual.media[0].mimeType, 'image/png') assert.isTrue(Buffer.isBuffer(transcript.steps[0].actual.media[0].buffer)) }) }) describe('scripting.userinputs.mediaInputDownloadConvos.baseUri', function () { beforeEach(async function () { const myCaps = { [Capabilities.PROJECTNAME]: 'scripting.userinputs.mediaInputDownloadConvos', [Capabilities.CONTAINERMODE]: echoConnector, [Capabilities.SCRIPTING_ENABLE_MEMORY]: true, [Capabilities.USER_INPUTS]: [ { ref: 'MEDIA', src: 'MediaInput', args: { downloadMedia: true, baseUri: 'https://www.botium.at' } } ] } const driver = new BotDriver(myCaps) this.compiler = driver.BuildCompiler() this.container = await driver.Build() }) afterEach(async function () { this.container && await this.container.Clean() }) it('should add media in user message', async function () { const scope = nock('https://www.botium.at') .get('/botium.png') .reply(200, Buffer.from('hello world')) .persist() this.compiler.ReadScript(path.resolve(__dirname, 'convos'), 'media.convo.txt') const transcript = await this.compiler.convos[0].Run(this.container) assert.equal(transcript.steps.length, 1) assert.equal(transcript.steps[0].actual.media.length, 1) assert.equal(transcript.steps[0].actual.media[0].downloadUri, 'https://www.botium.at/botium.png') assert.equal(transcript.steps[0].actual.media[0].mimeType, 'image/png') assert.isTrue(Buffer.isBuffer(transcript.steps[0].actual.media[0].buffer)) scope.persist(false) }) }) })