@tomei/sso 0.64.0-staging.1 → 0.64.0-staging.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/.commitlintrc.json +22 -22
  2. package/.gitlab-ci.yml +16 -16
  3. package/.husky/commit-msg +9 -9
  4. package/.husky/pre-commit +7 -7
  5. package/.prettierrc +4 -4
  6. package/Jenkinsfile +57 -57
  7. package/README.md +23 -23
  8. package/__tests__/unit/components/group/group.spec.ts +79 -79
  9. package/__tests__/unit/components/group-object-privilege/group-object-privilege.spec.ts +88 -88
  10. package/__tests__/unit/components/group-privilege/group-privilege.spec.ts +68 -68
  11. package/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.ts +66 -66
  12. package/__tests__/unit/components/group-system-access/group-system-access.spec.ts +83 -83
  13. package/__tests__/unit/components/login-user/l.spec.ts +746 -746
  14. package/__tests__/unit/components/login-user/login.spec.ts +1164 -1164
  15. package/__tests__/unit/components/password-hash/password-hash.service.spec.ts +31 -31
  16. package/__tests__/unit/components/system/system.spec.ts +254 -254
  17. package/__tests__/unit/components/system-privilege/system-privilege.spec.ts +83 -83
  18. package/__tests__/unit/components/user-group/user-group.spec.ts +86 -86
  19. package/__tests__/unit/components/user-object-privilege/user-object-privilege.spec.ts +78 -78
  20. package/__tests__/unit/components/user-privilege/user-privilege.spec.ts +72 -72
  21. package/__tests__/unit/components/user-system-access/user-system-access.spec.ts +89 -89
  22. package/__tests__/unit/redis-client/redis.service.spec.ts +23 -23
  23. package/__tests__/unit/session/session.service.spec.ts +47 -47
  24. package/__tests__/unit/system-privilege/system-privilage.spec.ts +91 -91
  25. package/create-sso-user.sql +39 -39
  26. package/dist/src/components/login-user/user.d.ts +22 -3
  27. package/dist/src/components/login-user/user.js +53 -14
  28. package/dist/src/components/login-user/user.js.map +1 -1
  29. package/dist/tsconfig.tsbuildinfo +1 -1
  30. package/eslint.config.mjs +58 -58
  31. package/jest.config.js +14 -14
  32. package/migrations/20240314080602-create-user-table.js +124 -124
  33. package/migrations/20240314080603-create-user-group-table.js +85 -85
  34. package/migrations/20240314080604-create-user-user-group-table.js +55 -55
  35. package/migrations/20240314080605-create-login-history-table.js +53 -53
  36. package/migrations/20240527064925-create-system-table.js +78 -78
  37. package/migrations/20240527064926-create-system-privilege-table.js +71 -71
  38. package/migrations/20240527065342-create-group-table.js +93 -93
  39. package/migrations/20240527065633-create-group-reporting-user-table.js +76 -76
  40. package/migrations/20240528011551-create-group-system-access-table.js +72 -72
  41. package/migrations/20240528023018-user-system-access-table.js +75 -75
  42. package/migrations/20240528032229-user-privilege-table.js +76 -76
  43. package/migrations/20240528063003-create-group-privilege-table.js +76 -76
  44. package/migrations/20240528063051-create-group-object-privilege-table.js +84 -84
  45. package/migrations/20240528063107-create-user-object-privilege-table.js +84 -84
  46. package/migrations/20240528063108-create-api-key-table.js +85 -85
  47. package/migrations/20241104104802-create-building-table.js +95 -95
  48. package/migrations/20250108091132-add-area-manager-user-id-to-building-table.js +14 -14
  49. package/migrations/20250108091133-add-passcode-to-user-table.js +36 -36
  50. package/migrations/20250210115636-create-user-reporting-hierarchy.js +76 -76
  51. package/migrations/20250326043818-crate-user-password-history.js +42 -42
  52. package/migrations/20250610070720-added-MFBypassYN-to-sso-user.js +30 -30
  53. package/package.json +87 -87
  54. package/sampledotenv +7 -7
  55. package/src/components/login-user/user.ts +53 -16
  56. package/tsconfig.build.json +5 -5
  57. package/tsconfig.json +23 -23
  58. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.d.ts +0 -1
  59. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js +0 -71
  60. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js.map +0 -1
  61. package/dist/__tests__/unit/components/login-user/login-user.spec.d.ts +0 -0
  62. package/dist/__tests__/unit/components/login-user/login-user.spec.js +0 -6
  63. package/dist/__tests__/unit/components/login-user/login-user.spec.js.map +0 -1
package/package.json CHANGED
@@ -1,87 +1,87 @@
1
- {
2
- "name": "@tomei/sso",
3
- "version": "0.64.0-staging.1",
4
- "description": "Tomei SSO Package",
5
- "main": "dist/index.js",
6
- "scripts": {
7
- "start:dev": "tsc -w",
8
- "build": "tsc",
9
- "prepare": "husky",
10
- "format": "prettier --write \"src/**/*.ts\"",
11
- "lint": "npx eslint . --fix",
12
- "test": "jest --forceExit --detectOpenHandles --coverage"
13
- },
14
- "repository": {
15
- "type": "git",
16
- "url": "git+ssh://git@gitlab.com/tomei-package/sso.git"
17
- },
18
- "keywords": [
19
- "tomei",
20
- "sso"
21
- ],
22
- "author": "Tomei",
23
- "license": "ISC",
24
- "bugs": {
25
- "url": "https://gitlab.com/tomei-package/sso/issues"
26
- },
27
- "homepage": "https://gitlab.com/tomei-package/sso#readme",
28
- "devDependencies": {
29
- "@commitlint/cli": "^19.8.1",
30
- "@commitlint/config-conventional": "^19.8.1",
31
- "@eslint/js": "^9.35.0",
32
- "@tsconfig/node18": "^18.2.4",
33
- "@types/bcrypt": "^6.0.0",
34
- "@types/jest": "^30.0.0",
35
- "@types/node": "^24.3.1",
36
- "@types/validator": "^13.15.3",
37
- "@typescript-eslint/eslint-plugin": "^8.43.0",
38
- "@typescript-eslint/parser": "^8.43.0",
39
- "cls-hooked": "^4.2.2",
40
- "dotenv": "^17.2.2",
41
- "eslint": "^9.35.0",
42
- "eslint-config-prettier": "^10.1.8",
43
- "eslint-plugin-import": "^2.32.0",
44
- "eslint-plugin-prettier": "^5.5.4",
45
- "globals": "^16.4.0",
46
- "husky": "^9.1.7",
47
- "jest": "^30.1.3",
48
- "jest-mock-extended": "^4.0.0",
49
- "jest-sonar-reporter": "^2.0.0",
50
- "lint-staged": "^16.1.6",
51
- "prettier": "^3.6.2",
52
- "redis-mock": "^0.56.3",
53
- "ts-jest": "^29.4.1",
54
- "ts-node": "^10.9.2",
55
- "tsc-watch": "^7.1.1",
56
- "tsconfig-paths": "^4.2.0",
57
- "typescript": "^5.9.2"
58
- },
59
- "publishConfig": {
60
- "access": "public"
61
- },
62
- "peerDependencies": {
63
- "@tomei/activity-history": "^0.4.4",
64
- "@tomei/config": "^0.3.22",
65
- "@tomei/general": "^0.21.9",
66
- "@tomei/mailer": "^0.6.0",
67
- "argon2": "^0.44.0",
68
- "redis": "^5.8.2",
69
- "reflect-metadata": "^0.2.2",
70
- "sequelize": "^6.37.7",
71
- "sequelize-cli": "^6.6.3",
72
- "sequelize-typescript": "^2.1.6",
73
- "speakeasy": "^2.0.0",
74
- "uuid": "^11.1.0"
75
- },
76
- "lint-staged": {
77
- "*/**/*.{js,ts,tsx}": [
78
- "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
79
- "eslint \"{src,apps,libs,test}/**/*.ts\" --fix"
80
- ]
81
- },
82
- "jestSonar": {
83
- "reportPath": "coverage",
84
- "reportFile": "test-report.xml",
85
- "indent": 2
86
- }
87
- }
1
+ {
2
+ "name": "@tomei/sso",
3
+ "version": "0.64.0-staging.2",
4
+ "description": "Tomei SSO Package",
5
+ "main": "dist/index.js",
6
+ "scripts": {
7
+ "start:dev": "tsc -w",
8
+ "build": "tsc",
9
+ "prepare": "husky",
10
+ "format": "prettier --write \"src/**/*.ts\"",
11
+ "lint": "npx eslint . --fix",
12
+ "test": "jest --forceExit --detectOpenHandles --coverage"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+ssh://git@gitlab.com/tomei-package/sso.git"
17
+ },
18
+ "keywords": [
19
+ "tomei",
20
+ "sso"
21
+ ],
22
+ "author": "Tomei",
23
+ "license": "ISC",
24
+ "bugs": {
25
+ "url": "https://gitlab.com/tomei-package/sso/issues"
26
+ },
27
+ "homepage": "https://gitlab.com/tomei-package/sso#readme",
28
+ "devDependencies": {
29
+ "@commitlint/cli": "^19.8.1",
30
+ "@commitlint/config-conventional": "^19.8.1",
31
+ "@eslint/js": "^9.35.0",
32
+ "@tsconfig/node18": "^18.2.4",
33
+ "@types/bcrypt": "^6.0.0",
34
+ "@types/jest": "^30.0.0",
35
+ "@types/node": "^24.3.1",
36
+ "@types/validator": "^13.15.3",
37
+ "@typescript-eslint/eslint-plugin": "^8.43.0",
38
+ "@typescript-eslint/parser": "^8.43.0",
39
+ "cls-hooked": "^4.2.2",
40
+ "dotenv": "^17.2.2",
41
+ "eslint": "^9.35.0",
42
+ "eslint-config-prettier": "^10.1.8",
43
+ "eslint-plugin-import": "^2.32.0",
44
+ "eslint-plugin-prettier": "^5.5.4",
45
+ "globals": "^16.4.0",
46
+ "husky": "^9.1.7",
47
+ "jest": "^30.1.3",
48
+ "jest-mock-extended": "^4.0.0",
49
+ "jest-sonar-reporter": "^2.0.0",
50
+ "lint-staged": "^16.1.6",
51
+ "prettier": "^3.6.2",
52
+ "redis-mock": "^0.56.3",
53
+ "ts-jest": "^29.4.1",
54
+ "ts-node": "^10.9.2",
55
+ "tsc-watch": "^7.1.1",
56
+ "tsconfig-paths": "^4.2.0",
57
+ "typescript": "^5.9.2"
58
+ },
59
+ "publishConfig": {
60
+ "access": "public"
61
+ },
62
+ "peerDependencies": {
63
+ "@tomei/activity-history": "^0.4.4",
64
+ "@tomei/config": "^0.3.22",
65
+ "@tomei/general": "^0.21.9",
66
+ "@tomei/mailer": "^0.6.0",
67
+ "argon2": "^0.44.0",
68
+ "redis": "^5.8.2",
69
+ "reflect-metadata": "^0.2.2",
70
+ "sequelize": "^6.37.7",
71
+ "sequelize-cli": "^6.6.3",
72
+ "sequelize-typescript": "^2.1.6",
73
+ "speakeasy": "^2.0.0",
74
+ "uuid": "^11.1.0"
75
+ },
76
+ "lint-staged": {
77
+ "*/**/*.{js,ts,tsx}": [
78
+ "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
79
+ "eslint \"{src,apps,libs,test}/**/*.ts\" --fix"
80
+ ]
81
+ },
82
+ "jestSonar": {
83
+ "reportPath": "coverage",
84
+ "reportFile": "test-report.xml",
85
+ "indent": 2
86
+ }
87
+ }
package/sampledotenv CHANGED
@@ -1,8 +1,8 @@
1
- DATABASE_URL=
2
- SHADOW_DATABASE_URL=
3
- REDIS_URL=
4
- REDIS_PASSWORD=
5
- SMTP_HOST=
6
- SMTP_PORT=
7
- EMAIL_SENDER=
1
+ DATABASE_URL=
2
+ SHADOW_DATABASE_URL=
3
+ REDIS_URL=
4
+ REDIS_PASSWORD=
5
+ SMTP_HOST=
6
+ SMTP_PORT=
7
+ EMAIL_SENDER=
8
8
  EMAIL_PASSWORD=
@@ -585,7 +585,7 @@ export class User extends UserBase {
585
585
  },
586
586
  });
587
587
  if (!system) {
588
- throw new Error('Invalid credentials.');
588
+ throw new Error('Access denied: invalid or unauthorized system.');
589
589
  }
590
590
 
591
591
  // 1.5: Instantiate new PasswordHashService object and call PasswordHashService.verify method to check whether the param.Password is correct.
@@ -614,12 +614,14 @@ export class User extends UserBase {
614
614
  await User.releaseLock(this.UserId, dbTransaction);
615
615
  this.Status = UserStatus.ACTIVE;
616
616
  } else {
617
- throw new Error('Invalid credentials.');
617
+ throw new Error(
618
+ 'Your account has been locked. Please contact the administrator for assistance.',
619
+ );
618
620
  }
619
621
  }
620
622
  } catch (error) {
621
623
  await this.incrementFailedLoginAttemptCount(dbTransaction);
622
- throw new Error('Invalid credentials.');
624
+ throw error;
623
625
  }
624
626
 
625
627
  // 2.1: Call alertNewLogin to check whether the ip used is new ip and alert the user if it's new.
@@ -1732,7 +1734,7 @@ export class User extends UserBase {
1732
1734
  throw new ClassError(
1733
1735
  'LoginUser',
1734
1736
  'LoginUserErrMsg0X',
1735
- 'Invalid credentials.',
1737
+ 'Your account has been locked due to too many failed login attempts, please contact IT Support for instructions on how to unlock your account.',
1736
1738
  );
1737
1739
  }
1738
1740
  }
@@ -1818,7 +1820,7 @@ export class User extends UserBase {
1818
1820
 
1819
1821
  // Part 2: Retrieve Parent Group System Access If Applicable
1820
1822
  // 2.1 Check if Params.group.InheritParentSystemAccessYN is "Y" and Params.group.ParentGroupCode is not empty
1821
- if (group.InheritParentPrivilegeYN === 'Y' && group.ParentGroupCode) {
1823
+ if (group.InheritParentSystemAccessYN === 'Y' && group.ParentGroupCode) {
1822
1824
  const GroupCode = group.ParentGroupCode;
1823
1825
  const parentGroup = await User._GroupRepo.findByPk(
1824
1826
  GroupCode,
@@ -2003,15 +2005,31 @@ export class User extends UserBase {
2003
2005
  }
2004
2006
 
2005
2007
  // 3. Verify the mfaToken by calling speakeasy.totp.verify
2006
- const isVerified = await speakeasy.totp.verify({
2008
+ const isCurrentValid = await speakeasy.totp.verify({
2007
2009
  secret: userMFAConfig.totp.secret,
2008
2010
  encoding: 'base32',
2009
2011
  token: mfaToken,
2012
+ window: 0, // strict current time window
2010
2013
  });
2014
+ if (!isCurrentValid) {
2015
+ const isExpired = await speakeasy.totp.verify({
2016
+ secret: userMFAConfig.totp.secret,
2017
+ encoding: 'base32',
2018
+ token: mfaToken,
2019
+ window: 2, // allow slight leeway: previous or next 2 time steps
2020
+ });
2011
2021
 
2012
- // 4. if not verified, then return false. if verified, Call LoginUser._Repo.update and update user data in database
2013
- if (!isVerified) {
2014
- return false;
2022
+ if (isExpired) {
2023
+ return {
2024
+ success: false,
2025
+ reason: 'MFA token has expired. Please try again.',
2026
+ };
2027
+ } else {
2028
+ return {
2029
+ success: false,
2030
+ reason: 'Invalid MFA token. Check your authenticator app.',
2031
+ };
2032
+ }
2015
2033
  }
2016
2034
 
2017
2035
  user.MFAEnabled = 1;
@@ -2040,7 +2058,7 @@ export class User extends UserBase {
2040
2058
  const systemLogin = userSession.systemLogins.find(
2041
2059
  (e) => e.code === systemCode,
2042
2060
  );
2043
- return `${userId}:${systemLogin.sessionId}`;
2061
+ return { success: true, sessionId: `${userId}:${systemLogin.sessionId}` };
2044
2062
  }
2045
2063
 
2046
2064
  // This method will verify 2FA codes
@@ -2078,15 +2096,31 @@ export class User extends UserBase {
2078
2096
  }
2079
2097
 
2080
2098
  // 3. Verify the mfaToken by calling speakeasy.totp.verify
2081
- const isVerified = await speakeasy.totp.verify({
2099
+ const isCurrentValid = await speakeasy.totp.verify({
2082
2100
  secret: userMFAConfig.totp.secret,
2083
2101
  encoding: 'base32',
2084
2102
  token: mfaToken,
2103
+ window: 0, // strict current time window
2085
2104
  });
2105
+ if (!isCurrentValid) {
2106
+ const isExpired = await speakeasy.totp.verify({
2107
+ secret: userMFAConfig.totp.secret,
2108
+ encoding: 'base32',
2109
+ token: mfaToken,
2110
+ window: 2, // allow slight leeway: previous or next 2 time steps
2111
+ });
2086
2112
 
2087
- // 4. if not verified, then return false. if verified, Call LoginUser._Repo.update and update user data in database
2088
- if (!isVerified) {
2089
- return false;
2113
+ if (isExpired) {
2114
+ return {
2115
+ success: false,
2116
+ reason: 'MFA token has expired. Please try again.',
2117
+ };
2118
+ } else {
2119
+ return {
2120
+ success: false,
2121
+ reason: 'Invalid MFA token. Check your authenticator app.',
2122
+ };
2123
+ }
2090
2124
  }
2091
2125
 
2092
2126
  // 5. Retrieve Session
@@ -2109,7 +2143,7 @@ export class User extends UserBase {
2109
2143
  const systemLogin = userSession.systemLogins.find(
2110
2144
  (e) => e.code === systemCode,
2111
2145
  );
2112
- return `${userId}:${systemLogin.sessionId}`;
2146
+ return { success: true, sessionId: `${userId}:${systemLogin.sessionId}` };
2113
2147
  }
2114
2148
 
2115
2149
  public async bypass2FA(systemCode: string, dbTransaction: any) {
@@ -2152,7 +2186,10 @@ export class User extends UserBase {
2152
2186
  const systemLogin = userSession.systemLogins.find(
2153
2187
  (e) => e.code === systemCode,
2154
2188
  );
2155
- return `${this.UserId}:${systemLogin.sessionId}`;
2189
+ return {
2190
+ success: true,
2191
+ sessionId: `${this.UserId}:${systemLogin.sessionId}`,
2192
+ };
2156
2193
  } catch (error) {
2157
2194
  throw error;
2158
2195
  }
@@ -1,6 +1,6 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "include": ["**/*.ts"],
4
- "exclude": ["node_modules", "__tests__", "dist", "**/*spec.ts"]
5
- }
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "include": ["**/*.ts"],
4
+ "exclude": ["node_modules", "__tests__", "dist", "**/*spec.ts"]
5
+ }
6
6
 
package/tsconfig.json CHANGED
@@ -1,24 +1,24 @@
1
- {
2
- "compilerOptions": {
3
- "module": "commonjs",
4
- "declaration": true,
5
- "removeComments": true,
6
- "emitDecoratorMetadata": true,
7
- "experimentalDecorators": true,
8
- "allowSyntheticDefaultImports": true,
9
- "moduleResolution": "node",
10
- "target": "es6",
11
- "sourceMap": true,
12
- "outDir": "./dist",
13
- "baseUrl": "./src",
14
- "rootDir": "./",
15
- "incremental": true,
16
- "skipLibCheck": true,
17
- "noImplicitAny": false,
18
- "strictBindCallApply": false,
19
- "forceConsistentCasingInFileNames": false,
20
- "noFallthroughCasesInSwitch": false,
21
- "strictNullChecks": false,
22
- },
23
- "exclude": ["node_modules", "dist"]
1
+ {
2
+ "compilerOptions": {
3
+ "module": "commonjs",
4
+ "declaration": true,
5
+ "removeComments": true,
6
+ "emitDecoratorMetadata": true,
7
+ "experimentalDecorators": true,
8
+ "allowSyntheticDefaultImports": true,
9
+ "moduleResolution": "node",
10
+ "target": "es6",
11
+ "sourceMap": true,
12
+ "outDir": "./dist",
13
+ "baseUrl": "./src",
14
+ "rootDir": "./",
15
+ "incremental": true,
16
+ "skipLibCheck": true,
17
+ "noImplicitAny": false,
18
+ "strictBindCallApply": false,
19
+ "forceConsistentCasingInFileNames": false,
20
+ "noFallthroughCasesInSwitch": false,
21
+ "strictNullChecks": false,
22
+ },
23
+ "exclude": ["node_modules", "dist"]
24
24
  }
@@ -1,71 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- const group_privilege_1 = require("../../../../src/components/group-privilege/group-privilege");
13
- const group_privilege_repository_1 = require("../../../../src/components/group-privilege/group-privilege.repository");
14
- const general_1 = require("@tomei/general");
15
- describe('GroupPrivilege', () => {
16
- afterEach(() => {
17
- jest.restoreAllMocks();
18
- });
19
- it('should initialize with GroupPrivilegeAttr', () => __awaiter(void 0, void 0, void 0, function* () {
20
- const mockGroupPrivilegeAttr = {
21
- GroupPrivilegeId: 1,
22
- GroupCode: 'group1',
23
- PrivilegeCode: 'privilege1',
24
- Status: 'active',
25
- CreatedAt: new Date(),
26
- UpdatedAt: new Date(),
27
- CreatedById: 1,
28
- UpdatedById: 1,
29
- };
30
- const findOneMock = jest
31
- .spyOn(group_privilege_repository_1.GroupPrivilegeRepository.prototype, 'findOne')
32
- .mockResolvedValueOnce({ get: jest.fn().mockReturnValue(mockGroupPrivilegeAttr) });
33
- const groupPrivilege = yield group_privilege_1.GroupPrivilege.init(null, 1);
34
- expect(findOneMock).toBeCalledWith({
35
- where: { GroupPrivilegeId: 1 },
36
- transaction: null,
37
- });
38
- expect(groupPrivilege).toBeInstanceOf(group_privilege_1.GroupPrivilege);
39
- expect(groupPrivilege.GroupPrivilegeId).toEqual(mockGroupPrivilegeAttr.GroupPrivilegeId);
40
- expect(groupPrivilege.GroupCode).toEqual(mockGroupPrivilegeAttr.GroupCode);
41
- expect(groupPrivilege.PrivilegeCode).toEqual(mockGroupPrivilegeAttr.PrivilegeCode);
42
- expect(groupPrivilege.Status).toEqual(mockGroupPrivilegeAttr.Status);
43
- expect(groupPrivilege.CreatedAt).toEqual(mockGroupPrivilegeAttr.CreatedAt);
44
- expect(groupPrivilege.UpdatedAt).toEqual(mockGroupPrivilegeAttr.UpdatedAt);
45
- expect(groupPrivilege.CreatedById).toEqual(mockGroupPrivilegeAttr.CreatedById);
46
- expect(groupPrivilege.UpdatedById).toEqual(mockGroupPrivilegeAttr.UpdatedById);
47
- }));
48
- it('should throw ClassError when GroupPrivilegeAttr is not found', () => __awaiter(void 0, void 0, void 0, function* () {
49
- const findOneMock = jest
50
- .spyOn(group_privilege_repository_1.GroupPrivilegeRepository.prototype, 'findOne')
51
- .mockResolvedValueOnce(null);
52
- yield expect(group_privilege_1.GroupPrivilege.init(null, 1)).rejects.toThrow(general_1.ClassError);
53
- expect(findOneMock).toBeCalledWith({
54
- where: { GroupPrivilegeId: 1 },
55
- transaction: null,
56
- });
57
- }));
58
- it('should initialize with default values', () => __awaiter(void 0, void 0, void 0, function* () {
59
- const groupPrivilege = yield group_privilege_1.GroupPrivilege.init();
60
- expect(groupPrivilege).toBeInstanceOf(group_privilege_1.GroupPrivilege);
61
- expect(groupPrivilege.GroupPrivilegeId).toBeUndefined();
62
- expect(groupPrivilege.GroupCode).toBeUndefined();
63
- expect(groupPrivilege.PrivilegeCode).toBeUndefined();
64
- expect(groupPrivilege.Status).toBeUndefined();
65
- expect(groupPrivilege.CreatedAt).toBeUndefined();
66
- expect(groupPrivilege.UpdatedAt).toBeUndefined();
67
- expect(groupPrivilege.CreatedById).toBeUndefined();
68
- expect(groupPrivilege.UpdatedById).toBeUndefined();
69
- }));
70
- });
71
- //# sourceMappingURL=group-privilege.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"group-privilege.test.js","sourceRoot":"","sources":["../../../../../__tests__/unit/components/group-privilege/group-privilege.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- describe('LoginUser', () => {
2
- it('should be true', () => {
3
- expect(true).toBe(true);
4
- });
5
- });
6
- //# sourceMappingURL=login-user.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login-user.spec.js","sourceRoot":"","sources":["../../../../../__tests__/unit/components/login-user/login-user.spec.ts"],"names":[],"mappings":"AAuuBA,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}