@@ -40,4 +40,122 @@ test.describe("LLM Provider Management", () => {
4040 page . locator ( 'input[value="http://localhost:3001"]' ) ,
4141 ) . toBeVisible ( ) ;
4242 } ) ;
43+
44+ test ( "should add two providers" , async ( { page } ) => {
45+ await expect ( page ) . toHaveTitle ( / m o d A I / ) ;
46+ await page . getByText ( "Global Settings" ) . click ( ) ;
47+ await page . getByText ( "LLM Providers" ) . click ( ) ;
48+
49+ // Add first provider
50+ await page . getByText ( "Add Provider" ) . click ( ) ;
51+ await page . getByLabel ( "Provider Name" ) . fill ( "Provider One" ) ;
52+ await page . getByLabel ( "Base URL" ) . fill ( "http://localhost:3001" ) ;
53+ await page . getByLabel ( "API Key" ) . fill ( "key1" ) ;
54+ await page . getByText ( "Create Provider" ) . click ( ) ;
55+ await expect ( page . getByText ( "Add Provider" ) ) . toBeVisible ( ) ;
56+ await expect ( page . getByText ( "Provider One" ) ) . toBeVisible ( ) ;
57+
58+ // Add second provider
59+ await page . getByText ( "Add Provider" ) . click ( ) ;
60+ await page . getByLabel ( "Provider Name" ) . fill ( "Provider Two" ) ;
61+ await page . getByLabel ( "Base URL" ) . fill ( "http://localhost:3002" ) ;
62+ await page . getByLabel ( "API Key" ) . fill ( "key2" ) ;
63+ await page . getByText ( "Create Provider" ) . click ( ) ;
64+ await expect ( page . getByText ( "Add Provider" ) ) . toBeVisible ( ) ;
65+ await expect ( page . getByText ( "Provider Two" ) ) . toBeVisible ( ) ;
66+
67+ // Verify both are there
68+ await expect ( page . getByText ( "Provider One" ) ) . toBeVisible ( ) ;
69+ await expect ( page . getByText ( "Provider Two" ) ) . toBeVisible ( ) ;
70+ } ) ;
71+
72+ test ( "should not add provider with duplicate name" , async ( { page } ) => {
73+ await expect ( page ) . toHaveTitle ( / m o d A I / ) ;
74+ await page . getByText ( "Global Settings" ) . click ( ) ;
75+ await page . getByText ( "LLM Providers" ) . click ( ) ;
76+
77+ // Add first provider
78+ await page . getByText ( "Add Provider" ) . click ( ) ;
79+ await page . getByLabel ( "Provider Name" ) . fill ( "Duplicate Provider" ) ;
80+ await page . getByLabel ( "Base URL" ) . fill ( "http://localhost:3001" ) ;
81+ await page . getByLabel ( "API Key" ) . fill ( "key1" ) ;
82+ await page . getByText ( "Create Provider" ) . click ( ) ;
83+ await expect ( page . getByText ( "Add Provider" ) ) . toBeVisible ( ) ;
84+ await expect ( page . getByText ( "Duplicate Provider" ) ) . toBeVisible ( ) ;
85+
86+ // Add another with same name (should work in no-backend mode)
87+ await page . getByText ( "Add Provider" ) . click ( ) ;
88+ await page . getByLabel ( "Provider Name" ) . fill ( "Duplicate Provider" ) ;
89+ await page . getByLabel ( "Base URL" ) . fill ( "http://localhost:3002" ) ;
90+ await page . getByLabel ( "API Key" ) . fill ( "key2" ) ;
91+ await page . getByText ( "Create Provider" ) . click ( ) ;
92+
93+ // Expect two providers with same name
94+ await expect ( page . getByText ( "Provider with name 'Duplicate Provider' already exists" ) ) . toBeVisible ( ) ;
95+ } ) ;
96+
97+ test ( "should update a provider" , async ( { page } ) => {
98+ await expect ( page ) . toHaveTitle ( / m o d A I / ) ;
99+ await page . getByText ( "Global Settings" ) . click ( ) ;
100+ await page . getByText ( "LLM Providers" ) . click ( ) ;
101+
102+ // Add provider
103+ await page . getByText ( "Add Provider" ) . click ( ) ;
104+ await page . getByLabel ( "Provider Name" ) . fill ( "Update Provider" ) ;
105+ await page . getByLabel ( "Base URL" ) . fill ( "http://localhost:3001" ) ;
106+ await page . getByLabel ( "API Key" ) . fill ( "key1" ) ;
107+ await page . getByText ( "Create Provider" ) . click ( ) ;
108+ await expect ( page . getByText ( "Add Provider" ) ) . toBeVisible ( ) ;
109+ await expect ( page . getByText ( "Update Provider" ) ) . toBeVisible ( ) ;
110+
111+ // Click on the provider to edit
112+ await page . getByText ( "Update Provider" ) . click ( ) ;
113+
114+ // Modify fields
115+ await page . getByLabel ( "Base URL" ) . fill ( "http://localhost:3003" ) ;
116+ await page . getByLabel ( "API Key" ) . fill ( "updated-key" ) ;
117+
118+ // Click update button
119+ await page . getByText ( "Save" ) . click ( ) ;
120+
121+ // Verify updated - go back and check
122+ await expect ( page . getByText ( "Add Provider" ) ) . toBeVisible ( ) ;
123+ await page . getByText ( "Update Provider" ) . click ( ) ;
124+ await expect (
125+ page . locator ( 'input[value="http://localhost:3003"]' ) ,
126+ ) . toBeVisible ( ) ;
127+ } ) ;
128+
129+ test ( "should delete a provider" , async ( { page } ) => {
130+ await expect ( page ) . toHaveTitle ( / m o d A I / ) ;
131+ await page . getByText ( "Global Settings" ) . click ( ) ;
132+ await page . getByText ( "LLM Providers" ) . click ( ) ;
133+
134+ // Add provider
135+ await page . getByText ( "Add Provider" ) . click ( ) ;
136+ await page . getByLabel ( "Provider Name" ) . fill ( "Delete Provider" ) ;
137+ await page . getByLabel ( "Base URL" ) . fill ( "http://localhost:3001" ) ;
138+ await page . getByLabel ( "API Key" ) . fill ( "key1" ) ;
139+ await page . getByText ( "Create Provider" ) . click ( ) ;
140+ await expect ( page . getByText ( "Add Provider" ) ) . toBeVisible ( ) ;
141+ await expect ( page . getByText ( "Delete Provider" ) ) . toBeVisible ( ) ;
142+
143+ // Click on provider to see delete option
144+ await page . getByText ( "Delete Provider" ) . click ( ) ;
145+
146+ // Click delete button (the one with trash icon)
147+ await page
148+ . locator ( "button" )
149+ . filter ( { has : page . locator ( ".lucide-trash2" ) } )
150+ . click ( ) ;
151+
152+ // Click the delete button in the confirmation dialog
153+ await page
154+ . getByRole ( "alertdialog" )
155+ . getByText ( "Delete" , { exact : true } )
156+ . click ( ) ;
157+
158+ // Verify gone
159+ await expect ( page . getByText ( "Delete Provider" ) ) . not . toBeVisible ( ) ;
160+ } ) ;
43161} ) ;
0 commit comments