1+ import { test , expect } from '@playwright/test' ;
2+ import { waitForStatusText } from '../utils' ;
3+ import path from 'path' ;
4+
5+ const trainDataset = path . resolve ( __dirname , '../../test-files/toy_finetune_data.jsonl' ) ;
6+
7+ async function setupResponseListener ( page , apiResponse ) {
8+ page . on ( 'response' , async ( response ) => {
9+ if ( response . url ( ) . includes ( '/v1/app-backend' ) && response . request ( ) . method ( ) === 'POST' ) {
10+ const contentType = response . headers ( ) [ 'content-type' ] ;
11+ if ( contentType . includes ( 'text/event-stream' ) ) {
12+ const responseBody = await response . text ( ) ;
13+ // Parse SSE stream
14+ const events = responseBody . split ( '\n\n' ) ;
15+ for ( const event of events ) {
16+ const lines = event . split ( '\n' ) ;
17+ for ( const line of lines ) {
18+ if ( line . startsWith ( 'data: ' ) ) {
19+ const cleanedData = line . slice ( 6 , - 1 ) . trim ( ) ; // Remove 'data: ' prefix
20+ apiResponse . value += cleanedData + " " ;
21+ }
22+ }
23+ }
24+ } else {
25+ console . error ( 'Response is not SSE' ) ;
26+ }
27+ }
28+ } ) ;
29+ }
30+
31+ test ( '006_test_funetuning_embedding' , async ( { browser, baseURL } ) => {
32+ test . setTimeout ( 1200000 ) ;
33+ let apiResponse = { value : '' } ;
34+ const context = await browser . newContext ( {
35+ ignoreHTTPSErrors : true ,
36+ recordVideo : {
37+ dir : './videos/' ,
38+ size : { width : 1280 , height : 720 }
39+ }
40+ } ) ;
41+ const page = await context . newPage ( ) ;
42+ const IDC_URL = baseURL || ""
43+ await page . goto ( IDC_URL ) ;
44+ await page . getByLabel ( 'Username or email' ) . fill ( '[email protected] ' ) ; 45+ await page . getByLabel ( 'Password' , { exact : true } ) . click ( ) ;
46+ await page . getByLabel ( 'Password' , { exact : true } ) . fill ( 'test' ) ;
47+ await page . getByRole ( 'button' , { name : 'Sign In' } ) . click ( ) ;
48+ await page . getByRole ( 'button' , { name : 'Fine-tuning' } ) . click ( ) ;
49+ await page . getByRole ( 'button' , { name : 'Create New Job' } ) . click ( ) ;
50+ await page . getByRole ( 'combobox' , { name : 'Base Model' } ) . click ( ) ;
51+ await page . getByRole ( 'option' , { name : 'BAAI/bge-base-en-v1.5' } ) . click ( ) ;
52+ await page . getByText ( 'Instruction Tuning' ) . click ( ) ;
53+ await page . getByRole ( 'option' , { name : 'Embedding' } ) . click ( ) ;
54+ let fileChooserPromise = page . waitForEvent ( 'filechooser' ) ;
55+ await page . getByRole ( 'button' , { name : 'Choose File' } ) . click ( ) ;
56+ let fileChooser = await fileChooserPromise ;
57+ await fileChooser . setFiles ( trainDataset ) ;
58+ await page . waitForTimeout ( 5000 ) ;
59+ await page . getByRole ( 'button' , { name : 'Create Job' } ) . click ( ) ;
60+ await page . waitForTimeout ( 20000 ) ;
61+ await expect ( page . getByRole ( 'cell' , { name : 'running' } ) ) . toHaveText ( 'running' ) ;
62+ await expect ( page . locator ( 'div' ) . filter ( { hasText : 'Fine-tuning JobsCreate New' } ) . nth ( 3 ) ) . toContainText ( 'embedding' ) ;
63+ await waitForStatusText ( page , 'td.MuiTableCell-root div.MuiChip-root' , 'succeeded' , 20 , 60000 ) ;
64+
65+ await page . locator ( 'button' ) . nth ( 5 ) . click ( ) ;
66+ await page . getByRole ( 'menuitem' , { name : 'Delete Job' } ) . click ( ) ;
67+
68+ } ) ;
0 commit comments