+
Please enter a valid Application Name.
diff --git a/src/app/launcher/shared/project-name.validator.spec.ts b/src/app/launcher/shared/project-name.validator.spec.ts
new file mode 100644
index 00000000..5fbdd8ae
--- /dev/null
+++ b/src/app/launcher/shared/project-name.validator.spec.ts
@@ -0,0 +1,70 @@
+import { ProjectNameValidatorDirective } from './project-name.validator';
+
+describe('should check pattern to valdidate Project name', () => {
+
+ it('validate Project Name to be falsy if start with special character', () => {
+ let valProjectName = ProjectNameValidatorDirective.pattern.test('#app-may-11-2018-1');
+ expect(valProjectName).toBeFalsy();
+ });
+
+ it('validate Project Name to be falsy if ends with special character', () => {
+ let valProjectName = ProjectNameValidatorDirective.pattern.test('app-may-11-2018-1@');
+ expect(valProjectName).toBeFalsy();
+ });
+
+ it('validate Project Name to be falsy if has any special character apart from - and _', () => {
+ let valProjectName = ProjectNameValidatorDirective.pattern.test('app-may-11-2018@1');
+ expect(valProjectName).toBeFalsy();
+ });
+
+ it('validate Project Name to be falsy if ends with _', () => {
+ let valProjectName = ProjectNameValidatorDirective.pattern.test('app-may-11-2018-1_');
+ expect(valProjectName).toBeFalsy();
+ });
+
+ it('validate Project Name to be falsy if ends with -', () => {
+ let valProjectName = ProjectNameValidatorDirective.pattern.test('app-may-11-2018-1-');
+ expect(valProjectName).toBeFalsy();
+ });
+
+ it('validate Project Name to be truthy', () => {
+ let valProjectName = ProjectNameValidatorDirective.pattern.test('app-may-11-2018-1');
+ expect(valProjectName).toBeTruthy();
+ });
+
+ it('validate Project Name to be falsy as length is not satisfied', () => {
+ let valProjectName = ProjectNameValidatorDirective.pattern.test('ap');
+ expect(valProjectName).toBeFalsy();
+ });
+
+ it('validate Project Name to be falsy as length is not satisfied', () => {
+ let valProjectName = ProjectNameValidatorDirective.pattern.test('12345678901234567890123456789012345678901');
+ expect(valProjectName).toBeFalsy();
+ });
+
+ it('validate Project Name to be truthy as length is satisfied', () => {
+ let valProjectName = ProjectNameValidatorDirective.pattern.test('a123456789012345678901234567890123456789');
+ expect(valProjectName).toBeTruthy();
+ });
+
+ it('should return false if the project name has continous hyphens (-)', () => {
+ let valProjectName = ProjectNameValidatorDirective.pattern.test('app_name--name');
+ expect(valProjectName).toBeFalsy();
+ });
+
+ it('should return false if the project name has continous underscores (_)', () => {
+ let valProjectName = ProjectNameValidatorDirective.pattern.test('app_name__name');
+ expect(valProjectName).toBeFalsy();
+ });
+
+ it('should not allow project name with spaces', () => {
+ let valProjectName = ProjectNameValidatorDirective.pattern.test('app_name name');
+ expect(valProjectName).toBeFalsy();
+ });
+
+ it('should not allow project name starting with a number', () => {
+ let valProjectName = ProjectNameValidatorDirective.pattern.test('1app_namename');
+ expect(valProjectName).toBeFalsy();
+ });
+
+});
diff --git a/src/app/launcher/shared/project-name.validator.ts b/src/app/launcher/shared/project-name.validator.ts
index 5a4f4776..9e3503c2 100644
--- a/src/app/launcher/shared/project-name.validator.ts
+++ b/src/app/launcher/shared/project-name.validator.ts
@@ -10,7 +10,9 @@ import { DependencyCheckService } from '../service/dependency-check.service';
forwardRef(() => ProjectNameValidatorDirective), multi: true }]
})
export class ProjectNameValidatorDirective implements Validator {
- private pattern = /^[a-z][a-z0-9-]{3,63}$/;
+ // allows only '-', '_' and 4-40 characters (must start with alphabetic and end with alphanumeric)
+ // no continuous '-' or '_' is allowed
+ public static readonly pattern = new RegExp('^[a-zA-Z](?!.*--)(?!.*__)[a-zA-Z0-9-_]{2,38}[a-zA-Z0-9]$');
constructor(private dependencyCheckService: DependencyCheckService) { }
@@ -20,7 +22,7 @@ export class ProjectNameValidatorDirective implements Validator {
validRepositoryName(value: any): Observable<{ [key: string]: any }> {
return new Observable((resolve) => {
- const valid = this.pattern.test(value);
+ const valid = ProjectNameValidatorDirective.pattern.test(value);
if (!valid) {
resolve.next(this.createError('pattern', value));
} else {