
/*
 * Copyright 2017-present Open Networking Foundation

 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at

 * http://www.apache.org/licenses/LICENSE-2.0

 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


(function () {
  'use strict';

  const chai = require('chai');
  const expect = chai.expect;
  const sinonChai = require('sinon-chai');
  chai.use(sinonChai);
  const io = require('socket.io-client');
  const server = require('../src/server.js');
  const port = 4000;
  xdescribe('Websocket', function() {

    var client;

    beforeEach(function(done) {
      // Start our server
      server.start(port);

      // connect a client to the server
      client = io.connect(`http://localhost:${port}`, {
        query: 'name=test@xos.org&token=testToken&sessionId=testSession&id=1'
      });

      // when is connected start testing
      client.on('connect', () => {
        done();
      });
    });

    afterEach((done) => {
      // disconnect the client
      if(client.connected) {
        client.disconnect();
      }
      done();
    });

    it('should store user details for a new connection', () => {
      const clients = require('../src/controllers/clients.js');
      const user = clients.clients[0];
      expect(user.name).to.equal('test@xos.org')
    });

    it('should not store the same user twice', (done) => {

      // connect a client to the server
      const client2 = io.connect(`http://localhost:${port}`, {
        query: 'name=test@xos.org&token=testToken&sessionId=testSession&id=1'
      });

      // when is connected start testing
      client2.on('connect', () => {
        setTimeout(() => {
          const clients = require('../src/controllers/clients.js');
          expect(clients.clients.length).to.equal(1)
          done();
        }, 100);
      });

    });

    it('should remove a user on disconnect', (done) => {
      client.disconnect();
      // we need to wait for the event to be dispatched
      setTimeout(() => {
        const clients = require('../src/controllers/clients.js');
        expect(clients.clients.length).to.equal(0)
        done();
      }, 100);
    });

  });
})();