/*
* Test suites for WebSocket.
* ONLY TO ENSURE THE REQUEST WILL BE BYPASSED SUCCESSFULLY, WE HAVEN'T SUPPORTTED WEBSOCKET YET.
*
*/
const ProxyServerUtil = require('./util/ProxyServerUtil.js');
const { generateWsUrl, directWs, proxyWs } = require('./util/HttpUtil.js');
const Server = require('./server/server.js');
const { printLog } = require('./util/CommonUtil.js');

const wsHost = 'ws://localhost:3000/test/socket';

testWebsocket('ws');
testWebsocket('wss');

function testWebsocket(protocol) {
    describe('Test WebSocket in protocol : ' + protocol , () =>{
        const url = generateWsUrl(protocol, '/test/socket');
        let serverInstance ;
        let proxyServer ;

        beforeAll((done) => {
            jasmine.DEFAULT_TIMEOUT_INTERVAL = 200000;
            printLog('Start server for no_rule_websocket_spec');
            serverInstance = new Server();

            proxyServer = ProxyServerUtil.proxyServerWithoutHttpsIntercept();

            setTimeout(function() {
                done();
            }, 2000);
        });

        afterAll(() => {
            serverInstance && serverInstance.close();
            proxyServer && proxyServer.close();
            printLog('Closed server for no_rule_websocket_spec');
        });

        it('Default websocket option', done => {
            const sendMessage = 'Send the message with default option';
            let directMessage ; // set the flag for direct message, compare when both direct and proxy got message
            let proxyMessage;

            const ws  = directWs(url);
            const porxyWsRef = proxyWs(url);
            ws.on('open', () => {
                ws.send(sendMessage);
            });

            porxyWsRef.on('open', () => {
                porxyWsRef.send(sendMessage);
            });

            ws.on('message', (data, flag) => {
                const message = JSON.parse(data);
                if (message.type === 'onMessage') {
                    directMessage = message.content;
                    compareMessageIfReady();
                }
            });

            porxyWsRef.on('message', (data, flag) => {
                const message = JSON.parse(data);
                if (message.type === 'onMessage') {
                    proxyMessage = message.content;
                    compareMessageIfReady();
                }
            });

            ws.on('error', error => {
                console.error('error happened in direct websocket:', error);
                done.fail('Error happened in direct websocket');
            });

            porxyWsRef.on('error', error => {
                console.error('error happened in proxy websocket:', error);
                done.fail('Error happened in proxy websocket');
            });

            function compareMessageIfReady () {
                if (directMessage && proxyMessage) {
                    expect(directMessage).toEqual(proxyMessage);
                    expect(directMessage).toEqual(sendMessage);
                    done();
                }
            }
        });

        it('masked:true', done => {
            const sendMessage = 'Send the message with option masked:true';
            let directMessage ; // set the flag for direct message, compare when both direct and proxy got message
            let proxyMessage;

            const ws  = directWs(url);
            const porxyWsRef = proxyWs(url);
            ws.on('open', () => {
                ws.send(sendMessage, { masked: true });
            });

            porxyWsRef.on('open', () => {
                porxyWsRef.send(sendMessage, { masked: true });
            });

            ws.on('message', (data, flag) => {
                const message = JSON.parse(data);
                if (message.type === 'onMessage') {
                    directMessage = message.content;
                    compareMessageIfReady();
                }
            });

            porxyWsRef.on('message', (data, flag) => {
                const message = JSON.parse(data);
                if (message.type === 'onMessage') {
                    proxyMessage = message.content;
                    compareMessageIfReady();
                }
            });

            ws.on('error', error => {
                console.error('error happened in direct websocket:', error);
                done.fail('Error happened in direct websocket');
            });

            porxyWsRef.on('error', error => {
                console.error('error happened in proxy websocket:', error);

                done.fail('Error happened in proxy websocket');
            });

            function compareMessageIfReady () {
                if (directMessage && proxyMessage) {
                    expect(directMessage).toEqual(proxyMessage);
                    expect(directMessage).toEqual(sendMessage);
                    done();
                }
            }

        });
    });

}