dashboardSupervisor.test.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { describe, expect, it } from 'vitest'
  2. import {
  3. DashboardSupervisor,
  4. DEFAULT_DASHBOARD_USERNAME,
  5. } from '../../src/server/dashboardSupervisor.js'
  6. function supervisor(overrides: {
  7. values?: Record<string, string>
  8. running?: boolean
  9. allowLan?: boolean
  10. } = {}) {
  11. const values = { ...overrides.values }
  12. let running = overrides.running ?? false
  13. const calls: string[][] = []
  14. const launches: string[][] = []
  15. const instance = new DashboardSupervisor({
  16. allowLan: overrides.allowLan ?? false,
  17. run(args) {
  18. calls.push([...args])
  19. if (args[0] === 'config' && args[1] === 'get') return values[args[2]] ?? ''
  20. if (args[0] === 'config' && args[1] === 'set') {
  21. values[args[2]] = args[3]
  22. return ''
  23. }
  24. if (args[0] === 'dashboard' && args[1] === '--stop') {
  25. running = false
  26. return ''
  27. }
  28. return ''
  29. },
  30. launch(args) {
  31. launches.push([...args])
  32. running = true
  33. },
  34. probe: async () => running,
  35. log: () => undefined,
  36. })
  37. return { instance, calls, launches, values }
  38. }
  39. describe('DashboardSupervisor', () => {
  40. it('configures the requested default credentials and starts an unavailable dashboard', async () => {
  41. const value = supervisor()
  42. await value.instance.checkNow()
  43. expect(value.values['dashboard.basic_auth.username']).toBe(DEFAULT_DASHBOARD_USERNAME)
  44. expect(value.values['dashboard.basic_auth.password_hash']).toMatch(/^scrypt\$16384\$8\$1\$/)
  45. expect(value.values['dashboard.basic_auth.secret']).toMatch(/.{32,}/)
  46. expect(value.launches).toEqual([['dashboard', '--host', '127.0.0.1', '--no-open']])
  47. })
  48. it('does not overwrite configured dashboard credentials', async () => {
  49. const value = supervisor({
  50. running: true,
  51. values: {
  52. 'dashboard.basic_auth.username': 'operator',
  53. 'dashboard.basic_auth.password_hash': 'scrypt$existing',
  54. 'dashboard.basic_auth.secret': 'configured-secret',
  55. },
  56. })
  57. await value.instance.checkNow()
  58. expect(value.calls.filter((args) => args[1] === 'set')).toEqual([])
  59. expect(value.launches).toEqual([])
  60. })
  61. it('restarts a running dashboard after filling missing authentication and uses LAN binding when enabled', async () => {
  62. const value = supervisor({ running: true, allowLan: true })
  63. await value.instance.checkNow()
  64. expect(value.calls).toContainEqual(['dashboard', '--stop'])
  65. expect(value.launches).toEqual([['dashboard', '--host', '0.0.0.0', '--no-open']])
  66. })
  67. it('explicitly restarts a healthy dashboard and waits for 9119 to return', async () => {
  68. const value = supervisor({
  69. running: true,
  70. values: {
  71. 'dashboard.basic_auth.username': 'operator',
  72. 'dashboard.basic_auth.password_hash': 'scrypt$existing',
  73. 'dashboard.basic_auth.secret': 'configured-secret',
  74. },
  75. })
  76. await value.instance.restart()
  77. expect(value.calls).toContainEqual(['dashboard', '--stop'])
  78. expect(value.launches).toEqual([['dashboard', '--host', '127.0.0.1', '--no-open']])
  79. })
  80. })