import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import test from 'node:test'
import { fileURLToPath } from 'node:url'

import { checkBackendHealth, useBackendHealth } from '../src/composables/useBackendHealth.js'

const routerScript = readFileSync(
  fileURLToPath(new URL('../src/router/index.js', import.meta.url)),
  'utf8'
)

test('app route guard allows stale healthy state when health check times out', () => {
  assert.match(routerScript, /checkBackendHealth\(\{\s*allowStaleOnTimeout:\s*true\s*\}\)/)
})

test('backend health timeout does not block app rendering when stale fallback is allowed', async () => {
  const originalFetch = global.fetch

  global.fetch = async (_url, options = {}) =>
    new Promise((_, reject) => {
      options.signal.addEventListener('abort', () => {
        const error = new Error('aborted')
        error.name = 'AbortError'
        reject(error)
      })
    })

  try {
    const ok = await checkBackendHealth({
      force: true,
      allowStaleOnTimeout: true,
      timeoutMs: 1
    })
    const { backendHealthy, backendError } = useBackendHealth()

    assert.equal(ok, true)
    assert.equal(backendHealthy.value, true)
    assert.match(backendError.value, /健康检查超时|health/i)
  } finally {
    global.fetch = originalFetch
  }
})
