@memberjunction/credentials 4.2.0 → 4.3.0
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.
- package/dist/__mocks__/core-entities.d.ts +64 -0
- package/dist/__mocks__/core-entities.d.ts.map +1 -0
- package/dist/__mocks__/core-entities.js +68 -0
- package/dist/__mocks__/core-entities.js.map +1 -0
- package/dist/__mocks__/core.d.ts +46 -0
- package/dist/__mocks__/core.d.ts.map +1 -0
- package/dist/__mocks__/core.js +80 -0
- package/dist/__mocks__/core.js.map +1 -0
- package/package.json +6 -8
- package/dist/__tests__/credential-validation.test.d.ts +0 -2
- package/dist/__tests__/credential-validation.test.d.ts.map +0 -1
- package/dist/__tests__/credential-validation.test.js +0 -440
- package/dist/__tests__/credential-validation.test.js.map +0 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
declare class MockBaseEntity {
|
|
2
|
+
protected _data: Record<string, unknown>;
|
|
3
|
+
constructor(data?: Record<string, unknown>);
|
|
4
|
+
get ID(): string;
|
|
5
|
+
set ID(value: string);
|
|
6
|
+
Save: import("vitest").Mock<(...args: any[]) => any>;
|
|
7
|
+
NewRecord: import("vitest").Mock<(...args: any[]) => any>;
|
|
8
|
+
Load: import("vitest").Mock<(...args: any[]) => any>;
|
|
9
|
+
GetAll(): Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export declare class CredentialEntity extends MockBaseEntity {
|
|
12
|
+
get Name(): string;
|
|
13
|
+
set Name(value: string);
|
|
14
|
+
get CredentialTypeID(): string;
|
|
15
|
+
set CredentialTypeID(value: string);
|
|
16
|
+
get Values(): string;
|
|
17
|
+
set Values(value: string);
|
|
18
|
+
get IsActive(): boolean;
|
|
19
|
+
set IsActive(value: boolean);
|
|
20
|
+
get IsDefault(): boolean;
|
|
21
|
+
set IsDefault(value: boolean);
|
|
22
|
+
get ExpiresAt(): Date | null;
|
|
23
|
+
set ExpiresAt(value: Date | null);
|
|
24
|
+
get LastUsedAt(): Date | null;
|
|
25
|
+
set LastUsedAt(value: Date | null);
|
|
26
|
+
get LastValidatedAt(): Date | null;
|
|
27
|
+
set LastValidatedAt(value: Date | null);
|
|
28
|
+
get CategoryID(): string | null;
|
|
29
|
+
set CategoryID(value: string | null);
|
|
30
|
+
get IconClass(): string | null;
|
|
31
|
+
set IconClass(value: string | null);
|
|
32
|
+
get Description(): string | null;
|
|
33
|
+
set Description(value: string | null);
|
|
34
|
+
}
|
|
35
|
+
export declare class CredentialTypeEntity extends MockBaseEntity {
|
|
36
|
+
get Name(): string;
|
|
37
|
+
set Name(value: string);
|
|
38
|
+
get FieldSchema(): string;
|
|
39
|
+
set FieldSchema(value: string);
|
|
40
|
+
get ValidationEndpoint(): string | null;
|
|
41
|
+
set ValidationEndpoint(value: string | null);
|
|
42
|
+
}
|
|
43
|
+
export declare class CredentialCategoryEntity extends MockBaseEntity {
|
|
44
|
+
get Name(): string;
|
|
45
|
+
set Name(value: string);
|
|
46
|
+
}
|
|
47
|
+
export declare class AuditLogEntity extends MockBaseEntity {
|
|
48
|
+
get UserID(): string;
|
|
49
|
+
set UserID(value: string);
|
|
50
|
+
get AuditLogTypeID(): string;
|
|
51
|
+
set AuditLogTypeID(value: string);
|
|
52
|
+
get Status(): string;
|
|
53
|
+
set Status(value: string);
|
|
54
|
+
get Description(): string;
|
|
55
|
+
set Description(value: string);
|
|
56
|
+
get Details(): string;
|
|
57
|
+
set Details(value: string);
|
|
58
|
+
get EntityID(): string | null;
|
|
59
|
+
set EntityID(value: string | null);
|
|
60
|
+
get RecordID(): string | null;
|
|
61
|
+
set RecordID(value: string | null);
|
|
62
|
+
}
|
|
63
|
+
export {};
|
|
64
|
+
//# sourceMappingURL=core-entities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-entities.d.ts","sourceRoot":"","sources":["../../src/__mocks__/core-entities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { vi } from 'vitest';
|
|
2
|
+
class MockBaseEntity {
|
|
3
|
+
constructor(data) {
|
|
4
|
+
this._data = {};
|
|
5
|
+
this.Save = vi.fn().mockResolvedValue(true);
|
|
6
|
+
this.NewRecord = vi.fn();
|
|
7
|
+
this.Load = vi.fn().mockResolvedValue(true);
|
|
8
|
+
if (data) {
|
|
9
|
+
Object.assign(this._data, data);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
get ID() { return this._data.ID || ''; }
|
|
13
|
+
set ID(value) { this._data.ID = value; }
|
|
14
|
+
GetAll() { return { ...this._data }; }
|
|
15
|
+
}
|
|
16
|
+
export class CredentialEntity extends MockBaseEntity {
|
|
17
|
+
get Name() { return this._data.Name || ''; }
|
|
18
|
+
set Name(value) { this._data.Name = value; }
|
|
19
|
+
get CredentialTypeID() { return this._data.CredentialTypeID || ''; }
|
|
20
|
+
set CredentialTypeID(value) { this._data.CredentialTypeID = value; }
|
|
21
|
+
get Values() { return this._data.Values || ''; }
|
|
22
|
+
set Values(value) { this._data.Values = value; }
|
|
23
|
+
get IsActive() { return this._data.IsActive ?? true; }
|
|
24
|
+
set IsActive(value) { this._data.IsActive = value; }
|
|
25
|
+
get IsDefault() { return this._data.IsDefault ?? false; }
|
|
26
|
+
set IsDefault(value) { this._data.IsDefault = value; }
|
|
27
|
+
get ExpiresAt() { return this._data.ExpiresAt ?? null; }
|
|
28
|
+
set ExpiresAt(value) { this._data.ExpiresAt = value; }
|
|
29
|
+
get LastUsedAt() { return this._data.LastUsedAt ?? null; }
|
|
30
|
+
set LastUsedAt(value) { this._data.LastUsedAt = value; }
|
|
31
|
+
get LastValidatedAt() { return this._data.LastValidatedAt ?? null; }
|
|
32
|
+
set LastValidatedAt(value) { this._data.LastValidatedAt = value; }
|
|
33
|
+
get CategoryID() { return this._data.CategoryID ?? null; }
|
|
34
|
+
set CategoryID(value) { this._data.CategoryID = value; }
|
|
35
|
+
get IconClass() { return this._data.IconClass ?? null; }
|
|
36
|
+
set IconClass(value) { this._data.IconClass = value; }
|
|
37
|
+
get Description() { return this._data.Description ?? null; }
|
|
38
|
+
set Description(value) { this._data.Description = value; }
|
|
39
|
+
}
|
|
40
|
+
export class CredentialTypeEntity extends MockBaseEntity {
|
|
41
|
+
get Name() { return this._data.Name || ''; }
|
|
42
|
+
set Name(value) { this._data.Name = value; }
|
|
43
|
+
get FieldSchema() { return this._data.FieldSchema || ''; }
|
|
44
|
+
set FieldSchema(value) { this._data.FieldSchema = value; }
|
|
45
|
+
get ValidationEndpoint() { return this._data.ValidationEndpoint ?? null; }
|
|
46
|
+
set ValidationEndpoint(value) { this._data.ValidationEndpoint = value; }
|
|
47
|
+
}
|
|
48
|
+
export class CredentialCategoryEntity extends MockBaseEntity {
|
|
49
|
+
get Name() { return this._data.Name || ''; }
|
|
50
|
+
set Name(value) { this._data.Name = value; }
|
|
51
|
+
}
|
|
52
|
+
export class AuditLogEntity extends MockBaseEntity {
|
|
53
|
+
get UserID() { return this._data.UserID || ''; }
|
|
54
|
+
set UserID(value) { this._data.UserID = value; }
|
|
55
|
+
get AuditLogTypeID() { return this._data.AuditLogTypeID || ''; }
|
|
56
|
+
set AuditLogTypeID(value) { this._data.AuditLogTypeID = value; }
|
|
57
|
+
get Status() { return this._data.Status || ''; }
|
|
58
|
+
set Status(value) { this._data.Status = value; }
|
|
59
|
+
get Description() { return this._data.Description || ''; }
|
|
60
|
+
set Description(value) { this._data.Description = value; }
|
|
61
|
+
get Details() { return this._data.Details || ''; }
|
|
62
|
+
set Details(value) { this._data.Details = value; }
|
|
63
|
+
get EntityID() { return this._data.EntityID ?? null; }
|
|
64
|
+
set EntityID(value) { this._data.EntityID = value; }
|
|
65
|
+
get RecordID() { return this._data.RecordID ?? null; }
|
|
66
|
+
set RecordID(value) { this._data.RecordID = value; }
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=core-entities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-entities.js","sourceRoot":"","sources":["../../src/__mocks__/core-entities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export declare function setMockLoadData(entityName: string, data: unknown[]): void;
|
|
2
|
+
export declare function setMockEntityObject(entityName: string, entity: unknown): void;
|
|
3
|
+
export declare function setMockEntityInfos(infos: Array<{
|
|
4
|
+
ID: string;
|
|
5
|
+
Name: string;
|
|
6
|
+
}>): void;
|
|
7
|
+
export declare function clearAllCredentialMocks(): void;
|
|
8
|
+
export declare function resetEngineInstances(): void;
|
|
9
|
+
export declare class BaseEngine<_T> {
|
|
10
|
+
protected _isLoaded: boolean;
|
|
11
|
+
protected Load(params: Array<{
|
|
12
|
+
PropertyName: string;
|
|
13
|
+
EntityName: string;
|
|
14
|
+
CacheLocal?: boolean;
|
|
15
|
+
}>, _provider?: unknown, _forceRefresh?: boolean, _contextUser?: unknown): Promise<void>;
|
|
16
|
+
protected TryThrowIfNotLoaded(): void;
|
|
17
|
+
protected RefreshItem(_propertyName: string): Promise<void>;
|
|
18
|
+
protected static getInstance<U>(): U;
|
|
19
|
+
}
|
|
20
|
+
export declare class Metadata {
|
|
21
|
+
GetEntityObject<T>(entityName: string, _contextUser?: unknown): Promise<T>;
|
|
22
|
+
EntityByName(name: string): {
|
|
23
|
+
ID: string;
|
|
24
|
+
Name: string;
|
|
25
|
+
} | undefined;
|
|
26
|
+
}
|
|
27
|
+
export declare class UserInfo {
|
|
28
|
+
ID: string;
|
|
29
|
+
Name: string;
|
|
30
|
+
Email: string;
|
|
31
|
+
IsActive: boolean;
|
|
32
|
+
constructor(_provider?: unknown, data?: Record<string, unknown>);
|
|
33
|
+
}
|
|
34
|
+
export type IMetadataProvider = {
|
|
35
|
+
Entities: Array<{
|
|
36
|
+
ID: string;
|
|
37
|
+
Name: string;
|
|
38
|
+
}>;
|
|
39
|
+
};
|
|
40
|
+
export type EntityInfo = {
|
|
41
|
+
ID: string;
|
|
42
|
+
Name: string;
|
|
43
|
+
};
|
|
44
|
+
export declare const LogError: import("vitest").Mock<(...args: any[]) => any>;
|
|
45
|
+
export declare const LogStatus: import("vitest").Mock<(...args: any[]) => any>;
|
|
46
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/__mocks__/core.ts"],"names":[],"mappings":"AAcA,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAEzE;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAE7E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAEnF;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAK9C;AAKD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAGD,qBAAa,UAAU,CAAC,EAAE;IACtB,SAAS,CAAC,SAAS,UAAS;cAEZ,IAAI,CAChB,MAAM,EAAE,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,EACjF,SAAS,CAAC,EAAE,OAAO,EACnB,aAAa,CAAC,EAAE,OAAO,EACvB,YAAY,CAAC,EAAE,OAAO,GACvB,OAAO,CAAC,IAAI,CAAC;IAQhB,SAAS,CAAC,mBAAmB,IAAI,IAAI;cAMrB,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjE,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC;CAOvC;AAGD,qBAAa,QAAQ;IACX,eAAe,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAchF,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;CAKvE;AAGD,qBAAa,QAAQ;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;gBAEN,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAMlE;AAGD,MAAM,MAAM,iBAAiB,GAAG;IAC5B,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,eAAO,MAAM,QAAQ,gDAAU,CAAC;AAChC,eAAO,MAAM,SAAS,gDAAU,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { vi } from 'vitest';
|
|
2
|
+
let mockLoadData = new Map();
|
|
3
|
+
let mockEntityObjects = new Map();
|
|
4
|
+
let mockEntityInfos = [
|
|
5
|
+
{ ID: 'cred-entity-id', Name: 'MJ: Credentials' }
|
|
6
|
+
];
|
|
7
|
+
export function setMockLoadData(entityName, data) {
|
|
8
|
+
mockLoadData.set(entityName, data);
|
|
9
|
+
}
|
|
10
|
+
export function setMockEntityObject(entityName, entity) {
|
|
11
|
+
mockEntityObjects.set(entityName, entity);
|
|
12
|
+
}
|
|
13
|
+
export function setMockEntityInfos(infos) {
|
|
14
|
+
mockEntityInfos = infos;
|
|
15
|
+
}
|
|
16
|
+
export function clearAllCredentialMocks() {
|
|
17
|
+
mockLoadData.clear();
|
|
18
|
+
mockEntityObjects.clear();
|
|
19
|
+
mockEntityInfos = [{ ID: 'cred-entity-id', Name: 'MJ: Credentials' }];
|
|
20
|
+
_instances.clear();
|
|
21
|
+
}
|
|
22
|
+
const _instances = new Map();
|
|
23
|
+
export function resetEngineInstances() {
|
|
24
|
+
_instances.clear();
|
|
25
|
+
}
|
|
26
|
+
export class BaseEngine {
|
|
27
|
+
constructor() {
|
|
28
|
+
this._isLoaded = false;
|
|
29
|
+
}
|
|
30
|
+
async Load(params, _provider, _forceRefresh, _contextUser) {
|
|
31
|
+
for (const param of params) {
|
|
32
|
+
const data = mockLoadData.get(param.EntityName) || [];
|
|
33
|
+
this[param.PropertyName] = data;
|
|
34
|
+
}
|
|
35
|
+
this._isLoaded = true;
|
|
36
|
+
}
|
|
37
|
+
TryThrowIfNotLoaded() {
|
|
38
|
+
if (!this._isLoaded) {
|
|
39
|
+
throw new Error('Engine has not been initialized. Call Config() first.');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async RefreshItem(_propertyName) {
|
|
43
|
+
}
|
|
44
|
+
static getInstance() {
|
|
45
|
+
const key = this.name || 'default';
|
|
46
|
+
if (!_instances.has(key)) {
|
|
47
|
+
_instances.set(key, new this());
|
|
48
|
+
}
|
|
49
|
+
return _instances.get(key);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export class Metadata {
|
|
53
|
+
async GetEntityObject(entityName, _contextUser) {
|
|
54
|
+
const entity = mockEntityObjects.get(entityName);
|
|
55
|
+
if (entity) {
|
|
56
|
+
return entity;
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
ID: 'mock-entity-id',
|
|
60
|
+
Save: vi.fn().mockResolvedValue(true),
|
|
61
|
+
Load: vi.fn().mockResolvedValue(true),
|
|
62
|
+
GetAll: vi.fn().mockReturnValue({}),
|
|
63
|
+
NewRecord: vi.fn(),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
EntityByName(name) {
|
|
67
|
+
return mockEntityInfos.find(e => e.Name?.trim().toLowerCase() === name.trim().toLowerCase());
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export class UserInfo {
|
|
71
|
+
constructor(_provider, data) {
|
|
72
|
+
this.ID = data?.ID || 'mock-user-id';
|
|
73
|
+
this.Name = data?.Name || 'Mock User';
|
|
74
|
+
this.Email = data?.Email || 'mock@example.com';
|
|
75
|
+
this.IsActive = data?.IsActive ?? true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export const LogError = vi.fn();
|
|
79
|
+
export const LogStatus = vi.fn();
|
|
80
|
+
//# sourceMappingURL=core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/__mocks__/core.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/credentials",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.3.0",
|
|
4
4
|
"description": "MemberJunction: Credential Engine - secure credential management with caching, encryption, and audit logging.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -11,25 +11,23 @@
|
|
|
11
11
|
"scripts": {
|
|
12
12
|
"start": "ts-node-dev src/index.ts",
|
|
13
13
|
"build": "tsc && tsc-alias -f",
|
|
14
|
-
"test": "
|
|
14
|
+
"test": "vitest run"
|
|
15
15
|
},
|
|
16
16
|
"author": "MemberJunction.com",
|
|
17
17
|
"license": "ISC",
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@memberjunction/core": "4.
|
|
20
|
-
"@memberjunction/global": "4.
|
|
21
|
-
"@memberjunction/core-entities": "4.
|
|
19
|
+
"@memberjunction/core": "4.3.0",
|
|
20
|
+
"@memberjunction/global": "4.3.0",
|
|
21
|
+
"@memberjunction/core-entities": "4.3.0",
|
|
22
22
|
"ajv": "^8.17.1",
|
|
23
23
|
"ajv-formats": "^3.0.1",
|
|
24
24
|
"rxjs": "^7.8.2"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@types/jest": "^30.0.0",
|
|
28
27
|
"@types/node": "24.10.11",
|
|
29
|
-
"jest": "^30.2.0",
|
|
30
28
|
"tsc-alias": "^1.8.16",
|
|
31
|
-
"ts-jest": "^29.4.6",
|
|
32
29
|
"ts-node-dev": "^2.0.0",
|
|
30
|
+
"vitest": "^3.1.1",
|
|
33
31
|
"typescript": "^5.9.3"
|
|
34
32
|
},
|
|
35
33
|
"repository": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-validation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/credential-validation.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,440 +0,0 @@
|
|
|
1
|
-
import { describe, test, expect, beforeEach } from '@jest/globals';
|
|
2
|
-
import Ajv from 'ajv';
|
|
3
|
-
import addFormats from 'ajv-formats';
|
|
4
|
-
describe('Credential Validation with Ajv', () => {
|
|
5
|
-
let ajv;
|
|
6
|
-
beforeEach(() => {
|
|
7
|
-
ajv = new Ajv({
|
|
8
|
-
allErrors: true,
|
|
9
|
-
strict: false,
|
|
10
|
-
coerceTypes: false
|
|
11
|
-
});
|
|
12
|
-
addFormats(ajv);
|
|
13
|
-
});
|
|
14
|
-
describe('Required Field Validation', () => {
|
|
15
|
-
test('should reject when required field is missing', () => {
|
|
16
|
-
const schema = {
|
|
17
|
-
type: 'object',
|
|
18
|
-
properties: {
|
|
19
|
-
apiKey: { type: 'string' }
|
|
20
|
-
},
|
|
21
|
-
required: ['apiKey']
|
|
22
|
-
};
|
|
23
|
-
const validator = ajv.compile(schema);
|
|
24
|
-
const result = validator({});
|
|
25
|
-
expect(result).toBe(false);
|
|
26
|
-
expect(validator.errors).toBeDefined();
|
|
27
|
-
expect(validator.errors?.[0].keyword).toBe('required');
|
|
28
|
-
expect(validator.errors?.[0].params.missingProperty).toBe('apiKey');
|
|
29
|
-
});
|
|
30
|
-
test('should pass when all required fields are present', () => {
|
|
31
|
-
const schema = {
|
|
32
|
-
type: 'object',
|
|
33
|
-
properties: {
|
|
34
|
-
apiKey: { type: 'string' },
|
|
35
|
-
endpoint: { type: 'string' }
|
|
36
|
-
},
|
|
37
|
-
required: ['apiKey', 'endpoint']
|
|
38
|
-
};
|
|
39
|
-
const validator = ajv.compile(schema);
|
|
40
|
-
const result = validator({
|
|
41
|
-
apiKey: 'sk-test123',
|
|
42
|
-
endpoint: 'https://api.example.com'
|
|
43
|
-
});
|
|
44
|
-
expect(result).toBe(true);
|
|
45
|
-
expect(validator.errors).toBeNull();
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
describe('Const Field Validation', () => {
|
|
49
|
-
test('should reject when const field has wrong value', () => {
|
|
50
|
-
const schema = {
|
|
51
|
-
type: 'object',
|
|
52
|
-
properties: {
|
|
53
|
-
tokenUrl: {
|
|
54
|
-
type: 'string',
|
|
55
|
-
const: 'https://api.box.com/oauth2/token'
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
const validator = ajv.compile(schema);
|
|
60
|
-
const result = validator({ tokenUrl: 'https://wrong.url.com' });
|
|
61
|
-
expect(result).toBe(false);
|
|
62
|
-
expect(validator.errors?.[0].keyword).toBe('const');
|
|
63
|
-
expect(validator.errors?.[0].params.allowedValue).toBe('https://api.box.com/oauth2/token');
|
|
64
|
-
});
|
|
65
|
-
test('should pass when const field matches exactly', () => {
|
|
66
|
-
const schema = {
|
|
67
|
-
type: 'object',
|
|
68
|
-
properties: {
|
|
69
|
-
tokenUrl: {
|
|
70
|
-
type: 'string',
|
|
71
|
-
const: 'https://api.box.com/oauth2/token'
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
const validator = ajv.compile(schema);
|
|
76
|
-
const result = validator({ tokenUrl: 'https://api.box.com/oauth2/token' });
|
|
77
|
-
expect(result).toBe(true);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
describe('Enum Field Validation', () => {
|
|
81
|
-
test('should reject when value is not in enum', () => {
|
|
82
|
-
const schema = {
|
|
83
|
-
type: 'object',
|
|
84
|
-
properties: {
|
|
85
|
-
boxSubjectType: {
|
|
86
|
-
type: 'string',
|
|
87
|
-
enum: ['enterprise', 'user']
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
const validator = ajv.compile(schema);
|
|
92
|
-
const result = validator({ boxSubjectType: 'invalid' });
|
|
93
|
-
expect(result).toBe(false);
|
|
94
|
-
expect(validator.errors?.[0].keyword).toBe('enum');
|
|
95
|
-
expect(validator.errors?.[0].params.allowedValues).toEqual(['enterprise', 'user']);
|
|
96
|
-
});
|
|
97
|
-
test('should pass when value is in enum', () => {
|
|
98
|
-
const schema = {
|
|
99
|
-
type: 'object',
|
|
100
|
-
properties: {
|
|
101
|
-
boxSubjectType: {
|
|
102
|
-
type: 'string',
|
|
103
|
-
enum: ['enterprise', 'user']
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
};
|
|
107
|
-
const validator = ajv.compile(schema);
|
|
108
|
-
const result = validator({ boxSubjectType: 'enterprise' });
|
|
109
|
-
expect(result).toBe(true);
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
describe('Format Validation', () => {
|
|
113
|
-
test('should reject invalid URI format', () => {
|
|
114
|
-
const schema = {
|
|
115
|
-
type: 'object',
|
|
116
|
-
properties: {
|
|
117
|
-
endpoint: {
|
|
118
|
-
type: 'string',
|
|
119
|
-
format: 'uri'
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
};
|
|
123
|
-
const validator = ajv.compile(schema);
|
|
124
|
-
const result = validator({ endpoint: 'not-a-valid-url' });
|
|
125
|
-
expect(result).toBe(false);
|
|
126
|
-
expect(validator.errors?.[0].keyword).toBe('format');
|
|
127
|
-
expect(validator.errors?.[0].params.format).toBe('uri');
|
|
128
|
-
});
|
|
129
|
-
test('should pass valid URI format', () => {
|
|
130
|
-
const schema = {
|
|
131
|
-
type: 'object',
|
|
132
|
-
properties: {
|
|
133
|
-
endpoint: {
|
|
134
|
-
type: 'string',
|
|
135
|
-
format: 'uri'
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
const validator = ajv.compile(schema);
|
|
140
|
-
const result = validator({ endpoint: 'https://api.example.com/v1' });
|
|
141
|
-
expect(result).toBe(true);
|
|
142
|
-
});
|
|
143
|
-
test('should reject invalid email format', () => {
|
|
144
|
-
const schema = {
|
|
145
|
-
type: 'object',
|
|
146
|
-
properties: {
|
|
147
|
-
email: {
|
|
148
|
-
type: 'string',
|
|
149
|
-
format: 'email'
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
const validator = ajv.compile(schema);
|
|
154
|
-
const result = validator({ email: 'not-an-email' });
|
|
155
|
-
expect(result).toBe(false);
|
|
156
|
-
expect(validator.errors?.[0].params.format).toBe('email');
|
|
157
|
-
});
|
|
158
|
-
test('should pass valid email format', () => {
|
|
159
|
-
const schema = {
|
|
160
|
-
type: 'object',
|
|
161
|
-
properties: {
|
|
162
|
-
email: {
|
|
163
|
-
type: 'string',
|
|
164
|
-
format: 'email'
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
const validator = ajv.compile(schema);
|
|
169
|
-
const result = validator({ email: 'test@example.com' });
|
|
170
|
-
expect(result).toBe(true);
|
|
171
|
-
});
|
|
172
|
-
test('should reject invalid uuid format', () => {
|
|
173
|
-
const schema = {
|
|
174
|
-
type: 'object',
|
|
175
|
-
properties: {
|
|
176
|
-
id: {
|
|
177
|
-
type: 'string',
|
|
178
|
-
format: 'uuid'
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
};
|
|
182
|
-
const validator = ajv.compile(schema);
|
|
183
|
-
const result = validator({ id: 'not-a-uuid' });
|
|
184
|
-
expect(result).toBe(false);
|
|
185
|
-
});
|
|
186
|
-
test('should pass valid uuid format', () => {
|
|
187
|
-
const schema = {
|
|
188
|
-
type: 'object',
|
|
189
|
-
properties: {
|
|
190
|
-
id: {
|
|
191
|
-
type: 'string',
|
|
192
|
-
format: 'uuid'
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
};
|
|
196
|
-
const validator = ajv.compile(schema);
|
|
197
|
-
const result = validator({ id: '550e8400-e29b-41d4-a716-446655440000' });
|
|
198
|
-
expect(result).toBe(true);
|
|
199
|
-
});
|
|
200
|
-
});
|
|
201
|
-
describe('Pattern Validation', () => {
|
|
202
|
-
test('should reject value not matching pattern', () => {
|
|
203
|
-
const schema = {
|
|
204
|
-
type: 'object',
|
|
205
|
-
properties: {
|
|
206
|
-
apiKey: {
|
|
207
|
-
type: 'string',
|
|
208
|
-
pattern: '^sk-[a-zA-Z0-9]{32}$'
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
};
|
|
212
|
-
const validator = ajv.compile(schema);
|
|
213
|
-
const result = validator({ apiKey: 'invalid-key' });
|
|
214
|
-
expect(result).toBe(false);
|
|
215
|
-
expect(validator.errors?.[0].keyword).toBe('pattern');
|
|
216
|
-
});
|
|
217
|
-
test('should pass value matching pattern', () => {
|
|
218
|
-
const schema = {
|
|
219
|
-
type: 'object',
|
|
220
|
-
properties: {
|
|
221
|
-
apiKey: {
|
|
222
|
-
type: 'string',
|
|
223
|
-
pattern: '^sk-[a-zA-Z0-9]{32}$'
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
};
|
|
227
|
-
const validator = ajv.compile(schema);
|
|
228
|
-
const result = validator({ apiKey: 'sk-abcdefghijklmnopqrstuvwxyz123456' });
|
|
229
|
-
expect(result).toBe(true);
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
describe('Length Validation', () => {
|
|
233
|
-
test('should reject value shorter than minLength', () => {
|
|
234
|
-
const schema = {
|
|
235
|
-
type: 'object',
|
|
236
|
-
properties: {
|
|
237
|
-
password: {
|
|
238
|
-
type: 'string',
|
|
239
|
-
minLength: 8
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
};
|
|
243
|
-
const validator = ajv.compile(schema);
|
|
244
|
-
const result = validator({ password: 'short' });
|
|
245
|
-
expect(result).toBe(false);
|
|
246
|
-
expect(validator.errors?.[0].keyword).toBe('minLength');
|
|
247
|
-
expect(validator.errors?.[0].params.limit).toBe(8);
|
|
248
|
-
});
|
|
249
|
-
test('should reject value longer than maxLength', () => {
|
|
250
|
-
const schema = {
|
|
251
|
-
type: 'object',
|
|
252
|
-
properties: {
|
|
253
|
-
name: {
|
|
254
|
-
type: 'string',
|
|
255
|
-
maxLength: 10
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
};
|
|
259
|
-
const validator = ajv.compile(schema);
|
|
260
|
-
const result = validator({ name: 'this-is-too-long' });
|
|
261
|
-
expect(result).toBe(false);
|
|
262
|
-
expect(validator.errors?.[0].keyword).toBe('maxLength');
|
|
263
|
-
expect(validator.errors?.[0].params.limit).toBe(10);
|
|
264
|
-
});
|
|
265
|
-
test('should pass value within length bounds', () => {
|
|
266
|
-
const schema = {
|
|
267
|
-
type: 'object',
|
|
268
|
-
properties: {
|
|
269
|
-
password: {
|
|
270
|
-
type: 'string',
|
|
271
|
-
minLength: 8,
|
|
272
|
-
maxLength: 20
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
};
|
|
276
|
-
const validator = ajv.compile(schema);
|
|
277
|
-
const result = validator({ password: 'goodpassword' });
|
|
278
|
-
expect(result).toBe(true);
|
|
279
|
-
});
|
|
280
|
-
});
|
|
281
|
-
describe('Numeric Range Validation', () => {
|
|
282
|
-
test('should reject value below minimum', () => {
|
|
283
|
-
const schema = {
|
|
284
|
-
type: 'object',
|
|
285
|
-
properties: {
|
|
286
|
-
port: {
|
|
287
|
-
type: 'number',
|
|
288
|
-
minimum: 1024
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
};
|
|
292
|
-
const validator = ajv.compile(schema);
|
|
293
|
-
const result = validator({ port: 80 });
|
|
294
|
-
expect(result).toBe(false);
|
|
295
|
-
expect(validator.errors?.[0].keyword).toBe('minimum');
|
|
296
|
-
});
|
|
297
|
-
test('should reject value above maximum', () => {
|
|
298
|
-
const schema = {
|
|
299
|
-
type: 'object',
|
|
300
|
-
properties: {
|
|
301
|
-
port: {
|
|
302
|
-
type: 'number',
|
|
303
|
-
maximum: 65535
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
};
|
|
307
|
-
const validator = ajv.compile(schema);
|
|
308
|
-
const result = validator({ port: 70000 });
|
|
309
|
-
expect(result).toBe(false);
|
|
310
|
-
expect(validator.errors?.[0].keyword).toBe('maximum');
|
|
311
|
-
});
|
|
312
|
-
test('should pass value within numeric bounds', () => {
|
|
313
|
-
const schema = {
|
|
314
|
-
type: 'object',
|
|
315
|
-
properties: {
|
|
316
|
-
port: {
|
|
317
|
-
type: 'number',
|
|
318
|
-
minimum: 1024,
|
|
319
|
-
maximum: 65535
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
};
|
|
323
|
-
const validator = ajv.compile(schema);
|
|
324
|
-
const result = validator({ port: 8080 });
|
|
325
|
-
expect(result).toBe(true);
|
|
326
|
-
});
|
|
327
|
-
});
|
|
328
|
-
describe('Combined Constraints', () => {
|
|
329
|
-
test('should validate Box.com OAuth schema', () => {
|
|
330
|
-
const schema = {
|
|
331
|
-
type: 'object',
|
|
332
|
-
properties: {
|
|
333
|
-
clientId: { type: 'string' },
|
|
334
|
-
clientSecret: { type: 'string' },
|
|
335
|
-
tokenUrl: {
|
|
336
|
-
type: 'string',
|
|
337
|
-
const: 'https://api.box.com/oauth2/token'
|
|
338
|
-
},
|
|
339
|
-
boxSubjectType: {
|
|
340
|
-
type: 'string',
|
|
341
|
-
enum: ['enterprise', 'user']
|
|
342
|
-
}
|
|
343
|
-
},
|
|
344
|
-
required: ['clientId', 'clientSecret', 'tokenUrl', 'boxSubjectType']
|
|
345
|
-
};
|
|
346
|
-
const validator = ajv.compile(schema);
|
|
347
|
-
expect(validator({
|
|
348
|
-
clientId: 'test-client',
|
|
349
|
-
clientSecret: 'test-secret',
|
|
350
|
-
tokenUrl: 'https://api.box.com/oauth2/token',
|
|
351
|
-
boxSubjectType: 'enterprise'
|
|
352
|
-
})).toBe(true);
|
|
353
|
-
expect(validator({
|
|
354
|
-
clientId: 'test-client',
|
|
355
|
-
clientSecret: 'test-secret',
|
|
356
|
-
tokenUrl: 'https://wrong.url.com',
|
|
357
|
-
boxSubjectType: 'enterprise'
|
|
358
|
-
})).toBe(false);
|
|
359
|
-
expect(validator({
|
|
360
|
-
clientId: 'test-client',
|
|
361
|
-
clientSecret: 'test-secret',
|
|
362
|
-
tokenUrl: 'https://api.box.com/oauth2/token',
|
|
363
|
-
boxSubjectType: 'invalid'
|
|
364
|
-
})).toBe(false);
|
|
365
|
-
});
|
|
366
|
-
test('should validate GCP credential schema with defaults', () => {
|
|
367
|
-
const schema = {
|
|
368
|
-
type: 'object',
|
|
369
|
-
properties: {
|
|
370
|
-
projectId: { type: 'string' },
|
|
371
|
-
location: {
|
|
372
|
-
type: 'string',
|
|
373
|
-
default: 'us-central1'
|
|
374
|
-
},
|
|
375
|
-
endpoint: {
|
|
376
|
-
type: 'string',
|
|
377
|
-
format: 'uri'
|
|
378
|
-
}
|
|
379
|
-
},
|
|
380
|
-
required: ['projectId']
|
|
381
|
-
};
|
|
382
|
-
const validator = ajv.compile(schema);
|
|
383
|
-
expect(validator({
|
|
384
|
-
projectId: 'my-project',
|
|
385
|
-
endpoint: 'https://api.example.com'
|
|
386
|
-
})).toBe(true);
|
|
387
|
-
expect(validator({
|
|
388
|
-
projectId: 'my-project',
|
|
389
|
-
endpoint: 'not-a-uri'
|
|
390
|
-
})).toBe(false);
|
|
391
|
-
});
|
|
392
|
-
});
|
|
393
|
-
describe('Error Message Formatting', () => {
|
|
394
|
-
test('should format required error message', () => {
|
|
395
|
-
const schema = {
|
|
396
|
-
type: 'object',
|
|
397
|
-
properties: {
|
|
398
|
-
apiKey: { type: 'string' }
|
|
399
|
-
},
|
|
400
|
-
required: ['apiKey']
|
|
401
|
-
};
|
|
402
|
-
const validator = ajv.compile(schema);
|
|
403
|
-
validator({});
|
|
404
|
-
const error = validator.errors?.[0];
|
|
405
|
-
expect(error?.keyword).toBe('required');
|
|
406
|
-
expect(error?.params.missingProperty).toBe('apiKey');
|
|
407
|
-
const message = `Missing required field: ${error?.params.missingProperty}`;
|
|
408
|
-
expect(message).toBe('Missing required field: apiKey');
|
|
409
|
-
});
|
|
410
|
-
test('should format const error message', () => {
|
|
411
|
-
const schema = {
|
|
412
|
-
type: 'object',
|
|
413
|
-
properties: {
|
|
414
|
-
tokenUrl: { const: 'https://api.box.com/oauth2/token' }
|
|
415
|
-
}
|
|
416
|
-
};
|
|
417
|
-
const validator = ajv.compile(schema);
|
|
418
|
-
validator({ tokenUrl: 'wrong' });
|
|
419
|
-
const error = validator.errors?.[0];
|
|
420
|
-
const field = error?.instancePath.replace(/^\//, '') || 'credential';
|
|
421
|
-
const message = `Field "${field}" must be "${error?.params.allowedValue}"`;
|
|
422
|
-
expect(message).toContain('must be "https://api.box.com/oauth2/token"');
|
|
423
|
-
});
|
|
424
|
-
test('should format enum error message', () => {
|
|
425
|
-
const schema = {
|
|
426
|
-
type: 'object',
|
|
427
|
-
properties: {
|
|
428
|
-
type: { enum: ['enterprise', 'user'] }
|
|
429
|
-
}
|
|
430
|
-
};
|
|
431
|
-
const validator = ajv.compile(schema);
|
|
432
|
-
validator({ type: 'invalid' });
|
|
433
|
-
const error = validator.errors?.[0];
|
|
434
|
-
const allowed = error?.params.allowedValues.join(', ');
|
|
435
|
-
const message = `Field "type" must be one of: ${allowed}`;
|
|
436
|
-
expect(message).toBe('Field "type" must be one of: enterprise, user');
|
|
437
|
-
});
|
|
438
|
-
});
|
|
439
|
-
});
|
|
440
|
-
//# sourceMappingURL=credential-validation.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-validation.test.js","sourceRoot":"","sources":["../../src/__tests__/credential-validation.test.ts"],"names":[],"mappings":"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"}
|