botium-core
Version:
The Selenium for Chatbots
725 lines (630 loc) • 33 kB
JavaScript
const fs = require('fs')
const path = require('path')
const assert = require('chai').assert
const Compiler = require('../../src/scripting/CompilerCsv')
const Capabilities = require('../../src/Capabilities')
const DefaultCapabilities = require('../../src/Defaults').Capabilities
const CONVOS_DIR = 'convos/csv'
const buildContext = () => {
const result = {
IsAsserterValid: () => false,
IsUserInputValid: () => false,
IsLogicHookValid: () => false,
AddConvos: (c) => {
result.convos = result.convos.concat(c)
},
AddUtterances: (utteranceStructsToAdd) => {
for (const utteranceStructToAdd of utteranceStructsToAdd) {
const existing = result.utterances.find(entry => entry.name === utteranceStructToAdd.name)
if (existing) {
existing.utterances = existing.utterances.concat(utteranceStructToAdd.utterances)
} else {
result.utterances.push(utteranceStructToAdd)
}
}
},
convos: [],
utterances: []
}
return result
}
const assertLivepersonV2 = (context) => {
assert.lengthOf(context.utterances, 4)
assert.lengthOf(context.convos, 0)
assert.deepEqual(context.utterances[0], {
name: 'Cancel Pre-Authorized Payment',
utterances: [
'Can I call back to re-start the payment',
'Can I stop a direct debit',
'Can you cancel a preauthorized payment for me',
'Can you help me cancel my pre authorized payment'
]
})
assert.deepEqual(context.utterances[1], {
name: 'Payee - Correct/Modify',
utterances: [
'Can I modify my existing payee?',
'Can you change the name of the payee?'
]
})
assert.deepEqual(context.utterances[2], {
name: 'Pre-Authorized Payment - Correct/Modify',
utterances: [
'Can I delay my payment to (company)?'
]
})
assert.deepEqual(context.utterances[3], {
name: 'E-Transfer Recipient – Delete',
utterances: [
'Can you delete my friend as an e-transfer recipient?',
'Can you delete this e-transfer recipient',
'Can you delete this recipient'
]
})
}
describe('compiler.compilercsv', function () {
describe('ROW_PER_MESSAGE mode, full', function () {
it('should read basic case', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'convos_sender_basic.csv'))
const context = buildContext()
const caps = {}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.convos, 1)
assert.equal(context.convos[0].conversation[0].messageText, 'test 1')
assert.equal(context.convos[0].conversation[0].sender, 'me')
assert.equal(context.convos[0].conversation[1].messageText, 'test 2')
assert.equal(context.convos[0].conversation[1].sender, 'bot')
})
it('should read different sequence and extra row', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'convos_sender_sequence_and_extra_row.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_MULTIROW_COLUMN_CONVERSATION_ID]: 'conversationId',
[Capabilities.SCRIPTING_CSV_MULTIROW_COLUMN_SENDER]: 'sender',
[Capabilities.SCRIPTING_CSV_MULTIROW_COLUMN_TEXT]: 'text'
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.convos, 1)
assert.equal(context.convos[0].conversation[0].messageText, 'test 1')
assert.equal(context.convos[0].conversation[0].sender, 'me')
assert.equal(context.convos[0].conversation[1].messageText, 'test 2')
assert.equal(context.convos[0].conversation[1].sender, 'bot')
})
it('should read by cap', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'convos_sender_sequence_and_extra_row_no_def_colname.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_MULTIROW_COLUMN_CONVERSATION_ID]: 'alter conversationId',
[Capabilities.SCRIPTING_CSV_MULTIROW_COLUMN_SENDER]: 'alter sender',
[Capabilities.SCRIPTING_CSV_MULTIROW_COLUMN_TEXT]: 'alter text'
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.convos, 1)
assert.equal(context.convos[0].conversation[0].messageText, 'test 1')
assert.equal(context.convos[0].conversation[0].sender, 'me')
assert.equal(context.convos[0].conversation[1].messageText, 'test 2')
assert.equal(context.convos[0].conversation[1].sender, 'bot')
})
it('should read by index', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'convos_sender_sequence_and_extra_row_no_def_colname.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_MULTIROW_COLUMN_CONVERSATION_ID]: 1,
[Capabilities.SCRIPTING_CSV_MULTIROW_COLUMN_SENDER]: 0,
[Capabilities.SCRIPTING_CSV_MULTIROW_COLUMN_TEXT]: 2
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.convos, 1)
assert.equal(context.convos[0].conversation[0].messageText, 'test 1')
assert.equal(context.convos[0].conversation[0].sender, 'me')
assert.equal(context.convos[0].conversation[1].messageText, 'test 2')
assert.equal(context.convos[0].conversation[1].sender, 'bot')
})
it('should read by index, no header', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'convos_sender_no_header.csv'))
const context = buildContext()
const caps = {
SCRIPTING_CSV_SKIP_HEADER: false
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.convos, 1)
assert.equal(context.convos[0].conversation[0].messageText, 'test 1')
assert.equal(context.convos[0].conversation[0].sender, 'me')
assert.equal(context.convos[0].conversation[1].messageText, 'test 2')
assert.equal(context.convos[0].conversation[1].sender, 'bot')
})
it('should read more convos', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'convos_sender_more_convos.csv'))
const context = buildContext()
const caps = {}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.convos, 2)
assert.equal(context.convos[0].conversation[0].messageText, 'test 1')
assert.equal(context.convos[0].conversation[0].sender, 'me')
assert.equal(context.convos[0].conversation[1].messageText, 'test 2')
assert.equal(context.convos[0].conversation[1].sender, 'bot')
assert.equal(context.convos[1].conversation[0].messageText, 'test 3')
assert.equal(context.convos[1].conversation[0].sender, 'me')
assert.equal(context.convos[1].conversation[1].messageText, 'test 4')
assert.equal(context.convos[1].conversation[1].sender, 'bot')
})
it('should read no text', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'convos_sender_no_text.csv'))
const context = buildContext()
const caps = {}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.convos, 1)
assert.equal(context.convos[0].conversation[0].messageText, '')
assert.equal(context.convos[0].conversation[0].sender, 'me')
assert.equal(context.convos[0].conversation[1].messageText, 'test 2')
assert.equal(context.convos[0].conversation[1].sender, 'bot')
})
})
describe('QUESTION_ANSWER mode', function () {
it('should read basic case', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'convos_column_basic.csv'))
const context = buildContext()
const caps = {}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.convos, 1)
assert.equal(context.convos[0].conversation[0].messageText, 'test 1')
assert.equal(context.convos[0].conversation[0].sender, 'me')
assert.equal(context.convos[0].conversation[1].messageText, 'test 2')
assert.equal(context.convos[0].conversation[1].sender, 'bot')
})
it('should read different sequence', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'convos_column_sequence.csv'))
const context = buildContext()
const caps = {
SCRIPTING_CSV_QA_COLUMN_QUESTION: 'question',
SCRIPTING_CSV_QA_COLUMN_ANSWER: 'answer'
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.convos, 1)
assert.equal(context.convos[0].conversation[0].messageText, 'test 1')
assert.equal(context.convos[0].conversation[0].sender, 'me')
assert.equal(context.convos[0].conversation[1].messageText, 'test 2')
assert.equal(context.convos[0].conversation[1].sender, 'bot')
})
it('should read by name', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'convos_column_sequence_no_def_colname.csv'))
const context = buildContext()
const caps = {
SCRIPTING_CSV_QA_COLUMN_QUESTION: 'alter question',
SCRIPTING_CSV_QA_COLUMN_ANSWER: 'alter answer'
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.convos, 1)
assert.equal(context.convos[0].conversation[0].messageText, 'test 1')
assert.equal(context.convos[0].conversation[0].sender, 'me')
assert.equal(context.convos[0].conversation[1].messageText, 'test 2')
assert.equal(context.convos[0].conversation[1].sender, 'bot')
})
it('should read by index', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'convos_column_sequence_no_def_colname.csv'))
const context = buildContext()
const caps = {
SCRIPTING_CSV_QA_COLUMN_QUESTION: 1,
SCRIPTING_CSV_QA_COLUMN_ANSWER: 0
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.convos, 1)
assert.equal(context.convos[0].conversation[0].messageText, 'test 1')
assert.equal(context.convos[0].conversation[0].sender, 'me')
assert.equal(context.convos[0].conversation[1].messageText, 'test 2')
assert.equal(context.convos[0].conversation[1].sender, 'bot')
})
it('should read by index, no header', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'convos_column_no_header.csv'))
const context = buildContext()
const caps = {
SCRIPTING_CSV_SKIP_HEADER: false
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.convos, 1)
assert.equal(context.convos[0].conversation[0].messageText, 'test 1')
assert.equal(context.convos[0].conversation[0].sender, 'me')
assert.equal(context.convos[0].conversation[1].messageText, 'test 2')
assert.equal(context.convos[0].conversation[1].sender, 'bot')
})
it('should read more convos', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'convos_column_more_convos.csv'))
const context = buildContext()
const caps = {}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.convos, 2)
assert.equal(context.convos[0].conversation[0].messageText, 'test 1')
assert.equal(context.convos[0].conversation[0].sender, 'me')
assert.equal(context.convos[0].conversation[1].messageText, 'test 2')
assert.equal(context.convos[0].conversation[1].sender, 'bot')
assert.equal(context.convos[1].conversation[0].messageText, 'test 3')
assert.equal(context.convos[1].conversation[0].sender, 'me')
assert.equal(context.convos[1].conversation[1].messageText, 'test 4')
assert.equal(context.convos[1].conversation[1].sender, 'bot')
})
it('should read user and bot columns', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'convos_column_me_bot.csv'))
const context = buildContext()
const caps = {
SCRIPTING_CSV_QA_COLUMN_QUESTION: 'user',
SCRIPTING_CSV_QA_COLUMN_ANSWER: 'bot'
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.convos, 1)
assert.equal(context.convos[0].conversation[0].messageText, 'test 1')
assert.equal(context.convos[0].conversation[0].sender, 'me')
assert.equal(context.convos[0].conversation[1].messageText, 'test 2')
assert.equal(context.convos[0].conversation[1].sender, 'bot')
})
})
describe('Utterances', function () {
describe('In legacy mode', function () {
describe('Utterance mode', function () {
it('should read oldscool single column format', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_singlecolumn.csv'))
const context = buildContext()
const caps = {}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_UTTERANCES')
assert.lengthOf(context.utterances, 1)
assert.deepEqual(context.utterances[0], {
name: 'singlecolumn',
utterances: ['hello', 'hi']
})
})
// maybe we could read it
it('should NOT read multi column format 3 col', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_multicolumn3col.csv'))
const context = buildContext()
const caps = {}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_UTTERANCES')
assert.lengthOf(context.utterances, 0)
assert.lengthOf(context.convos, 0)
})
// maybe we could read it
it('should NOT read multi column format 5 col', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_multicolumn5col.csv'))
const context = buildContext()
const caps = {}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_UTTERANCES')
assert.lengthOf(context.utterances, 0)
assert.lengthOf(context.convos, 0)
})
// maybe we could read it
it('should NOT read liveperson format with SCRIPTING_CSV_STARTROW', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_liveperson.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_UTTERANCE_STARTROW]: 12
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_UTTERANCES')
assert.lengthOf(context.utterances, 0)
assert.lengthOf(context.convos, 0)
})
// maybe we could read it
it('should NOT read liveperson format with SCRIPTING_CSV_STARTROWHEADER', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_liveperson.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_UTTERANCE_STARTROW_HEADER]: 'SampleSentences'
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_UTTERANCES')
assert.lengthOf(context.utterances, 0)
assert.lengthOf(context.convos, 0)
})
})
describe('Convo mode', function () {
it('should not read oldscool single column format', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_singlecolumn.csv'))
const context = buildContext()
const caps = {}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.utterances, 0)
})
it('should not parse multi column uttrances as convos ???', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_multicolumn3col.csv'))
const context = buildContext()
const caps = {}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
try {
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.fail('expected error')
} catch (err) {
assert.equal(err.message, 'Failed to parse conversation. Section "goodbye" unknown.')
}
})
it('should not parse multi column uttrances as convos ??? 2', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_multicolumn5col.csv'))
const context = buildContext()
const caps = {}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
try {
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.fail('expected error')
} catch (err) {
assert.equal(err.message, 'Failed to parse conversation. Section "goodbye" unknown.')
}
})
it('should NOT read liveperson format with SCRIPTING_CSV_UTTERANCE_STARTROW???', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_liveperson.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_UTTERANCE_STARTROW]: 12
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
try {
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.fail('expected error')
} catch (err) {
assert.equal(err.message, 'Failed to parse conversation. Section "DisplayName" unknown.')
}
})
it('should NOT read liveperson format with SCRIPTING_CSV_STARTROWHEADER', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_liveperson.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_UTTERANCE_STARTROW_HEADER]: 'SampleSentences'
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
try {
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.fail('expected error')
} catch (err) {
assert.equal(err.message, 'Failed to parse conversation. Section "DisplayName" unknown.')
}
})
})
})
describe('In non-legacy mode', function () {
describe('Utterance mode', function () {
it('should read oldscool single column format', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_singlecolumn.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_LEGACY_MODE_OFF]: true
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_UTTERANCES')
assert.lengthOf(context.utterances, 1)
assert.deepEqual(context.utterances[0], {
name: 'singlecolumn',
utterances: ['hello', 'hi']
})
})
it('BUG, 3 column utterance is not well supported', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_multicolumn3col.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_LEGACY_MODE_OFF]: true
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_UTTERANCES')
assert.lengthOf(context.utterances, 0)
assert.lengthOf(context.convos, 0)
})
it('should read multi column format 5 col', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_multicolumn5col.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_LEGACY_MODE_OFF]: true
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_UTTERANCES')
assert.lengthOf(context.utterances, 5)
assert.lengthOf(context.convos, 0)
assert.deepEqual(context.utterances[0], {
name: '5col',
utterances: [
'hello',
'hi'
]
})
})
it('should read liveperson format with SCRIPTING_CSV_STARTROW', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_liveperson.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_UTTERANCE_STARTROW]: 12,
[Capabilities.SCRIPTING_CSV_UTTERANCE_STOP_ON_EMPTY]: true,
[Capabilities.SCRIPTING_CSV_LEGACY_MODE_OFF]: true
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_UTTERANCES')
assert.lengthOf(context.utterances, 18)
assert.lengthOf(context.convos, 0)
assert.deepEqual(context.utterances[0], {
name: 'ask about installation',
utterances: [
'about my appointment',
'book service installation appointment'
]
})
})
it('should read liveperson format 2 with SCRIPTING_CSV_STARTROW', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_liveperson2.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_UTTERANCE_STARTROW]: 9,
[Capabilities.SCRIPTING_CSV_UTTERANCE_STOP_ON_EMPTY]: true,
[Capabilities.SCRIPTING_CSV_LEGACY_MODE_OFF]: true
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_UTTERANCES')
assertLivepersonV2(context)
})
it('should read liveperson format with SCRIPTING_CSV_STARTROW without stop', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_liveperson.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_UTTERANCE_STARTROW]: 12,
[Capabilities.SCRIPTING_CSV_LEGACY_MODE_OFF]: true
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_UTTERANCES')
// description fields are pared as utterances. even metaintents
assert.lengthOf(context.utterances, 21)
})
it('should read liveperson format with SCRIPTING_CSV_STARTROWHEADER', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_liveperson.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_UTTERANCE_STARTROW_HEADER]: 'SampleSentences',
[Capabilities.SCRIPTING_CSV_UTTERANCE_STOP_ON_EMPTY]: true,
[Capabilities.SCRIPTING_CSV_LEGACY_MODE_OFF]: true
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_UTTERANCES')
assert.lengthOf(context.utterances, 18)
assert.lengthOf(context.convos, 0)
assert.deepEqual(context.utterances[0], {
name: 'ask about installation',
utterances: [
'about my appointment',
'book service installation appointment'
]
})
})
it('should read liveperson format 2 with SCRIPTING_CSV_STARTROWHEADER', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_liveperson2.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_UTTERANCE_STARTROW_HEADER]: 'SampleSentences',
[Capabilities.SCRIPTING_CSV_UTTERANCE_STOP_ON_EMPTY]: true,
[Capabilities.SCRIPTING_CSV_LEGACY_MODE_OFF]: true
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_UTTERANCES')
assertLivepersonV2(context)
})
it('should read liveperson format with SCRIPTING_CSV_STARTROWHEADER 2', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_liveperson.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_UTTERANCE_STARTROW_HEADER]: 'SampleSentences',
[Capabilities.SCRIPTING_CSV_UTTERANCE_STOP_ON_EMPTY]: true,
[Capabilities.SCRIPTING_CSV_LEGACY_MODE_OFF]: true
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_UTTERANCES')
assert.lengthOf(context.utterances, 18)
assert.lengthOf(context.convos, 0)
assert.deepEqual(context.utterances[0], {
name: 'ask about installation',
utterances: [
'about my appointment',
'book service installation appointment'
]
})
})
it('should read liveperson format 2 with SCRIPTING_CSV_STARTROWHEADER 2', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_liveperson2.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_UTTERANCE_STARTROW_HEADER]: 'SampleSentences',
[Capabilities.SCRIPTING_CSV_UTTERANCE_STOP_ON_EMPTY]: true,
[Capabilities.SCRIPTING_CSV_LEGACY_MODE_OFF]: true
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_UTTERANCES')
assertLivepersonV2(context)
})
it('should work with variable length csv', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_variable_row_len.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_LEGACY_MODE_OFF]: true
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_UTTERANCES')
assert.lengthOf(context.utterances, 5)
assert.deepEqual(context.utterances[0], {
name: 'variable_row_len',
utterances: ['hello', 'hi']
})
})
})
describe('Convo mode', function () {
it('should not read oldscool single column format', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_singlecolumn.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_LEGACY_MODE_OFF]: true
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.utterances, 0)
})
it('BUG, 3 column utterance is not well supported', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_multicolumn3col.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_LEGACY_MODE_OFF]: true
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
assert.lengthOf(context.utterances, 0)
assert.lengthOf(context.convos, 0)
try {
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.fail('expected error')
} catch (err) {
assert.equal(err.message, 'Failed to parse conversation. Section "goodbye" unknown.')
}
})
it('should not parse multi column uttrances as convos', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_multicolumn5col.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_LEGACY_MODE_OFF]: true
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.utterances, 0)
assert.lengthOf(context.convos, 0)
})
it('should NOT read liveperson format with SCRIPTING_CSV_UTTERANCE_STARTROW', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_liveperson.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_UTTERANCE_STARTROW]: 12,
[Capabilities.SCRIPTING_CSV_LEGACY_MODE_OFF]: true
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.utterances, 0)
assert.lengthOf(context.convos, 0)
})
it('should NOT read liveperson format with SCRIPTING_CSV_STARTROWHEADER', async function () {
const scriptBuffer = fs.readFileSync(path.resolve(__dirname, CONVOS_DIR, 'utterances_liveperson.csv'))
const context = buildContext()
const caps = {
[Capabilities.SCRIPTING_CSV_UTTERANCE_STARTROW_HEADER]: 'SampleSentences',
[Capabilities.SCRIPTING_CSV_LEGACY_MODE_OFF]: true
}
const compiler = new Compiler(context, Object.assign({}, DefaultCapabilities, caps))
compiler.Compile(scriptBuffer, 'SCRIPTING_TYPE_CONVO')
assert.lengthOf(context.utterances, 0)
assert.lengthOf(context.convos, 0)
})
})
})
})
})