11import { test , expect , Page } from '@playwright/test' ;
22
33const GRAFANA_CLIENT = 'grafana-client' ;
4- const EXPORT_DATA = 'Explore data ' ;
4+ const EXPLORE_DATA = 'Explore' ;
55
66async function login ( page : Page ) {
77 await page . goto ( 'http://localhost:3000/login' ) ;
8- await page . getByTestId ( 'data-testid Username input field ') . fill ( 'admin' ) ;
9- await page . getByTestId ( 'data-testid Password input field ') . fill ( 'admin' ) ;
10- await page . getByTestId ( 'data-testid Login button') . click ( ) ;
11- await page . getByTestId ( 'data-testid Skip change password button' ) . click ( ) ;
8+ await page . getByPlaceholder ( 'email or username ') . fill ( 'admin' ) ;
9+ await page . getByPlaceholder ( 'password ') . fill ( 'admin' ) ;
10+ await page . getByRole ( 'button' , { name : ' Login button' } ) . or ( page . getByRole ( 'button' , { name : 'Log in' } ) ) . click ( ) ;
11+ await page . getByRole ( 'button' , { name : / s k i p / i } ) . click ( ) ;
1212}
1313
1414async function goToTrinoSettings ( page : Page ) {
15- await page . getByTestId ( 'data-testid Toggle menu' ) . click ( ) ;
16- await page . getByRole ( 'link' , { name : ' Connections'} ) . click ( ) ;
17- await page . getByRole ( 'link' , { name : 'Trino' } ) . click ( ) ;
18- await page . locator ( '.css-1yhi3xa ') . click ( ) ;
19- await page . getByRole ( 'button' , { name : 'Add new data source' } ) . click ( ) ;
15+ await page . getByRole ( 'button' , { name : / t o g g l e m e n u | o p e n m e n u / i } ) . click ( ) ;
16+ await page . getByText ( ' Connections') . click ( ) ;
17+ await page . getByText ( / a d d . * c o n n e c t i o n | c o n n e c t d a t a / i ) . first ( ) . click ( ) ;
18+ await page . getByText ( 'Trino ') . click ( ) ;
19+ await page . getByRole ( 'button' , { name : / a d d n e w d a t a s o u r c e | c r e a t e . * t r i n o . * d a t a s o u r c e / i } ) . click ( ) ;
2020}
2121
2222async function setupDataSourceWithAccessToken ( page : Page ) {
23- await page . getByTestId ( 'data-testid Datasource HTTP settings url ') . fill ( 'http://trino:8080' ) ;
24- await page . locator ( 'div' ) . filter ( { hasText : / ^ I m p e r s o n a t e l o g g e d i n u s e r $ / } ) . getByLabel ( 'Toggle switch' ) . click ( ) ;
23+ await page . getByPlaceholder ( 'http://localhost:8080 ') . fill ( 'http://trino:8080' ) ;
24+ await page . locator ( 'label[for="trino-settings-enable-impersonation"][aria-label="Toggle switch"], label[for="trino-settings-enable-impersonation"]:has(svg)' ) . first ( ) . click ( ) ;
2525 await page . locator ( 'div' ) . filter ( { hasText : / ^ A c c e s s t o k e n $ / } ) . locator ( 'input[type="password"]' ) . fill ( 'aaa' ) ;
26- await page . getByTestId ( 'data-testid Data source settings page Save and Test button' ) . click ( ) ;
26+ await page . getByRole ( 'button' , { name : / s a v e . * t e s t / i } ) . click ( ) ;
2727}
2828
2929async function setupDataSourceWithClientCredentials ( page : Page , clientId : string ) {
30- await page . getByTestId ( 'data-testid Datasource HTTP settings url ') . fill ( 'http://trino:8080' ) ;
30+ await page . getByPlaceholder ( 'http://localhost:8080 ') . fill ( 'http://trino:8080' ) ;
3131 await page . locator ( 'div' ) . filter ( { hasText : / ^ T o k e n U R L $ / } ) . locator ( 'input' ) . fill ( 'http://keycloak:8080/realms/trino-realm/protocol/openid-connect/token' ) ;
3232 await page . locator ( 'div' ) . filter ( { hasText : / ^ C l i e n t i d $ / } ) . locator ( 'input' ) . fill ( clientId ) ;
3333 await page . locator ( 'div' ) . filter ( { hasText : / ^ C l i e n t s e c r e t $ / } ) . locator ( 'input[type="password"]' ) . fill ( 'grafana-secret' ) ;
3434 await page . locator ( 'div' ) . filter ( { hasText : / ^ I m p e r s o n a t i o n u s e r $ / } ) . locator ( 'input' ) . fill ( 'service-account-grafana-client' ) ;
35- await page . getByTestId ( 'data-testid Data source settings page Save and Test button' ) . click ( ) ;
35+ await page . getByRole ( 'button' , { name : / s a v e .* t e s t / i } ) . click ( ) ;
36+ }
37+
38+ async function runQueryAndCheckResults ( page : Page ) {
39+ await page . getByText ( EXPLORE_DATA ) . click ( ) ;
40+ await page . locator ( 'textarea[aria-label*="Editor content"]' ) . click ( ) ;
41+ await page . getByTestId ( 'data-testid TimePicker Open Button' ) . click ( ) ;
42+ const timeInputs = page . locator ( 'input[value*="now"], input[value*="00:00:00"]' ) ;
43+ await timeInputs . first ( ) . fill ( '1995-01-01' ) ;
44+ await timeInputs . last ( ) . fill ( '1995-12-31' ) ;
45+ await page . getByTestId ( 'data-testid TimePicker submit button' ) . click ( ) ;
46+ await page . locator ( '[role="combobox"][aria-label="Format as"]' ) . click ( ) ;
47+ await page . locator ( '[id^="react-select"][id$="option-1"]' ) . waitFor ( ) ;
48+ await page . locator ( '[id^="react-select"][id$="option-1"]' ) . click ( ) ;
49+ await expect ( page . locator ( '[role="table"][aria-label="Explore Table"]' ) . getByText ( / 1 9 9 5 - 0 1 - \d + / ) . first ( ) ) . toBeVisible ( ) ;
3650}
3751
3852async function setupDataSourceWithClientTags ( page : Page , clientTags : string ) {
39- await page . getByTestId ( 'data-testid Datasource HTTP settings url ') . fill ( 'http://trino:8080' ) ;
40- await page . locator ( 'div' ) . filter ( { hasText : / ^ I m p e r s o n a t e l o g g e d i n u s e r $ / } ) . getByLabel ( 'Toggle switch' ) . click ( ) ;
53+ await page . getByPlaceholder ( 'http://localhost:8080 ') . fill ( 'http://trino:8080' ) ;
54+ await page . locator ( 'label[for="trino-settings-enable-impersonation"][aria-label="Toggle switch"], label[for="trino-settings-enable-impersonation"]:has(svg)' ) . first ( ) . click ( ) ;
4155 await page . locator ( 'div' ) . filter ( { hasText : / ^ A c c e s s t o k e n $ / } ) . locator ( 'input[type="password"]' ) . fill ( 'aaa' ) ;
4256 await page . locator ( 'div' ) . filter ( { hasText : / ^ C l i e n t T a g s $ / } ) . locator ( 'input' ) . fill ( clientTags ) ;
43- await page . getByTestId ( 'data-testid Data source settings page Save and Test button' ) . click ( ) ;
57+ await page . getByRole ( 'button' , { name : / s a v e . * t e s t / i } ) . click ( ) ;
4458}
4559
46- async function runQueryAndCheckResults ( page : Page ) {
47- await page . getByLabel ( EXPORT_DATA ) . click ( ) ;
48- await page . getByTestId ( 'data-testid TimePicker Open Button' ) . click ( ) ;
49- await page . getByTestId ( 'data-testid Time Range from field' ) . fill ( '1995-01-01' ) ;
50- await page . getByTestId ( 'data-testid Time Range to field' ) . fill ( '1995-12-31' ) ;
51- await page . getByTestId ( 'data-testid TimePicker submit button' ) . click ( ) ;
52- await page . locator ( 'div' ) . filter ( { hasText : / ^ F o r m a t a s C h o o s e $ / } ) . locator ( 'svg' ) . click ( ) ;
53- await page . getByRole ( 'option' , { name : 'Table' } ) . click ( ) ;
54- await page . getByTestId ( 'data-testid Code editor container' ) . click ( ) ;
55- await page . getByTestId ( 'data-testid RefreshPicker run button' ) . click ( ) ;
56- await expect ( page . getByTestId ( 'data-testid table body' ) ) . toContainText ( / .* 1 9 9 5 - 0 1 - 1 9 0 .: 0 0 : 0 0 5 7 0 3 8 5 7 F .* / ) ;
57- }
60+ test ( 'test client credentials flow with wrong credentials' , async ( { page } ) => {
61+ await login ( page ) ;
62+ await goToTrinoSettings ( page ) ;
63+ await setupDataSourceWithClientCredentials ( page , "some-wrong-client" ) ;
64+ await expect ( page . getByTestId ( 'data-testid Alert error' ) ) . toBeVisible ( ) ;
65+ await expect ( page . getByTestId ( 'data-testid Alert error' ) ) . toContainText ( 'Bad Request' ) ;
66+ } ) ;
5867
5968test ( 'test with access token' , async ( { page } ) => {
6069 await login ( page ) ;
@@ -70,19 +79,13 @@ test('test client credentials flow', async ({ page }) => {
7079 await runQueryAndCheckResults ( page ) ;
7180} ) ;
7281
73- test ( 'test client credentials flow with wrong credentials' , async ( { page } ) => {
74- await login ( page ) ;
75- await goToTrinoSettings ( page ) ;
76- await setupDataSourceWithClientCredentials ( page , "some-wrong-client" ) ;
77- await expect ( page . getByLabel ( EXPORT_DATA ) ) . toHaveCount ( 0 ) ;
78- } ) ;
79-
8082test ( 'test client credentials flow with configured access token' , async ( { page } ) => {
8183 await login ( page ) ;
8284 await goToTrinoSettings ( page ) ;
8385 await page . locator ( 'div' ) . filter ( { hasText : / ^ A c c e s s t o k e n $ / } ) . locator ( 'input[type="password"]' ) . fill ( 'aaa' ) ;
8486 await setupDataSourceWithClientCredentials ( page , GRAFANA_CLIENT ) ;
85- await expect ( page . getByLabel ( EXPORT_DATA ) ) . toHaveCount ( 0 ) ;
87+ await expect ( page . getByTestId ( 'data-testid Alert error' ) ) . toBeVisible ( ) ;
88+ await expect ( page . getByTestId ( 'data-testid Alert error' ) ) . toContainText ( 'Internal Server Error' ) ;
8689} ) ;
8790
8891test ( 'test with client tags' , async ( { page } ) => {
0 commit comments