diff --git a/test/integration/client/copy-tests.js b/test/integration/client/copy-tests.js new file mode 100644 index 00000000..b806a65c --- /dev/null +++ b/test/integration/client/copy-tests.js @@ -0,0 +1,61 @@ +var helper = require(__dirname + '/../test-helper'); +var pg = require(__dirname + '/../../../lib'); +if(helper.args.native) { + pg = require(__dirname + '/../../../lib').native; +} +var ROWS_TO_INSERT = 1000; +var prepareTable = function (client, callback) { + client.query( + 'CREATE TEMP TABLE copy_test (id SERIAL, name CHARACTER VARYING(10), age INT)', + assert.calls(function (err, result) { + assert.equal(err, null, "create table query should not fail"); + callback(); + }) + ); +}; +test('COPY FROM', function () { + pg.connect(helper.config, function (error, client) { + assert.equal(error, null, "Failed to connect: " + helper.sys.inspect(error)); + prepareTable(client, function () { + var stream = client.copyFrom("COPY copy_test (name, age) FROM stdin WITH CSV"); + stream.on('error', function (error) { + assert.ok(false, "COPY FROM stream should not emit errors" + helper.sys.inspect(error)); + }); + for (var i = 0; i < ROWS_TO_INSERT; i++) { + stream.write( String(Date.now() + Math.random()).slice(0,10) + ',' + i + '\n'); + } + assert.emits(stream, 'close', function () { + client.query("SELECT count(*), sum(age) from copy_test", function (err, result) { + assert.equal(err, null, "Query should not fail"); + assert.lengthIs(result.rows, 1) + assert.equal(result.rows[0].sum, ROWS_TO_INSERT * (0 + ROWS_TO_INSERT -1)/2); + assert.equal(result.rows[0].count, ROWS_TO_INSERT); + pg.end(helper.config); + }); + }, "COPY FROM stream should emit close after query end"); + stream.end(); + }); + }); +}); +test('COPY TO', function () { + pg.connect(helper.config, function (error, client) { + assert.equal(error, null, "Failed to connect: " + helper.sys.inspect(error)); + prepareTable(client, function () { + var stream = client.copyTo("COPY person (id, name, age) TO stdin WITH CSV"); + var buf = new Buffer(0); + stream.on('error', function (error) { + assert.ok(false, "COPY TO stream should not emit errors" + helper.sys.inspect(error)); + }); + assert.emits(stream, 'data', function (chunk) { + buf = Buffer.concat([buf, chunk]); + }, "COPY IN stream should emit data event for each row"); + assert.emits(stream, 'end', function () { + var lines = buf.toString().split('\n'); + assert.equal(lines.length >= 0, true, "copy in should return rows saved by copy from"); + assert.equal(lines[0].split(',').length, 3, "each line should consists of 3 fields"); + pg.end(helper.config); + }, "COPY IN stream should emit end event after all rows"); + }); + }); +}); +