import { render, screen } from '@testing-library/react'

import { PageAccessGuard } from 'dbaas/contexts/access-control'

import ClusterBackupRestore from './Restore'

jest.mock('mobx-react', () => ({
  observer: (component: unknown) => component
}))

jest.mock('@tidbcloud/uikit', () => ({
  Loader: () => <div data-testid="restore-loader" />
}))

jest.mock(
  'config',
  () => ({
    PAGE_TITLE_PREFIX: 'TiDB Cloud - '
  }),
  { virtual: true }
)

jest.mock('dbaas/contexts/access-control', () => ({
  PageAccessGuard: jest.fn(({ children }: React.PropsWithChildren) => <>{children}</>)
}))

jest.mock('dbaas/screens/Restore/RestoreForDedicated', () => ({
  RestoreForDedicated: () => <div data-testid="dedicated-restore" />
}))

jest.mock('dbaas/screens/Restore/RestoreForServerless/NextGen', () => ({
  RestoreForServerlessNextGen: () => <div data-testid="serverless-restore" />
}))

const mockedPageAccessGuard = PageAccessGuard as jest.Mock

const createCluster = (isServerless: boolean) =>
  ({
    id: 'cluster-1',
    computed: {
      isServerless,
      loading: false
    }
  }) as any

describe('ClusterBackupRestore', () => {
  afterEach(() => {
    mockedPageAccessGuard.mockClear()
  })

  test('uses dedicated restore access for dedicated clusters', () => {
    render(<ClusterBackupRestore cluster={createCluster(false)} />)

    expect(mockedPageAccessGuard).toHaveBeenCalledWith(
      expect.objectContaining({
        id: 'ClusterRestoreAction'
      }),
      expect.anything()
    )
    expect(screen.getByTestId('dedicated-restore')).toBeTruthy()
  })

  test('uses tidbx restore-create access for serverless clusters', () => {
    render(<ClusterBackupRestore cluster={createCluster(true)} />)

    expect(mockedPageAccessGuard).toHaveBeenCalledWith(
      expect.objectContaining({
        id: 'TidbxRestoreCreate',
        scopeProps: { tidbId: 'cluster-1' }
      }),
      expect.anything()
    )
    expect(screen.getByTestId('serverless-restore')).toBeTruthy()
  })
})
