[ADF-5332] Login basic auth - Ability to override the successRoute from app.config.json (#6651)

* ability to override successRoute from app.config

* Add basic doc

* Reset the appconfig

* Rebase and handle login errors

* Remove the  default route /

* remove space
This commit is contained in:
Maurizio Vitale 2021-02-12 16:03:10 +00:00 committed by GitHub
parent dc0dc5ef01
commit 3c5d5dc02d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 95 additions and 26 deletions

View File

@ -225,6 +225,18 @@ export class MyCustomLogin {
} }
``` ```
### Override the successRoute from app.config.json with Basic Auth
When the user is logged in the login componet redirect him to the successRoute. This route can be overriden from the app.config.json. The successRoute must to be a valid app route.
**app.config.json**
```json
{
"successRoute" : "/my-landing-page"
}
```
### Controlling form submit execution behaviour ### Controlling form submit execution behaviour
The standard form submission system is suitable for most tasks but you can The standard form submission system is suitable for most tasks but you can

View File

@ -27,7 +27,8 @@ import {
UserModel, UserModel,
UsersActions, UsersActions,
Widget, Widget,
SearchService SearchService,
Logger
} from '@alfresco/adf-testing'; } from '@alfresco/adf-testing';
import { TasksPage } from './pages/tasks.page'; import { TasksPage } from './pages/tasks.page';
import { browser } from 'protractor'; import { browser } from 'protractor';
@ -73,9 +74,9 @@ describe('Attach File - Content service', () => {
const csIntegrations = ['adf dev', 'adf master']; const csIntegrations = ['adf dev', 'adf master'];
let user: UserModel; let user: UserModel;
beforeAll(async () => { beforeAll(async (done) => {
await LocalStorageUtil.setStorageItem('providers', 'ALL'); await LocalStorageUtil.setStorageItem('providers', 'ALL');
try {
await apiService.loginWithProfile('admin'); await apiService.loginWithProfile('admin');
user = await usersActions.createUser(); user = await usersActions.createUser();
@ -99,6 +100,10 @@ describe('Attach File - Content service', () => {
await searchService.isSearchable(pdfFileTwo.name); await searchService.isSearchable(pdfFileTwo.name);
await searchService.isSearchable(externalFile); await searchService.isSearchable(externalFile);
} catch (error) {
console.error('Preconditions failed check if the external env is up and running');
}
done();
}); });
afterAll(async () => { afterAll(async () => {
@ -146,6 +151,7 @@ describe('Attach File - Content service', () => {
it('[C286516][C299040] Able to upload a file when user has more than two alfresco repositories', async () => { it('[C286516][C299040] Able to upload a file when user has more than two alfresco repositories', async () => {
const name = 'Attach file - multiple repo'; const name = 'Attach file - multiple repo';
Logger.log('Step 1 - create task ' + name);
await taskPage.createTask({ name, formName: app.UPLOAD_FILE_FORM_CS.formName }); await taskPage.createTask({ name, formName: app.UPLOAD_FILE_FORM_CS.formName });
await widget.attachFileWidget().clickUploadButton(app.UPLOAD_FILE_FORM_CS.FIELD.widget_id); await widget.attachFileWidget().clickUploadButton(app.UPLOAD_FILE_FORM_CS.FIELD.widget_id);
@ -162,20 +168,24 @@ describe('Attach File - Content service', () => {
await expect(await widget.attachFileWidget().viewFileEnabled()).toBe(false); await expect(await widget.attachFileWidget().viewFileEnabled()).toBe(false);
await expect(await widget.attachFileWidget().downloadFileEnabled()).toBe(true); await expect(await widget.attachFileWidget().downloadFileEnabled()).toBe(true);
await expect(await widget.attachFileWidget().removeFileEnabled()).toBe(true); await expect(await widget.attachFileWidget().removeFileEnabled()).toBe(true);
Logger.log('Step 2 - upload file ' + pdfFileTwo.name);
await widget.attachFileWidget().clickUploadButton(app.UPLOAD_FILE_FORM_CS.FIELD.widget_id); await widget.attachFileWidget().clickUploadButton(app.UPLOAD_FILE_FORM_CS.FIELD.widget_id);
await widget.attachFileWidget().selectUploadSource(csIntegrations[1]); await widget.attachFileWidget().selectUploadSource(csIntegrations[1]);
await externalNodeSelector.waitForLogInDialog(); await externalNodeSelector.waitForLogInDialog();
Logger.log(`Step 3 - login with user:${user.username}`);
await externalNodeSelector.login(user.username, user.password); await externalNodeSelector.login(user.username, user.password);
await searchService.isSearchable(externalFile); await searchService.isSearchable(externalFile);
Logger.log('Step 4 - search and click external file ' + externalFile);
await externalNodeSelector.searchAndSelectResult(externalFile, externalFile); await externalNodeSelector.searchAndSelectResult(externalFile, externalFile);
await externalNodeSelector.clickMoveCopyButton(); await externalNodeSelector.clickMoveCopyButton();
await widget.attachFileWidget().checkFileIsAttached(app.UPLOAD_FILE_FORM_CS.FIELD.widget_id, externalFile); await widget.attachFileWidget().checkFileIsAttached(app.UPLOAD_FILE_FORM_CS.FIELD.widget_id, externalFile);
await widget.attachFileWidget().toggleAttachedFileMenu(app.UPLOAD_FILE_FORM_CS.FIELD.widget_id, pdfFileTwo.name); await widget.attachFileWidget().toggleAttachedFileMenu(app.UPLOAD_FILE_FORM_CS.FIELD.widget_id, pdfFileTwo.name);
await expect(await widget.attachFileWidget().viewFileEnabled()).toBe(false); await expect(await widget.attachFileWidget().viewFileEnabled()).toBe(false);
Logger.log('Step 5 - download ');
await expect(await widget.attachFileWidget().downloadFileEnabled()).toBe(true); await expect(await widget.attachFileWidget().downloadFileEnabled()).toBe(true);
await expect(await widget.attachFileWidget().removeFileEnabled()).toBe(true); await expect(await widget.attachFileWidget().removeFileEnabled()).toBe(true);
@ -183,10 +193,11 @@ describe('Attach File - Content service', () => {
await expect(await widget.attachFileWidget().viewFileEnabled()).toBe(false); await expect(await widget.attachFileWidget().viewFileEnabled()).toBe(false);
await expect(await widget.attachFileWidget().downloadFileEnabled()).toBe(false); await expect(await widget.attachFileWidget().downloadFileEnabled()).toBe(false);
await expect(await widget.attachFileWidget().removeFileEnabled()).toBe(true); await expect(await widget.attachFileWidget().removeFileEnabled()).toBe(true);
Logger.log('Step 6 - download ');
await taskPage.taskDetails().clickCompleteFormTask(); await taskPage.taskDetails().clickCompleteFormTask();
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS); await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS);
Logger.log('Step 7 - go filter completed ');
await taskPage.tasksListPage().selectRow(name); await taskPage.tasksListPage().selectRow(name);
await widget.attachFileWidget().checkFileIsAttached(app.UPLOAD_FILE_FORM_CS.FIELD.widget_id, pdfFileTwo.name); await widget.attachFileWidget().checkFileIsAttached(app.UPLOAD_FILE_FORM_CS.FIELD.widget_id, pdfFileTwo.name);

View File

@ -124,7 +124,44 @@ describe('LoginComponent', () => {
expect(router.navigate).toHaveBeenCalledWith([redirect]); expect(router.navigate).toHaveBeenCalledWith([redirect]);
}); });
it('should use the input successRoute as redirect if defined', () => {
spyOn(authService, 'isLoggedIn').and.returnValue(true);
spyOn(router, 'navigate');
component.successRoute = 'input-route';
appConfigService.config = {};
component.ngOnInit();
expect(router.navigate).toHaveBeenCalledWith(['input-route']);
});
it('should use the successRoute route from app.config if the input successRoute is NOT defined', () => {
spyOn(authService, 'isLoggedIn').and.returnValue(true);
spyOn(router, 'navigate');
component.successRoute = undefined;
appConfigService.config.successRoute = 'route-app-config';
component.ngOnInit();
expect(router.navigate).toHaveBeenCalledWith(['route-app-config']);
});
it('should use the successRoute route from app.config if both successRoute are defined', () => {
spyOn(authService, 'isLoggedIn').and.returnValue(true);
spyOn(router, 'navigate');
component.successRoute = 'input-route';
appConfigService.config.successRoute = 'route-app-config';
component.ngOnInit();
expect(router.navigate).toHaveBeenCalledWith(['route-app-config']);
});
it('should redirect to previous route state on successful login', () => { it('should redirect to previous route state on successful login', () => {
appConfigService.config = {};
appConfigService.config.providers = 'ECM'; appConfigService.config.providers = 'ECM';
spyOn(authService, 'login').and.returnValue(of({ type: 'type', ticket: 'ticket' })); spyOn(authService, 'login').and.returnValue(of({ type: 'type', ticket: 'ticket' }));

View File

@ -150,6 +150,8 @@ export class LoginComponent implements OnInit, OnDestroy {
this.initFormFieldsDefault(); this.initFormFieldsDefault();
this.initFormFieldsMessages(); this.initFormFieldsMessages();
this.successRoute = this.appConfig.get<string>('successRoute', this.successRoute);
if (this.authService.isLoggedIn()) { if (this.authService.isLoggedIn()) {
this.router.navigate([this.successRoute]); this.router.navigate([this.successRoute]);
} else { } else {

View File

@ -93,7 +93,13 @@ export class ApiService {
async loginWithProfile(profileName: string): Promise<void> { async loginWithProfile(profileName: string): Promise<void> {
const profile = browser.params.testConfig.users[profileName]; const profile = browser.params.testConfig.users[profileName];
if (profile) { if (profile) {
Logger.log(`try to login with ${profile.username} on HOST: ${this.apiService.config.hostEcm} AUTHTYPE: ${this.apiService.config.authType} PROVIDER: ${this.apiService.config.provider}`);
try {
await this.apiService.login(profile.username, profile.password); await this.apiService.login(profile.username, profile.password);
} catch (error) {
Logger.error(`Failed to login with ${profile.username}`, error.message);
throw new Error(`Login failed with ${profile.username}`);
}
} else { } else {
throw new Error(`Login profile "${profileName}" not found on "browser.params.testConfig".`); throw new Error(`Login profile "${profileName}" not found on "browser.params.testConfig".`);
} }

View File

@ -20,7 +20,7 @@ import { BrowserActions } from '../../core/utils/browser-actions';
import { BrowserVisibility } from '../../core/utils/browser-visibility'; import { BrowserVisibility } from '../../core/utils/browser-visibility';
import { ContentNodeSelectorDialogPage } from '../../content-services/dialog/content-node-selector-dialog.page'; import { ContentNodeSelectorDialogPage } from '../../content-services/dialog/content-node-selector-dialog.page';
import { DocumentListPage } from '../../content-services/pages/document-list.page'; import { DocumentListPage } from '../../content-services/pages/document-list.page';
import { Logger } from '../../core/utils/logger';
export class ExternalNodeSelectorDialogPage extends ContentNodeSelectorDialogPage { export class ExternalNodeSelectorDialogPage extends ContentNodeSelectorDialogPage {
txtUsername = element(by.css('input[id="username"]')); txtUsername = element(by.css('input[id="username"]'));
txtPassword = element(by.css('input[id="password"]')); txtPassword = element(by.css('input[id="password"]'));
@ -63,6 +63,7 @@ export class ExternalNodeSelectorDialogPage extends ContentNodeSelectorDialogPag
} }
async login(username, password): Promise<void> { async login(username, password): Promise<void> {
Logger.log('Login external With ' + username);
await this.waitForLogInDialog(); await this.waitForLogInDialog();
await this.enterUsername(username); await this.enterUsername(username);
await this.enterPassword(password); await this.enterPassword(password);