Skip to content

Commit aa6785e

Browse files
authored
[7.x] Add Login Selector functional tests. (#66709)
# Conflicts: # x-pack/scripts/functional_tests.js
1 parent 3a4c86b commit aa6785e

File tree

20 files changed

+552
-131
lines changed

20 files changed

+552
-131
lines changed

test/functional/page_objects/common_page.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export function CommonPageProvider({ getService, getPageObjects }: FtrProviderCo
3434
const find = getService('find');
3535
const globalNav = getService('globalNav');
3636
const testSubjects = getService('testSubjects');
37-
const PageObjects = getPageObjects(['shield']);
37+
const PageObjects = getPageObjects(['login']);
3838

3939
const defaultTryTimeout = config.get('timeouts.try');
4040
const defaultFindTimeout = config.get('timeouts.find');
@@ -76,12 +76,12 @@ export function CommonPageProvider({ getService, getPageObjects }: FtrProviderCo
7676
if (loginPage && !wantedLoginPage) {
7777
log.debug('Found login page');
7878
if (config.get('security.disableTestUser')) {
79-
await PageObjects.shield.login(
79+
await PageObjects.login.login(
8080
config.get('servers.kibana.username'),
8181
config.get('servers.kibana.password')
8282
);
8383
} else {
84-
await PageObjects.shield.login('test_user', 'changeme');
84+
await PageObjects.login.login('test_user', 'changeme');
8585
}
8686

8787
await find.byCssSelector(

test/functional/page_objects/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import { HomePageProvider } from './home_page';
2828
import { NewsfeedPageProvider } from './newsfeed_page';
2929
import { SettingsPageProvider } from './settings_page';
3030
import { SharePageProvider } from './share_page';
31-
import { ShieldPageProvider } from './shield_page';
31+
import { LoginPageProvider } from './login_page';
3232
import { TimePickerProvider } from './time_picker';
3333
import { TimelionPageProvider } from './timelion_page';
3434
import { VisualBuilderPageProvider } from './visual_builder_page';
@@ -51,7 +51,7 @@ export const pageObjects = {
5151
newsfeed: NewsfeedPageProvider,
5252
settings: SettingsPageProvider,
5353
share: SharePageProvider,
54-
shield: ShieldPageProvider,
54+
login: LoginPageProvider,
5555
timelion: TimelionPageProvider,
5656
timePicker: TimePickerProvider,
5757
visualBuilder: VisualBuilderPageProvider,

test/functional/page_objects/shield_page.ts renamed to test/functional/page_objects/login_page.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@
1919

2020
import { FtrProviderContext } from '../ftr_provider_context';
2121

22-
export function ShieldPageProvider({ getService }: FtrProviderContext) {
22+
export function LoginPageProvider({ getService }: FtrProviderContext) {
2323
const testSubjects = getService('testSubjects');
2424

25-
class ShieldPage {
25+
class LoginPage {
2626
async login(user: string, pwd: string) {
2727
await testSubjects.setValue('loginUsername', user);
2828
await testSubjects.setValue('loginPassword', pwd);
2929
await testSubjects.click('loginSubmit');
3030
}
3131
}
3232

33-
return new ShieldPage();
33+
return new LoginPage();
3434
}

x-pack/plugins/security/public/authentication/login/components/login_form/login_form.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ export class LoginForm extends Component<Props, State> {
262262
{this.props.selector.providers.map(provider => (
263263
<button
264264
key={provider.name}
265+
data-test-subj={`loginCard-${provider.type}/${provider.name}`}
265266
disabled={!this.isLoadingState(LoadingStateType.None)}
266267
onClick={() =>
267268
provider.usesLoginForm

x-pack/scripts/functional_tests.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ require('@kbn/test').runTestsCli([
1010
require.resolve('../test/reporting/configs/generate_api'),
1111
require.resolve('../test/functional/config.js'),
1212
require.resolve('../test/functional_with_es_ssl/config.ts'),
13-
require.resolve('../test/functional/config_security_basic.js'),
13+
require.resolve('../test/functional/config_security_basic.ts'),
14+
require.resolve('../test/functional/config_security_trial.ts'),
1415
require.resolve('../test/api_integration/config_security_basic.js'),
1516
require.resolve('../test/api_integration/config.js'),
1617
require.resolve('../test/alerting_api_integration/basic/config.ts'),

x-pack/test/functional/apps/security/security.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export default function({ getService, getPageObjects }: FtrProviderContext) {
6767
});
6868

6969
it('logging out of a non-default space redirects to the login page at the server root', async () => {
70-
await PageObjects.security.login(null, null, {
70+
await PageObjects.security.login(undefined, undefined, {
7171
expectSpaceSelector: true,
7272
});
7373

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
import { FtrProviderContext } from '../../../ftr_provider_context';
8+
9+
export default function({ loadTestFile }: FtrProviderContext) {
10+
describe('security app - trial license', function() {
11+
this.tags('ciGroup4');
12+
13+
loadTestFile(require.resolve('./login_selector'));
14+
});
15+
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
import expect from '@kbn/expect';
8+
import { parse } from 'url';
9+
import { USERS_PATH } from '../../../../../plugins/security/public/management/management_urls';
10+
import { FtrProviderContext } from '../../../ftr_provider_context';
11+
12+
export default function({ getService, getPageObjects }: FtrProviderContext) {
13+
const esArchiver = getService('esArchiver');
14+
const testSubjects = getService('testSubjects');
15+
const browser = getService('browser');
16+
const PageObjects = getPageObjects(['security', 'common']);
17+
18+
describe('Login Selector', function() {
19+
this.tags('includeFirefox');
20+
21+
before(async () => {
22+
await getService('esSupertest')
23+
.post('/_security/role_mapping/saml1')
24+
.send({ roles: ['superuser'], enabled: true, rules: { field: { 'realm.name': 'saml1' } } })
25+
.expect(200);
26+
27+
await esArchiver.load('empty_kibana');
28+
await PageObjects.security.forceLogout();
29+
});
30+
31+
after(async () => {
32+
await esArchiver.unload('empty_kibana');
33+
});
34+
35+
beforeEach(async () => {
36+
await browser.get(`${PageObjects.common.getHostPort()}/login`);
37+
await PageObjects.security.loginSelector.verifyLoginSelectorIsVisible();
38+
});
39+
40+
afterEach(async () => {
41+
await PageObjects.security.forceLogout();
42+
});
43+
44+
it('can login with Login Form preserving original URL', async () => {
45+
await PageObjects.common.navigateToActualUrl('kibana', USERS_PATH, {
46+
ensureCurrentUrl: false,
47+
shouldLoginIfPrompted: false,
48+
});
49+
await PageObjects.common.waitUntilUrlIncludes('next=');
50+
51+
await PageObjects.security.loginSelector.login('basic', 'basic1');
52+
53+
// We need to make sure that both path and hash are respected.
54+
const currentURL = parse(await browser.getCurrentUrl());
55+
expect(currentURL.pathname).to.eql('/app/kibana');
56+
expect(currentURL.hash).to.eql(`#${USERS_PATH}`);
57+
});
58+
59+
it('can login with SSO preserving original URL', async () => {
60+
await PageObjects.common.navigateToActualUrl('kibana', USERS_PATH, {
61+
ensureCurrentUrl: false,
62+
shouldLoginIfPrompted: false,
63+
});
64+
await PageObjects.common.waitUntilUrlIncludes('next=');
65+
66+
await PageObjects.security.loginSelector.login('saml', 'saml1');
67+
68+
// We need to make sure that both path and hash are respected.
69+
const currentURL = parse(await browser.getCurrentUrl());
70+
expect(currentURL.pathname).to.eql('/app/kibana');
71+
expect(currentURL.hash).to.eql(`#${USERS_PATH}`);
72+
});
73+
74+
it('should show toast with error if SSO fails', async () => {
75+
await PageObjects.security.loginSelector.selectLoginMethod('saml', 'unknown_saml');
76+
77+
const toastTitle = await PageObjects.common.closeToast();
78+
expect(toastTitle).to.eql('Could not perform login.');
79+
80+
await PageObjects.security.loginSelector.verifyLoginSelectorIsVisible();
81+
});
82+
83+
it('can go to Login Form and return back to Selector', async () => {
84+
await PageObjects.security.loginSelector.selectLoginMethod('basic', 'basic1');
85+
await PageObjects.security.loginSelector.verifyLoginFormIsVisible();
86+
87+
await testSubjects.click('loginBackToSelector');
88+
await PageObjects.security.loginSelector.verifyLoginSelectorIsVisible();
89+
90+
await PageObjects.security.loginSelector.login('saml', 'saml1');
91+
});
92+
93+
it('can show Login Help from both Login Selector and Login Form', async () => {
94+
// Show Login Help from Login Selector.
95+
await testSubjects.click('loginHelpLink');
96+
await PageObjects.security.loginSelector.verifyLoginHelpIsVisible('Some-login-help.');
97+
98+
// Go back to Login Selector.
99+
await testSubjects.click('loginBackToLoginLink');
100+
await PageObjects.security.loginSelector.verifyLoginSelectorIsVisible();
101+
102+
// Go to Login Form and show Login Help there.
103+
await PageObjects.security.loginSelector.selectLoginMethod('basic', 'basic1');
104+
await PageObjects.security.loginSelector.verifyLoginFormIsVisible();
105+
await testSubjects.click('loginHelpLink');
106+
await PageObjects.security.loginSelector.verifyLoginHelpIsVisible('Some-login-help.');
107+
108+
// Go back to Login Form.
109+
await testSubjects.click('loginBackToLoginLink');
110+
await PageObjects.security.loginSelector.verifyLoginFormIsVisible();
111+
112+
// Go back to Login Selector and show Login Help there again.
113+
await testSubjects.click('loginBackToSelector');
114+
await PageObjects.security.loginSelector.verifyLoginSelectorIsVisible();
115+
await testSubjects.click('loginHelpLink');
116+
await PageObjects.security.loginSelector.verifyLoginHelpIsVisible('Some-login-help.');
117+
118+
// Go back to Login Selector.
119+
await testSubjects.click('loginBackToLoginLink');
120+
await PageObjects.security.loginSelector.verifyLoginSelectorIsVisible();
121+
});
122+
});
123+
}

x-pack/test/functional/apps/spaces/copy_saved_objects.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export default function spaceSelectorFunctonalTests({
3232
disabledFeatures: [],
3333
});
3434

35-
await PageObjects.security.login(null, null, {
35+
await PageObjects.security.login(undefined, undefined, {
3636
expectSpaceSelector: true,
3737
});
3838

x-pack/test/functional/apps/spaces/enter_space.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export default function enterSpaceFunctonalTests({
2727
it('falls back to the default home page when the configured default route is malformed', async () => {
2828
const spaceId = 'default';
2929

30-
await PageObjects.security.login(null, null, {
30+
await PageObjects.security.login(undefined, undefined, {
3131
expectSpaceSelector: true,
3232
});
3333

@@ -39,7 +39,7 @@ export default function enterSpaceFunctonalTests({
3939
it('allows user to navigate to different spaces, respecting the configured default route', async () => {
4040
const spaceId = 'another-space';
4141

42-
await PageObjects.security.login(null, null, {
42+
await PageObjects.security.login(undefined, undefined, {
4343
expectSpaceSelector: true,
4444
});
4545

0 commit comments

Comments
 (0)