'use strict'
const helper = require('./test-helper')
const { Client } = helper
var assert = require('assert')
const suite = new helper.Suite()
const test = suite.test.bind(suite)

var pguser = process.env['PGUSER'] || process.env.USER
var pgdatabase = process.env['PGDATABASE'] || process.env.USER
var pgport = process.env['PGPORT'] || 5432

test('client settings', function () {
  test('defaults', function () {
    var client = new Client()
    assert.equal(client.user, pguser)
    assert.equal(client.database, pgdatabase)
    assert.equal(client.port, pgport)
    assert.equal(client.ssl, false)
  })

  test('custom', function () {
    var user = 'brian'
    var database = 'pgjstest'
    var password = 'boom'
    var client = new Client({
      user: user,
      database: database,
      port: 321,
      password: password,
      ssl: true,
    })

    assert.equal(client.user, user)
    assert.equal(client.database, database)
    assert.equal(client.port, 321)
    assert.equal(client.password, password)
    assert.equal(client.ssl, true)
  })

  test('custom ssl default on', function () {
    var old = process.env.PGSSLMODE
    process.env.PGSSLMODE = 'prefer'

    var client = new Client()
    process.env.PGSSLMODE = old

    assert.equal(client.ssl, true)
  })

  test('custom ssl force off', function () {
    var old = process.env.PGSSLMODE
    process.env.PGSSLMODE = 'prefer'

    var client = new Client({
      ssl: false,
    })
    process.env.PGSSLMODE = old

    assert.equal(client.ssl, false)
  })
})

test('initializing from a config string', function () {
  test('uses connectionString property', function () {
    var client = new Client({
      connectionString: 'postgres://brian:pass@host1:333/databasename',
    })
    assert.equal(client.user, 'brian')
    assert.equal(client.password, 'pass')
    assert.equal(client.host, 'host1')
    assert.equal(client.port, 333)
    assert.equal(client.database, 'databasename')
  })

  test('uses the correct values from the config string', function () {
    var client = new Client('postgres://brian:pass@host1:333/databasename')
    assert.equal(client.user, 'brian')
    assert.equal(client.password, 'pass')
    assert.equal(client.host, 'host1')
    assert.equal(client.port, 333)
    assert.equal(client.database, 'databasename')
  })

  test('uses the correct values from the config string with space in password', function () {
    var client = new Client('postgres://brian:pass word@host1:333/databasename')
    assert.equal(client.user, 'brian')
    assert.equal(client.password, 'pass word')
    assert.equal(client.host, 'host1')
    assert.equal(client.port, 333)
    assert.equal(client.database, 'databasename')
  })

  test('when not including all values the defaults are used', function () {
    var client = new Client('postgres://host1')
    assert.equal(client.user, process.env['PGUSER'] || process.env.USER)
    assert.equal(client.password, process.env['PGPASSWORD'] || null)
    assert.equal(client.host, 'host1')
    assert.equal(client.port, process.env['PGPORT'] || 5432)
    assert.equal(client.database, process.env['PGDATABASE'] || process.env.USER)
  })

  test('when not including all values the environment variables are used', function () {
    var envUserDefined = process.env['PGUSER'] !== undefined
    var envPasswordDefined = process.env['PGPASSWORD'] !== undefined
    var envHostDefined = process.env['PGHOST'] !== undefined
    var envPortDefined = process.env['PGPORT'] !== undefined
    var envDBDefined = process.env['PGDATABASE'] !== undefined

    var savedEnvUser = process.env['PGUSER']
    var savedEnvPassword = process.env['PGPASSWORD']
    var savedEnvHost = process.env['PGHOST']
    var savedEnvPort = process.env['PGPORT']
    var savedEnvDB = process.env['PGDATABASE']

    process.env['PGUSER'] = 'utUser1'
    process.env['PGPASSWORD'] = 'utPass1'
    process.env['PGHOST'] = 'utHost1'
    process.env['PGPORT'] = 5464
    process.env['PGDATABASE'] = 'utDB1'

    var client = new Client('postgres://host1')
    assert.equal(client.user, process.env['PGUSER'])
    assert.equal(client.password, process.env['PGPASSWORD'])
    assert.equal(client.host, 'host1')
    assert.equal(client.port, process.env['PGPORT'])
    assert.equal(client.database, process.env['PGDATABASE'])

    if (envUserDefined) {
      process.env['PGUSER'] = savedEnvUser
    } else {
      delete process.env['PGUSER']
    }

    if (envPasswordDefined) {
      process.env['PGPASSWORD'] = savedEnvPassword
    } else {
      delete process.env['PGPASSWORD']
    }

    if (envDBDefined) {
      process.env['PGDATABASE'] = savedEnvDB
    } else {
      delete process.env['PGDATABASE']
    }

    if (envHostDefined) {
      process.env['PGHOST'] = savedEnvHost
    } else {
      delete process.env['PGHOST']
    }

    if (envPortDefined) {
      process.env['PGPORT'] = savedEnvPort
    } else {
      delete process.env['PGPORT']
    }
  })
})

test('calls connect correctly on connection', function () {
  var client = new Client('/tmp')
  var usedPort = ''
  var usedHost = ''
  client.connection.connect = function (port, host) {
    usedPort = port
    usedHost = host
  }
  client.connect()
  assert.equal(usedPort, '/tmp/.s.PGSQL.' + pgport)
  assert.strictEqual(usedHost, undefined)
})
