import type { DifyMock } from '@test/fixtures/dify-mock/server'
import { startMock } from '@test/fixtures/dify-mock/server'
import { testHttpClient } from '@test/fixtures/http-client'
import { afterEach, beforeEach, describe, expect, it } from 'vitest'
import { MetaClient } from './meta.js'

describe('MetaClient', () => {
  let mock: DifyMock

  beforeEach(async () => {
    mock = await startMock()
  })
  afterEach(async () => {
    await mock.stop()
  })

  it('fetches /openapi/v1/_version without a bearer token', async () => {
    const client = new MetaClient(testHttpClient(mock.url))
    const info = await client.serverVersion()

    expect(info.version).toBe('1.6.4')
    expect(info.edition).toBe('CLOUD')
  })

  it('honors the auth-expired scenario by allowing the unauthed endpoint anyway', async () => {
    mock.setScenario('auth-expired')
    const client = new MetaClient(testHttpClient(mock.url))
    const info = await client.serverVersion()

    // The meta endpoint is exempt from auth middleware, so an auth-expired
    // session does not stop the version probe.
    expect(info.version).toBe('1.6.4')
  })

  it('returns an empty version string when the server scenario forces it', async () => {
    mock.setScenario('server-version-empty')
    const client = new MetaClient(testHttpClient(mock.url))
    const info = await client.serverVersion()

    expect(info.version).toBe('')
    expect(info.edition).toBe('SELF_HOSTED')
  })

  it('throws when the host has no Dify on it', async () => {
    // Closed port — connection refused.
    const client = new MetaClient(testHttpClient('http://127.0.0.1:1'))
    await expect(client.serverVersion()).rejects.toBeDefined()
  })
})
