import { seedUser } from '@documenso/prisma/seed/users';
import { expect, type Page, test } from '@playwright/test';

import { apiSignin } from '../fixtures/authentication';
import { expectTextToBeVisible } from '../fixtures/generic';

test('[USER] revoke sessions', async ({ page }: { page: Page }) => {
  const { user, team } = await seedUser();

  await apiSignin({
    page,
    email: user.email,
    password: 'password',
    redirectPath: '/settings/security/sessions',
  });

  // Expect 2 rows length (header + 1)
  await expect(page.getByRole('row')).toHaveCount(2);

  // Clear cookies
  await page.context().clearCookies();

  await apiSignin({
    page,
    email: user.email,
    password: 'password',
    redirectPath: '/settings/security/sessions',
  });

  await page.context().clearCookies();

  await apiSignin({
    page,
    email: user.email,
    password: 'password',
    redirectPath: '/settings/security/sessions',
  });

  // Expect 4 (3 sessions + 1 header) rows length
  await expect(page.getByRole('row')).toHaveCount(4);

  // Revoke all sessions
  await page.getByRole('button', { name: 'Revoke all sessions' }).click();
  await page.getByRole('button', { name: 'Revoke all sessions' }).click();

  await expectTextToBeVisible(page, 'Sessions have been revoked');

  // Expect (1 sessions + 1 header) rows length
  await expect(page.getByRole('row')).toHaveCount(2);

  await page.context().clearCookies();

  await apiSignin({
    page,
    email: user.email,
    password: 'password',
    redirectPath: '/settings/security/sessions',
  });

  // Find table row which does not have text 'Current' and click the button called Revoke within the row.
  await page.getByRole('row').filter({ hasNotText: 'Current' }).nth(1).getByRole('button', { name: 'Revoke' }).click();
  await expectTextToBeVisible(page, 'Session revoked');

  // Expect (1 sessions + 1 header) rows length
  await expect(page.getByRole('row')).toHaveCount(2);

  // Revoke own session.
  await page.getByRole('row').filter({ hasText: 'Current' }).first().getByRole('button', { name: 'Revoke' }).click();

  await expect(page).toHaveURL('/signin');
});
