/* eslint-env mocha */
'use strict'

const expect = require('chai').expect
const multiaddr = require('multiaddr')
const pull = require('pull-stream')
const goodbye = require('pull-goodbye')

const WS = require('../src')

describe('libp2p-websockets', () => {
  const ma = multiaddr('/ip4/127.0.0.1/tcp/9090/ws')
  let ws
  let conn

  beforeEach((done) => {
    ws = new WS()
    expect(ws).to.exist
    conn = ws.dial(ma, done)
  })

  it('echo', (done) => {
    const message = 'Hello World!'

    const s = goodbye({
      source: pull.values([message]),
      sink: pull.collect((err, results) => {
        expect(err).to.not.exist
        expect(results).to.be.eql([message])
        done()
      })
    })

    pull(s, conn, s)
  })

  describe('stress', () => {
    it('one big write', (done) => {
      const rawMessage = new Buffer(1000000).fill('a')

      const s = goodbye({
        source: pull.values([rawMessage]),
        sink: pull.collect((err, results) => {
          expect(err).to.not.exist
          expect(results).to.be.eql([rawMessage])
          done()
        })
      })
      pull(s, conn, s)
    })

    it('many writes', (done) => {
      const s = goodbye({
        source: pull(
          pull.infinite(),
          pull.take(1000),
          pull.map((val) => Buffer(val.toString()))
        ),
        sink: pull.collect((err, result) => {
          expect(err).to.not.exist
          expect(result).to.have.length(1000)
          done()
        })
      })

      pull(s, conn, s)
    })
  })
})