it('should set a session cookie', function(done) { config.set('api.enabled', false); config.set('sessions.enabled', true); config.set('sessions.name', 'dadiweb.sid'); // create a page var name = 'test'; var schema = help.getPageSchema(); var page = Page(name, schema); page.contentType = 'application/json'; page.template = 'session.dust'; page.route.paths[0] = '/session'; page.datasources = []; page.events = ['session']; delete page.route.constraint; startServer(page); var client = request(connectionString); client .get(page.route.paths[0]) .expect(200) .expect('content-type', page.contentType) .expect(help.shouldSetCookie('dadiweb.sid')) .end(function (err, res) { if (err) return done(err); cleanup(done); }); })
it('should use specified type when adding requestParams to the endpoint', function (done) { var name = 'test'; var schema = help.getPageSchema(); var p = page(name, schema); var dsName = 'car-makes'; var options = help.getPathOptions(); var dsSchema = help.getSchemaFromFile(options.datasourcePath, dsName); sinon.stub(datasource.Datasource.prototype, "loadDatasource").yields(null, dsSchema); // add type dsSchema.datasource.requestParams[0].type = 'Number' var params = { "make": "1337" }; var req = { params: params, url: '/1.0/cars/makes' }; var ds = datasource(p, dsName, options, function() {}); datasource.Datasource.prototype.loadDatasource.restore(); ds.processRequest(dsName, req); ds.endpoint.should.eql('http://127.0.0.1:3000/1.0/cars/makes?count=20&page=1&filter={"name":1337}&fields={"name":1,"_id":0}&sort={"name":1}'); done(); });
it('should have a session object attached to the request', function(done) { config.set('api.enabled', false); config.set('sessions.enabled', true); config.set('sessions.name', 'dadiweb.sid'); // create a page var name = 'test'; var schema = help.getPageSchema(); var page = Page(name, schema); page.contentType = 'application/json'; page.template = 'session.dust'; page.route.paths[0] = '/session'; page.datasources = []; page.events = ['session']; delete page.route.constraint; startServer(page); var client = request(connectionString); client .get(page.route.paths[0]) .expect(200) .expect('content-type', page.contentType) .end(function (err, res) { if (err) return done(err); var data = JSON.parse(JSON.stringify(res.body)); (data.session_id !== null).should.eql(true); cleanup(done); }); })
it('should return generated url for specified page path', function (done) { Server.app = api(); Server.components = {}; var name = 'test'; var schema = help.getPageSchema(); var p = page(name, schema); Server.addComponent({ key: p.key, route: p.route, component: { page: p } }, false); var tmpl = "{@url page=\"test\" make=\"bmw\" model=\"1-series\"/}"; var expected = "/car-reviews/bmw/1-series"; dust.renderSource(tmpl, { }, function (err, out) { if (err) done(err); out.should.eql(expected); done(); }); });
it('should load a domain specific config file if available', function(done) { config.set('api.enabled', false); loadConfig(config.get('server')); // create a page var name = 'test'; var schema = help.getPageSchema(); var page = Page(name, schema); page.contentType = 'application/json'; page.template = 'session.dust'; page.route.paths[0] = '/session'; page.datasources = []; page.events = ['session']; delete page.route.constraint; startServer(page); var client = request(connectionString); client .get(page.route.paths[0]) .expect(200) .expect('content-type', page.contentType) .end(function (err, res) { if (err) return done(err); config.get('app.name').should.eql('Domain Loaded Config'); cleanup(done); }); });
it('should attach null `filterEvent` when not specified', function (done) { var name = 'test'; var schema = help.getPageSchema(); var p = page(name, schema); var dsName = 'car-makes'; (datasource(p, dsName, help.getPathOptions(), function() {}).filterEvent === null).should.eql(true); done(); });
it('should attach specified `options` to datasource', function (done) { var name = 'test'; var schema = help.getPageSchema(); var p = page(name, schema); var dsName = 'car-makes'; datasource(p, dsName, help.getPathOptions(), function() {}).options.datasourcePath.should.exist; done(); });
it('should export a `loadDatasource()` function', function (done) { var name = 'test'; var schema = help.getPageSchema(); var p = page(name, schema); var dsName = 'car-makes'; datasource(p, dsName, help.getPathOptions(), function() {}).loadDatasource.should.be.Function; done(); });
it('should export function that returns an instance', function (done) { datasource.should.be.Function; var name = 'test'; var schema = help.getPageSchema(); var p = page(name, schema); var dsName = 'car-makes'; datasource(p, dsName, help.getPathOptions(), function() {}).should.be.an.instanceOf(datasource.Datasource); done(); });
it('should build an endpoint string from schema properties when no page is specified', function (done) { var name = 'test'; var schema = help.getPageSchema(); var dsName = 'car-makes'; datasource(name, dsName, help.getPathOptions(), function(err, ds) { ds.endpoint.should.eql('http://127.0.0.1:3000/1.0/cars/makes?count=20&page=1&filter={}&fields={"name":1,"_id":0}&sort={"name":1}'); done(); }); });
it('should attach `source` to datasource', function (done) { var name = 'test'; var schema = help.getPageSchema(); var p = page(name, schema); var dsName = 'car-makes'; var options = help.getPathOptions(); var ds = datasource(p, dsName, options, function() {}); ds.source.should.eql(help.getSchemaFromFile(options.datasourcePath, dsName, null).datasource.source); done(); });
it('should attach `requestParams` to datasource if specified', function (done) { var name = 'test'; var schema = help.getPageSchema(); var p = page(name, schema); var dsName = 'car-makes'; var options = help.getPathOptions(); var ds = datasource(p, dsName, options, function() {} ); ds.requestParams[0].param.should.eql("make"); done(); });
it('should use main config api settings if no port specified', function(done) { var name = 'test'; var schema = help.getPageSchema(); var dsName = 'car-makes'; config.set('api.host', 'api.example.com'); config.set('api.port', 80); var ds = datasource(name, dsName, help.getPathOptions(), function() {}); delete ds.schema.datasource.source.port; ds.buildEndpoint(ds.schema, function() {}); ds.endpoint.should.eql('http://127.0.0.1:80/1.0/cars/makes?count=20&page=1&filter={}&fields={"name":1,"_id":0}&sort={"name":1}'); done(); });
it('should attach `authStrategy` to datasource if specified', function (done) { var name = 'test'; var schema = help.getPageSchema(); var p = page(name, schema); var dsName = 'car-makes'; var options = help.getPathOptions(); var ds = datasource(p, dsName, options, function() {} ); should.exist(ds.authStrategy); ds.authStrategy.config.type.should.eql('bearer'); done(); });
it('should attach `chained` property to datasource if specified', function (done) { var name = 'test'; var schema = help.getPageSchema(); var p = page(name, schema); var dsName = 'car-makes'; var options = help.getPathOptions(); var ds = datasource(p, dsName, options, function() {} ); should.exist(ds.chained); ds.chained.datasource.should.eql('global'); done(); });
it('should load the referenced datasource file from the filesystem', function (done) { var name = 'test'; var schema = help.getPageSchema(); var p = page(name, schema); var dsName = 'car-makes'; var options = help.getPathOptions(); var dsSchema = help.getSchemaFromFile(options.datasourcePath, dsName, ''); var ds = datasource(p, dsName, options, function() {} ); ds.schema.should.eql(dsSchema); done(); });
it('should run an attached `filterEvent` before datasource loads', function(done) { var name = 'test'; var schema = testHelper.getPageSchema(); schema.datasources = ['car-makes-unchained', 'filters'] schema.events = [] var page = Page(name, schema); page.template = 'test.dust'; page.route.paths[0] = '/test'; page.settings.cache = false; startServer(page); // provide API response var apiResults = { results: [{_id: 1, title: 'books'}] } //var dataStub = sinon.stub(help.DataHelper.prototype, 'load'); // dataStub.onCall(0).returns(null, apiResults); // dataStub.onCall(1).returns(null, apiResults); sinon.stub(help.DataHelper.prototype, 'load').yields(null, apiResults); var client = request(connectionString); client .get(page.route.paths[0] + '?json=true') .expect(200) .end(function (err, res) { if (err) return done(err); cleanup(function() { help.DataHelper.prototype.load.restore(); res.body['car-makes-unchained'].should.exist; res.body['filters'].should.exist; controller.datasources['filters'].schema.datasource.filterEventResult.should.exist; controller.datasources['filters'].schema.datasource.filterEventResult.x.should.exist; controller.datasources['filters'].schema.datasource.filterEventResult.x.should.eql('1'); controller.datasources['filters'].schema.datasource.filter.x.should.exist; controller.datasources['filters'].schema.datasource.filter.x.should.eql('1'); controller.datasources['filters'].schema.datasource.filter.y.should.exist; controller.datasources['filters'].schema.datasource.filter.y.should.eql('2'); done(); }) }) })
it.skip('should pass querystring id param to the endpoint when page.passFilters is true', function (done) { var name = 'test'; var schema = help.getPageSchema(); schema.settings.passFilters = true; var p = page(name, schema); var dsName = 'car-makes'; var req = { params: {}, url: '/1.0/cars/makes?id=1234567890' }; var ds = datasource(p, dsName, help.getPathOptions(), function() {}); ds.processRequest(dsName, req); ds.endpoint.should.eql('http://127.0.0.1:3000/1.0/cars/makes?count=20&page=1&filter={"_id":"1234567890"}&fields={"name":1,"_id":0}&sort={"name":1}'); done(); });
it('should use the `skip` property when building an endpoint string', function (done) { var name = 'test'; var schema = help.getPageSchema(); var p = page(name, schema); var dsName = 'car-makes'; var req = { params: {}, url: '/1.0/cars/makes' }; var ds = datasource(p, dsName, help.getPathOptions(), function() {}); ds.schema.datasource.skip = 5; ds.processRequest(dsName, req); ds.endpoint.should.eql('http://127.0.0.1:3000/1.0/cars/makes?count=20&skip=5&page=1&filter={}&fields={"name":1,"_id":0}&sort={"name":1}'); done(); });
it('should add requestParams to the endpoint', function (done) { var name = 'test'; var schema = help.getPageSchema(); var p = page(name, schema); var dsName = 'car-makes'; var params = { "make": "bmw" }; var req = { params: params, url: '/1.0/cars/makes' }; var ds = datasource(p, dsName, help.getPathOptions(), function() {}); ds.processRequest(dsName, req); ds.endpoint.should.eql('http://127.0.0.1:3000/1.0/cars/makes?count=20&page=1&filter={"name":"bmw"}&fields={"name":1,"_id":0}&sort={"name":1}'); done(); });
it('should use https when the datasource specifies https protocol', function(done) { var host = 'http://' + config.get('api.host') + ':' + config.get('api.port') var authscope1 = nock(host).post('/token').times(4).reply(200, { accessToken: 'xx' }); var endpoint1 = '/1.0/library/categories?count=20&page=1&filter=%7B%22name%22:%22Crime%22%7D&fields=%7B%22name%22:1%7D&sort=%7B%22name%22:1%7D'; var categoriesResult1 = JSON.stringify({ results: [ { name: 'Crime' } ] }); var scope2 = nock(host).get(endpoint1).reply(200, categoriesResult1); var dsName = 'categories_no_cache'; var options = help.getPathOptions(); var dsSchema = help.getSchemaFromFile(options.datasourcePath, dsName); dsSchema.datasource.source.protocol = 'https' sinon.stub(datasource.Datasource.prototype, "loadDatasource").yields(null, dsSchema); var page1 = Page('page1', help.getPageSchema()); page1.datasources = ['categories_no_cache']; page1.template = 'test.dust'; page1.route.paths[0] = '/categories/:category'; page1.events = []; var pages = []; pages.push(page1) help.startServer(pages, function() { var spy = sinon.spy(libHelp, 'DataHelper'); var client = request(clientHost); client .get('/categories/Crime') .expect('content-type', 'text/html') .expect(200) .end(function (err, res) { if (err) return done(err); // check the args that the data loader was called with var dataHelperArgs = spy.args[0]; spy.restore(); datasource.Datasource.prototype.loadDatasource.restore() var datasourceArg = dataHelperArgs[0]; var urlArg = dataHelperArgs[1]; spy.firstCall.thisValue.options.protocol.should.eql('https:') spy.firstCall.thisValue.options.agent.protocol.should.eql('https:') done() }) }) })
function getPage() { // create a page var name = 'test'; var schema = testHelper.getPageSchema(); var page = Page(name, schema); page.contentType = 'application/json'; page.template = 'test.dust'; page.route.paths[0] = '/test'; page.settings.cache = false; page.datasources = []; page.events = []; delete page.route.constraint; return page; }
it('should attach default `chained` property to datasource if not specified', function (done) { var name = 'test'; var schema = help.getPageSchema(); var p = page(name, schema); var dsName = 'car-makes'; var options = help.getPathOptions(); var dsSchema = help.getSchemaFromFile(options.datasourcePath, dsName, 'chained'); sinon.stub(datasource.Datasource.prototype, "loadDatasource").yields(null, dsSchema); var ds = datasource(p, dsName, options, function() {} ); should.not.exist(ds.chained); datasource.Datasource.prototype.loadDatasource.restore(); done(); });
it('should pass referer header to datasource', function (done) { var name = 'test'; var schema = help.getPageSchema(); schema.settings.passFilters = true; var p = page(name, schema); var params = { "make": "bmw", "model": "i3", "page": 3 }; var req = { params: params, url: '/1.0/cars/makes', headers: {'referer': 'http://www.example.com'} }; var ds1 = datasource(p, 'car-makes', help.getPathOptions(), function() {}); ds1.processRequest('car-makes', req); ds1.endpoint.should.eql('http://127.0.0.1:3000/1.0/cars/makes?count=20&page=3&referer=' + encodeURIComponent('http://www.example.com') + '&filter={"name":"bmw"}&fields={"name":1,"_id":0}&sort={"name":1}'); done(); });
it('should attach default `requestParams` to datasource if not specified', function (done) { var name = 'test'; var schema = help.getPageSchema(); var p = page(name, schema); var dsName = 'car-makes'; var options = help.getPathOptions(); var dsSchema = help.getSchemaFromFile(options.datasourcePath, dsName, 'requestParams'); sinon.stub(datasource.Datasource.prototype, "loadDatasource").yields(null, dsSchema); var ds = datasource(p, dsName, options, function() {} ); ds.requestParams.should.eql([]); datasource.Datasource.prototype.loadDatasource.restore(); done(); });
it.skip('should pass req.params id param to the endpoint when the datasource matches the page name', function (done) { var name = 'test'; var schema = help.getPageSchema(); schema.settings.passFilters = false; var p = page(name, schema); var dsName = 'test-cars-ds'; var params = { 'id': '1234567890' }; var req = { params: params, url: '/1.0/cars/makes' }; var ds = datasource(p, dsName, help.getPathOptions(), function() {}); ds.processRequest(dsName, req); ds.endpoint.should.eql('http://127.0.0.1:3000/1.0/cars/makes?count=20&page=1&filter={"_id":"1234567890"}&fields={"name":1,"_id":0}&sort={"name":1}'); done(); });
it('should allow getting components by key', function (done) { Server.app = api(); var name = 'test'; var schema = help.getPageSchema(); var page = Page(name, schema); Server.addComponent({ key: page.key, route: page.route, component: { page: page } }, false); Server.getComponent('test').should.not.be.null; done(); });
it('should pass filter param to the endpoint', function (done) { var name = 'test'; var schema = help.getPageSchema(); schema.settings.passFilters = true; var p = page(name, schema); var dsName = 'car-makes'; var filter = JSON.stringify( { "model": "x3" } ); var params = { "make": "bmw", "page": 3 }; var req = { params: params, url: '/1.0/cars/makes?filter=' + filter }; var ds = datasource(p, dsName, help.getPathOptions(), function() {}); ds.processRequest(dsName, req); ds.endpoint.should.eql('http://127.0.0.1:3000/1.0/cars/makes?count=20&page=3&filter={"model":"x3","name":"bmw"}&fields={"name":1,"_id":0}&sort={"name":1}'); done(); });
it('should log an error if the specified datasource file can\'t be found', function (done) { var name = 'test'; var schema = help.getPageSchema(); var p = page(name, schema); var dsName = 'carzzz'; var method = sinon.spy(log, 'error'); datasource(p, dsName, help.getPathOptions(), function() {}) method.called.should.be.true; log.error.restore(); //should.throws(function() { datasource(p, dsName, help.getPathOptions(), function() {}) }, Error); done(); });
it('should not redirect if the router redirect datasource returns unmatching results', function (done) { var host = 'http://' + config.get('api.host') + ':' + config.get('api.port') config.set('rewrites.datasource', 'redirects') var scope = nock(host) .post('/token') .times(2) .reply(200, { accessToken: 'xx' }); var dsEndpoint = '/1.0/test/redirects?count=3&page=1&filter=%7B%22rule%22:%22/news/whatever?hello=world&foo=bar%22%7D&fields=%7B%7D&sort=%7B%7D'; var dsResult = JSON.stringify({ results: [ { _id: "56ec1c", source: "import", rule: "/car-reviews/alfa-romeo/4c-coupe/", replacement: "/alfa-romeo/4c/coupe/", redirectType: "301", stopProcessing: 1, apiVersion: "1.0" } ]}); var scope2 = nock(host) .get(dsEndpoint) .reply(200, dsResult); // create page 1 var page1 = Page('page1', help.getPageSchema()); page1.datasources = []; page1.template = 'test.dust'; page1.route.paths[0] = '/news/:seoUrlNews?'; page1.events = []; delete page1.route.constraint; var pages = []; pages.push(page1) help.startServer(pages, function() { var client = request(clientHost); client .get('/news/whatever?hello=world&foo=bar') .expect(200) .end(function (err, res) { if (err) return done(err); config.set('rewrites.datasource', '') done() }) }) });