Skip to content

Commit

Permalink
Add Translate API samples. Fixes #176. (#184)
Browse files Browse the repository at this point in the history
* Add Translate API samples. Fixes #176.

* Fix build.

* Add comment.

* Address comments
  • Loading branch information
jmdobry authored Aug 21, 2016
0 parents commit 26f213c
Show file tree
Hide file tree
Showing 4 changed files with 443 additions and 0 deletions.
19 changes: 19 additions & 0 deletions translate/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"name": "nodejs-docs-samples-translate",
"version": "0.0.1",
"private": true,
"license": "Apache Version 2.0",
"author": "Google Inc.",
"scripts": {
"test": "mocha -R spec -t 120000 --require intelli-espower-loader ../test/_setup.js test/*.test.js",
"system-test": "mocha -R spec -t 120000 --require intelli-espower-loader ../system-test/_setup.js system-test/*.test.js"
},
"dependencies": {
"@google-cloud/translate": "^0.1.1",
"iso-639-1": "^1.2.1",
"yargs": "^5.0.0"
},
"devDependencies": {
"mocha": "^3.0.2"
}
}
66 changes: 66 additions & 0 deletions translate/system-test/translate.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// Copyright 2015-2016, Google, Inc.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

'use strict';

var program = require('../translate');
var apiKey = process.env.TRANSLATE_API_KEY;
var text = 'Hello world!';

describe('translate:translate', function () {
if (!process.env.TRANSLATE_API_KEY) {
process.stdout.write('Skipping Translate API tests...\n');
return;
}
describe('detectLanguage', function () {
it('should detect language', function (done) {
program.detectLanguage(text, apiKey, function (err, result) {
assert.ifError(err);
assert(result, 'should have received a result');
assert.equal(result.language, 'en', 'should have detected english');
assert(console.log.calledWith('Detected %s with confidence %d', 'English', result.confidence));
done();
});
});
});

describe('listLanguages', function () {
it('should list languages', function (done) {
program.listLanguages(apiKey, function (err, languages) {
assert.ifError(err);
assert(Array.isArray(languages));
assert(languages.length > 0);
assert(console.log.calledWith('Found %d language(s)!', languages.length));
done();
});
});
});

describe('translateText', function () {
it('should translate text', function (done) {
var options = {
text: text,
apiKey: apiKey,
to: 'ru'
};
var expected = 'Привет мир!';

program.translateText(options, function (err, translation) {
assert.ifError(err);
assert.equal(translation, expected);
assert(console.log.calledWith('Translated text to %s', 'Russian'));
done();
});
});
});
});
188 changes: 188 additions & 0 deletions translate/test/translate.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
// Copyright 2016, Google, Inc.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

'use strict';

var proxyquire = require('proxyquire').noCallThru();
var text = 'Hello world!';
var apiKey = 'key';

function getSample () {
var languagesMock = [
'en',
'ru'
];
var resultMock = {
language: 'en',
confidence: 0.75,
input: text
};
var translationMock = 'Привет мир!';
var translateMock = {
getLanguages: sinon.stub().callsArgWith(0, null, languagesMock),
detect: sinon.stub().callsArgWith(1, null, resultMock),
translate: sinon.stub().callsArgWith(2, null, translationMock)
};
var TranslateMock = sinon.stub().returns(translateMock);

return {
program: proxyquire('../translate', {
'@google-cloud/translate': TranslateMock,
yargs: proxyquire('yargs', {})
}),
mocks: {
Translate: TranslateMock,
translate: translateMock,
languages: languagesMock,
result: resultMock,
translation: translationMock
}
};
}

describe('translate:translate', function () {
describe('detectLanguage', function () {
it('should detect language', function () {
var sample = getSample();
var callback = sinon.stub();

sample.program.detectLanguage(text, apiKey, callback);

assert(sample.mocks.translate.detect.calledOnce, 'method called once');
assert.equal(sample.mocks.translate.detect.firstCall.args.length, 2, 'method received 2 arguments');
assert.equal(sample.mocks.translate.detect.firstCall.args[0], text, 'method received correct argument');
assert(callback.calledOnce, 'callback called once');
assert.equal(callback.firstCall.args.length, 2, 'callback received 2 arguments');
assert.ifError(callback.firstCall.args[0], 'callback did not receive error');
assert.strictEqual(callback.firstCall.args[1], sample.mocks.result, 'callback received result');
assert(console.log.calledWith('Detected %s with confidence %d', 'English', sample.mocks.result.confidence));
});

it('should handle error', function () {
var error = 'error';
var sample = getSample();
var callback = sinon.stub();
sample.mocks.translate.detect = sinon.stub().callsArgWith(1, error);

sample.program.detectLanguage(text, apiKey, callback);

assert(callback.calledOnce, 'callback called once');
assert.equal(callback.firstCall.args.length, 1, 'callback received 1 argument');
assert(callback.firstCall.args[0], 'callback received error');
assert.equal(callback.firstCall.args[0].message, error.message, 'error has correct message');
});
});

describe('listLanguages', function () {
it('should list languages', function () {
var sample = getSample();
var callback = sinon.stub();

sample.program.listLanguages(apiKey, callback);

assert(sample.mocks.translate.getLanguages.calledOnce, 'method called once');
assert.equal(sample.mocks.translate.getLanguages.firstCall.args.length, 1, 'method received 1 argument');
assert(callback.calledOnce, 'callback called once');
assert.equal(callback.firstCall.args.length, 2, 'callback received 2 arguments');
assert.ifError(callback.firstCall.args[0], 'callback did not receive error');
assert.strictEqual(callback.firstCall.args[1], sample.mocks.languages, 'callback received result');
assert(console.log.calledWith('Found %d language(s)!', sample.mocks.languages.length));
});

it('should handle error', function () {
var error = 'error';
var sample = getSample();
var callback = sinon.stub();
sample.mocks.translate.getLanguages = sinon.stub().callsArgWith(0, error);

sample.program.listLanguages(apiKey, callback);

assert(callback.calledOnce, 'callback called once');
assert.equal(callback.firstCall.args.length, 1, 'callback received 1 argument');
assert(callback.firstCall.args[0], 'callback received error');
assert.equal(callback.firstCall.args[0].message, error.message, 'error has correct message');
});
});

describe('translateText', function () {
it('should translate text', function () {
var sample = getSample();
var callback = sinon.stub();
var options = {
text: text,
to: 'ru',
apiKey: apiKey
};

sample.program.translateText(options, callback);

assert(sample.mocks.translate.translate.calledOnce, 'method called once');
assert.equal(sample.mocks.translate.translate.firstCall.args.length, 3, 'method received 3 arguments');
assert.equal(sample.mocks.translate.translate.firstCall.args[0], text, 'method received correct first argument');
assert.deepEqual(sample.mocks.translate.translate.firstCall.args[1], {
to: 'ru',
from: undefined
}, 'method received correct second argument');
assert(callback.calledOnce, 'callback called once');
assert.equal(callback.firstCall.args.length, 2, 'callback received 2 arguments');
assert.ifError(callback.firstCall.args[0], 'callback did not receive error');
assert.strictEqual(callback.firstCall.args[1], sample.mocks.translation, 'callback received result');
assert(console.log.calledWith('Translated text to %s', 'Russian'));
});

it('should handle error', function () {
var error = 'error';
var sample = getSample();
var callback = sinon.stub();
var options = {
text: text,
to: 'ru',
apiKey: apiKey
};
sample.mocks.translate.translate = sinon.stub().callsArgWith(2, error);

sample.program.translateText(options, callback);

assert(callback.calledOnce, 'callback called once');
assert.equal(callback.firstCall.args.length, 1, 'callback received 1 argument');
assert(callback.firstCall.args[0], 'callback received error');
assert.equal(callback.firstCall.args[0].message, error.message, 'error has correct message');
});
});

describe('main', function () {
it('should call detectLanguage', function () {
var program = getSample().program;

sinon.stub(program, 'detectLanguage');
program.main(['detect', text, '-k', apiKey]);
assert(program.detectLanguage.calledOnce);
});

it('should call listLanguages', function () {
var program = getSample().program;

sinon.stub(program, 'listLanguages');
program.main(['list', '-k', apiKey]);
assert(program.listLanguages.calledOnce);
});

it('should call translateText', function () {
var program = getSample().program;

sinon.stub(program, 'translateText');
program.main(['translate', text, '-k', apiKey, '-t', 'ru']);
assert(program.translateText.calledOnce);
});
});
});
Loading

0 comments on commit 26f213c

Please sign in to comment.