type2docfx
Version:
A tool to convert json format output from TypeDoc to universal reference model for DocFx to consume.
289 lines (234 loc) • 11.3 kB
JavaScript
const assert = require('assert');
const { TestAdapter, TurnContext } = require('botbuilder');
const { LanguageTranslator } = require('../');
const translatorKey = process.env.TRANSLATORKEY;
class TestContext extends TurnContext {
constructor(request) {
super(new TestAdapter(), request);
this.sent = undefined;
this.onSendActivities((context, activities, next) => {
this.sent = activities;
});
}
}
describe('LanguageTranslator', function () {
this.timeout(10000);
if (!translatorKey)
{
console.warn('WARNING: skipping LanguageTranslator test suite because TRANSLATORKEY environment letiable is not defined');
return;
}
it('should translate en to fr and support html tags in sentences', function (done) {
let toFrenchSettings = {
translatorKey: translatorKey,
nativeLanguages: ['fr', 'de'],
}
const testAdapter = new TestAdapter(c => c.sendActivity(c.activity.text))
.use(new LanguageTranslator(toFrenchSettings))
.test('greetings>', 'salutations >', 'should have received french')
.then(() => done());
});
it('should handle punctuations', function (done) {
let toFrenchSettings = {
translatorKey: translatorKey,
nativeLanguages: ['fr', 'de'],
}
const testAdapter = new TestAdapter(c => c.sendActivity(c.activity.text))
.use(new LanguageTranslator(toFrenchSettings))
.test('0: You said "hello"', '0 : vous avez dit " Bonjour "', 'should have received french')
.then(() => done());
});
it('should not translate when a native language', function (done) {
let toEnglishSettings = {
translatorKey: translatorKey,
nativeLanguages: ['fr', 'de', 'en'],
getUserLanguage: c => 'fr',
setUserLanguage: c => Promise.resolve(false)
}
const testAdapter = new TestAdapter(c => c.sendActivity(c.activity.text))
.use(new LanguageTranslator(toEnglishSettings))
.test('greetings', 'greetings', 'should have received english')
.then(() => done());
});
it('should not translate no translate texts and numbers', function (done) {
let noTranslateSettings = {
translatorKey: translatorKey,
nativeLanguages: ['en', 'de'],
noTranslatePatterns: { 'fr': ['Bonjour (Jean mon ami)'] },
getUserLanguage: c => 'fr',
setUserLanguage: c => Promise.resolve(false)
}
const testAdapter = new TestAdapter(c => c.sendActivity(c.activity.text))
.use(new LanguageTranslator(noTranslateSettings))
.test('Bonjour Jean mon ami 2018', 'Hello Jean mon ami 2018', 'should have received no translate patterns')
.then(() => done())
});
it('should support changing language', function (done) {
let userLang = 'en';
let changeLanguageSettings = {
translatorKey: translatorKey,
nativeLanguages: ['en'],
getUserLanguage: c => userLang,
setUserLanguage: c => {
if (c.activity.text == 'I would like to speak french') {
userLang = 'fr';
return Promise.resolve(true);
}
return Promise.resolve(false);
}
}
const testAdapter = new TestAdapter(c => assert.equal(userLang, 'fr', 'should have changed language letiable to fr'))
.use(new LanguageTranslator(changeLanguageSettings))
.send('I would like to speak french')
.then(() => done());
});
it('should handle empty messages', function (done) {
let emptyMessageSettings = {
translatorKey: translatorKey,
nativeLanguages: ['fr', 'de'],
noTranslatePatterns: { 'en': ['(HI)', '(BYE)'] }
}
const testAdapter = new TestAdapter(c => c.sendActivity(c.activity.text))
.use(new LanguageTranslator(emptyMessageSettings))
.test('\n\n', '', 'should have received an empty message')
.then(() => done());
});
it('should handle wrong api keys', function (done) {
let emptyMessageSettings = {
translatorKey: 'N/A',
nativeLanguages: ['fr', 'de'],
}
const testAdapter = new TestAdapter(c => c.sendActivity(c.activity.text))
.use(new LanguageTranslator(emptyMessageSettings))
.send('Hello')
.catch(error => done());
});
it('should translate multiple sentences', function (done) {
let toFrenchSettings = {
translatorKey: translatorKey,
nativeLanguages: ['fr', 'de'],
}
const testAdapter = new TestAdapter(c => c.sendActivity(c.activity.text))
.use(new LanguageTranslator(toFrenchSettings))
.test('Greetings\nHello', 'Salutations\nSalut', 'should have received french')
.then(() => done());
});
it('should bypass calling service in middleware for non-message activities.', function (done) {
let intercepted = true;
let toEnglishSettings = {
translatorKey: translatorKey,
nativeLanguages: ['en', 'de'],
}
const context = new TestContext({ text: 'bonjour', type: 'foo' });
const translator = new LanguageTranslator(toEnglishSettings)
.onTurn(context, () => {
intercepted = false;
Promise.resolve();
})
.then(() => {
assert(!intercepted, 'intercepted');
done();
});
});
it('should handle no translate texts with no groups', function (done) {
let noTranslateSettings = {
translatorKey: translatorKey,
nativeLanguages: ['en', 'de'],
noTranslatePatterns: { 'fr':['Jean mon ami'] },
getUserLanguage: c => 'fr',
setUserLanguage: c => Promise.resolve(false)
}
const testAdapter = new TestAdapter(c => c.sendActivity(c.activity.text))
.use(new LanguageTranslator(noTranslateSettings))
.test('Bonjour Jean mon ami', 'Hello Jean mon ami', 'should have received no translate patterns')
.then(() => done())
});
it('should handle special cases in no translates - 1', function (done) {
let noTranslateSettings = {
translatorKey: translatorKey,
nativeLanguages: ['en'],
noTranslatePatterns: { 'es': ['perr[oa]', 'Hi'] },
getUserLanguage: c => 'es',
setUserLanguage: c => Promise.resolve(false)
}
const testAdapter = new TestAdapter(c => c.sendActivity(c.activity.text))
.use(new LanguageTranslator(noTranslateSettings))
.test('mi perro se llama Enzo', "My perro's name is Enzo", 'should have received no translate patterns')
.then(() => done())
});
it('should handle special cases in no translates - 2', function (done) {
let noTranslateSettings = {
translatorKey: translatorKey,
nativeLanguages: ['en'],
noTranslatePatterns: { 'fr': ['mon nom est (.+)'] },
getUserLanguage: c => 'fr',
setUserLanguage: c => Promise.resolve(false)
}
const testAdapter = new TestAdapter(c => c.sendActivity(c.activity.text))
.use(new LanguageTranslator(noTranslateSettings))
.test("mon nom est l'etat", "My name is l'etat", 'should have received no translate patterns')
.then(() => done())
});
it('should translate back to user language', function (done) {
let translateBackSettings = {
translatorKey: translatorKey,
nativeLanguages: ['en'],
getUserLanguage: () => 'fr',
translateBackToUserLanguage: true
}
const testAdapter = new TestAdapter(c => c.sendActivity(c.activity.text))
.use(new LanguageTranslator(translateBackSettings))
.test('bonjour', 'Salut', 'should have received french')
.then(() => done());
});
it('should not translate back to user language for non-message activites', function (done) {
let translateBackSettings = {
translatorKey: translatorKey,
nativeLanguages: ['en'],
getUserLanguage: () => 'fr',
translateBackToUserLanguage: true
}
const context = new TestContext({ text: 'hello', type: 'foo' });
const testAdapter = new TestAdapter(c => c.sendActivity(context.activity))
.use(new LanguageTranslator(translateBackSettings))
.test('foo', context.activity, 'should have received hello with no translation')
.then(() => done());
});
it('should handle long sentences', function (done) {
let toFrenchSettings = {
translatorKey: translatorKey,
nativeLanguages: ['fr', 'de'],
wordDictionary: { 'first': 'enregistreuse' }
}
let message = 'Prior to your first visit, preferably starting in the morning '
+ 'to fully benefit from your day, remember to write your name, first name and '
+ 'the current date (without overwriting and crossing out) on the back of your '
+ 'pass in order to activate it consecutively for 2, 4, or 6 days. '
+ 'Presenting your pass at the entrance of monuments and museums grants you '
+ 'FREE access with no waiting time at the cash register.';
let translatedMessage = "Avant votre première visite, "
+ "de préférence à partir du matin pour profiter pleinement de votre journée, "
+ "n'oubliez pas d'écrire votre nom, prénom et la date actuelle "
+ "(sans écraser et de passage) sur le dos de votre laissez-passer "
+ "afin de l'activer consécutivement pour 2 , 4 ou 6 jours. "
+ "La présentation de votre laissez-passer à l'entrée des monuments et des musées "
+ "vous accorde un accès gratuit sans temps d'attente à la caisse enregistreuse";
const testAdapter = new TestAdapter(c => c.sendActivity(c.activity.text))
.use(new LanguageTranslator(toFrenchSettings))
.test(message, translatedMessage, 'should have received french')
.then(() => done());
});
it('should use dictionary', function (done) {
let dictionarySettings = {
translatorKey: translatorKey,
nativeLanguages: ['fr', 'de'],
wordDictionary: { 'Mahmoud': 'John', 'Mohamed': 'Harvey' },
getUserLanguage: c => 'en',
setUserLanguage: c => Promise.resolve(false)
}
const testAdapter = new TestAdapter(c => c.sendActivity(c.activity.text))
.use(new LanguageTranslator(dictionarySettings))
.test('I am Mahmoud', 'Je suis John', 'should have translated word')
.then(() => done())
});
})