mirror of
https://github.com/elastic/kibana.git
synced 2025-06-27 18:51:07 -04:00
## Summary Fixes https://github.com/elastic/kibana/issues/149132 This PR adds a Kibana feature for the guided onboarding plugin for better permissions handling. By default `kibana_admin` and `editor` roles are granted access to guided onboarding. The role `viewer` on the other hand doesn't have enough permissions to see or use guided onboarding. For any roles that don't have the correct permissions, guided onboarding is completely disabled, the same as it's disabled on-prem. When creating a new role, the feature "Setup guides" can be enabled or disabled. ### How to test 1. Add `xpack.cloud.id: 'testID'` to `/config/kibana.dev.yml` 1. Start ES with `yarn es snapshot` and Kibana with `yarn start`` 2. Login as elastic and create a test user with the role `viewer` 3. Clear everything from your browser's local storage 4. Login as the test user and check the following - On the first visit, the "on-prem" welcome message is shown (not the guided onboarding landing page) - The url `/app/home#/getting_started` is unknown and redirects back to the home page - There is no button "Setup guides" in the header - There is no link "Setup guides" in the help menu ### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
125 lines
5.5 KiB
TypeScript
125 lines
5.5 KiB
TypeScript
/*
|
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
* or more contributor license agreements. Licensed under the Elastic License
|
|
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
* 2.0.
|
|
*/
|
|
|
|
import { maybeAddCloudLinksMock } from './plugin.test.mocks';
|
|
import { CloudLinksPlugin } from './plugin';
|
|
import { coreMock } from '@kbn/core/public/mocks';
|
|
import { cloudMock } from '@kbn/cloud-plugin/public/mocks';
|
|
import { securityMock } from '@kbn/security-plugin/public/mocks';
|
|
import { guidedOnboardingMock } from '@kbn/guided-onboarding-plugin/public/mocks';
|
|
|
|
describe('Cloud Links Plugin - public', () => {
|
|
let plugin: CloudLinksPlugin;
|
|
|
|
beforeEach(() => {
|
|
plugin = new CloudLinksPlugin();
|
|
});
|
|
|
|
afterEach(() => {
|
|
maybeAddCloudLinksMock.mockReset();
|
|
});
|
|
|
|
describe('start', () => {
|
|
beforeEach(() => {
|
|
plugin.setup();
|
|
});
|
|
|
|
afterEach(() => {
|
|
plugin.stop();
|
|
});
|
|
|
|
describe('Onboarding Setup Guide link registration', () => {
|
|
describe('guided onboarding is enabled', () => {
|
|
const guidedOnboarding = guidedOnboardingMock.createStart();
|
|
test('registers the Onboarding Setup Guide link when cloud and guided onboarding is enabled and it is an authenticated page', () => {
|
|
const coreStart = coreMock.createStart();
|
|
coreStart.http.anonymousPaths.isAnonymous.mockReturnValue(false);
|
|
const cloud = { ...cloudMock.createStart(), isCloudEnabled: true };
|
|
|
|
plugin.start(coreStart, { cloud, guidedOnboarding });
|
|
expect(coreStart.chrome.registerGlobalHelpExtensionMenuLink).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
test('does not register the Onboarding Setup Guide link when cloud is enabled but it is an unauthenticated page', () => {
|
|
const coreStart = coreMock.createStart();
|
|
coreStart.http.anonymousPaths.isAnonymous.mockReturnValue(true);
|
|
const cloud = { ...cloudMock.createStart(), isCloudEnabled: true };
|
|
plugin.start(coreStart, { cloud, guidedOnboarding });
|
|
expect(coreStart.chrome.registerGlobalHelpExtensionMenuLink).not.toHaveBeenCalled();
|
|
});
|
|
|
|
test('does not register the Onboarding Setup Guide link when cloud is not enabled', () => {
|
|
const coreStart = coreMock.createStart();
|
|
const cloud = { ...cloudMock.createStart(), isCloudEnabled: false };
|
|
plugin.start(coreStart, { cloud, guidedOnboarding });
|
|
expect(coreStart.chrome.registerGlobalHelpExtensionMenuLink).not.toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
test('do not register the Onboarding Setup Guide link when guided onboarding is disabled', () => {
|
|
let { guidedOnboardingApi } = guidedOnboardingMock.createStart();
|
|
guidedOnboardingApi = {
|
|
...guidedOnboardingApi!,
|
|
isEnabled: false,
|
|
};
|
|
const guidedOnboarding = { guidedOnboardingApi };
|
|
|
|
const coreStart = coreMock.createStart();
|
|
coreStart.http.anonymousPaths.isAnonymous.mockReturnValue(false);
|
|
const cloud = { ...cloudMock.createStart(), isCloudEnabled: true };
|
|
|
|
plugin.start(coreStart, { cloud, guidedOnboarding });
|
|
expect(coreStart.chrome.registerGlobalHelpExtensionMenuLink).not.toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
describe('maybeAddCloudLinks', () => {
|
|
test('calls maybeAddCloudLinks when cloud and security are enabled and it is an authenticated page', () => {
|
|
const coreStart = coreMock.createStart();
|
|
coreStart.http.anonymousPaths.isAnonymous.mockReturnValue(false);
|
|
const cloud = { ...cloudMock.createStart(), isCloudEnabled: true };
|
|
const security = securityMock.createStart();
|
|
plugin.start(coreStart, { cloud, security });
|
|
expect(maybeAddCloudLinksMock).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
test('does not call maybeAddCloudLinks when security is disabled', () => {
|
|
const coreStart = coreMock.createStart();
|
|
coreStart.http.anonymousPaths.isAnonymous.mockReturnValue(false);
|
|
const cloud = { ...cloudMock.createStart(), isCloudEnabled: true };
|
|
plugin.start(coreStart, { cloud });
|
|
expect(maybeAddCloudLinksMock).toHaveBeenCalledTimes(0);
|
|
});
|
|
|
|
test('does not call maybeAddCloudLinks when the page is anonymous', () => {
|
|
const coreStart = coreMock.createStart();
|
|
coreStart.http.anonymousPaths.isAnonymous.mockReturnValue(true);
|
|
const cloud = { ...cloudMock.createStart(), isCloudEnabled: true };
|
|
const security = securityMock.createStart();
|
|
plugin.start(coreStart, { cloud, security });
|
|
expect(maybeAddCloudLinksMock).toHaveBeenCalledTimes(0);
|
|
});
|
|
|
|
test('does not call maybeAddCloudLinks when cloud is disabled', () => {
|
|
const coreStart = coreMock.createStart();
|
|
coreStart.http.anonymousPaths.isAnonymous.mockReturnValue(false);
|
|
const security = securityMock.createStart();
|
|
plugin.start(coreStart, { security });
|
|
expect(maybeAddCloudLinksMock).toHaveBeenCalledTimes(0);
|
|
});
|
|
|
|
test('does not call maybeAddCloudLinks when isCloudEnabled is false', () => {
|
|
const coreStart = coreMock.createStart();
|
|
coreStart.http.anonymousPaths.isAnonymous.mockReturnValue(false);
|
|
const cloud = { ...cloudMock.createStart(), isCloudEnabled: false };
|
|
const security = securityMock.createStart();
|
|
plugin.start(coreStart, { cloud, security });
|
|
expect(maybeAddCloudLinksMock).toHaveBeenCalledTimes(0);
|
|
});
|
|
});
|
|
});
|
|
});
|