jsforce
Version:
Salesforce API Library for JavaScript
210 lines (192 loc) • 6.44 kB
JavaScript
/*global describe, it, before */
var testUtils = require('./helper/test-utils'),
assert = testUtils.assert;
var _ = require('underscore'),
fs = require('fs'),
stream = require('stream'),
Stream = stream.Stream,
querystring = require('querystring'),
sf = require('../lib/jsforce'),
RecordStream = require('../lib/record-stream'),
config = require('./config/salesforce');
/**
*
*/
describe("query", function() {
this.timeout(40000); // set timeout to 40 sec.
var conn = new testUtils.createConnection(config);
/**
*
*/
before(function(done) {
testUtils.establishConnection(conn, config, done);
});
/**
*
*/
describe("query accounts", function() {
it("should return records", function(done) {
var query = conn.query("SELECT Id, Name FROM Account");
query.run(function(err, result) {
if (err) { throw err; }
assert.ok(_.isNumber(result.totalSize));
}.check(done));
});
});
/**
*
*/
describe("query accounts with scanAll option", function() {
before(function(done) {
conn.sobject('Account').create({ Name: 'Deleting Account #1'}, function(err, ret) {
if (err) { return done(err); }
conn.sobject('Account').record(ret.id).destroy(done);
});
});
it("should return records", function(done) {
var query = conn.query("SELECT Id, IsDeleted, Name FROM Account WHERE IsDeleted = true");
query.run({ scanAll: true }, function(err, result) {
if (err) { throw err; }
assert.ok(_.isNumber(result.totalSize));
assert.ok(result.totalSize > 0);
}.check(done));
});
});
/**
*
*/
describe("query big table and execute queryMore", function() {
it("should fetch all records", function(done) {
var records = [];
var handleResult = function(err, res) {
if (err) { callback(err); }
records.push.apply(records, res.records);
if (res.done) {
callback(null, { result: res, records: records });
} else {
query = conn.queryMore(res.nextRecordsUrl, handleResult);
}
};
var query = conn.query("SELECT Id, Name FROM " + (config.bigTable || 'Account'), handleResult);
var callback = function(err, result) {
if (err) { throw err; }
assert.equal(result.records.length, result.result.totalSize);
}.check(done);
});
});
/**
*
*/
describe("query big tables without autoFetch", function() {
it("should scan records in one query fetch", function(done) {
var records = [];
var query = conn.query("SELECT Id, Name FROM " + (config.bigTable || 'Account'));
query.on('record', function(record, i, cnt){
records.push(record);
});
query.on('end', function() {
callback(null, { query : query, records : records });
});
query.on('error', function(err) {
callback(err);
});
query.run({ autoFetch : false });
var callback = function(err, result) {
if (err) { throw err; }
assert.ok(result.query.totalFetched === result.records.length);
assert.ok(result.query.totalSize > 2000 ?
result.query.totalFetched === 2000 :
result.query.totalFetched === result.query.totalSize
);
}.check(done);
});
});
/**
*
*/
describe("query big tables with autoFetch", function() {
it("should scan records up to maxFetch num", function(done) {
var records = [];
var query = conn.query("SELECT Id, Name FROM " + (config.bigTable || 'Account'));
query.on('record', function(record) {
records.push(record);
})
.on('error', function(err) {
callback(err);
})
.on('end', function() {
callback(null, { query : query, records : records });
})
.run({ autoFetch : true, maxFetch : 5000 });
var callback = function(err, result) {
if (err) { throw err; }
assert.ok(result.query.totalFetched === result.records.length);
assert.ok(result.query.totalSize > 5000 ?
result.query.totalFetched === 5000 :
result.query.totalFetched === result.query.totalSize
);
}.check(done);
});
});
/**
*
*/
describe("query big tables by piping randomly-waiting output record stream object", function() {
it("should scan records via stream up to maxFetch num", function(done) {
var records = [];
var query = conn.query("SELECT Id, Name FROM " + (config.bigTable || 'Account'));
var outStream = new RecordStream();
outStream.sendable = true;
outStream.send = function(record) {
records.push(record);
if (records.length % 100 === 0) {
outStream.sendable = false;
setTimeout(function() {
outStream.sendable = true;
outStream.emit('drain');
}, Math.floor(1000 * Math.random()));
}
return outStream.sendable;
};
outStream.end = function() {
callback(null, { query : query, records : records });
};
query.pipe(outStream);
query.on("error", function(err) { callback(err); });
var callback = function(err, result) {
if (err) { throw err; }
assert.ok(result.query.totalFetched === result.records.length);
assert.ok(result.query.totalSize > 5000 ?
result.query.totalFetched === 5000 :
result.query.totalFetched === result.query.totalSize
);
}.check(done);
});
});
/**
*
*/
describe("query table and convert to readable stream", function() {
it("should get CSV text", function(done) {
var query = conn.query("SELECT Id, Name FROM Account LIMIT 10");
var csvOut = new Stream();
csvOut.writable = true;
var result = '';
csvOut.write = function(data) {
result += data;
};
csvOut.end = function(data) {
result += data;
csvOut.writable = false;
callback(null, result);
};
query.stream().pipe(csvOut);
var callback = function(err, csv) {
if (err) { throw err; }
assert.ok(_.isString(csv));
var header = csv.split("\n")[0];
assert.equal(header, "Id,Name");
}.check(done);
});
});
});