var helper = require(__dirname + '/test-helper');

var client = helper.client();
var con = client.connection;
var parseArg = null;
con.parse = function(arg) {
  parseArg = arg;
  process.nextTick(function() {
    con.emit('parseComplete');
  });
};

var bindArg = null;
con.bind = function(arg) {
  bindArg = arg;
  process.nextTick(function(){
    con.emit('bindComplete');
  });
};

var executeArg = null;
con.execute = function(arg) {
  executeArg = arg;
  process.nextTick(function() {
    con.emit('rowData',{ fields: [] });
    con.emit('commandComplete', { text: "" });
  });
};

var describeArg = null;
con.describe = function(arg) {
  describeArg = arg;
  process.nextTick(function() {
    con.emit('rowDescription', { fields: [] });
  });
};

var syncCalled = false;
con.flush = function() {
};
con.sync = function() {
  syncCalled = true;
  process.nextTick(function() {
    con.emit('readyForQuery');
  });
};

test('bound command', function() {
  test('simple, unnamed bound command', function() {
    assert.ok(client.connection.emit('readyForQuery'));

    var query = client.query({
      text: 'select * where name = $1',
      values: ['hi']
    });

    assert.emits(query,'end', function() {
      test('parse argument', function() {
        assert.equal(parseArg.name, null);
        assert.equal(parseArg.text, 'select * where name = $1');
        assert.equal(parseArg.types, null);
      });

      test('bind argument', function() {
        assert.equal(bindArg.statement, null);
        assert.equal(bindArg.portal, null);
        assert.lengthIs(bindArg.values, 1);
        assert.equal(bindArg.values[0], 'hi')
      });

      test('describe argument', function() {
        assert.equal(describeArg.type, 'P');
        assert.equal(describeArg.name, "");
      });

      test('execute argument', function() {
        assert.equal(executeArg.portal, null);
        assert.equal(executeArg.rows, null);
      });

      test('sync called', function() {
        assert.ok(syncCalled);
      });
    });
  });
});
