node-nlp
Version:
Library for NLU (Natural Language Understanding) done in Node.js
187 lines (176 loc) • 7.46 kB
JavaScript
var assert = require('assert');
var builder = require('../');
describe('routing', function() {
this.timeout(5000);
it('should recognize an intent', function (done) {
var connector = new builder.ConsoleConnector();
var bot = new builder.UniversalBot(connector);
bot.recognizer(new builder.RegExpRecognizer('test', /^test/i));
bot.onFindRoutes(function (context, callback) {
assert(context !== null && callback !== null);
assert(context.intent !== null);
assert(context.intent.score === 1.0);
assert(context.intent.intent === 'test');
done();
});
connector.processMessage('test');
});
it('should route to the default dialog', function (done) {
var connector = new builder.ConsoleConnector();
var bot = new builder.UniversalBot(connector);
bot.dialog('/', function (session, args) {
assert(session !== null);
assert(args == null);
done();
});
connector.processMessage('test');
});
it('should route to a global action', function (done) {
var connector = new builder.ConsoleConnector();
var bot = new builder.UniversalBot(connector);
bot.dialog('/test', function (session, args) {
assert(session !== null);
assert(args !== null);
done();
}).triggerAction({ matches: /test/i });
connector.processMessage('test');
});
it('should route to a stack action', function (done) {
var connector = new builder.ConsoleConnector();
var bot = new builder.UniversalBot(connector);
bot.dialog('/', function (session) {
session.send('step1');
}).cancelAction('cancel', null, {
matches: /cancel/i,
onSelectAction: function (session, args, next) {
assert(session !== null);
assert(args !== null);
assert(next !== null);
done();
}
});
bot.on('send', function (message) {
connector.processMessage('cancel');
});
connector.processMessage('test');
});
it('should route to a deep stack action', function (done) {
var connector = new builder.ConsoleConnector();
var bot = new builder.UniversalBot(connector);
bot.dialog('/', function (session) {
session.beginDialog('/child');
}).cancelAction('cancel', null, { matches: /cancel/i });
bot.dialog('/child', function (session) {
session.send('step1');
}).cancelAction('cancel', null, {
matches: /cancel/i,
onSelectAction: function (session, args, next) {
done();
}
});
bot.on('send', function (message) {
connector.processMessage('cancel');
});
connector.processMessage('test');
});
it('should route to a middle stack action', function (done) {
var connector = new builder.ConsoleConnector();
var bot = new builder.UniversalBot(connector);
bot.dialog('/', function (session) {
session.beginDialog('/child');
}).cancelAction('cancel', null, {
matches: /(cancel order|cancel)/i,
onSelectAction: function (session, args, next) {
done();
}
});
bot.dialog('/child', function (session) {
session.send('step1');
}).cancelAction('cancel', null, { matches: /(cancel item|cancel)/i });
bot.on('send', function (message) {
connector.processMessage('cancel order');
});
connector.processMessage('test');
});
it('should route over multiple libraries', function (done) {
var connector = new builder.ConsoleConnector();
var lib = new builder.Library('lib');
var bot = new builder.UniversalBot(connector);
bot.library(lib);
bot.dialog('/', function (session) {
assert(false);
});
lib.dialog('/', function (session) {
done();
}).triggerAction({ matches: /test/i });
connector.processMessage('test');
});
it('should favor the root library', function (done) {
var connector = new builder.ConsoleConnector();
var lib = new builder.Library('lib');
var bot = new builder.UniversalBot(connector);
bot.library(lib);
bot.dialog('/', function (session) {
done();
}).triggerAction({ matches: /test/i });
lib.dialog('/', function (session) {
assert(false);
}).triggerAction({ matches: /test/i });
connector.processMessage('test');
});
it('should favor the deepest library', function (done) {
var connector = new builder.ConsoleConnector();
var lib1 = new builder.Library('lib1');
var lib2 = new builder.Library('lib2');
var bot = new builder.UniversalBot(connector);
bot.library(lib1);
bot.library(lib2);
bot.dialog('/', function (session) { session.beginDialog('lib1:/'); });
bot.dialog('/test', function (session) {
assert(false);
}).triggerAction({ matches: /test/i });
lib1.dialog('/', function (session) { session.beginDialog('lib2:/'); });
lib1.dialog('/test', function (session) {
assert(false);
}).triggerAction({ matches: /test/i });
lib2.dialog('/', function (session) { session.send('step1'); });
lib2.dialog('/test', function (session) {
done();
}).triggerAction({ matches: /test/i });
bot.on('send', function (message) {
connector.processMessage('test');
});
connector.processMessage('start');
});
it('child libraries should inherit the root intents', function (done) {
var connector = new builder.ConsoleConnector();
var lib1 = new builder.Library('lib1');
var bot = new builder.UniversalBot(connector);
bot.recognizer(new builder.RegExpRecognizer('test', /test/i));
bot.library(lib1);
bot.dialog('/', function (session) { assert(false); });
lib1.dialog('/test', function (session) {
done();
}).triggerAction({ matches: 'test' });
connector.processMessage('test');
});
it('should only call the root libraries recognizer once', function (done) {
var cnt = 0;
var connector = new builder.ConsoleConnector();
var lib1 = new builder.Library('lib1');
var bot = new builder.UniversalBot(connector);
bot.recognizer({
recognize: function (context, callback) {
assert(++cnt === 1);
assert(context != null);
callback(null, { score: 1.0, intent: 'test' });
}
});
bot.library(lib1);
bot.dialog('/', function (session) { assert(false); });
lib1.dialog('/test', function (session) {
done();
}).triggerAction({ matches: 'test' });
connector.processMessage('test');
});
});