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

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

import ClusterBackup from './Home'

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

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/Cluster/Backup', () => ({
  __esModule: true,
  default: () => <div data-testid="dedicated-backup-list" />,
  DedicatedBackupListHeader: () => <div data-testid="dedicated-backup-list-header" />,
  ServerlessBackupListHeader: () => <div data-testid="serverless-backup-list-header" />
}))

jest.mock('dbaas/screens/Cluster/Backup/BackupListServerless', () => ({
  BackupListServerless: () => <div data-testid="serverless-backup-list" />
}))

jest.mock('dbaas/screens/ClusterV2/components', () => ({
  ClusterPageShell: ({ children }: React.PropsWithChildren) => <div data-testid="cluster-page-shell">{children}</div>
}))

const mockedPageAccessGuard = PageAccessGuard as jest.Mock

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

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

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

    expect(mockedPageAccessGuard).toHaveBeenCalledWith(
      expect.objectContaining({
        id: 'ClusterBackupView'
      }),
      expect.anything()
    )
    expect(screen.getByTestId('dedicated-backup-list')).toBeTruthy()
  })

  test('uses tidbx read access for serverless clusters', () => {
    render(<ClusterBackup cluster={createCluster(true)} />)

    expect(mockedPageAccessGuard).toHaveBeenCalledWith(
      expect.objectContaining({
        id: 'TidbxRead'
      }),
      expect.anything()
    )
    expect(screen.getByTestId('serverless-backup-list')).toBeTruthy()
  })
})
