| import { expect, test } from '../fixtures'; | |
| import { AuthPage } from '../pages/auth'; | |
| import { generateRandomTestUser } from '../helpers'; | |
| import { ChatPage } from '../pages/chat'; | |
| import { getMessageByErrorCode } from '@/lib/errors'; | |
| test.describe | |
| .serial('Guest Session', () => { | |
| test('Authenticate as guest user when a new session is loaded', async ({ | |
| page, | |
| }) => { | |
| const response = await page.goto('/'); | |
| if (!response) { | |
| throw new Error('Failed to load page'); | |
| } | |
| let request = response.request(); | |
| const chain = []; | |
| while (request) { | |
| chain.unshift(request.url()); | |
| request = request.redirectedFrom(); | |
| } | |
| expect(chain).toEqual([ | |
| 'http://localhost:3000/', | |
| 'http://localhost:3000/api/auth/guest?redirectUrl=http%3A%2F%2Flocalhost%3A3000%2F', | |
| 'http://localhost:3000/', | |
| ]); | |
| }); | |
| test('Log out is not available for guest users', async ({ page }) => { | |
| await page.goto('/'); | |
| const sidebarToggleButton = page.getByTestId('sidebar-toggle-button'); | |
| await sidebarToggleButton.click(); | |
| const userNavButton = page.getByTestId('user-nav-button'); | |
| await expect(userNavButton).toBeVisible(); | |
| await userNavButton.click(); | |
| const userNavMenu = page.getByTestId('user-nav-menu'); | |
| await expect(userNavMenu).toBeVisible(); | |
| const authMenuItem = page.getByTestId('user-nav-item-auth'); | |
| await expect(authMenuItem).toContainText('Login to your account'); | |
| }); | |
| test('Do not authenticate as guest user when an existing non-guest session is active', async ({ | |
| adaContext, | |
| }) => { | |
| const response = await adaContext.page.goto('/'); | |
| if (!response) { | |
| throw new Error('Failed to load page'); | |
| } | |
| let request = response.request(); | |
| const chain = []; | |
| while (request) { | |
| chain.unshift(request.url()); | |
| request = request.redirectedFrom(); | |
| } | |
| expect(chain).toEqual(['http://localhost:3000/']); | |
| }); | |
| test('Allow navigating to /login as guest user', async ({ page }) => { | |
| await page.goto('/login'); | |
| await page.waitForURL('/login'); | |
| await expect(page).toHaveURL('/login'); | |
| }); | |
| test('Allow navigating to /register as guest user', async ({ page }) => { | |
| await page.goto('/register'); | |
| await page.waitForURL('/register'); | |
| await expect(page).toHaveURL('/register'); | |
| }); | |
| test('Do not show email in user menu for guest user', async ({ page }) => { | |
| await page.goto('/'); | |
| const sidebarToggleButton = page.getByTestId('sidebar-toggle-button'); | |
| await sidebarToggleButton.click(); | |
| const userEmail = page.getByTestId('user-email'); | |
| await expect(userEmail).toContainText('Guest'); | |
| }); | |
| }); | |
| test.describe | |
| .serial('Login and Registration', () => { | |
| let authPage: AuthPage; | |
| const testUser = generateRandomTestUser(); | |
| test.beforeEach(async ({ page }) => { | |
| authPage = new AuthPage(page); | |
| }); | |
| test('Register new account', async () => { | |
| await authPage.register(testUser.email, testUser.password); | |
| await authPage.expectToastToContain('Account created successfully!'); | |
| }); | |
| test('Register new account with existing email', async () => { | |
| await authPage.register(testUser.email, testUser.password); | |
| await authPage.expectToastToContain('Account already exists!'); | |
| }); | |
| test('Log into account that exists', async ({ page }) => { | |
| await authPage.login(testUser.email, testUser.password); | |
| await page.waitForURL('/'); | |
| await expect(page.getByPlaceholder('Send a message...')).toBeVisible(); | |
| }); | |
| test('Display user email in user menu', async ({ page }) => { | |
| await authPage.login(testUser.email, testUser.password); | |
| await page.waitForURL('/'); | |
| await expect(page.getByPlaceholder('Send a message...')).toBeVisible(); | |
| const userEmail = await page.getByTestId('user-email'); | |
| await expect(userEmail).toHaveText(testUser.email); | |
| }); | |
| test('Log out as non-guest user', async () => { | |
| await authPage.logout(testUser.email, testUser.password); | |
| }); | |
| test('Do not force create a guest session if non-guest session already exists', async ({ | |
| page, | |
| }) => { | |
| await authPage.login(testUser.email, testUser.password); | |
| await page.waitForURL('/'); | |
| const userEmail = await page.getByTestId('user-email'); | |
| await expect(userEmail).toHaveText(testUser.email); | |
| await page.goto('/api/auth/guest'); | |
| await page.waitForURL('/'); | |
| const updatedUserEmail = await page.getByTestId('user-email'); | |
| await expect(updatedUserEmail).toHaveText(testUser.email); | |
| }); | |
| test('Log out is available for non-guest users', async ({ page }) => { | |
| await authPage.login(testUser.email, testUser.password); | |
| await page.waitForURL('/'); | |
| authPage.openSidebar(); | |
| const userNavButton = page.getByTestId('user-nav-button'); | |
| await expect(userNavButton).toBeVisible(); | |
| await userNavButton.click(); | |
| const userNavMenu = page.getByTestId('user-nav-menu'); | |
| await expect(userNavMenu).toBeVisible(); | |
| const authMenuItem = page.getByTestId('user-nav-item-auth'); | |
| await expect(authMenuItem).toContainText('Sign out'); | |
| }); | |
| test('Do not navigate to /register for non-guest users', async ({ | |
| page, | |
| }) => { | |
| await authPage.login(testUser.email, testUser.password); | |
| await page.waitForURL('/'); | |
| await page.goto('/register'); | |
| await expect(page).toHaveURL('/'); | |
| }); | |
| test('Do not navigate to /login for non-guest users', async ({ page }) => { | |
| await authPage.login(testUser.email, testUser.password); | |
| await page.waitForURL('/'); | |
| await page.goto('/login'); | |
| await expect(page).toHaveURL('/'); | |
| }); | |
| }); | |
| test.describe('Entitlements', () => { | |
| let chatPage: ChatPage; | |
| test.beforeEach(async ({ page }) => { | |
| chatPage = new ChatPage(page); | |
| }); | |
| test('Guest user cannot send more than 20 messages/day', async () => { | |
| test.fixme(); | |
| await chatPage.createNewChat(); | |
| for (let i = 0; i <= 20; i++) { | |
| await chatPage.sendUserMessage('Why is the sky blue?'); | |
| await chatPage.isGenerationComplete(); | |
| } | |
| await chatPage.sendUserMessage('Why is the sky blue?'); | |
| await chatPage.expectToastToContain( | |
| getMessageByErrorCode('rate_limit:chat'), | |
| ); | |
| }); | |
| }); | |