const test = require('brittle')
const fs = require('bare-fs')
const ws = require('.')

const options = {
  cert: fs.readFileSync('test/fixtures/cert.crt'),
  key: fs.readFileSync('test/fixtures/cert.key')
}

test('basic', async (t) => {
  t.plan(3)

  const server = new ws.Server({ port: 8080 })

  server.on('connection', (ws) => {
    ws.on('data', (data) => {
      t.alike(data, Buffer.from('hello'))

      ws.end()
    }).on('close', () => {
      server.close(() => {
        t.pass('server closed')
      })
    })
  })

  server.on('listening', () => {
    t.pass('listening')

    const client = new ws.Socket({ port: 8080 })

    client.end('hello')
  })
})

test('secure', async (t) => {
  t.plan(3)

  const server = new ws.Server({ port: 8080, secure: true, ...options })

  server.on('connection', (ws) => {
    ws.on('data', (data) => {
      t.alike(data, Buffer.from('hello'))

      ws.end()
    }).on('close', () => {
      server.close(() => {
        t.pass('server closed')
      })
    })
  })

  server.on('listening', () => {
    t.pass('listening')

    const client = new ws.Socket({ port: 8080, secure: true })

    client.end('hello')
  })
})

test('ping pong', async (t) => {
  t.plan(4)

  const server = new ws.Server({ port: 8080 })

  server.on('connection', (ws) => {
    ws.on('ping', (data) => {
      t.alike(data, Buffer.from('hello'), 'received ping')

      ws.end()
    }).on('close', () => {
      server.close(() => {
        t.pass('server closed')
      })
    })
  })

  server.on('listening', () => {
    t.pass('listening')

    const client = new ws.Socket({ port: 8080 })

    client
      .on('pong', (data) =>
        t.alike(data, Buffer.from('hello'), 'received pong')
      )
      .on('open', () => client.ping('hello'))
  })
})

test('connection refused', (t) => {
  t.plan(1)

  const client = new ws.Socket({ port: 8080 })

  client.on('error', (err) => t.ok(err))
})