Adding images vertical, some refactoring. Adding Gruntfile for jshint, jsdoc, mocha. Adding basic mocha test for sunny-day case.
This commit is contained in:
parent
8be332ad43
commit
5a8dcf8d59
4 changed files with 195 additions and 42 deletions
33
Gruntfile.js
Normal file
33
Gruntfile.js
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
module.exports = function(grunt) {
|
||||||
|
grunt.initConfig({
|
||||||
|
simplemocha: {
|
||||||
|
options: {
|
||||||
|
globals: ['should'],
|
||||||
|
timeout: 3000,
|
||||||
|
ignoreLeaks: false,
|
||||||
|
ui: 'bdd',
|
||||||
|
reporter: 'list'
|
||||||
|
},
|
||||||
|
all: { src: ['test/**/*.js'] }
|
||||||
|
},
|
||||||
|
|
||||||
|
jshint: {
|
||||||
|
all: [ 'Gruntfile.js', 'index.js', 'lib/**/*.js', 'test/**/*.js']
|
||||||
|
},
|
||||||
|
|
||||||
|
jsdoc: {
|
||||||
|
all: {
|
||||||
|
src: ['index.js', 'lib/**/*.js'],
|
||||||
|
dest: 'doc'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-jshint');
|
||||||
|
grunt.loadNpmTasks('grunt-simple-mocha');
|
||||||
|
grunt.loadNpmTasks('grunt-jsdoc');
|
||||||
|
|
||||||
|
grunt.registerTask('test', ['simplemocha:all']);
|
||||||
|
grunt.registerTask('build', ['jshint', 'test']);
|
||||||
|
grunt.registerTask('default', ['build', 'jsdoc']);
|
||||||
|
};
|
120
lib/bing.js
120
lib/bing.js
|
@ -9,7 +9,12 @@ var request = require('request'),
|
||||||
_ = require('underscore'),
|
_ = require('underscore'),
|
||||||
qs = require('querystring');
|
qs = require('querystring');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Object} options Options to all Bing calls, allows overriding of rootUri,
|
||||||
|
* accKey (Bing API key), userAgent, reqTimeout
|
||||||
|
* @returns {Bing}
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
var Bing = function( options ) {
|
var Bing = function( options ) {
|
||||||
|
|
||||||
if( !(this instanceof Bing) ) return new Bing( options );
|
if( !(this instanceof Bing) ) return new Bing( options );
|
||||||
|
@ -17,7 +22,7 @@ var Bing = function( options ) {
|
||||||
var defaults = {
|
var defaults = {
|
||||||
|
|
||||||
//Bing Search API URI
|
//Bing Search API URI
|
||||||
rootUri: "https://api.datamarket.azure.com/Bing/Search/Web",
|
rootUri: "https://api.datamarket.azure.com/Bing/Search/",
|
||||||
//TODO move the web part, to choose also Images
|
//TODO move the web part, to choose also Images
|
||||||
|
|
||||||
//Account Key
|
//Account Key
|
||||||
|
@ -31,49 +36,82 @@ var Bing = function( options ) {
|
||||||
};
|
};
|
||||||
|
|
||||||
//merge options passed in with defaults
|
//merge options passed in with defaults
|
||||||
this.options = _.extend(defaults, options)
|
this.options = _.extend(defaults, options);
|
||||||
}
|
|
||||||
|
|
||||||
|
this.searchVertical = function(query, vertical, callback, options) {
|
||||||
|
if(typeof callback != 'function') {
|
||||||
|
throw "Error: Callback function required!";
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO check if valid options
|
||||||
|
|
||||||
|
var opts = this.options;
|
||||||
|
|
||||||
|
if (options !== null) {
|
||||||
|
opts = _.extend(this.options, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
debugger;
|
||||||
|
var reqUri = opts.rootUri + vertical +
|
||||||
|
"?$format=json&" +
|
||||||
|
qs.stringify({ "Query": "'" + query + "'" });
|
||||||
|
|
||||||
|
request({
|
||||||
|
uri: reqUri,
|
||||||
|
method: opts.method || "GET",
|
||||||
|
headers: {
|
||||||
|
"User-Agent": opts.userAgent
|
||||||
|
},
|
||||||
|
auth: {
|
||||||
|
user: opts.accKey,
|
||||||
|
pass: opts.accKey
|
||||||
|
},
|
||||||
|
timeout: opts.reqTimeout
|
||||||
|
|
||||||
|
}, function(err, res, body){
|
||||||
|
|
||||||
|
// Parse body, if body
|
||||||
|
body = typeof body === 'string' ?
|
||||||
|
JSON.parse(body) :
|
||||||
|
body;
|
||||||
|
|
||||||
|
callback(err, res, body);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @callback requestCallback
|
||||||
|
* @param {String} error Error evaluates to true when an error has occurred.
|
||||||
|
* @param {Object} response Response object from the Bing call.
|
||||||
|
* @param {Object} body JSON of the response.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs a Bing search in the Web vertical.
|
||||||
|
*
|
||||||
|
* @param {String} query Query term to search for.
|
||||||
|
* @param {requestCallback} callback Callback called with (potentially json-parsed) response.
|
||||||
|
* @param {Object} options Options to command, allows overriding of rootUri,
|
||||||
|
* accKey (Bing API key), userAgent, reqTimeout
|
||||||
|
* @function
|
||||||
|
*/
|
||||||
Bing.prototype.search = function(query, callback, options) {
|
Bing.prototype.search = function(query, callback, options) {
|
||||||
|
this.searchVertical(query, "Web", callback, options);
|
||||||
|
};
|
||||||
|
|
||||||
if(typeof callback != 'function') {
|
/**
|
||||||
throw "Error: Callback function required!";
|
* Performs a Bing search in the Images vertical.
|
||||||
}
|
*
|
||||||
|
* @param {String} query Query term to search for.
|
||||||
// TODO check if valid options
|
* @param {requestCallback} callback Callback called with (potentially json-parsed) response.
|
||||||
|
* @param {Object} options Options to command, allows overriding of rootUri,
|
||||||
var opts = this.options;
|
* accKey (Bing API key), userAgent, reqTimeout
|
||||||
|
* @function
|
||||||
if(options != null) {
|
*/
|
||||||
opts = _.extend(this.options, options)
|
Bing.prototype.images = function(query, callback, options) {
|
||||||
}
|
this.searchVertical(query, "Image", callback, options);
|
||||||
|
|
||||||
var reqUri = opts.rootUri
|
|
||||||
+ "?$format=json&"
|
|
||||||
+ qs.stringify({ "Query": "'" + query + "'" })
|
|
||||||
|
|
||||||
request({
|
|
||||||
uri: reqUri,
|
|
||||||
method: opts.method || "GET",
|
|
||||||
headers: {
|
|
||||||
"User-Agent": opts.userAgent
|
|
||||||
},
|
|
||||||
auth: {
|
|
||||||
user: opts.accKey,
|
|
||||||
pass: opts.accKey
|
|
||||||
},
|
|
||||||
timeout: opts.reqTimeout
|
|
||||||
|
|
||||||
}, function(err, res, body){
|
|
||||||
|
|
||||||
// Parse body, if body
|
|
||||||
body = typeof body === 'string'
|
|
||||||
? JSON.parse(body)
|
|
||||||
: body;
|
|
||||||
|
|
||||||
callback(err, res, body);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = Bing;
|
module.exports = Bing;
|
||||||
|
|
11
package.json
11
package.json
|
@ -5,7 +5,7 @@
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"author": "Mr. Goferito",
|
"author": "Mr. Goferito",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository" : {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/goferito/node-bing-api"
|
"url": "https://github.com/goferito/node-bing-api"
|
||||||
},
|
},
|
||||||
|
@ -15,5 +15,14 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"request": "^2.44.0",
|
"request": "^2.44.0",
|
||||||
"underscore": "^1.6.0"
|
"underscore": "^1.6.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"express": "^4.9.5",
|
||||||
|
"grunt": "^0.4.5",
|
||||||
|
"grunt-contrib-jshint": "^0.10.0",
|
||||||
|
"grunt-jsdoc": "^0.5.7",
|
||||||
|
"grunt-simple-mocha": "^0.4.0",
|
||||||
|
"mocha": "^1.21.4",
|
||||||
|
"should": "^4.0.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
73
test/test.js
Normal file
73
test/test.js
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
var validWebResponse = {
|
||||||
|
"d": {
|
||||||
|
"results": [
|
||||||
|
{
|
||||||
|
"__metadata": {
|
||||||
|
"uri": "https://api.datamarket.azure.com/Data.ashx/Bing/Search/Web?Query='xbox'&$skip=0&$top=1",
|
||||||
|
"type": "WebResult"
|
||||||
|
},
|
||||||
|
"ID": "26888c2a-d245-47dc-87de-dc3551249de7",
|
||||||
|
"Title": "Xbox | Games and Entertainment on All Your Devices",
|
||||||
|
"Description": "Experience the new generation of games and entertainment with Xbox. Play Xbox games and stream video on all your devices.",
|
||||||
|
"DisplayUrl": "www.xbox.com",
|
||||||
|
"Url": "http://www.xbox.com/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__metadata": {
|
||||||
|
"uri": "https://api.datamarket.azure.com/Data.ashx/Bing/Search/Web?Query='xbox'&$skip=1&$top=1",
|
||||||
|
"type": "WebResult"
|
||||||
|
},
|
||||||
|
"ID": "ff23e110-31c2-44f9-be21-f213bcd4c654",
|
||||||
|
"Title": "Amazon.com: Xbox - More Systems: Video Games: Games ...",
|
||||||
|
"Description": "Online shopping for Video Games from a great selection of Games, Hardware, Computer And Console Video Game Products & more at everyday low prices.",
|
||||||
|
"DisplayUrl": "www.amazon.com/Xbox-Games/b?ie=UTF8&node=537504",
|
||||||
|
"Url": "http://www.amazon.com/Xbox-Games/b?ie=UTF8&node=537504"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"__next": "https://api.datamarket.azure.com/Data.ashx/Bing/Search/Web?Query='xbox'&$skip=2"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var should = require('should'),
|
||||||
|
express = require('express'),
|
||||||
|
http = require('http'),
|
||||||
|
request = require('request'),
|
||||||
|
bing = require('../lib/bing');
|
||||||
|
|
||||||
|
describe('Bing', function() {
|
||||||
|
var server;
|
||||||
|
var app;
|
||||||
|
var port = 4321;
|
||||||
|
|
||||||
|
before(function (done) {
|
||||||
|
app = express();
|
||||||
|
server = http.createServer(app);
|
||||||
|
server.listen.apply(server, [port,
|
||||||
|
function(err, result) {
|
||||||
|
if (err) {
|
||||||
|
done(err);
|
||||||
|
} else {
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
});
|
||||||
|
|
||||||
|
after(function (done) {
|
||||||
|
server.close();
|
||||||
|
app = null;
|
||||||
|
server = null;
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should cope with valid responses', function(done) {
|
||||||
|
app.get('/hello/Web', function (req, res) {
|
||||||
|
res.status(200).send(JSON.stringify(validWebResponse));
|
||||||
|
});
|
||||||
|
var bingClient = bing({ rootUri: 'http://localhost:'+port+'/hello/', accKey: '123' });
|
||||||
|
bingClient.search('xbox', function (error, response, body) {
|
||||||
|
response.statusCode.should.eql(200);
|
||||||
|
body.should.eql(validWebResponse);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
Loading…
Add table
Add a link
Reference in a new issue