
var fs = require('fs'),
    path = require('path'),
    should = require('should');
var Client = require('../../lib/db/client'),
    schema = require('../../lib/db/schema');


describe('schema (db)', function () {
    var client = null;
    before(function (done) {
        var options = {database: 'express-admin-simple', user:'liolio', password:'karamba'};
        client = new Client({mysql:true});
        client.connect(options, done);
    });

    it('get table names', function (done) {
        schema.getTables(client, 'tables', function (err, tables) {
            if (err) return done(err);
            tables.join().should.equal(
                'item,property,purchase,recipe,recipe_ref,recipe_type,subtype,type,user');
            done();
        });
    });
    it('get table columns info', function (done) {
        schema.getTables(client, 'tables', function (err, tables) {
            if (err) return done(err);
            schema.getColumns(client, tables[0], function (err, info) {
                if (err) return done(err);
                var columns = Object.keys(info);
                columns.join().should.equal('id,name,notes');
                // may test column properties too
                done();
            });
        });
    });
    it('get schema columns info', function (done) {
        schema.getData(client, function (err, columns) {
            if (err) return done(err);
            var tables = Object.keys(columns);
            tables.join().should.equal(
                'item,property,purchase,recipe,recipe_ref,recipe_type,subtype,type,user');
            done();
        });
    });
});

describe.skip('schema mysql|pg', function () {
    function getColumnsInfo (dbType, cb) {
        var config = {};
        config[dbType] = {database:'express-admin-types', user:'liolio', password:'karamba'};
        db.connect(config, function (err) {
            if (err) return cb(err);
            var schema = new Schema(db);
            schema.getAllColumns(cb);
        });
    }
    it('generate correct settings', function (done) {
        getColumnsInfo('mysql', function (err, mysql) {
            if (err) return done(err);
            getColumnsInfo('pg', function (err, pg) {
                if (err) return done(err);

                // pk
                mysql.datatypes.int.key.should.equal('pri');
                mysql.datatypes.int.key.should.equal(pg.datatypes.int.key);
                // allow null
                mysql.datatypes.int.allowNull.should.equal(false);
                mysql.datatypes.int.allowNull.should.equal(pg.datatypes.int.allowNull);

should.deepEqual(pg.datatypes, { 
    boolean: { type: 'boolean', allowNull: true, key: '', defaultValue: null },
    smallint: { type: 'smallint', allowNull: true, key: '', defaultValue: null },
    int: { type: 'integer', allowNull: false, key: 'pri',defaultValue: null },
    integer: { type: 'integer', allowNull: true, key: '', defaultValue: null },
    bigint: { type: 'bigint', allowNull: true, key: '', defaultValue: null },
    real: { type: 'real', allowNull: true, key: '', defaultValue: null },
    float: { type: 'double', allowNull: true, key: '', defaultValue: null },
    'float(3)': { type: 'real', allowNull: true, key: '', defaultValue: null },
    double: { type: 'double', allowNull: true, key: '', defaultValue: null },
    decimal: { type: 'decimal', allowNull: true, key: '', defaultValue: null },
    'decimal(6)': { type: 'decimal(6,0)', allowNull: true, key: '', defaultValue: null },
    'decimal(6,2)': { type: 'decimal(6,2)', allowNull: true, key: '', defaultValue: null },
    numeric: { type: 'decimal', allowNull: true, key: '', defaultValue: null },
    'numeric(20)': { type: 'decimal(20,0)', allowNull: true, key: '', defaultValue: null },
    'numeric(20,5)': { type: 'decimal(20,5)', allowNull: true, key: '', defaultValue: null },
    date: { type: 'date', allowNull: true, key: '', defaultValue: null },
    time: { type: 'time', allowNull: true, key: '', defaultValue: null },
    timestamp: { type: 'timestamp', allowNull: true, key: '', defaultValue: null },
    bit: { type: 'bit(1)', allowNull: true, key: '', defaultValue: null },
    char: { type: 'char(1)', allowNull: true, key: '', defaultValue: null },
    'varchar(45)': { type: 'varchar(45)', allowNull: true, key: '', defaultValue: null },
    text: { type: 'text', allowNull: true, key: '', defaultValue: null }
});

                done();
            });
        });
    });
});
