describe('TextSecureWebSocket', function() {
  var RealWebSocket = window.WebSocket;
  before(function() {
    window.WebSocket = MockSocket;
  });
  after(function() {
    window.WebSocket = RealWebSocket;
  });
  it('connects and disconnects', function(done) {
    var mockServer = new MockServer('ws://localhost:8080');
    mockServer.on('connection', function(server) {
      socket.close();
      server.close();
      done();
    });
    var socket = new TextSecureWebSocket('ws://localhost:8080');
  });

  it('sends and receives', function(done) {
    var mockServer = new MockServer('ws://localhost:8080');
    mockServer.on('connection', function(server) {
      server.on('message', function(data) {
        server.send('ack');
        server.close();
      });
    });
    var socket = new TextSecureWebSocket('ws://localhost:8080');
    socket.onmessage = function(response) {
      assert.strictEqual(response.data, 'ack');
      socket.close();
      done();
    };
    socket.send('syn');
  });

  it('exposes the socket status', function(done) {
    var mockServer = new MockServer('ws://localhost:8082');
    mockServer.on('connection', function(server) {
      assert.strictEqual(socket.getStatus(), WebSocket.OPEN);
      server.close();
      socket.close();
    });
    var socket = new TextSecureWebSocket('ws://localhost:8082');
    socket.onclose = function() {
      assert.strictEqual(socket.getStatus(), WebSocket.CLOSING);
      done();
    };
  });

  it('reconnects', function(done) {
    this.timeout(60000);
    var mockServer = new MockServer('ws://localhost:8082');
    var socket = new TextSecureWebSocket('ws://localhost:8082');
    socket.onclose = function() {
      var mockServer = new MockServer('ws://localhost:8082');
      mockServer.on('connection', function(server) {
        socket.close();
        server.close();
        done();
      });
    };
    mockServer.close();
  });
});