diff --git a/multitenancy-rest-service/src/iam/keycloakUser.ts b/multitenancy-rest-service/src/iam/keycloakUser.ts index 799ac8c..8fb189a 100644 --- a/multitenancy-rest-service/src/iam/keycloakUser.ts +++ b/multitenancy-rest-service/src/iam/keycloakUser.ts @@ -302,7 +302,7 @@ export class KeycloakUser { entitlements: false, context: { attributes: {} - } + }, } ); diff --git a/multitenancy-rest-service/test/unit/app.controller.spec.ts b/multitenancy-rest-service/test/unit/app.controller.spec.ts index b84ca4a..49ece46 100644 --- a/multitenancy-rest-service/test/unit/app.controller.spec.ts +++ b/multitenancy-rest-service/test/unit/app.controller.spec.ts @@ -43,6 +43,7 @@ describe('Testing AppController', () => { createTable: jest.fn(() => of(mockMessage)), createRealm: jest.fn(), getAdminDetails: jest.fn(), + createRedirectUrl: jest.fn(), createUser: jest.fn(), listAllUser: jest.fn(), userInfo: jest.fn(), @@ -104,6 +105,19 @@ describe('Testing AppController', () => { mockgetAccessToken.mockRestore(); }); + it('Testing appcontroller "when login failed"', async () => { + const mockBody = { + username: '', + password: process.env.TEST_PASSWORD, + tenantName: 'tenantName', + clientId: 'clientId', + clientSecret: 'clientSecret', + } + + expect(async () => await appController.login(mockBody, mockResponse)).rejects.toThrow('Please enter userName'); + + }); + it('Testing appcontroller "logout"', async () => { const mockBody = { tenantName: 'tenantName', @@ -130,6 +144,16 @@ describe('Testing AppController', () => { mockrefreshAccessToken.mockRestore(); }); + it('Testing appcontroller "forgetPassword"', () => { + mockRequest.query ={ + tenantName: 'tenantName' + }; + const createRedirectUrl = jest.spyOn(appService, 'createRedirectUrl'); + appController.forgotPassword(mockRequest,mockResponse); + expect(createRedirectUrl).toHaveBeenCalled(); + createRedirectUrl.mockRestore(); + }); + it('Testing appcontroller "publicKey"', async () => { mockRequest.params = { tenantName: 'tenantName' @@ -181,7 +205,7 @@ describe('Testing AppController', () => { }); it('Testing appcontroller "getTenantConfig"', async () => { - mockRequest.params = { + mockRequest.query = { tenantName: 'tenantName', }; mockRequest.headers = { @@ -195,10 +219,28 @@ describe('Testing AppController', () => { mockSubscribe.mockRestore(); }); - it('Testing appcontroller "listAllTenant"', async () => { + it('Testing appcontroller "when getTenantConfig gets failed"', async () => { + mockRequest.query = { + tenantName: 'tenantname', + }; + mockRequest.headers = { + authorization: authToken + }; + + expect(async () => await appController.getTenantConfig(mockRequest, mockResponse)).rejects.toThrow("Not Allowed"); + }); + + it('Testing appcontroller "listAllTenant"', () => { + mockRequest.query = { + tenantName: 'tenantName', + isDeleted: 'true', + page: '1' + }; const mockSubscribe = jest.spyOn(Observable.prototype, 'subscribe'); + const listAllTenant = jest.spyOn(appService, 'listAllTenant'); appController.listAllTenant(mockRequest, mockResponse); expect(mockSubscribe).toHaveBeenCalled(); + expect(listAllTenant).toHaveBeenCalledWith('tenantName', 'true','1'); mockSubscribe.mockRestore(); }); @@ -217,10 +259,31 @@ describe('Testing AppController', () => { mockSubscribe.mockRestore(); }); + it('Testing appcontroller "when updateDescription gets failed"', async () => { + mockRequest.body = { + action: { + tenantName: '__', + description: 'newDescription' + } + }; + expect(async () => await appController.updateDescription(mockRequest, mockResponse)).rejects.toThrow('Updation Not Allowed'); + }); + + it('Testing appcontroller "deleteTenant"', async () => { + mockRequest.params ={ + tenantName: 'tenantName' + }; + + mockRequest.headers = { + authorization: 'Bearer token' + }; + const mockSubscribe = jest.spyOn(Observable.prototype, 'subscribe'); + const deleteTenant = jest.spyOn(appService, 'deleteTenant'); await appController.deleteTenant(mockRequest, mockResponse); expect(mockSubscribe).toHaveBeenCalled(); + expect(deleteTenant).toHaveBeenCalledWith('tenantName', mockRequest.headers['authorization']); mockSubscribe.mockRestore(); }); @@ -236,7 +299,7 @@ describe('Testing AppController', () => { } }; mockRequest.body = { - tenantName: 'tenantName', + tenantName: '', password: process.env.TEST_PASSWORD, userDetails: { userName: 'userName', @@ -258,7 +321,7 @@ describe('Testing AppController', () => { it('Testing appcontroller "listAllUser"', async () => { mockRequest.query = { - tenantName: 'tenantName', + tenantName: '', page: '1' }; @@ -279,8 +342,8 @@ describe('Testing AppController', () => { it('Testing appcontroller "getUserInfo"', async () => { mockRequest.query = { - tenantName: 'tenantName', - usertName: 'usertName', + tenantName: '', + userName: 'userName', }; mockRequest.headers = { @@ -297,7 +360,7 @@ describe('Testing AppController', () => { it('Testing appcontroller "updateUser"', async () => { mockRequest.body = { - tenantName: 'tenantName', + tenantName: '', userName: 'userName', action: { firstName: 'firstName' @@ -316,6 +379,22 @@ describe('Testing AppController', () => { mockSend.mockRestore(); }); + it('Testing appcontroller "when updateUser gets failed"', async () => { + mockRequest.body = { + tenantName: 'tenantName', + userName: '', + action: { + firstName: 'firstName' + } + }; + + mockRequest.headers = { + authorization: authToken + }; + + expect(async () => await appController.updateUser(mockRequest, mockResponse)).rejects.toThrow('Please enter userName'); + }); + it('Testing appcontroller "deleteUser"', async () => { mockRequest.params = { tenantName: 'tenantName', @@ -334,6 +413,19 @@ describe('Testing AppController', () => { mockSend.mockRestore(); }); + it('Testing appcontroller "when deleteUser gets failed"', async () => { + mockRequest.params = { + tenantName: 'tenantName', + userName: 'userName', + }; + + mockRequest.headers = { + authorization: authToken + }; + + expect(async () => await appController.deleteUser(mockRequest, mockResponse)).rejects.toThrow("Not Allowed"); + }); + it('Testing appcontroller "tenantClient"', async () => { mockRequest.body = { tenantName: 'string', @@ -371,9 +463,22 @@ describe('Testing AppController', () => { mockSend.mockRestore(); }); + it('Testing appcontroller "when createRole gets failed"', async () => { + mockRequest.body = { + tenantName: '', + roleDetails: { + name: 'string' + } + }; + mockRequest.headers = { + authorization: authToken + }; + expect(async () => await appController.createRole(mockRequest, mockResponse)).rejects.toThrow("Please enter tenantName"); + }); + it('Testing appcontroller "getAvailableRoles"', async () => { mockRequest.query = { - tenantName: 'tenantName', + tenantName: '', }; mockRequest.headers = { authorization: authToken @@ -402,6 +507,30 @@ describe('Testing AppController', () => { mockSend.mockRestore(); }); + it('Testing appcontroller "when getRoleInfo tenantName get failed"', async () => { + mockRequest.query = { + tenantName: '', + roleName: 'roleName' + }; + mockRequest.headers = { + authorization: authToken + }; + + expect(async () => await appController.getRoleInfo(mockRequest, mockResponse)).rejects.toThrow("Please enter tenantName"); + }); + + it('Testing appcontroller "when getRoleInfo roleName get failed"', async () => { + mockRequest.query = { + tenantName: 'tenantName', + roleName: '' + }; + mockRequest.headers = { + authorization: authToken + }; + + expect(async () => await appController.getRoleInfo(mockRequest, mockResponse)).rejects.toThrow("Please enter roleName"); + }); + it('Testing appcontroller "updateRole"', async () => { mockRequest.body = { tenantName: 'tenantName', @@ -421,6 +550,37 @@ describe('Testing AppController', () => { mockSend.mockRestore(); }); + it('Testing appcontroller "when updateRole tenantName gets failed"', async () => { + mockRequest.body = { + tenantName: '', + roleName: 'roleName', + action: { + name: 'string' + } + }; + mockRequest.headers = { + authorization: authToken + }; + + expect(async () => await appController.updateRole(mockRequest, mockResponse)).rejects.toThrow("Please enter tenantName"); + }); + + it('Testing appcontroller "when updateRole roleName gets failed"', async () => { + mockRequest.body = { + tenantName: 'tenantName', + roleName: '', + action: { + name: 'string' + } + }; + mockRequest.headers = { + authorization: authToken + }; + + expect(async () => await appController.updateRole(mockRequest, mockResponse)).rejects.toThrow("Please enter roleName"); + }); + + it('Testing appcontroller "deleteRole"', async () => { mockRequest.params = { tenantName: 'tenantName', @@ -460,7 +620,7 @@ describe('Testing AppController', () => { it('Testing appcontroller "listPermission"', async () => { mockRequest.query = { - tenantName: 'string', + tenantName: '', clientName: 'string', } mockRequest.headers = { @@ -589,6 +749,23 @@ describe('Testing AppController', () => { connect.mockRestore(); }); + it('Testing appcontroller "when connectDatabase method gets failed"', async () => { + mockRequest.query = { + host: 'host', + port: '3306', + tenantName: '', + password: process.env.TEST_PASSWORD, + dbName: 'tenant_db' + } + + mockRequest.headers = { + authorization: authToken + }; + + expect(async () => await appController.connectDatabase(mockRequest, mockResponse)).rejects.toThrow("Updation Not Allowed"); + + }); + it('Testing appcontroller "createTable"', async () => { const mockSubscribe = jest.spyOn(Observable.prototype, 'subscribe'); await appController.createTable(mockRequest, mockResponse); diff --git a/multitenancy-rest-service/test/unit/auth.service.spec.ts b/multitenancy-rest-service/test/unit/auth.service.spec.ts index 48e7377..c20abe4 100644 --- a/multitenancy-rest-service/test/unit/auth.service.spec.ts +++ b/multitenancy-rest-service/test/unit/auth.service.spec.ts @@ -56,6 +56,23 @@ describe('Testing Auth Service', () => { mockAccessToken.mockRestore(); }); + it('Testing "when getAccessToken method parameters are missing"', async () => { + const body = { + username: 'string', + password: process.env.TEST_PASSWORD, + tenantName: '', + clientId: '', + clientSecret: '' + } + + const mockAccessToken = jest.spyOn(axios, 'post').mockResolvedValue(accessToken); + const response = await authService.getAccessToken(body); + + expect(mockAccessToken).toHaveBeenCalled(); + expect(response).toEqual(accessToken); + mockAccessToken.mockRestore(); + }); + it('Testing "logout"', async () => { const body = { tenantName: 'string', @@ -72,6 +89,23 @@ describe('Testing Auth Service', () => { mockLogOut.mockRestore(); }); + it('Testing "when logout method parameters are missing"', async () => { + const body = { + tenantName: 'master', + refreshToken: 'string', + clientId: '', + clientSecret: '' + } + + const mockLogOut = jest.spyOn(axios, 'post').mockResolvedValue({ status: 204 }); + const response = await authService.logout(body); + + expect(mockLogOut).toHaveBeenCalled(); + expect(response).toEqual(204); + mockLogOut.mockRestore(); + }); + + it('Testing "refreshAccessToken"', async () => { const body = { tenantName: 'string', @@ -88,6 +122,22 @@ describe('Testing Auth Service', () => { mockrefreshAccessToken.mockRestore(); }); + it('Testing "when refreshAccessToken method parameters are missing"', async () => { + const body = { + tenantName: 'master', + refreshToken: 'string', + clientId: '', + clientSecret: '' + } + + const mockrefreshAccessToken = jest.spyOn(axios, 'post').mockResolvedValue(accessToken); + const response = await authService.refreshAccessToken(body); + + expect(mockrefreshAccessToken).toHaveBeenCalled(); + expect(response).toEqual(accessToken); + mockrefreshAccessToken.mockRestore(); + }); + it('Testing "validateToken"', async () => { const mockvalidateToken = jest.spyOn(axios, 'post').mockResolvedValue({ data: { active: true } }); const response = await authService.validateToken('string', 'string', 'string'); diff --git a/multitenancy-rest-service/test/unit/permission.spec.ts b/multitenancy-rest-service/test/unit/permission.spec.ts index 7bcd3e6..4bbe121 100644 --- a/multitenancy-rest-service/test/unit/permission.spec.ts +++ b/multitenancy-rest-service/test/unit/permission.spec.ts @@ -21,7 +21,21 @@ jest.mock('@keycloak/keycloak-admin-client', () => { clientId: 'string', } ]), - createPermission: jest.fn() + findPermissions: jest.fn().mockResolvedValue([ + { + id: 'id', + name: 'name' + } + ]), + createPermission: jest.fn(), + updatePermission: jest.fn(), + delPermission: jest.fn().mockResolvedValue([ + { + id: 'id', + type: 'string', + permissionId: 'test-permission' + } + ]), }, setAccessToken: jest.fn() }; @@ -54,4 +68,44 @@ describe('Testing Keycloak Authorization Permission', () => { const response = await keycloakAuthPermission.createPermission(body, token); expect(response).toEqual('Permission created successfully'); }); + + it('Testing "getPermissions" method', async () => { + const tenantName = 'string'; + const clientName = 'string'; + const token = 'Bearer token'; + + const response = await keycloakAuthPermission.getPermissions(tenantName, clientName, token); + expect (response).toEqual([{ + id: 'id', + name: 'name' + }]); + }); + + it('Testing "updatePermission" method', async () => { + const body = { + tenantName: 'string', + clientName: 'string', + permissionName: 'string', + permissionType: 'user', + permissionDetails: { + name: "test-permission", + description: "test permission description" + } + }; + const token = 'Bearer token'; + const response = await keycloakAuthPermission.updatePermission(body, token); + expect(response).toEqual('Permission updated successfully'); + }); + + it('Testing "deletePermission" method', async () => { + const body = { + tenantName: 'string', + clientName: 'string', + permissionName: 'string', + permissionType: 'user' + }; + const token = 'Bearer token'; + const response = await keycloakAuthPermission.deletePermission(body, token); + expect(response).toEqual('Permission deleted successfully'); + }); }); diff --git a/tenant-master-service/test/unit/tenant.master.controller.spec.ts b/tenant-master-service/test/unit/tenant.master.controller.spec.ts index 2acb53c..981a0ed 100644 --- a/tenant-master-service/test/unit/tenant.master.controller.spec.ts +++ b/tenant-master-service/test/unit/tenant.master.controller.spec.ts @@ -1,6 +1,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { TenantMasterController } from '@app/tenant-master/tenant.master.controller'; import { TenantMasterService } from '@app/tenant-master/tenant.master.service'; +import { TenantMasterModule } from '@app/tenant-master/tenant.master.module'; describe('Tenant Master Controller', () => { let tenantMasterController: TenantMasterController; @@ -20,6 +21,7 @@ describe('Tenant Master Controller', () => { }; beforeAll(async () => { const module: TestingModule = await Test.createTestingModule({ + imports: [TenantMasterModule], controllers: [TenantMasterController], providers: [TenantMasterService], }) diff --git a/tenant-provisioning/test/unit/tenantprovision.controller.spec.ts b/tenant-provisioning/test/unit/tenantprovision.controller.spec.ts index 5ccc0dc..28f5ab1 100644 --- a/tenant-provisioning/test/unit/tenantprovision.controller.spec.ts +++ b/tenant-provisioning/test/unit/tenantprovision.controller.spec.ts @@ -1,6 +1,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { TenantprovisionController } from '@app/tenant-provisioning/tenantprovision.controller'; import { TenantprovisionService } from '@app/tenant-provisioning/tenantprovision.service'; +import { TenantprovisionModule } from '@app/tenant-provisioning/tenantprovision.module'; describe('Testing Provisioning MicroService Controller', () => { let tenantprovisionController: TenantprovisionController; @@ -18,6 +19,7 @@ describe('Testing Provisioning MicroService Controller', () => { beforeAll(async () => { const module: TestingModule = await Test.createTestingModule({ + imports: [TenantprovisionModule], controllers: [TenantprovisionController], providers: [TenantprovisionService], })