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'),
|
||||
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 ) {
|
||||
|
||||
if( !(this instanceof Bing) ) return new Bing( options );
|
||||
|
@ -17,7 +22,7 @@ var Bing = function( options ) {
|
|||
var defaults = {
|
||||
|
||||
//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
|
||||
|
||||
//Account Key
|
||||
|
@ -31,49 +36,82 @@ var Bing = function( options ) {
|
|||
};
|
||||
|
||||
//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) {
|
||||
this.searchVertical(query, "Web", 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)
|
||||
}
|
||||
|
||||
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);
|
||||
});
|
||||
/**
|
||||
* Performs a Bing search in the Images 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.images = function(query, callback, options) {
|
||||
this.searchVertical(query, "Image", callback, options);
|
||||
};
|
||||
|
||||
module.exports = Bing;
|
||||
|
|
11
package.json
11
package.json
|
@ -5,7 +5,7 @@
|
|||
"main": "index.js",
|
||||
"author": "Mr. Goferito",
|
||||
"license": "MIT",
|
||||
"repository" : {
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/goferito/node-bing-api"
|
||||
},
|
||||
|
@ -15,5 +15,14 @@
|
|||
"dependencies": {
|
||||
"request": "^2.44.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