var async = require('async');
var helper = require('../test-helper');

var db = helper.client();

function createTableFoo(callback){
    db.query("create temp table foo(column1 int, column2 int)", callback);
}

function createTableBar(callback){
    db.query("create temp table bar(column1 text, column2 text)", callback);
}

function insertDataFoo(callback){
    db.query({
        name: 'insertFoo',
        text: 'insert into foo values($1,$2)',
        values:['one','two']
    }, callback );
}

function insertDataBar(callback){
    db.query({
        name: 'insertBar',
        text: 'insert into bar values($1,$2)',
        values:['one','two']
    }, callback );
}

function startTransaction(callback) {
    db.query('BEGIN', callback);
}
function endTransaction(callback) {
    db.query('COMMIT', callback);
}

function doTransaction(callback) {
    // The transaction runs startTransaction, then all queries, then endTransaction,
    // no matter if there has been an error in a query in the middle.
    startTransaction(function() {
        insertDataFoo(function() {
            insertDataBar(function() {
                endTransaction( callback );
            });
        });
    });
}

var steps = [
  createTableFoo,
  createTableBar,
  doTransaction,
  insertDataBar
]

test('test if query fails', function() {
  async.series(steps, assert.success(function() {
    db.end()
  }))
})

test('test if prepare works but bind fails', function() {
  var client = helper.client();
  var q = {
    text: 'SELECT $1::int as name',
    values: ['brian'],
    name: 'test'
  };
  client.query(q, assert.calls(function(err, res) {
    q.values = [1];
    client.query(q, assert.calls(function(err, res) {
      assert.ifError(err);
      client.end();
    }));
  }));
});