diff --git a/client/src/app/users/user-profile/user-profile.component.html b/client/src/app/users/user-profile/user-profile.component.html index 9b8f3504202aab983a5623e14b3db63a95f90819..440e0c790810fc0f569fcb5a5f165e0906c9b58b 100644 --- a/client/src/app/users/user-profile/user-profile.component.html +++ b/client/src/app/users/user-profile/user-profile.component.html @@ -1,4 +1,8 @@ <p>user-profile works!</p> <p>Userid: {{user.getUserId}}</p> <p>username: {{user.getUsername}}</p> -<p>email: {{user.getEmail}}</p> \ No newline at end of file +<p>email: {{user.getEmail}}</p> + +<div> + <app-button text="Slett bruker" (click)="deleteUser()"></app-button> +</div> \ No newline at end of file diff --git a/client/src/app/users/user-profile/user-profile.component.spec.ts b/client/src/app/users/user-profile/user-profile.component.spec.ts index 3cc34bfe7937ceaea07988e2bed0029d17671949..6f0e7db6d9f7c4bf96bf48b6946eb4dbacb871fe 100644 --- a/client/src/app/users/user-profile/user-profile.component.spec.ts +++ b/client/src/app/users/user-profile/user-profile.component.spec.ts @@ -3,14 +3,16 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { AuthService } from 'src/app/authentication/auth.service'; import { User } from 'src/app/models/user.model'; +import { SharedModule } from 'src/app/shared/shared.module'; import { UserLoginFormComponent } from '../user-login-form/user-login-form.component'; +import { UserService } from '../user.service'; import { UserProfileComponent } from './user-profile.component'; describe('UserProfileComponent', () => { let component: UserProfileComponent; let fixture: ComponentFixture<UserProfileComponent>; - let mockAuthService; + let mockAuthService, mockUserService; beforeEach(async () => { // AuthService mock setup @@ -22,6 +24,15 @@ describe('UserProfileComponent', () => { password: "1234", create_time: 513498 })); + + // UserService mock setup + mockUserService = jasmine.createSpyObj(['deleteUser']); + mockUserService.deleteUser.and.returnValue( + new Promise<any>( + (resolve) => { + resolve({data: []}) + }) + ); await TestBed.configureTestingModule({ @@ -33,7 +44,8 @@ describe('UserProfileComponent', () => { ]) ], providers: [ - { provide: AuthService, useValue: mockAuthService } + { provide: AuthService, useValue: mockAuthService }, + { provide: UserService, useValue: mockUserService } ] }) .compileComponents(); @@ -60,4 +72,11 @@ describe('UserProfileComponent', () => { create_time: 513498 })); }); + + it('should delete current user', async () => { + // Waits for ngOnInit and checks that we can delete the current user + await fixture.whenStable(); + component.deleteUser(); + expect(mockUserService.deleteUser).toHaveBeenCalledWith(4); + }); }); diff --git a/client/src/app/users/user-profile/user-profile.component.ts b/client/src/app/users/user-profile/user-profile.component.ts index 5ba47faffcd241a344e888f5772820e7021fc541..ddc341836ea839703bb22c6fde3645cb913eef55 100644 --- a/client/src/app/users/user-profile/user-profile.component.ts +++ b/client/src/app/users/user-profile/user-profile.component.ts @@ -13,9 +13,22 @@ import { UserService } from '../user.service'; export class UserProfileComponent implements OnInit { user: User = new User(); - constructor(private authService: AuthService, private router: Router) { } + constructor(private authService: AuthService, private userService: UserService, private router: Router) { } ngOnInit(): void { this.user = this.authService.getCurrentUser(); } + + /** + * Deletes user in database and navigates to login + */ + deleteUser() { + this.userService.deleteUser(this.user.getUserId).then(data => { + console.log("Successfully deleted user: " + this.user.getUserId); + this.authService.logout(); + this.router.navigateByUrl("/login"); + }).catch(error => { + console.log(error); + }); + } } diff --git a/client/src/app/users/user.service.spec.ts b/client/src/app/users/user.service.spec.ts index e0577bfad4be1dd5e26776350e9b918bd3e3b27b..79f633163ceec14baeb756b85c522f30db3d1b74 100644 --- a/client/src/app/users/user.service.spec.ts +++ b/client/src/app/users/user.service.spec.ts @@ -75,6 +75,35 @@ describe('UserService', () => { req.error(new ErrorEvent("400")); }); }); + + describe('deleteUser', () => { + it('should delete user', () => { + // Deletes user with id = 2 + service.deleteUser(2) + .then(data => {}) + .catch(error => { + fail(); + }); + + // Mocks and checks HTTP request + const req = httpMock.expectOne("api/user/2"); + expect(req.request.method).toBe("DELETE"); + req.flush({ + data: [] + }); + }); + it('should reject on http error', () => { + // Deletes user with id = 2, but should catch HTTP error + service.deleteUser(2).then(data => { + fail(); + }).catch(error => {}); + + // Mocks and checks HTTP request + const req = httpMock.expectOne("api/user/2"); + expect(req.request.method).toBe("DELETE"); + req.error(new ErrorEvent("400")); + }); + }); }); diff --git a/client/src/app/users/user.service.ts b/client/src/app/users/user.service.ts index f4def23c7d6289232ae86ea9d6f0c0dee50b3a35..4b40cadd532b39c817843ca65ed6082f19cec2f2 100644 --- a/client/src/app/users/user.service.ts +++ b/client/src/app/users/user.service.ts @@ -76,4 +76,28 @@ export class UserService { private get_all_users() { return this.http.get(this.userUrl); } -} + + /** + * Deletes an user from the database by id. + */ + deleteUser(id: number): Promise<User> { + return new Promise<User>( + (resolve, reject) => { + this.delete_user(id).subscribe((data: any) => { + try { + resolve(data); + } catch (err: any) { + reject(err); + } + }, + (err: any) => { + console.log(err.message); + reject(err); + }); + } + ); + } + private delete_user(id: number) { + return this.http.delete(this.userUrl + id); + } +} \ No newline at end of file diff --git a/server/src/controllers/userController/index.ts b/server/src/controllers/userController/index.ts index b0d49b9aeb5de3015d7700119d8fac43654ada7a..ae9257e515058eeb7d9ba90bbaace64a9b26bb5b 100644 --- a/server/src/controllers/userController/index.ts +++ b/server/src/controllers/userController/index.ts @@ -61,7 +61,7 @@ router.route('/:userId').put(async (request: Request, response: Response) => { /* ============================= DELETE ============================= */ // Delete user from id `/api/user/:id` -router.route('/:userId').delete(async (request: Request, response: Response) => { +router.route('/:userId').delete(authenticateToken, async (request: Request, response: Response) => { const userId = request.params.userId; try { const input = `DELETE FROM user WHERE (userId=?);`;