dashboardSupervisor.test.ts 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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) { launches.push([...args]) },
  31. probe: async () => running,
  32. log: () => undefined,
  33. })
  34. return { instance, calls, launches, values }
  35. }
  36. describe('DashboardSupervisor', () => {
  37. it('configures the requested default credentials and starts an unavailable dashboard', async () => {
  38. const value = supervisor()
  39. await value.instance.checkNow()
  40. expect(value.values['dashboard.basic_auth.username']).toBe(DEFAULT_DASHBOARD_USERNAME)
  41. expect(value.values['dashboard.basic_auth.password_hash']).toMatch(/^scrypt\$16384\$8\$1\$/)
  42. expect(value.values['dashboard.basic_auth.secret']).toMatch(/.{32,}/)
  43. expect(value.launches).toEqual([['dashboard', '--host', '127.0.0.1', '--no-open']])
  44. })
  45. it('does not overwrite configured dashboard credentials', async () => {
  46. const value = supervisor({
  47. running: true,
  48. values: {
  49. 'dashboard.basic_auth.username': 'operator',
  50. 'dashboard.basic_auth.password_hash': 'scrypt$existing',
  51. 'dashboard.basic_auth.secret': 'configured-secret',
  52. },
  53. })
  54. await value.instance.checkNow()
  55. expect(value.calls.filter((args) => args[1] === 'set')).toEqual([])
  56. expect(value.launches).toEqual([])
  57. })
  58. it('restarts a running dashboard after filling missing authentication and uses LAN binding when enabled', async () => {
  59. const value = supervisor({ running: true, allowLan: true })
  60. await value.instance.checkNow()
  61. expect(value.calls).toContainEqual(['dashboard', '--stop'])
  62. expect(value.launches).toEqual([['dashboard', '--host', '0.0.0.0', '--no-open']])
  63. })
  64. })