diff --git a/src/app/components/projects/projects.component.html b/src/app/components/projects/projects.component.html
index 7f785447..90d28c2e 100644
--- a/src/app/components/projects/projects.component.html
+++ b/src/app/components/projects/projects.component.html
@@ -40,6 +40,9 @@
+
diff --git a/src/app/components/projects/projects.component.spec.ts b/src/app/components/projects/projects.component.spec.ts
index 29e82cec..3f3a4d8a 100644
--- a/src/app/components/projects/projects.component.spec.ts
+++ b/src/app/components/projects/projects.component.spec.ts
@@ -85,6 +85,28 @@ describe('ProjectsComponent', () => {
expect(mockedProjectService.delete).toHaveBeenCalled();
});
+ it('should call project service after duplicate action', () => {
+ spyOn(mockedProjectService, 'duplicate').and.returnValue(of());
+ let project = new Project();
+ project.project_id = '1';
+ project.status = 'closed';
+
+ component.duplicate(project);
+
+ expect(mockedProjectService.duplicate).toHaveBeenCalled();
+ });
+
+ it('should call refresh after duplicate action', () => {
+ spyOn(component, 'refresh');
+ let project = new Project();
+ project.project_id = '1';
+ project.status = 'closed';
+
+ component.duplicate(project);
+
+ expect(component.refresh).toHaveBeenCalled();
+ });
+
describe('ProjectComponent open', () => {
let project: Project;
diff --git a/src/app/components/projects/projects.component.ts b/src/app/components/projects/projects.component.ts
index ab50f90f..1c7fa38a 100644
--- a/src/app/components/projects/projects.component.ts
+++ b/src/app/components/projects/projects.component.ts
@@ -107,6 +107,12 @@ export class ProjectsComponent implements OnInit {
);
}
+ duplicate(project: Project) {
+ this.projectService.duplicate(this.server, project.project_id, project.name).subscribe(() => {
+ this.refresh();
+ });
+ }
+
addBlankProject() {
const dialogRef = this.dialog.open(AddBlankProjectDialogComponent, {
width: '400px',
diff --git a/src/app/services/project.service.spec.ts b/src/app/services/project.service.spec.ts
index 2752923a..f6380c3f 100644
--- a/src/app/services/project.service.spec.ts
+++ b/src/app/services/project.service.spec.ts
@@ -41,6 +41,10 @@ export class MockedProjectService {
delete(server: Server, project_id: string) {
return of(project_id);
}
+
+ duplicate(server: Server, project_id: string) {
+ return of(project_id);
+ }
}
describe('ProjectService', () => {
@@ -132,6 +136,13 @@ describe('ProjectService', () => {
expect(req.request.method).toEqual('DELETE');
});
+ it('should duplicate the project', () => {
+ service.duplicate(server, 'projectId', 'projectName').subscribe();
+
+ const req = httpTestingController.expectOne('http://127.0.0.1:3080/v2/projects/projectId/duplicate');
+ expect(req.request.method).toEqual('POST');
+ });
+
it('should get notifications path of project', () => {
const path = service.notificationsPath(server, 'myproject');
expect(path).toEqual('ws://127.0.0.1:3080/v2/projects/myproject/notifications/ws');
diff --git a/src/app/services/project.service.ts b/src/app/services/project.service.ts
index 403cf9b0..9bf32788 100644
--- a/src/app/services/project.service.ts
+++ b/src/app/services/project.service.ts
@@ -52,6 +52,10 @@ export class ProjectService {
getStatistics(server: Server, project_id: string): Observable {
return this.httpServer.get(server, `/projects/${project_id}/stats`);
}
+
+ duplicate(server: Server, project_id: string, project_name): Observable {
+ return this.httpServer.post(server, `/projects/${project_id}/duplicate`, { name: project_name });
+ }
notificationsPath(server: Server, project_id: string): string {
return `ws://${server.host}:${server.port}/v2/projects/${project_id}/notifications/ws`;