11import { expect , test } from '@playwright/test'
22import type { Page } from '@playwright/test'
3+ import { defaultGitHubChatModel } from '../src/modules/github-api.js'
34
45const webServerMode = process . env . PLAYWRIGHT_WEB_SERVER_MODE ?? 'dev'
56const appEntryPath = webServerMode === 'preview' ? '/index.html' : '/src/index.html'
@@ -12,6 +13,8 @@ type ChatRequestMessage = {
1213type ChatRequestBody = {
1314 metadata ?: unknown
1415 messages ?: ChatRequestMessage [ ]
16+ model ?: string
17+ stream ?: boolean
1518}
1619
1720const waitForAppReady = async ( page : Page , path = appEntryPath ) => {
@@ -256,6 +259,7 @@ test('AI chat prefers streaming responses when available', async ({ page }) => {
256259 )
257260
258261 expect ( streamRequestBody ?. metadata ) . toBeUndefined ( )
262+ expect ( streamRequestBody ?. model ) . toBe ( defaultGitHubChatModel )
259263 const systemMessage = streamRequestBody ?. messages ?. find (
260264 ( message : ChatRequestMessage ) => message . role === 'system' ,
261265 )
@@ -335,9 +339,14 @@ test('AI chat falls back to non-streaming response when streaming fails', async
335339} ) => {
336340 let streamAttemptCount = 0
337341 let fallbackAttemptCount = 0
342+ const attemptedModels : string [ ] = [ ]
338343
339344 await page . route ( 'https://models.github.ai/inference/chat/completions' , async route => {
340- const body = route . request ( ) . postDataJSON ( ) as { stream ?: boolean } | null
345+ const body = route . request ( ) . postDataJSON ( ) as ChatRequestBody | null
346+ if ( typeof body ?. model === 'string' ) {
347+ attemptedModels . push ( body . model )
348+ }
349+
341350 if ( body ?. stream ) {
342351 streamAttemptCount += 1
343352 await route . fulfill ( {
@@ -373,6 +382,10 @@ test('AI chat falls back to non-streaming response when streaming fails', async
373382 await connectByotWithSingleRepo ( page )
374383 await ensureAiChatDrawerOpen ( page )
375384
385+ const selectedModel = 'openai/gpt-5-mini'
386+ await page . locator ( '#ai-chat-model' ) . selectOption ( selectedModel )
387+ await expect ( page . locator ( '#ai-chat-model' ) ) . toHaveValue ( selectedModel )
388+
376389 await page . locator ( '#ai-chat-prompt' ) . fill ( 'Use fallback path.' )
377390 await page . locator ( '#ai-chat-send' ) . click ( )
378391
@@ -383,6 +396,8 @@ test('AI chat falls back to non-streaming response when streaming fails', async
383396 )
384397 expect ( streamAttemptCount ) . toBeGreaterThan ( 0 )
385398 expect ( fallbackAttemptCount ) . toBeGreaterThan ( 0 )
399+ expect ( attemptedModels . length ) . toBeGreaterThan ( 0 )
400+ expect ( attemptedModels . every ( model => model === selectedModel ) ) . toBe ( true )
386401} )
387402
388403test ( 'BYOT remembers selected repository across reloads' , async ( { page } ) => {
@@ -433,7 +448,7 @@ test('BYOT remembers selected repository across reloads', async ({ page }) => {
433448test ( 'renders default playground preview' , async ( { page } ) => {
434449 await waitForInitialRender ( page )
435450
436- await page . getByLabel ( 'ShadowRoot (open) ' ) . uncheck ( )
451+ await page . getByLabel ( 'ShadowRoot' ) . uncheck ( )
437452 await expect ( page . locator ( '#status' ) ) . toHaveText ( 'Rendered' )
438453 await expectPreviewHasRenderedContent ( page )
439454} )
@@ -668,7 +683,7 @@ test('renders in react mode with css modules', async ({ page }) => {
668683 await ensurePanelToolsVisible ( page , 'component' )
669684 await ensurePanelToolsVisible ( page , 'styles' )
670685
671- await page . getByLabel ( 'ShadowRoot (open) ' ) . uncheck ( )
686+ await page . getByLabel ( 'ShadowRoot' ) . uncheck ( )
672687 await page . locator ( '#render-mode' ) . selectOption ( 'react' )
673688 await page . locator ( '#style-mode' ) . selectOption ( 'module' )
674689 await expect ( page . locator ( '#status' ) ) . toHaveText ( 'Rendered' )
@@ -678,7 +693,7 @@ test('renders in react mode with css modules', async ({ page }) => {
678693test ( 'transpiles TypeScript annotations in component source' , async ( { page } ) => {
679694 await waitForInitialRender ( page )
680695
681- await page . getByLabel ( 'ShadowRoot (open) ' ) . uncheck ( )
696+ await page . getByLabel ( 'ShadowRoot' ) . uncheck ( )
682697 await setComponentEditorSource (
683698 page ,
684699 [
@@ -762,7 +777,7 @@ test('react mode executes default React import without TDZ runtime failure', asy
762777
763778 await ensurePanelToolsVisible ( page , 'component' )
764779
765- await page . getByLabel ( 'ShadowRoot (open) ' ) . uncheck ( )
780+ await page . getByLabel ( 'ShadowRoot' ) . uncheck ( )
766781 await page . locator ( '#render-mode' ) . selectOption ( 'react' )
767782 await setComponentEditorSource (
768783 page ,
@@ -854,7 +869,7 @@ test('renders with less style mode', async ({ page }) => {
854869
855870 await ensurePanelToolsVisible ( page , 'styles' )
856871
857- await page . getByLabel ( 'ShadowRoot (open) ' ) . uncheck ( )
872+ await page . getByLabel ( 'ShadowRoot' ) . uncheck ( )
858873 await page . locator ( '#style-mode' ) . selectOption ( 'less' )
859874 await expect ( page . locator ( '#status' ) ) . toHaveText ( 'Rendered' )
860875 await expectPreviewHasRenderedContent ( page )
@@ -865,7 +880,7 @@ test('renders with sass style mode', async ({ page }) => {
865880
866881 await ensurePanelToolsVisible ( page , 'styles' )
867882
868- await page . getByLabel ( 'ShadowRoot (open) ' ) . uncheck ( )
883+ await page . getByLabel ( 'ShadowRoot' ) . uncheck ( )
869884 await page . locator ( '#style-mode' ) . selectOption ( 'sass' )
870885 await expect ( page . locator ( '#status' ) ) . toHaveText ( 'Rendered' )
871886 await expectPreviewHasRenderedContent ( page )
0 commit comments