Skip to content

Commit 3fd6964

Browse files
committed
allow specifying a admin api specific user
1 parent a62657e commit 3fd6964

File tree

7 files changed

+58
-18
lines changed

7 files changed

+58
-18
lines changed

packages/plugin-e2e/playwright.config.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ export default defineConfig<PluginOptions>({
2525

2626
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
2727
trace: 'on-first-retry',
28+
grafanaAPIUser: {
29+
user: 'admin',
30+
password: 'admin',
31+
},
2832
httpCredentials: {
2933
username: 'admin',
3034
password: 'admin',
@@ -41,6 +45,13 @@ export default defineConfig<PluginOptions>({
4145
name: 'authenticate',
4246
testDir: './src/auth',
4347
testMatch: [/.*auth\.setup\.ts/],
48+
use: {
49+
user: {
50+
user: 'admin',
51+
password: 'admin',
52+
userExists: true,
53+
},
54+
},
4455
},
4556
// Login to Grafana with new user with viewer role and store the cookie on disk for use in other tests
4657
{

packages/plugin-e2e/src/auth/auth.setup.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { test as setup } from '../';
22

33
setup('authenticate', async ({ login, createUser, user }) => {
4-
if (user) {
4+
if (user && !user.skipCreateUser) {
55
await createUser();
66
}
77
await login();

packages/plugin-e2e/src/fixtures/commands/createUser.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
11
import { APIRequestContext, expect, TestFixture } from '@playwright/test';
2-
import { PlaywrightArgs } from '../../types';
2+
import { PlaywrightArgs, User } from '../../types';
33

44
type CreateUserFixture = TestFixture<() => Promise<void>, PlaywrightArgs>;
55

6-
const headers = {
7-
Authorization: `Basic ${Buffer.from(`admin:admin`).toString('base64')}`,
8-
};
6+
const getHeaders = (user: User) => ({
7+
Authorization: `Basic ${Buffer.from(`${user.user}:${user.password}`).toString('base64')}`,
8+
});
99

10-
const getUserIdByUsername = async (request: APIRequestContext, userName: string): Promise<number> => {
10+
const getUserIdByUsername = async (
11+
request: APIRequestContext,
12+
userName: string,
13+
grafanaAPIUser: User
14+
): Promise<number> => {
1115
const getUserIdByUserNameReq = await request.get(`/api/users/lookup?loginOrEmail=${userName}`, {
12-
headers,
16+
headers: getHeaders(grafanaAPIUser),
1317
});
1418
expect(getUserIdByUserNameReq.ok()).toBeTruthy();
1519
const json = await getUserIdByUserNameReq.json();
1620
return json.id;
1721
};
1822

19-
export const createUser: CreateUserFixture = async ({ request, user }, use) => {
23+
export const createUser: CreateUserFixture = async ({ request, user, grafanaAPIUser }, use) => {
2024
await use(async () => {
2125
if (!user) {
2226
throw new Error('Playwright option `User` was not provided');
@@ -28,7 +32,7 @@ export const createUser: CreateUserFixture = async ({ request, user }, use) => {
2832
login: user?.user,
2933
password: user?.password,
3034
},
31-
headers,
35+
headers: getHeaders(grafanaAPIUser),
3236
});
3337

3438
let userId: number | undefined;
@@ -37,15 +41,15 @@ export const createUser: CreateUserFixture = async ({ request, user }, use) => {
3741
userId = respJson.id;
3842
} else if (createUserReq.status() === 412) {
3943
// user already exists
40-
userId = await getUserIdByUsername(request, user?.user);
44+
userId = await getUserIdByUsername(request, user?.user, grafanaAPIUser);
4145
} else {
4246
throw new Error(`Could not create user '${user?.user}': ${await createUserReq.text()}`);
4347
}
4448

4549
if (user.role) {
4650
const updateRoleReq = await request.patch(`/api/org/users/${userId}`, {
4751
data: { role: user.role },
48-
headers,
52+
headers: getHeaders(grafanaAPIUser),
4953
});
5054
const updateRoleReqText = await updateRoleReq.text();
5155
expect(

packages/plugin-e2e/src/fixtures/commands/gotoDataSourceConfigPage.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ import { DataSourceConfigPage } from '../../models/pages/DataSourceConfigPage';
55
type GotoDataSourceConfigPageFixture = TestFixture<(uid: string) => Promise<DataSourceConfigPage>, PlaywrightArgs>;
66

77
export const gotoDataSourceConfigPage: GotoDataSourceConfigPageFixture = async (
8-
{ request, page, selectors, grafanaVersion },
8+
{ request, page, selectors, grafanaVersion, grafanaAPIUser },
99
use,
1010
testInfo
1111
) => {
1212
await use(async (uid) => {
1313
const response = await request.get(`/api/datasources/uid/${uid}`, {
1414
headers: {
1515
// here we call backend as admin user and not on behalf of the logged in user as it might not have required permissions
16-
Authorization: `Basic ${Buffer.from(`admin:admin`).toString('base64')}`,
16+
Authorization: `Basic ${Buffer.from(`${grafanaAPIUser.user}:${grafanaAPIUser.password}`).toString('base64')}`,
1717
},
1818
});
1919
if (!response.ok()) {

packages/plugin-e2e/src/fixtures/commands/login.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import path from 'path';
22
import { expect, TestFixture } from '@playwright/test';
3-
import { PlaywrightArgs } from '../../types';
3+
import { PlaywrightArgs, User } from '../../types';
44

55
type LoginFixture = TestFixture<() => Promise<void>, PlaywrightArgs>;
66

7-
const ADMIN_USER = { user: 'admin', password: 'admin' };
7+
export const DEFAULT_ADMIN_USER: User = { user: 'admin', password: 'admin' };
88

99
export const login: LoginFixture = async ({ request, user }, use) => {
1010
await use(async () => {
11-
const data = user ?? ADMIN_USER;
11+
const data = user ?? DEFAULT_ADMIN_USER;
1212
const loginReq = await request.post('/login', { data });
1313
const text = await loginReq.text();
1414
expect.soft(loginReq.ok(), `Could not log in to Grafana: ${text}`).toBeTruthy();

packages/plugin-e2e/src/options.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import path = require('path');
22
import { Fixtures } from '@playwright/test';
33
import { PluginOptions } from './types';
4+
import { DEFAULT_ADMIN_USER } from './fixtures/commands/login';
45

56
export const options: Fixtures<{}, PluginOptions> = {
67
user: [undefined, { option: true, scope: 'worker' }],
78
featureToggles: [{}, { option: true, scope: 'worker' }],
89
provisioningRootDir: [path.join(process.cwd(), 'provisioning'), { option: true, scope: 'worker' }],
10+
grafanaAPIUser: [DEFAULT_ADMIN_USER, { option: true, scope: 'worker' }],
911
};

packages/plugin-e2e/src/types.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,13 @@ export type PluginOptions = {
6262
* You can use different users for different projects. See the fixture createUser for more information on how to create a user,
6363
* and the fixture login for more information on how to authenticate. Also see https://grafana.com/developers/plugin-tools/e2e-test-a-plugin/use-authentication
6464
*/
65-
user?: CreateUserArgs;
65+
user?: UserArgs;
66+
67+
/**
68+
* The user to use when making requests to the Grafana API. For example when creating users, fetching data sources etc.
69+
* If no user is provided, the server default admin/admin user will be used.
70+
*/
71+
grafanaAPIUser: User;
6672
};
6773

6874
export type PluginFixture = {
@@ -301,7 +307,7 @@ export interface Dashboard {
301307
title?: string;
302308
}
303309

304-
export type CreateUserArgs = {
310+
export type UserArgs = {
305311
/**
306312
* The username of the user to create. Needs to be unique
307313
*/
@@ -314,6 +320,23 @@ export type CreateUserArgs = {
314320
* The role of the user to create
315321
*/
316322
role?: OrgRole;
323+
324+
/**
325+
* Set this to true if the user already exist in the database. If omitted or set to false, the user will be created.
326+
*/
327+
skipCreateUser?: boolean;
328+
};
329+
330+
export type User = {
331+
/**
332+
* The username of the user
333+
*/
334+
user: string;
335+
336+
/**
337+
* The passwords
338+
*/
339+
password: string;
317340
};
318341

319342
export type CreateDataSourceArgs<T = any> = {

0 commit comments

Comments
 (0)