/**
 * Quick Connect Parser Tests
 * Uses Node.js built-in test function (node:test)
 */

const { test, describe } = require('node:test')
const assert = require('node:assert')
const {
  parseQuickConnect,
  getDefaultPort,
  getSupportedProtocols,
  SUPPORTED_PROTOCOLS,
  DEFAULT_PORTS
} = require('../../src/app/common/parse-quick-connect')

describe('parseQuickConnect', function () {
  // Test null/undefined/empty input
  test('should return null for null input', () => {
    assert.strictEqual(parseQuickConnect(null), null)
  })

  test('should return null for undefined input', () => {
    assert.strictEqual(parseQuickConnect(undefined), null)
  })

  test('should return null for empty string', () => {
    assert.strictEqual(parseQuickConnect(''), null)
  })

  test('should return null for whitespace only', () => {
    assert.strictEqual(parseQuickConnect('   '), null)
  })

  // Test SSH protocol
  test('should parse ssh://user@host', () => {
    const result = parseQuickConnect('ssh://user@192.168.1.100')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.username, 'user')
    assert.strictEqual(result.password, undefined)
  })

  test('should parse ssh://user:password@host', () => {
    const result = parseQuickConnect('ssh://user:password@192.168.1.100:22')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.username, 'user')
    assert.strictEqual(result.password, 'password')
    assert.strictEqual(result.port, 22)
  })

  test('should parse ssh://host (without username)', () => {
    const result = parseQuickConnect('ssh://192.168.1.100')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.username, undefined)
  })

  test('should parse ssh://host:port', () => {
    const result = parseQuickConnect('ssh://192.168.1.100:2222')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.port, 2222)
  })

  // Test SSH shortcut format
  test('should parse user@host (shortcut)', () => {
    const result = parseQuickConnect('user@192.168.1.100')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.username, 'user')
  })

  test('should parse user@host:port (shortcut)', () => {
    const result = parseQuickConnect('user@192.168.1.100:2222')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.username, 'user')
    assert.strictEqual(result.port, 2222)
  })

  test('should parse host (shortcut)', () => {
    const result = parseQuickConnect('192.168.1.100')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
  })

  test('should parse host:port (shortcut)', () => {
    const result = parseQuickConnect('192.168.1.100:2222')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.port, 2222)
  })

  // Test SSH shortcut format with hostname containing colon
  test('should parse hostname:port with letters (shortcut)', () => {
    const result = parseQuickConnect('localhost:23344')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, 'localhost')
    assert.strictEqual(result.port, 23344)
  })

  test('should parse hostname:port with multiple labels (shortcut)', () => {
    const result = parseQuickConnect('my-server:23344')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, 'my-server')
    assert.strictEqual(result.port, 23344)
  })

  test('should parse user@hostname:port (shortcut)', () => {
    const result = parseQuickConnect('user@localhost:23344')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, 'localhost')
    assert.strictEqual(result.port, 23344)
    assert.strictEqual(result.username, 'user')
  })

  // Test Telnet protocol
  test('should parse telnet://user@host', () => {
    const result = parseQuickConnect('telnet://user@192.168.1.1:23')
    assert.strictEqual(result.type, 'telnet')
    assert.strictEqual(result.host, '192.168.1.1')
    assert.strictEqual(result.username, 'user')
    assert.strictEqual(result.port, 23)
  })

  test('should parse telnet://host', () => {
    const result = parseQuickConnect('telnet://192.168.1.1')
    assert.strictEqual(result.type, 'telnet')
    assert.strictEqual(result.host, '192.168.1.1')
  })

  // Test VNC protocol
  test('should parse vnc://user@host', () => {
    const result = parseQuickConnect('vnc://user@192.168.1.100:5900')
    assert.strictEqual(result.type, 'vnc')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.username, 'user')
    assert.strictEqual(result.port, 5900)
  })

  test('should parse vnc://host', () => {
    const result = parseQuickConnect('vnc://192.168.1.100')
    assert.strictEqual(result.type, 'vnc')
    assert.strictEqual(result.host, '192.168.1.100')
  })

  // Test RDP protocol
  test('should parse rdp://user@host', () => {
    const result = parseQuickConnect('rdp://admin@192.168.1.100:3389')
    assert.strictEqual(result.type, 'rdp')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.username, 'admin')
    assert.strictEqual(result.port, 3389)
  })

  test('should parse rdp://host', () => {
    const result = parseQuickConnect('rdp://192.168.1.100')
    assert.strictEqual(result.type, 'rdp')
    assert.strictEqual(result.host, '192.168.1.100')
  })

  // Test Spice protocol
  test('should parse spice://host', () => {
    const result = parseQuickConnect('spice://192.168.1.100:5900')
    assert.strictEqual(result.type, 'spice')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.port, 5900)
  })

  test('should parse spice://password:host', () => {
    const result = parseQuickConnect('spice://password:192.168.1.100:5900')
    assert.strictEqual(result.type, 'spice')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.password, 'password')
    assert.strictEqual(result.port, 5900)
  })

  // Test Serial protocol
  test('should parse serial://COM1', () => {
    const result = parseQuickConnect('serial://COM1')
    assert.strictEqual(result.type, 'serial')
    assert.strictEqual(result.path, 'COM1')
  })

  test('should parse serial://COM1?baudRate=115200', () => {
    const result = parseQuickConnect('serial://COM1?baudRate=115200')
    assert.strictEqual(result.type, 'serial')
    assert.strictEqual(result.path, 'COM1')
    assert.strictEqual(result.baudRate, 115200)
  })

  test('should parse serial:///dev/ttyUSB0?baudRate=9600', () => {
    const result = parseQuickConnect('serial:///dev/ttyUSB0?baudRate=9600')
    assert.strictEqual(result.type, 'serial')
    assert.strictEqual(result.path, '/dev/ttyUSB0')
    assert.strictEqual(result.baudRate, 9600)
  })

  // Test FTP protocol
  test('should parse ftp://user@host', () => {
    const result = parseQuickConnect('ftp://user@ftp.example.com:21')
    assert.strictEqual(result.type, 'ftp')
    assert.strictEqual(result.host, 'ftp.example.com')
    assert.strictEqual(result.user, 'user')
    assert.strictEqual(result.port, 21)
  })

  test('should parse ftp://user:password@host', () => {
    const result = parseQuickConnect('ftp://user:password@ftp.example.com:21')
    assert.strictEqual(result.type, 'ftp')
    assert.strictEqual(result.host, 'ftp.example.com')
    assert.strictEqual(result.user, 'user')
    assert.strictEqual(result.password, 'password')
  })

  test('should parse ftp://ftpuser:ftppass@0.0.0.0:2121', () => {
    const result = parseQuickConnect('ftp://ftpuser:ftppass@0.0.0.0:2121')
    assert.strictEqual(result.type, 'ftp')
    assert.strictEqual(result.host, '0.0.0.0')
    assert.strictEqual(result.user, 'ftpuser')
    assert.strictEqual(result.password, 'ftppass')
    assert.strictEqual(result.port, 2121)
  })

  // Test HTTP/HTTPS protocols
  test('should parse http://host', () => {
    const result = parseQuickConnect('http://192.168.1.100:8080')
    assert.strictEqual(result.type, 'web')
    assert.strictEqual(result.url, 'http://192.168.1.100:8080')
  })

  test('should parse https://host', () => {
    const result = parseQuickConnect('https://192.168.1.100:8443')
    assert.strictEqual(result.type, 'web')
    assert.strictEqual(result.url, 'https://192.168.1.100:8443')
  })

  test('should parse https://example.com', () => {
    const result = parseQuickConnect('https://example.com')
    assert.strictEqual(result.type, 'web')
    assert.strictEqual(result.url, 'https://example.com')
  })

  test('should parse http://host?query params', () => {
    const result = parseQuickConnect('http://example.com?key=value&foo=bar')
    assert.strictEqual(result.type, 'web')
    assert.strictEqual(result.url, 'http://example.com?key=value&foo=bar')
  })

  test('should parse https://host?title=xxx', () => {
    const result = parseQuickConnect('https://example.com?title=MyPage&type=web')
    assert.strictEqual(result.type, 'web')
    assert.strictEqual(result.url, 'https://example.com?title=MyPage&type=web')
  })

  // Test opts parameter
  test('should parse opts with single quotes', () => {
    const result = parseQuickConnect("ssh://user@host:22?opts='{\"title\": \"My Server\"}'")
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.title, 'My Server')
  })

  test('should parse opts with double quotes', () => {
    const result = parseQuickConnect('ssh://user@host:22?opts={"title": "My Server"}')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.title, 'My Server')
  })

  test('should parse opts and merge with other params', () => {
    const result = parseQuickConnect('ssh://user@192.168.1.100:22?title=MyServer&opts={"title":"MyServer","username":"user","password":"password"}')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.username, 'user')
    assert.strictEqual(result.password, 'password')
    assert.strictEqual(result.title, 'MyServer')
  })

  // Test sshTunnels via opts
  test('should parse sshTunnels from opts', () => {
    const result = parseQuickConnect('ssh://user@192.168.1.100:22?opts={"sshTunnels":[{"sshTunnel":"forwardLocalToRemote","sshTunnelLocalPort":8080,"sshTunnelRemoteHost":"localhost","sshTunnelRemotePort":80}]}')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.username, 'user')
    assert.strictEqual(result.port, 22)
    assert.deepStrictEqual(result.sshTunnels, [{
      sshTunnel: 'forwardLocalToRemote',
      sshTunnelLocalPort: 8080,
      sshTunnelRemoteHost: 'localhost',
      sshTunnelRemotePort: 80
    }])
  })

  // Test connectionHoppings via opts
  test('should parse connectionHoppings from opts', () => {
    const result = parseQuickConnect('ssh://user@192.168.1.100:22?opts={"connectionHoppings":[{"host":"192.168.1.101","port":22,"username":"user2","password":"pass2"}]}')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.username, 'user')
    assert.deepStrictEqual(result.connectionHoppings, [{
      host: '192.168.1.101',
      port: 22,
      username: 'user2',
      password: 'pass2'
    }])
  })

  // Test both sshTunnels and connectionHoppings together
  test('should parse both sshTunnels and connectionHoppings from opts', () => {
    const result = parseQuickConnect('ssh://user@192.168.1.100?opts={"sshTunnels":[{"sshTunnel":"dynamicForward","sshTunnelLocalPort":1080}],"connectionHoppings":[{"host":"jump.host","port":22,"username":"jumper"}]}')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.username, 'user')
    assert.strictEqual(result.sshTunnels.length, 1)
    assert.strictEqual(result.sshTunnels[0].sshTunnel, 'dynamicForward')
    assert.strictEqual(result.sshTunnels[0].sshTunnelLocalPort, 1080)
    assert.strictEqual(result.connectionHoppings.length, 1)
    assert.strictEqual(result.connectionHoppings[0].host, 'jump.host')
    assert.strictEqual(result.connectionHoppings[0].username, 'jumper')
  })

  // Test SSH default values (enableSsh, enableSftp, useSshAgent, term, encode, envLang)
  test('should add default values for SSH type', () => {
    const result = parseQuickConnect('ssh://user@192.168.1.100')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.enableSsh, true)
    assert.strictEqual(result.enableSftp, true)
    assert.strictEqual(result.useSshAgent, true)
    assert.strictEqual(result.term, 'xterm-256color')
    assert.strictEqual(result.encode, 'utf-8')
    assert.strictEqual(result.envLang, 'en_US.UTF-8')
  })

  // Test VNC default values
  test('should add default values for VNC type', () => {
    const result = parseQuickConnect('vnc://192.168.1.100')
    assert.strictEqual(result.type, 'vnc')
    assert.strictEqual(result.scaleViewport, true)
  })

  // Test RDP default values
  test('should add default values for RDP type', () => {
    const result = parseQuickConnect('rdp://192.168.1.100')
    assert.strictEqual(result.type, 'rdp')
  })

  // Test Serial default values
  test('should add default values for Serial type', () => {
    const result = parseQuickConnect('serial://COM1')
    assert.strictEqual(result.type, 'serial')
    assert.strictEqual(result.baudRate, 9600)
    assert.strictEqual(result.dataBits, 8)
    assert.strictEqual(result.stopBits, 1)
    assert.strictEqual(result.parity, 'none')
  })

  // Test Telnet default port
  test('should add default port for Telnet type', () => {
    const result = parseQuickConnect('telnet://192.168.1.1')
    assert.strictEqual(result.type, 'telnet')
    assert.strictEqual(result.port, 23)
  })

  // Test with title query param
  test('should parse title from query param', () => {
    const result = parseQuickConnect('ssh://user@192.168.1.100:22?title=MyServer')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.title, 'MyServer')
  })

  // Test trailing slash support
  test('should parse ssh://user@host/ with trailing slash', () => {
    const result = parseQuickConnect('ssh://user@192.168.1.100/')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.username, 'user')
  })

  test('should parse ssh://user:password@host:port/ with trailing slash', () => {
    const result = parseQuickConnect('ssh://user:password@192.168.1.100:22/')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.username, 'user')
    assert.strictEqual(result.password, 'password')
    assert.strictEqual(result.port, 22)
  })

  test('should parse ssh://host:port/ with trailing slash', () => {
    const result = parseQuickConnect('ssh://192.168.1.100:2222/')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.port, 2222)
  })

  test('should parse ssh://host/ with trailing slash', () => {
    const result = parseQuickConnect('ssh://192.168.1.100/')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
  })

  test('should parse ftp://user@host:port/ with trailing slash', () => {
    const result = parseQuickConnect('ftp://user@ftp.example.com:21/')
    assert.strictEqual(result.type, 'ftp')
    assert.strictEqual(result.host, 'ftp.example.com')
    assert.strictEqual(result.user, 'user')
    assert.strictEqual(result.port, 21)
  })

  test('should parse telnet://host/ with trailing slash', () => {
    const result = parseQuickConnect('telnet://192.168.1.1/')
    assert.strictEqual(result.type, 'telnet')
    assert.strictEqual(result.host, '192.168.1.1')
  })

  test('should parse vnc://host/ with trailing slash', () => {
    const result = parseQuickConnect('vnc://192.168.1.100/')
    assert.strictEqual(result.type, 'vnc')
    assert.strictEqual(result.host, '192.168.1.100')
  })

  test('should parse https://host/ with trailing slash', () => {
    const result = parseQuickConnect('https://example.com/')
    assert.strictEqual(result.type, 'web')
    assert.strictEqual(result.url, 'https://example.com')
  })

  test('should parse https://host:port/ with trailing slash', () => {
    const result = parseQuickConnect('https://example.com:8443/')
    assert.strictEqual(result.type, 'web')
    assert.strictEqual(result.url, 'https://example.com:8443')
  })

  test('should parse electerm://host/ with trailing slash', () => {
    const result = parseQuickConnect('electerm://192.168.1.100/')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
  })

  test('should parse electerm://user@host:port/ with trailing slash', () => {
    const result = parseQuickConnect('electerm://user@192.168.1.100:22/')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.username, 'user')
    assert.strictEqual(result.port, 22)
  })

  test('should parse host/ shortcut with trailing slash', () => {
    const result = parseQuickConnect('192.168.1.100/')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
  })

  test('should parse user@host/ shortcut with trailing slash', () => {
    const result = parseQuickConnect('user@192.168.1.100/')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.username, 'user')
  })

  test('should parse host:port/ shortcut with trailing slash', () => {
    const result = parseQuickConnect('192.168.1.100:2222/')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.port, 2222)
  })

  test('should parse ssh://host/opts/ with trailing slash before opts', () => {
    const result = parseQuickConnect("ssh://user@host:22/?opts='{\"title\": \"My Server\"}'")
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, 'host')
    assert.strictEqual(result.title, 'My Server')
  })

  // Test invalid inputs
  test('should return null for unsupported protocol', () => {
    const result = parseQuickConnect('unsupported://host')
    assert.strictEqual(result, null)
  })

  test('should return null for invalid format', () => {
    // Truly invalid format that can't be parsed
    const result = parseQuickConnect('://host')
    assert.strictEqual(result, null)
  })

  test('should handle protocol without host', () => {
    const result = parseQuickConnect('ssh://')
    assert.strictEqual(result, null)
  })
})

describe('getDefaultPort', function () {
  test('should return correct default port for ssh', () => {
    assert.strictEqual(getDefaultPort('ssh'), 22)
  })

  test('should return correct default port for telnet', () => {
    assert.strictEqual(getDefaultPort('telnet'), 23)
  })

  test('should return correct default port for vnc', () => {
    assert.strictEqual(getDefaultPort('vnc'), 5900)
  })

  test('should return correct default port for rdp', () => {
    assert.strictEqual(getDefaultPort('rdp'), 3389)
  })

  test('should return correct default port for spice', () => {
    assert.strictEqual(getDefaultPort('spice'), 5900)
  })

  test('should return correct default port for ftp', () => {
    assert.strictEqual(getDefaultPort('ftp'), 21)
  })

  test('should return correct default port for http', () => {
    assert.strictEqual(getDefaultPort('http'), 80)
  })

  test('should return correct default port for https', () => {
    assert.strictEqual(getDefaultPort('https'), 443)
  })

  test('should return undefined for serial', () => {
    assert.strictEqual(getDefaultPort('serial'), undefined)
  })
})

describe('getSupportedProtocols', function () {
  test('should return array of supported protocols', () => {
    const protocols = getSupportedProtocols()
    assert(Array.isArray(protocols))
    assert(protocols.includes('ssh'))
    assert(protocols.includes('telnet'))
    assert(protocols.includes('vnc'))
    assert(protocols.includes('rdp'))
    assert(protocols.includes('spice'))
    assert(protocols.includes('serial'))
    assert(protocols.includes('ftp'))
    assert(protocols.includes('http'))
    assert(protocols.includes('https'))
  })
})

describe('SUPPORTED_PROTOCOLS', function () {
  test('should include all expected protocols', () => {
    assert(SUPPORTED_PROTOCOLS.includes('ssh'))
    assert(SUPPORTED_PROTOCOLS.includes('telnet'))
    assert(SUPPORTED_PROTOCOLS.includes('vnc'))
    assert(SUPPORTED_PROTOCOLS.includes('rdp'))
    assert(SUPPORTED_PROTOCOLS.includes('spice'))
    assert(SUPPORTED_PROTOCOLS.includes('serial'))
    assert(SUPPORTED_PROTOCOLS.includes('ftp'))
    assert(SUPPORTED_PROTOCOLS.includes('http'))
    assert(SUPPORTED_PROTOCOLS.includes('https'))
  })
})

describe('DEFAULT_PORTS', function () {
  test('should have correct default ports', () => {
    assert.strictEqual(DEFAULT_PORTS.ssh, 22)
    assert.strictEqual(DEFAULT_PORTS.telnet, 23)
    assert.strictEqual(DEFAULT_PORTS.vnc, 5900)
    assert.strictEqual(DEFAULT_PORTS.rdp, 3389)
    assert.strictEqual(DEFAULT_PORTS.spice, 5900)
    assert.strictEqual(DEFAULT_PORTS.ftp, 21)
    assert.strictEqual(DEFAULT_PORTS.http, 80)
    assert.strictEqual(DEFAULT_PORTS.https, 443)
  })

  test('should have electerm default port', () => {
    assert.strictEqual(DEFAULT_PORTS.electerm, 22)
  })
})

describe('electerm:// protocol', function () {
  // Test electerm:// with default type (ssh)
  test('should parse electerm://host (default type ssh)', () => {
    const result = parseQuickConnect('electerm://192.168.1.100')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
  })

  test('should parse electerm://user@host', () => {
    const result = parseQuickConnect('electerm://user@192.168.1.100')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.username, 'user')
  })

  test('should parse electerm://user:password@host:port', () => {
    const result = parseQuickConnect('electerm://user:password@192.168.1.100:22')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.port, 22)
    assert.strictEqual(result.username, 'user')
    assert.strictEqual(result.password, 'password')
  })

  // Test electerm:// with type query param
  test('should parse electerm://host?type=telnet', () => {
    const result = parseQuickConnect('electerm://192.168.1.1?type=telnet')
    assert.strictEqual(result.type, 'telnet')
    assert.strictEqual(result.host, '192.168.1.1')
  })

  test('should parse electerm://host?type=vnc', () => {
    const result = parseQuickConnect('electerm://192.168.1.100?type=vnc')
    assert.strictEqual(result.type, 'vnc')
    assert.strictEqual(result.host, '192.168.1.100')
  })

  test('should parse electerm://host?type=rdp', () => {
    const result = parseQuickConnect('electerm://192.168.1.100?type=rdp')
    assert.strictEqual(result.type, 'rdp')
    assert.strictEqual(result.host, '192.168.1.100')
  })

  test('should parse electerm://host?type=serial', () => {
    const result = parseQuickConnect('electerm://COM1?type=serial')
    assert.strictEqual(result.type, 'serial')
    assert.strictEqual(result.path, 'COM1')
  })

  test('should parse electerm://host?type=spice', () => {
    const result = parseQuickConnect('electerm://192.168.1.100?type=spice')
    assert.strictEqual(result.type, 'spice')
    assert.strictEqual(result.host, '192.168.1.100')
  })

  // Test electerm:// with tp query param (alias for type)
  test('should parse electerm://host?tp=vnc', () => {
    const result = parseQuickConnect('electerm://192.168.1.100?tp=vnc')
    assert.strictEqual(result.type, 'vnc')
    assert.strictEqual(result.host, '192.168.1.100')
  })

  // Test electerm:// with port
  test('should parse electerm://host:port?type=ssh', () => {
    const result = parseQuickConnect('electerm://192.168.1.100:2222?type=ssh')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.port, 2222)
  })

  // Test electerm:// with title query param
  test('should parse electerm://host?type=ssh&title=MyServer', () => {
    const result = parseQuickConnect('electerm://192.168.1.100?type=ssh&title=MyServer')
    assert.strictEqual(result.type, 'ssh')
    assert.strictEqual(result.host, '192.168.1.100')
    assert.strictEqual(result.title, 'MyServer')
  })

  // Test electerm:// with username and type
  test('should parse electerm://user@host:port?type=telnet', () => {
    const result = parseQuickConnect('electerm://admin@192.168.1.1:23?type=telnet')
    assert.strictEqual(result.type, 'telnet')
    assert.strictEqual(result.host, '192.168.1.1')
    assert.strictEqual(result.port, 23)
    assert.strictEqual(result.username, 'admin')
  })

  // Test electerm:// with web type
  test('should parse electerm://host?type=https', () => {
    const result = parseQuickConnect('electerm://example.com?type=https')
    assert.strictEqual(result.type, 'web')
    assert.strictEqual(result.url, 'https://example.com')
  })

  test('should parse electerm://host:port?type=http', () => {
    const result = parseQuickConnect('electerm://example.com:8080?type=http')
    assert.strictEqual(result.type, 'web')
    assert.strictEqual(result.url, 'http://example.com:8080')
  })

  // Test electerm:// with invalid type
  test('should return null for electerm://host?type=invalid', () => {
    const result = parseQuickConnect('electerm://192.168.1.100?type=invalid')
    assert.strictEqual(result, null)
  })

  // Test electerm:// with serial baudRate
  test('should parse electerm://COM1?type=serial&baudRate=115200', () => {
    const result = parseQuickConnect('electerm://COM1?type=serial&baudRate=115200')
    assert.strictEqual(result.type, 'serial')
    assert.strictEqual(result.path, 'COM1')
    assert.strictEqual(result.baudRate, 115200)
  })
})
