1
+ /*
2
+ Copyright 2025 The Karmada Authors.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+
17
+ import { test , expect } from '@playwright/test' ;
18
+ import { setupDashboardAuthentication , generateTestMemberClusterResourceYaml , createK8sMemberCluster , getMemberClusterNameFromResourceYaml , deleteK8sMemberCluster } from './test-utils' ;
19
+
20
+ test . beforeEach ( async ( { page } ) => {
21
+ await setupDashboardAuthentication ( page ) ;
22
+ } ) ;
23
+
24
+ test ( 'should edit member cluster successfully' , async ( { page } ) => {
25
+ // Create a test member cluster directly via API to set up test data
26
+ const testMemberClusterYaml = generateTestMemberClusterResourceYaml ( ) ;
27
+ const memberClusterName = getMemberClusterNameFromResourceYaml ( testMemberClusterYaml ) ;
28
+
29
+ // Setup: Create member cluster using API
30
+ await createK8sMemberCluster ( testMemberClusterYaml ) ;
31
+
32
+ // Open Member Clusters menu
33
+ await page . click ( 'text=Member Clusters' ) ;
34
+
35
+ // Verify table is visible
36
+ await expect ( page . locator ( 'table' ) ) . toBeVisible ( { timeout : 30000 } ) ;
37
+
38
+ // Wait for member cluster to appear in list
39
+ const table = page . locator ( 'table' ) ;
40
+ await expect ( table . locator ( `text=${ memberClusterName } ` ) ) . toBeVisible ( { timeout : 30000 } ) ;
41
+
42
+ // Find row containing test member cluster name
43
+ const targetRow = page . locator ( `table tbody tr:has-text("${ memberClusterName } ")` ) ;
44
+ await expect ( targetRow ) . toBeVisible ( { timeout : 15000 } ) ;
45
+
46
+ // Find Edit button in that row and click
47
+ const editButton = targetRow . getByText ( 'Edit' ) ;
48
+ await expect ( editButton ) . toBeVisible ( { timeout : 15000 } ) ;
49
+
50
+ // Listen for update API call
51
+ const updateApiPromise = page . waitForResponse ( response => {
52
+ return response . url ( ) . includes ( `/cluster/${ memberClusterName } ` ) &&
53
+ response . request ( ) . method ( ) === 'PUT' &&
54
+ response . status ( ) === 200 ;
55
+ } , { timeout : 15000 } ) ;
56
+
57
+ await editButton . click ( ) ;
58
+
59
+ // Wait for edit dialog to appear
60
+ await expect ( page . locator ( '[role="dialog"]' ) ) . toBeVisible ( { timeout : 10000 } ) ;
61
+
62
+ // Verify the dialog title
63
+ await expect ( page . locator ( 'text=Edit Cluster' ) ) . toBeVisible ( ) ;
64
+
65
+ // Verify name field is populated and disabled
66
+ const nameField = page . getByRole ( 'textbox' , { name : '* Name :' } ) ;
67
+ await expect ( nameField ) . toHaveValue ( memberClusterName ) ;
68
+
69
+ // Modify cluster taint
70
+ const taintKeyField = page . getByRole ( 'textbox' , { name : 'Please output the key of the point' } ) ;
71
+ const taintValueField = page . getByRole ( 'textbox' , { name : 'Please output the value of the point' } ) ;
72
+
73
+ if ( await taintKeyField . isVisible ( ) && await taintValueField . isVisible ( ) ) {
74
+ try {
75
+ await taintKeyField . clear ( ) ;
76
+ await taintKeyField . fill ( 'test-key' ) ;
77
+ await taintValueField . fill ( 'test-value' ) ;
78
+ } catch ( error ) {
79
+ // Continue with form submission if taint modification fails
80
+ }
81
+ }
82
+
83
+ // Click Submit button
84
+ const submitButton = page . locator ( '[role="dialog"] button:has-text("Submit")' ) ;
85
+ await expect ( submitButton ) . toBeVisible ( { timeout : 5000 } ) ;
86
+ await submitButton . click ( ) ;
87
+
88
+ // Wait for the update API call to complete
89
+ await updateApiPromise ;
90
+
91
+ // Cleanup: Delete the created member cluster
92
+ try {
93
+ await deleteK8sMemberCluster ( memberClusterName ) ;
94
+ } catch ( error ) {
95
+ console . warn ( `Failed to cleanup member cluster ${ memberClusterName } :` , error ) ;
96
+ }
97
+
98
+ // Debug
99
+ if ( process . env . DEBUG === 'true' ) {
100
+ await page . screenshot ( { path : 'debug-membercluster-edit.png' , fullPage : true } ) ;
101
+ }
102
+
103
+ } ) ;
0 commit comments