@magda/typescript-common 1.1.0-alpha.2 → 1.1.0-alpha.3
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/AspectBuilder.d.ts +7 -0
- package/dist/AspectBuilder.js +3 -0
- package/dist/AspectBuilder.js.map +1 -0
- package/dist/AspectCreationFailure.d.ts +5 -0
- package/dist/AspectCreationFailure.js +10 -0
- package/dist/AspectCreationFailure.js.map +1 -0
- package/dist/AsyncPage.d.ts +18 -0
- package/dist/AsyncPage.js +140 -0
- package/dist/AsyncPage.js.map +1 -0
- package/dist/ConnectionResult.d.ts +16 -0
- package/dist/ConnectionResult.js +77 -0
- package/dist/ConnectionResult.js.map +1 -0
- package/dist/ConnectorRecordId.d.ts +15 -0
- package/dist/ConnectorRecordId.js +46 -0
- package/dist/ConnectorRecordId.js.map +1 -0
- package/dist/JsonConnector.d.ts +195 -0
- package/dist/JsonConnector.js +427 -0
- package/dist/JsonConnector.js.map +1 -0
- package/dist/JsonTransformer.d.ts +112 -0
- package/dist/JsonTransformer.js +225 -0
- package/dist/JsonTransformer.js.map +1 -0
- package/dist/OpaCompileResponseParser.d.ts +480 -0
- package/dist/OpaCompileResponseParser.js +1134 -0
- package/dist/OpaCompileResponseParser.js.map +1 -0
- package/dist/RecordCreationFailure.d.ts +7 -0
- package/dist/RecordCreationFailure.js +11 -0
- package/dist/RecordCreationFailure.js.map +1 -0
- package/dist/SimpleOpaSQLTranslator.d.ts +14 -0
- package/dist/SimpleOpaSQLTranslator.js +79 -0
- package/dist/SimpleOpaSQLTranslator.js.map +1 -0
- package/dist/addTrailingSlash.d.ts +1 -0
- package/dist/addTrailingSlash.js +15 -0
- package/dist/addTrailingSlash.js.map +1 -0
- package/dist/appendUrlSegments.d.ts +2 -0
- package/dist/appendUrlSegments.js +18 -0
- package/dist/appendUrlSegments.js.map +1 -0
- package/dist/authorization-api/AccessControlError.d.ts +4 -0
- package/dist/authorization-api/AccessControlError.js +13 -0
- package/dist/authorization-api/AccessControlError.js.map +1 -0
- package/dist/authorization-api/ApiClient.d.ts +141 -0
- package/dist/authorization-api/ApiClient.js +335 -0
- package/dist/authorization-api/ApiClient.js.map +1 -0
- package/dist/authorization-api/AuthError.d.ts +4 -0
- package/dist/authorization-api/AuthError.js +13 -0
- package/dist/authorization-api/AuthError.js.map +1 -0
- package/dist/authorization-api/GenericError.d.ts +9 -0
- package/dist/authorization-api/GenericError.js +17 -0
- package/dist/authorization-api/GenericError.js.map +1 -0
- package/dist/authorization-api/authMiddleware.d.ts +7 -0
- package/dist/authorization-api/authMiddleware.js +52 -0
- package/dist/authorization-api/authMiddleware.js.map +1 -0
- package/dist/authorization-api/model.d.ts +99 -0
- package/dist/authorization-api/model.js +3 -0
- package/dist/authorization-api/model.js.map +1 -0
- package/dist/coerceJson.d.ts +2 -0
- package/dist/coerceJson.js +13 -0
- package/dist/coerceJson.js.map +1 -0
- package/dist/createServiceError.d.ts +19 -0
- package/dist/createServiceError.js +45 -0
- package/dist/createServiceError.js.map +1 -0
- package/dist/delay.d.ts +2 -0
- package/dist/delay.js +9 -0
- package/dist/delay.js.map +1 -0
- package/dist/express/status.d.ts +30 -0
- package/dist/express/status.js +180 -0
- package/dist/express/status.js.map +1 -0
- package/dist/formatServiceError.d.ts +1 -0
- package/dist/formatServiceError.js +23 -0
- package/dist/formatServiceError.js.map +1 -0
- package/dist/generated/registry/api.d.ts +596 -0
- package/dist/generated/registry/api.js +2060 -0
- package/dist/generated/registry/api.js.map +1 -0
- package/dist/getAbsoluteUrl.d.ts +12 -0
- package/dist/getAbsoluteUrl.js +35 -0
- package/dist/getAbsoluteUrl.js.map +1 -0
- package/dist/getBasePathFromUrl.d.ts +10 -0
- package/dist/getBasePathFromUrl.js +27 -0
- package/dist/getBasePathFromUrl.js.map +1 -0
- package/dist/markdownToHtml.d.ts +3 -0
- package/dist/markdownToHtml.js +38 -0
- package/dist/markdownToHtml.js.map +1 -0
- package/dist/opa/OpaTypes.d.ts +41 -0
- package/dist/opa/OpaTypes.js +3 -0
- package/dist/opa/OpaTypes.js.map +1 -0
- package/dist/opa/getAuthDecision.d.ts +19 -0
- package/dist/opa/getAuthDecision.js +94 -0
- package/dist/opa/getAuthDecision.js.map +1 -0
- package/dist/opa/queryOpa.d.ts +1 -0
- package/dist/opa/queryOpa.js +41 -0
- package/dist/opa/queryOpa.js.map +1 -0
- package/dist/registry/AuthorizedRegistryClient.d.ts +29 -0
- package/dist/registry/AuthorizedRegistryClient.js +115 -0
- package/dist/registry/AuthorizedRegistryClient.js.map +1 -0
- package/dist/registry/RegistryClient.d.ts +36 -0
- package/dist/registry/RegistryClient.js +59 -0
- package/dist/registry/RegistryClient.js.map +1 -0
- package/dist/registry/TenantConsts.d.ts +31 -0
- package/dist/registry/TenantConsts.js +35 -0
- package/dist/registry/TenantConsts.js.map +1 -0
- package/dist/registry-manual/api.d.ts +9 -0
- package/dist/registry-manual/api.js +10 -0
- package/dist/registry-manual/api.js.map +1 -0
- package/dist/request.d.ts +3 -0
- package/dist/request.js +19 -0
- package/dist/request.js.map +1 -0
- package/dist/retry.d.ts +1 -0
- package/dist/retry.js +21 -0
- package/dist/retry.js.map +1 -0
- package/dist/retryBackoff.d.ts +1 -0
- package/dist/retryBackoff.js +21 -0
- package/dist/retryBackoff.js.map +1 -0
- package/dist/runLater.d.ts +1 -0
- package/dist/runLater.js +16 -0
- package/dist/runLater.js.map +1 -0
- package/dist/session/GetUserId.d.ts +5 -0
- package/dist/session/GetUserId.js +41 -0
- package/dist/session/GetUserId.js.map +1 -0
- package/dist/session/GetUserSession.d.ts +3 -0
- package/dist/session/GetUserSession.js +22 -0
- package/dist/session/GetUserSession.js.map +1 -0
- package/dist/session/addJwtSecretFromEnvVar.d.ts +14 -0
- package/dist/session/addJwtSecretFromEnvVar.js +23 -0
- package/dist/session/addJwtSecretFromEnvVar.js.map +1 -0
- package/dist/session/buildJwt.d.ts +1 -0
- package/dist/session/buildJwt.js +8 -0
- package/dist/session/buildJwt.js.map +1 -0
- package/dist/session/cookieUtils.d.ts +16 -0
- package/dist/session/cookieUtils.js +19 -0
- package/dist/session/cookieUtils.js.map +1 -0
- package/dist/session/destroySession.d.ts +10 -0
- package/dist/session/destroySession.js +44 -0
- package/dist/session/destroySession.js.map +1 -0
- package/dist/session/getSessionId.d.ts +2 -0
- package/dist/session/getSessionId.js +28 -0
- package/dist/session/getSessionId.js.map +1 -0
- package/dist/tenant-api/AuthorizedTenantClient.d.ts +25 -0
- package/dist/tenant-api/AuthorizedTenantClient.js +61 -0
- package/dist/tenant-api/AuthorizedTenantClient.js.map +1 -0
- package/dist/tenant-api/Tenant.d.ts +17 -0
- package/dist/tenant-api/Tenant.js +10 -0
- package/dist/tenant-api/Tenant.js.map +1 -0
- package/dist/test/JsonConnector.spec.d.ts +1 -0
- package/dist/test/JsonConnector.spec.js +352 -0
- package/dist/test/JsonConnector.spec.js.map +1 -0
- package/dist/test/JsonTransformer.spec.d.ts +1 -0
- package/dist/test/JsonTransformer.spec.js +98 -0
- package/dist/test/JsonTransformer.spec.js.map +1 -0
- package/dist/test/arbitraries.d.ts +98 -0
- package/dist/test/arbitraries.js +264 -0
- package/dist/test/arbitraries.js.map +1 -0
- package/dist/test/aspect-templates/organization-details.d.ts +4 -0
- package/dist/test/aspect-templates/organization-details.js +11 -0
- package/dist/test/aspect-templates/organization-details.js.map +1 -0
- package/dist/test/buildApiClient.spec.d.ts +1 -0
- package/dist/test/buildApiClient.spec.js +177 -0
- package/dist/test/buildApiClient.spec.js.map +1 -0
- package/dist/test/buildAuthorizedTenantClient.spec.d.ts +1 -0
- package/dist/test/buildAuthorizedTenantClient.spec.js +60 -0
- package/dist/test/buildAuthorizedTenantClient.spec.js.map +1 -0
- package/dist/test/connectors/MockExpressServer.d.ts +5 -0
- package/dist/test/connectors/MockExpressServer.js +28 -0
- package/dist/test/connectors/MockExpressServer.js.map +1 -0
- package/dist/test/connectors/MockRegistry.d.ts +7 -0
- package/dist/test/connectors/MockRegistry.js +93 -0
- package/dist/test/connectors/MockRegistry.js.map +1 -0
- package/dist/test/connectors/runConnectorTest.d.ts +5 -0
- package/dist/test/connectors/runConnectorTest.js +106 -0
- package/dist/test/connectors/runConnectorTest.js.map +1 -0
- package/dist/test/db/getTestDBConfig.d.ts +7 -0
- package/dist/test/db/getTestDBConfig.js +13 -0
- package/dist/test/db/getTestDBConfig.js.map +1 -0
- package/dist/test/db/runMigrationSql.d.ts +9 -0
- package/dist/test/db/runMigrationSql.js +82 -0
- package/dist/test/db/runMigrationSql.js.map +1 -0
- package/dist/test/express/status.spec.d.ts +1 -0
- package/dist/test/express/status.spec.js +160 -0
- package/dist/test/express/status.spec.js.map +1 -0
- package/dist/test/fakeArgv.d.ts +2 -0
- package/dist/test/fakeArgv.js +7 -0
- package/dist/test/fakeArgv.js.map +1 -0
- package/dist/test/getAuthDecision.spec.d.ts +1 -0
- package/dist/test/getAuthDecision.spec.js +22 -0
- package/dist/test/getAuthDecision.spec.js.map +1 -0
- package/dist/test/getBasePathFromUrl.spec.d.ts +1 -0
- package/dist/test/getBasePathFromUrl.spec.js +25 -0
- package/dist/test/getBasePathFromUrl.spec.js.map +1 -0
- package/dist/test/jsverify.d.ts +2 -0
- package/dist/test/jsverify.js +8 -0
- package/dist/test/jsverify.js.map +1 -0
- package/dist/test/mockAuthApiHost.d.ts +14 -0
- package/dist/test/mockAuthApiHost.js +174 -0
- package/dist/test/mockAuthApiHost.js.map +1 -0
- package/dist/test/mockAuthorization.d.ts +3 -0
- package/dist/test/mockAuthorization.js +24 -0
- package/dist/test/mockAuthorization.js.map +1 -0
- package/dist/test/mockTenantDataStore.d.ts +8 -0
- package/dist/test/mockTenantDataStore.js +41 -0
- package/dist/test/mockTenantDataStore.js.map +1 -0
- package/dist/test/mockUserDataStore.d.ts +11 -0
- package/dist/test/mockUserDataStore.js +56 -0
- package/dist/test/mockUserDataStore.js.map +1 -0
- package/dist/test/registry/buildAuthorizedClient.spec.d.ts +1 -0
- package/dist/test/registry/buildAuthorizedClient.spec.js +101 -0
- package/dist/test/registry/buildAuthorizedClient.spec.js.map +1 -0
- package/dist/test/sampleOpaResponse.json +480 -0
- package/dist/test/sampleOpaResponseSimple.json +173 -0
- package/dist/test/sampleOpaResponseUnconditionalTrue.json +193 -0
- package/dist/test/sampleOpaResponseUnconditionalTrueWithDefaultRule.json +303 -0
- package/dist/test/sampleOpaResponseWithDefaultRule.json +303 -0
- package/dist/test/session/buildJwt.spec.d.ts +1 -0
- package/dist/test/session/buildJwt.spec.js +50 -0
- package/dist/test/session/buildJwt.spec.js.map +1 -0
- package/dist/test/session/buildJwtForRegistryEsriOpaGroupsAndOwnerTest.spec.d.ts +1 -0
- package/dist/test/session/buildJwtForRegistryEsriOpaGroupsAndOwnerTest.spec.js +64 -0
- package/dist/test/session/buildJwtForRegistryEsriOpaGroupsAndOwnerTest.spec.js.map +1 -0
- package/dist/test/session/buildJwtForRegistryEsriOpaGroupsTest.spec.d.ts +1 -0
- package/dist/test/session/buildJwtForRegistryEsriOpaGroupsTest.spec.js +52 -0
- package/dist/test/session/buildJwtForRegistryEsriOpaGroupsTest.spec.js.map +1 -0
- package/dist/test/session/buildJwtForRegistryEsriOpaOwnerTest.spec.d.ts +1 -0
- package/dist/test/session/buildJwtForRegistryEsriOpaOwnerTest.spec.js +36 -0
- package/dist/test/session/buildJwtForRegistryEsriOpaOwnerTest.spec.js.map +1 -0
- package/dist/test/testAsyncPage.spec.d.ts +1 -0
- package/dist/test/testAsyncPage.spec.js +463 -0
- package/dist/test/testAsyncPage.spec.js.map +1 -0
- package/dist/test/testOpaCompileResponseParser.spec.d.ts +1 -0
- package/dist/test/testOpaCompileResponseParser.spec.js +148 -0
- package/dist/test/testOpaCompileResponseParser.spec.js.map +1 -0
- package/dist/test/util.d.ts +1 -0
- package/dist/test/util.js +8 -0
- package/dist/test/util.js.map +1 -0
- package/dist/util/arrayToMaybe.d.ts +2 -0
- package/dist/util/arrayToMaybe.js +8 -0
- package/dist/util/arrayToMaybe.js.map +1 -0
- package/dist/util/cleanOrgTitle.d.ts +1 -0
- package/dist/util/cleanOrgTitle.js +13 -0
- package/dist/util/cleanOrgTitle.js.map +1 -0
- package/dist/util/getMinikubeIP.d.ts +1 -0
- package/dist/util/getMinikubeIP.js +13 -0
- package/dist/util/getMinikubeIP.js.map +1 -0
- package/dist/util/isUuid.d.ts +2 -0
- package/dist/util/isUuid.js +6 -0
- package/dist/util/isUuid.js.map +1 -0
- package/dist/util/unionToThrowable.d.ts +1 -0
- package/dist/util/unionToThrowable.js +12 -0
- package/dist/util/unionToThrowable.js.map +1 -0
- package/dist/utilityTypes.d.ts +1 -0
- package/dist/utilityTypes.js +3 -0
- package/dist/utilityTypes.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,60 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const chai_1 = __importDefault(require("chai"));
|
|
16
|
+
const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
|
|
17
|
+
const AuthorizedTenantClient_1 = __importDefault(require("../tenant-api/AuthorizedTenantClient"));
|
|
18
|
+
const mockTenantDataStore_1 = __importDefault(require("./mockTenantDataStore"));
|
|
19
|
+
const TenantConsts_1 = require("../registry/TenantConsts");
|
|
20
|
+
const nock_1 = __importDefault(require("nock"));
|
|
21
|
+
const jwt = require("jsonwebtoken");
|
|
22
|
+
chai_1.default.use(chai_as_promised_1.default);
|
|
23
|
+
const expect = chai_1.default.expect;
|
|
24
|
+
describe("Test AuthorizedTenantClient.ts", function () {
|
|
25
|
+
const mockTenants = mockTenantDataStore_1.default.getTenants();
|
|
26
|
+
const jwtSecret = "a top secret";
|
|
27
|
+
const adminUserId = "an-admin-user";
|
|
28
|
+
const tenantsBaseUrl = "http://tenant.some.where";
|
|
29
|
+
const requestScope = nock_1.default(tenantsBaseUrl, {
|
|
30
|
+
reqheaders: {
|
|
31
|
+
// A jwt will contain timestamp by default. The value of header
|
|
32
|
+
// "X-Magda-Session" can not be pre-determined. The exact match
|
|
33
|
+
// of this header can not be guaranteed. Therefore we have to
|
|
34
|
+
// check the decoded user id.
|
|
35
|
+
"X-Magda-Session": (jwtToken) => {
|
|
36
|
+
return jwt.verify(jwtToken, jwtSecret).userId === adminUserId;
|
|
37
|
+
},
|
|
38
|
+
"Content-Type": "application/json",
|
|
39
|
+
"X-Magda-Tenant-Id": `${TenantConsts_1.MAGDA_ADMIN_PORTAL_ID}`
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
afterEach(() => {
|
|
43
|
+
nock_1.default.cleanAll();
|
|
44
|
+
});
|
|
45
|
+
it("`getTenants()` should return all tenants", function () {
|
|
46
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
requestScope.get("/tenants").reply(200, mockTenants);
|
|
48
|
+
const api = new AuthorizedTenantClient_1.default({
|
|
49
|
+
urlStr: tenantsBaseUrl,
|
|
50
|
+
maxRetries: 1,
|
|
51
|
+
secondsBetweenRetries: 1,
|
|
52
|
+
jwtSecret: jwtSecret,
|
|
53
|
+
userId: adminUserId
|
|
54
|
+
});
|
|
55
|
+
const actual = yield api.getTenants();
|
|
56
|
+
return expect(actual).to.deep.equal(mockTenants);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=buildAuthorizedTenantClient.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildAuthorizedTenantClient.spec.js","sourceRoot":"","sources":["../../src/test/buildAuthorizedTenantClient.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AACA,gDAAwB;AACxB,wEAA8C;AAC9C,kGAA0E;AAC1E,gFAAwD;AACxD,2DAAiE;AACjE,gDAAwB;AAExB,MAAM,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;AAEpC,cAAI,CAAC,GAAG,CAAC,0BAAc,CAAC,CAAC;AACzB,MAAM,MAAM,GAAG,cAAI,CAAC,MAAM,CAAC;AAE3B,QAAQ,CAAC,gCAAgC,EAAE;IACvC,MAAM,WAAW,GAAG,6BAAmB,CAAC,UAAU,EAAE,CAAC;IACrD,MAAM,SAAS,GAAG,cAAc,CAAC;IACjC,MAAM,WAAW,GAAG,eAAe,CAAC;IACpC,MAAM,cAAc,GAAG,0BAA0B,CAAC;IAElD,MAAM,YAAY,GAAG,cAAI,CAAC,cAAc,EAAE;QACtC,UAAU,EAAE;YACR,+DAA+D;YAC/D,+DAA+D;YAC/D,6DAA6D;YAC7D,6BAA6B;YAC7B,iBAAiB,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC5B,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC;YAClE,CAAC;YACD,cAAc,EAAE,kBAAkB;YAClC,mBAAmB,EAAE,GAAG,oCAAqB,EAAE;SAClD;KACJ,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACX,cAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE;;YAC3C,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAErD,MAAM,GAAG,GAAG,IAAI,gCAAsB,CAAC;gBACnC,MAAM,EAAE,cAAc;gBACtB,UAAU,EAAE,CAAC;gBACb,qBAAqB,EAAE,CAAC;gBACxB,SAAS,EAAE,SAAS;gBACpB,MAAM,EAAE,WAAW;aACtB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACrD,CAAC;KAAA,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
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
|
+
exports.MockExpressServer = void 0;
|
|
13
|
+
const express = require("express");
|
|
14
|
+
class MockExpressServer {
|
|
15
|
+
run(port) {
|
|
16
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
17
|
+
const app = express();
|
|
18
|
+
yield this.runImplementation(app);
|
|
19
|
+
return new Promise((resolve) => {
|
|
20
|
+
this.server = app.listen(port, () => {
|
|
21
|
+
resolve(this);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.MockExpressServer = MockExpressServer;
|
|
28
|
+
//# sourceMappingURL=MockExpressServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockExpressServer.js","sourceRoot":"","sources":["../../../src/test/connectors/MockExpressServer.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAEnC,MAAsB,iBAAiB;IAG7B,GAAG,CAAC,IAAY;;YAClB,MAAM,GAAG,GAAQ,OAAO,EAAE,CAAC;YAE3B,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAElC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC3B,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;oBAChC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAClB,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACP,CAAC;KAAA;CAGJ;AAhBD,8CAgBC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MockRegistry = void 0;
|
|
4
|
+
const MockExpressServer_1 = require("./MockExpressServer");
|
|
5
|
+
const lodash_1 = require("lodash");
|
|
6
|
+
const body = require("body-parser");
|
|
7
|
+
const djv = require("djv");
|
|
8
|
+
class MockRegistry extends MockExpressServer_1.MockExpressServer {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments);
|
|
11
|
+
this.aspects = {};
|
|
12
|
+
this.records = {};
|
|
13
|
+
this.env = djv();
|
|
14
|
+
}
|
|
15
|
+
runImplementation(registry) {
|
|
16
|
+
registry.use(body.json({
|
|
17
|
+
limit: "500000kb"
|
|
18
|
+
}));
|
|
19
|
+
registry.put("/aspects/:id", (req, res) => {
|
|
20
|
+
this.aspects[req.params.id] = req.body;
|
|
21
|
+
// our mock registry will validate the data it gets against the schemas it gets
|
|
22
|
+
this.env.addSchema(req.params.id, req.body.jsonSchema);
|
|
23
|
+
res.json(req.body);
|
|
24
|
+
});
|
|
25
|
+
registry.put("/records/:id", (req, res) => {
|
|
26
|
+
this.records[req.params.id] = lodash_1.merge(this.records[req.params.id] || {}, req.body);
|
|
27
|
+
// validate aspects
|
|
28
|
+
if (req.body.aspects) {
|
|
29
|
+
for (const [aspect, aspectBody] of Object.entries(req.body.aspects)) {
|
|
30
|
+
try {
|
|
31
|
+
let invalid = this.env.validate(`${aspect}`, aspectBody);
|
|
32
|
+
if (invalid) {
|
|
33
|
+
return res
|
|
34
|
+
.status(500)
|
|
35
|
+
.json({
|
|
36
|
+
aspect,
|
|
37
|
+
aspectBody,
|
|
38
|
+
schema: this.aspects[aspect].jsonSchema,
|
|
39
|
+
invalid
|
|
40
|
+
})
|
|
41
|
+
.end();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
// https://github.com/korzio/djv/issues/71
|
|
46
|
+
// return res
|
|
47
|
+
// .status(500)
|
|
48
|
+
// .json({
|
|
49
|
+
// aspect,
|
|
50
|
+
// aspectBody,
|
|
51
|
+
// schema: this.aspects[aspect].jsonSchema,
|
|
52
|
+
// error: e.message
|
|
53
|
+
// })
|
|
54
|
+
// .end();
|
|
55
|
+
console.log(e.message);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
res.json(req.body);
|
|
60
|
+
});
|
|
61
|
+
registry.delete("/records", (req, res) => {
|
|
62
|
+
let count = 0;
|
|
63
|
+
for (const entry of Object.entries(this.records)) {
|
|
64
|
+
const [recordId, record] = entry;
|
|
65
|
+
if (record.sourceTag === req.query.sourceTagToPreserve) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (record.aspects.source.id === req.query.sourceId) {
|
|
69
|
+
delete this.records[recordId];
|
|
70
|
+
count++;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
res.json({ count });
|
|
74
|
+
});
|
|
75
|
+
registry.get("/records/*", (req, res) => {
|
|
76
|
+
const id = decodeURI(req.path.substr(9));
|
|
77
|
+
res.json(this.records[id]).end();
|
|
78
|
+
});
|
|
79
|
+
registry.get("/records", (req, res) => {
|
|
80
|
+
res.json(this.records).end();
|
|
81
|
+
});
|
|
82
|
+
registry.all("*", function (req, res) {
|
|
83
|
+
console.log("REG", req.method, req.path, req.body, req.query);
|
|
84
|
+
res.status(200);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.MockRegistry = MockRegistry;
|
|
89
|
+
if (require.main === module) {
|
|
90
|
+
const app = new MockRegistry();
|
|
91
|
+
app.run(8080);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=MockRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockRegistry.js","sourceRoot":"","sources":["../../../src/test/connectors/MockRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.runConnectorTest = void 0;
|
|
16
|
+
const cross_spawn_1 = __importDefault(require("cross-spawn"));
|
|
17
|
+
const assert_1 = __importDefault(require("assert"));
|
|
18
|
+
const path_1 = __importDefault(require("path"));
|
|
19
|
+
const MockRegistry_1 = require("./MockRegistry");
|
|
20
|
+
const resolve_1 = __importDefault(require("resolve"));
|
|
21
|
+
/**
|
|
22
|
+
* Hoping to re-use this functionality for all black-box style connector
|
|
23
|
+
* testing.
|
|
24
|
+
*/
|
|
25
|
+
function runConnectorTest(TEST_CASES, Catalog, options = {}) {
|
|
26
|
+
describe("connector", function () {
|
|
27
|
+
this.timeout(30000);
|
|
28
|
+
const registryPort = 5000 + Math.round(5000 * Math.random());
|
|
29
|
+
const catalogPort = registryPort + 1;
|
|
30
|
+
function run() {
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
const tsconfigPath = path_1.default.resolve("tsconfig.json");
|
|
33
|
+
const tsNodeExec = path_1.default.resolve(path_1.default.dirname(resolve_1.default.sync("ts-node", {
|
|
34
|
+
basedir: process.cwd()
|
|
35
|
+
})), "./bin.js");
|
|
36
|
+
const command = [
|
|
37
|
+
"-r",
|
|
38
|
+
resolve_1.default.sync("tsconfig-paths/register", {
|
|
39
|
+
basedir: process.cwd()
|
|
40
|
+
}),
|
|
41
|
+
"./src",
|
|
42
|
+
"--id=connector",
|
|
43
|
+
"--name=Connector",
|
|
44
|
+
`--sourceUrl=http://localhost:${catalogPort}`,
|
|
45
|
+
`--registryUrl=http://localhost:${registryPort}`,
|
|
46
|
+
"--jwtSecret=nerdgasm",
|
|
47
|
+
"--userId=user",
|
|
48
|
+
"--tenantId=1"
|
|
49
|
+
];
|
|
50
|
+
const proc = cross_spawn_1.default(tsNodeExec, command, {
|
|
51
|
+
stdio: "inherit",
|
|
52
|
+
cwd: path_1.default.dirname(tsconfigPath),
|
|
53
|
+
env: Object.assign(Object.assign({}, (process.env ? process.env : {})), { TS_NODE_PROJECT: tsconfigPath })
|
|
54
|
+
});
|
|
55
|
+
proc.on("error", (err) => {
|
|
56
|
+
console.log("Failed to start subprocess.", err);
|
|
57
|
+
reject(err);
|
|
58
|
+
});
|
|
59
|
+
proc.on("close", (code) => {
|
|
60
|
+
if (code === 0) {
|
|
61
|
+
resolve();
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
reject(new Error(`error exit code nonzero: ${code}`));
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
let servers = [];
|
|
70
|
+
let registry;
|
|
71
|
+
beforeEach(function () {
|
|
72
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
73
|
+
servers.push((registry = yield new MockRegistry_1.MockRegistry().run(registryPort)));
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
afterEach(function () {
|
|
77
|
+
servers.forEach((server) => server.server.close());
|
|
78
|
+
});
|
|
79
|
+
TEST_CASES.forEach(function (testCase, index) {
|
|
80
|
+
it(`should run ${index}`, function () {
|
|
81
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
82
|
+
const catalog = new Catalog(testCase.input);
|
|
83
|
+
yield catalog.run(catalogPort).then((catalog) => {
|
|
84
|
+
servers.push(catalog);
|
|
85
|
+
return run().then(() => {
|
|
86
|
+
Object.values(registry.records).forEach((record) => {
|
|
87
|
+
record.sourceTag = "stag";
|
|
88
|
+
if (record.aspects &&
|
|
89
|
+
record.aspects.source &&
|
|
90
|
+
record.aspects.source.url) {
|
|
91
|
+
record.aspects.source.url = record.aspects.source.url.replace(`http://localhost:${catalogPort}`, "SOURCE");
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
if (options.cleanRegistry) {
|
|
95
|
+
options.cleanRegistry(registry);
|
|
96
|
+
}
|
|
97
|
+
assert_1.default.deepStrictEqual(registry.records, testCase.output);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
exports.runConnectorTest = runConnectorTest;
|
|
106
|
+
//# sourceMappingURL=runConnectorTest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runConnectorTest.js","sourceRoot":"","sources":["../../../src/test/connectors/runConnectorTest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
function getTestDBConfig() {
|
|
4
|
+
const { POSTGRES_HOST: host, POSTGRES_DB: database, POSTGRES_USER: user, POSTGRES_PASSWORD: password } = process.env;
|
|
5
|
+
return {
|
|
6
|
+
host: host ? host : "localhost",
|
|
7
|
+
database: database ? database : "postgres",
|
|
8
|
+
user: user ? user : "postgres",
|
|
9
|
+
password: password ? password : ""
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
exports.default = getTestDBConfig;
|
|
13
|
+
//# sourceMappingURL=getTestDBConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getTestDBConfig.js","sourceRoot":"","sources":["../../../src/test/db/getTestDBConfig.ts"],"names":[],"mappings":";;AAAA,SAAS,eAAe;IACpB,MAAM,EACF,aAAa,EAAE,IAAI,EACnB,WAAW,EAAE,QAAQ,EACrB,aAAa,EAAE,IAAI,EACnB,iBAAiB,EAAE,QAAQ,EAC9B,GAAG,OAAO,CAAC,GAAG,CAAC;IAEhB,OAAO;QACH,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW;QAC/B,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU;QAC1C,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU;QAC9B,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;KACrC,CAAC;AACN,CAAC;AAED,kBAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import pg from "pg";
|
|
2
|
+
export declare function deleteAllTables(pool: pg.Pool): Promise<void>;
|
|
3
|
+
/**
|
|
4
|
+
* rebuilt a clean (i.e. in initial state) auth db in test database
|
|
5
|
+
*
|
|
6
|
+
* @param pool
|
|
7
|
+
* @param deleteAllTable
|
|
8
|
+
*/
|
|
9
|
+
export default function runMigrationSql(pool: pg.Pool, sqlDir: string, deleteAllTable?: boolean): Promise<void>;
|
|
@@ -0,0 +1,82 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.deleteAllTables = void 0;
|
|
16
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
17
|
+
const recursive_readdir_1 = __importDefault(require("recursive-readdir"));
|
|
18
|
+
const getTestDBConfig_1 = __importDefault(require("./getTestDBConfig"));
|
|
19
|
+
const path_1 = __importDefault(require("path"));
|
|
20
|
+
const fs_1 = __importDefault(require("fs"));
|
|
21
|
+
function getVersionNumber(fileName) {
|
|
22
|
+
const matches = fileName.match(/^V(\d+(_\d+)*)/i);
|
|
23
|
+
if (!matches || matches.length < 2)
|
|
24
|
+
return 0;
|
|
25
|
+
const verNum = parseFloat(matches[1].replace(/_/, "."));
|
|
26
|
+
if (isNaN(verNum)) {
|
|
27
|
+
return 0;
|
|
28
|
+
}
|
|
29
|
+
return verNum;
|
|
30
|
+
}
|
|
31
|
+
function replaceEnvVar(sql) {
|
|
32
|
+
const config = getTestDBConfig_1.default();
|
|
33
|
+
return sql
|
|
34
|
+
.replace(/\$\{clientUserName\}/g, config.user)
|
|
35
|
+
.replace(/\$\{clientPassword\}/g, config.password);
|
|
36
|
+
}
|
|
37
|
+
function deleteAllTables(pool) {
|
|
38
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
39
|
+
const result = yield pool.query("SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public'");
|
|
40
|
+
if (!result || !result.rows || !result.rows.length)
|
|
41
|
+
return;
|
|
42
|
+
yield pool.query(result.rows
|
|
43
|
+
.map((r) => `DROP TABLE "${r["tablename"]}" CASCADE`)
|
|
44
|
+
.join(";\n"));
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
exports.deleteAllTables = deleteAllTables;
|
|
48
|
+
/**
|
|
49
|
+
* rebuilt a clean (i.e. in initial state) auth db in test database
|
|
50
|
+
*
|
|
51
|
+
* @param pool
|
|
52
|
+
* @param deleteAllTable
|
|
53
|
+
*/
|
|
54
|
+
function runMigrationSql(pool, sqlDir, deleteAllTable = false) {
|
|
55
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
56
|
+
if (!fs_1.default.existsSync(sqlDir)) {
|
|
57
|
+
throw new Error("Path `sqlDir` doesn't exist!");
|
|
58
|
+
}
|
|
59
|
+
if (!fs_1.default.lstatSync(sqlDir).isDirectory()) {
|
|
60
|
+
throw new Error("`sqlDir` is not a path to a directory");
|
|
61
|
+
}
|
|
62
|
+
const files = yield recursive_readdir_1.default(sqlDir, ["*,sql"]);
|
|
63
|
+
const fileObjects = files
|
|
64
|
+
.map((f) => ({
|
|
65
|
+
path: f,
|
|
66
|
+
version: getVersionNumber(path_1.default.basename(f))
|
|
67
|
+
}))
|
|
68
|
+
.sort((a, b) => a.version - b.version);
|
|
69
|
+
if (!fileObjects.length)
|
|
70
|
+
throw new Error("Can't find any DB migration SQL files.");
|
|
71
|
+
if (deleteAllTable) {
|
|
72
|
+
yield deleteAllTables(pool);
|
|
73
|
+
}
|
|
74
|
+
for (let i = 0; i < fileObjects.length; i++) {
|
|
75
|
+
const file = fileObjects[i];
|
|
76
|
+
const fileContent = replaceEnvVar(yield fs_extra_1.default.readFile(file.path, { encoding: "utf-8" }));
|
|
77
|
+
yield pool.query(fileContent);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
exports.default = runMigrationSql;
|
|
82
|
+
//# sourceMappingURL=runMigrationSql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runMigrationSql.js","sourceRoot":"","sources":["../../../src/test/db/runMigrationSql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,160 @@
|
|
|
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 status_1 = require("../../express/status");
|
|
13
|
+
const request = require("supertest");
|
|
14
|
+
const express = require("express");
|
|
15
|
+
const assert = require("assert");
|
|
16
|
+
setup("status - default", undefined, (agent) => {
|
|
17
|
+
it("should always be live", function (done) {
|
|
18
|
+
agent.get("/status/live").expect(200, "OK").end(done);
|
|
19
|
+
});
|
|
20
|
+
it("should instantly be ready with no probes", function (done) {
|
|
21
|
+
agent.get("/status/ready").expect(200).end(done);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
setup("status - not ready to ready", {
|
|
25
|
+
probes: {
|
|
26
|
+
a: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
27
|
+
console.log("here");
|
|
28
|
+
yield sleep(500);
|
|
29
|
+
console.log("after");
|
|
30
|
+
return {
|
|
31
|
+
ready: true
|
|
32
|
+
};
|
|
33
|
+
})
|
|
34
|
+
},
|
|
35
|
+
probeUpdateMs: 1000
|
|
36
|
+
}, (agent) => {
|
|
37
|
+
it("should be ready after a while", function (done) {
|
|
38
|
+
agent
|
|
39
|
+
.get("/status/ready")
|
|
40
|
+
.expect(500)
|
|
41
|
+
.end(() => __awaiter(this, void 0, void 0, function* () {
|
|
42
|
+
yield sleep(1000);
|
|
43
|
+
agent.get("/status/ready").expect(200).end(done);
|
|
44
|
+
}));
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
setup("status - not ready", {
|
|
48
|
+
probes: {
|
|
49
|
+
a: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
50
|
+
return {
|
|
51
|
+
ready: true
|
|
52
|
+
};
|
|
53
|
+
})
|
|
54
|
+
},
|
|
55
|
+
probeUpdateMs: 10
|
|
56
|
+
}, (agent) => {
|
|
57
|
+
it("should be ready with probes", function (done) {
|
|
58
|
+
sleep(100).then(function () {
|
|
59
|
+
agent.get("/status/ready").expect(200).end(done);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
it("should be ready with probes", function (done) {
|
|
63
|
+
sleep(100).then(function () {
|
|
64
|
+
agent.get("/status/readySync").expect(200).end(done);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
setup("status - error", {
|
|
69
|
+
probes: {
|
|
70
|
+
a: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
71
|
+
throw "ERROR";
|
|
72
|
+
})
|
|
73
|
+
},
|
|
74
|
+
probeUpdateMs: 10
|
|
75
|
+
}, (agent) => {
|
|
76
|
+
it("should error", function (done) {
|
|
77
|
+
sleep(100).then(function () {
|
|
78
|
+
agent.get("/status/ready").expect(500).end(done);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
setup("status - error", {
|
|
83
|
+
probes: {
|
|
84
|
+
a: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
85
|
+
return null;
|
|
86
|
+
})
|
|
87
|
+
},
|
|
88
|
+
probeUpdateMs: 60
|
|
89
|
+
}, (agent) => {
|
|
90
|
+
it("should error", function (done) {
|
|
91
|
+
sleep(100).then(function () {
|
|
92
|
+
agent.get("/status/ready").expect(500).end(done);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe("request", function () {
|
|
97
|
+
let app;
|
|
98
|
+
const port = Math.round(Math.random() * 8000 + 8000);
|
|
99
|
+
let server;
|
|
100
|
+
beforeEach(function (done) {
|
|
101
|
+
app = express();
|
|
102
|
+
server = app.listen(port, done);
|
|
103
|
+
});
|
|
104
|
+
afterEach(function () {
|
|
105
|
+
server.close();
|
|
106
|
+
});
|
|
107
|
+
it("should succeed", function () {
|
|
108
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
109
|
+
status_1.installStatusRouter(app, {});
|
|
110
|
+
let return_;
|
|
111
|
+
return_ = yield status_1.createServiceProbe(`http://127.0.0.1:${port}`)();
|
|
112
|
+
assert.deepEqual(return_.ready, true);
|
|
113
|
+
return_ = yield status_1.createServiceProbe(`http://127.0.0.1:${port}`, "/status/ready")();
|
|
114
|
+
assert.deepEqual(return_.ready, true);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
it("should fail", function () {
|
|
118
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
119
|
+
app.use("/status/ready", function (req, res) {
|
|
120
|
+
res.status(500).json({ ready: false });
|
|
121
|
+
});
|
|
122
|
+
try {
|
|
123
|
+
yield status_1.createServiceProbe(`http://127.0.0.1:${port}`)();
|
|
124
|
+
throw "ERROR";
|
|
125
|
+
}
|
|
126
|
+
catch (return_) {
|
|
127
|
+
assert.deepEqual(return_, {
|
|
128
|
+
ready: false,
|
|
129
|
+
statusCode: 500
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
it("should fail", function () {
|
|
135
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
136
|
+
try {
|
|
137
|
+
yield status_1.createServiceProbe(`http://127.0.0.1:${port + 6}`)();
|
|
138
|
+
throw "ERROR";
|
|
139
|
+
}
|
|
140
|
+
catch (return_) {
|
|
141
|
+
assert.notDeepEqual(return_, "ERROR");
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
function sleep(time) {
|
|
147
|
+
return new Promise((resolve) => setTimeout(resolve, time));
|
|
148
|
+
}
|
|
149
|
+
function setup(text, options, callback) {
|
|
150
|
+
describe(text, function () {
|
|
151
|
+
if (options) {
|
|
152
|
+
options.forceRun = true;
|
|
153
|
+
}
|
|
154
|
+
const app = express();
|
|
155
|
+
status_1.installStatusRouter(app, options);
|
|
156
|
+
const agent = request.agent(app);
|
|
157
|
+
callback(agent, options);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=status.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.spec.js","sourceRoot":"","sources":["../../../src/test/express/status.spec.ts"],"names":[],"mappings":"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"}
|