@flink-app/test-utils 0.2.0-beta.14 → 0.2.0-beta.17
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/http.d.ts +33 -0
- package/dist/http.js +192 -0
- package/dist/mocks.d.ts +20 -0
- package/dist/mocks.js +84 -0
- package/package.json +3 -3
package/dist/http.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { FlinkApp, FlinkResponse } from "@flink-app/flink";
|
|
2
|
+
export type HttpOpts = {
|
|
3
|
+
/***
|
|
4
|
+
* Optional query string
|
|
5
|
+
*/
|
|
6
|
+
qs?: {
|
|
7
|
+
[x: string]: string | string[];
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Optional headers
|
|
11
|
+
*/
|
|
12
|
+
headers?: {
|
|
13
|
+
[x: string]: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Optional user object to be used for authentication.
|
|
17
|
+
*
|
|
18
|
+
* An auth plugin must be set in the app for this to work. Most likely the auth plugin
|
|
19
|
+
* is a mock auth plugin in test scenarios.
|
|
20
|
+
*/
|
|
21
|
+
user?: any & {
|
|
22
|
+
roles: string[];
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Initializes test flink app.
|
|
27
|
+
* Must be invoked prior to using test HTTP methods.
|
|
28
|
+
*/
|
|
29
|
+
export declare function init(_app: FlinkApp<any>, host?: string): void;
|
|
30
|
+
export declare function get<Res = any>(path: string, opts?: HttpOpts): Promise<FlinkResponse<Res>>;
|
|
31
|
+
export declare function post<Req = any, Res = any>(path: string, body: Req, opts?: HttpOpts): Promise<FlinkResponse<Res>>;
|
|
32
|
+
export declare function put<Req = any, Res = any>(path: string, body: Req, opts?: HttpOpts): Promise<FlinkResponse<Res>>;
|
|
33
|
+
export declare function del<Res = any>(path: string, opts?: HttpOpts): Promise<FlinkResponse<Res>>;
|
package/dist/http.js
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
50
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
51
|
+
};
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
exports.del = exports.put = exports.post = exports.get = exports.init = void 0;
|
|
54
|
+
var got_1 = __importDefault(require("got"));
|
|
55
|
+
var qs_1 = __importDefault(require("qs"));
|
|
56
|
+
var app;
|
|
57
|
+
var baseUrl;
|
|
58
|
+
var gotOpts = {
|
|
59
|
+
throwHttpErrors: false,
|
|
60
|
+
json: true,
|
|
61
|
+
retry: 0,
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Initializes test flink app.
|
|
65
|
+
* Must be invoked prior to using test HTTP methods.
|
|
66
|
+
*/
|
|
67
|
+
function init(_app, host) {
|
|
68
|
+
if (host === void 0) { host = "localhost"; }
|
|
69
|
+
app = _app;
|
|
70
|
+
baseUrl = "http://".concat(host, ":").concat(app.port);
|
|
71
|
+
}
|
|
72
|
+
exports.init = init;
|
|
73
|
+
function get(path_1) {
|
|
74
|
+
return __awaiter(this, arguments, void 0, function (path, opts) {
|
|
75
|
+
var headers, res;
|
|
76
|
+
if (opts === void 0) { opts = {}; }
|
|
77
|
+
return __generator(this, function (_a) {
|
|
78
|
+
switch (_a.label) {
|
|
79
|
+
case 0:
|
|
80
|
+
validateApp();
|
|
81
|
+
return [4 /*yield*/, setAuthHeader(opts.user, opts.headers)];
|
|
82
|
+
case 1:
|
|
83
|
+
headers = _a.sent();
|
|
84
|
+
return [4 /*yield*/, got_1.default.get(getUrl(path, opts.qs), __assign(__assign({}, gotOpts), { headers: headers }))];
|
|
85
|
+
case 2:
|
|
86
|
+
res = _a.sent();
|
|
87
|
+
return [2 /*return*/, __assign({ status: res.statusCode }, res.body)];
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
exports.get = get;
|
|
93
|
+
function post(path_1, body_1) {
|
|
94
|
+
return __awaiter(this, arguments, void 0, function (path, body, opts) {
|
|
95
|
+
var headers, res, err_1;
|
|
96
|
+
if (opts === void 0) { opts = {}; }
|
|
97
|
+
return __generator(this, function (_a) {
|
|
98
|
+
switch (_a.label) {
|
|
99
|
+
case 0:
|
|
100
|
+
validateApp();
|
|
101
|
+
return [4 /*yield*/, setAuthHeader(opts.user, opts.headers)];
|
|
102
|
+
case 1:
|
|
103
|
+
headers = _a.sent();
|
|
104
|
+
_a.label = 2;
|
|
105
|
+
case 2:
|
|
106
|
+
_a.trys.push([2, 4, , 5]);
|
|
107
|
+
return [4 /*yield*/, got_1.default.post(getUrl(path, opts.qs), __assign(__assign({}, gotOpts), { body: body, headers: headers }))];
|
|
108
|
+
case 3:
|
|
109
|
+
res = _a.sent();
|
|
110
|
+
return [2 /*return*/, __assign({ status: res.statusCode }, res.body)];
|
|
111
|
+
case 4:
|
|
112
|
+
err_1 = _a.sent();
|
|
113
|
+
console.error(err_1);
|
|
114
|
+
throw err_1;
|
|
115
|
+
case 5: return [2 /*return*/];
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
exports.post = post;
|
|
121
|
+
function put(path_1, body_1) {
|
|
122
|
+
return __awaiter(this, arguments, void 0, function (path, body, opts) {
|
|
123
|
+
var headers, res;
|
|
124
|
+
if (opts === void 0) { opts = {}; }
|
|
125
|
+
return __generator(this, function (_a) {
|
|
126
|
+
switch (_a.label) {
|
|
127
|
+
case 0:
|
|
128
|
+
validateApp();
|
|
129
|
+
return [4 /*yield*/, setAuthHeader(opts.user, opts.headers)];
|
|
130
|
+
case 1:
|
|
131
|
+
headers = _a.sent();
|
|
132
|
+
return [4 /*yield*/, got_1.default.put(getUrl(path, opts.qs), __assign(__assign({}, gotOpts), { body: body, headers: headers }))];
|
|
133
|
+
case 2:
|
|
134
|
+
res = _a.sent();
|
|
135
|
+
return [2 /*return*/, __assign({ status: res.statusCode }, res.body)];
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
exports.put = put;
|
|
141
|
+
function del(path_1) {
|
|
142
|
+
return __awaiter(this, arguments, void 0, function (path, opts) {
|
|
143
|
+
var headers, res;
|
|
144
|
+
if (opts === void 0) { opts = {}; }
|
|
145
|
+
return __generator(this, function (_a) {
|
|
146
|
+
switch (_a.label) {
|
|
147
|
+
case 0:
|
|
148
|
+
validateApp();
|
|
149
|
+
return [4 /*yield*/, setAuthHeader(opts.user, opts.headers)];
|
|
150
|
+
case 1:
|
|
151
|
+
headers = _a.sent();
|
|
152
|
+
return [4 /*yield*/, got_1.default.delete(getUrl(path, opts.qs), __assign(__assign({}, gotOpts), { headers: headers }))];
|
|
153
|
+
case 2:
|
|
154
|
+
res = _a.sent();
|
|
155
|
+
return [2 /*return*/, __assign({ status: res.statusCode }, res.body)];
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
exports.del = del;
|
|
161
|
+
function validateApp() {
|
|
162
|
+
if (!app) {
|
|
163
|
+
throw new Error("App not initialized, run `init(app)` prior to invoking get/post/put/del");
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function getUrl(path, queryString) {
|
|
167
|
+
if (queryString) {
|
|
168
|
+
return baseUrl + path + "?" + qs_1.default.stringify(queryString);
|
|
169
|
+
}
|
|
170
|
+
return baseUrl + path;
|
|
171
|
+
}
|
|
172
|
+
function setAuthHeader(user, headers) {
|
|
173
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
174
|
+
var token;
|
|
175
|
+
return __generator(this, function (_a) {
|
|
176
|
+
switch (_a.label) {
|
|
177
|
+
case 0:
|
|
178
|
+
if (!user)
|
|
179
|
+
return [2 /*return*/, headers];
|
|
180
|
+
headers = headers || {};
|
|
181
|
+
if (!app.auth) {
|
|
182
|
+
throw new Error("Auth plugin not set, cannot use user option");
|
|
183
|
+
}
|
|
184
|
+
return [4 /*yield*/, app.auth.createToken(user, user.roles || [])];
|
|
185
|
+
case 1:
|
|
186
|
+
token = _a.sent();
|
|
187
|
+
headers["Authorization"] = "Bearer ".concat(token);
|
|
188
|
+
return [2 /*return*/, headers];
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
}
|
package/dist/mocks.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { FlinkAuthPlugin, FlinkRequest } from "@flink-app/flink";
|
|
2
|
+
interface TestFlinkRequest<T, P, Q> extends Omit<Partial<FlinkRequest<T, P, Q>>, "body" | "params" | "query"> {
|
|
3
|
+
body?: T;
|
|
4
|
+
params?: P;
|
|
5
|
+
query?: Q;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Creates a mocked FlinkRequest object where only essential properties are required.
|
|
9
|
+
* Will convert req body to JSON to ensure the body is a plain object.
|
|
10
|
+
* @param req
|
|
11
|
+
* @returns
|
|
12
|
+
*/
|
|
13
|
+
export declare function mockReq<T, P, Q>(req?: TestFlinkRequest<T, P, Q>): FlinkRequest<T, P, Q>;
|
|
14
|
+
/**
|
|
15
|
+
* Auth plugin used for testing handlers.
|
|
16
|
+
* Will allow all requests.
|
|
17
|
+
* @returns
|
|
18
|
+
*/
|
|
19
|
+
export declare function noOpAuthPlugin(): FlinkAuthPlugin;
|
|
20
|
+
export {};
|
package/dist/mocks.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.noOpAuthPlugin = exports.mockReq = void 0;
|
|
51
|
+
/**
|
|
52
|
+
* Creates a mocked FlinkRequest object where only essential properties are required.
|
|
53
|
+
* Will convert req body to JSON to ensure the body is a plain object.
|
|
54
|
+
* @param req
|
|
55
|
+
* @returns
|
|
56
|
+
*/
|
|
57
|
+
function mockReq(req) {
|
|
58
|
+
var aMockReq = __assign({ get: function (headerName) { var _a; return (_a = req === null || req === void 0 ? void 0 : req.headers) === null || _a === void 0 ? void 0 : _a[headerName]; } }, (req || {}));
|
|
59
|
+
if (!req) {
|
|
60
|
+
return aMockReq;
|
|
61
|
+
}
|
|
62
|
+
req.body = req.body ? JSON.parse(JSON.stringify(req.body)) : undefined;
|
|
63
|
+
req.query = req.query || {};
|
|
64
|
+
req.params = req.params ? JSON.parse(JSON.stringify(req.params)) : {};
|
|
65
|
+
return aMockReq;
|
|
66
|
+
}
|
|
67
|
+
exports.mockReq = mockReq;
|
|
68
|
+
/**
|
|
69
|
+
* Auth plugin used for testing handlers.
|
|
70
|
+
* Will allow all requests.
|
|
71
|
+
* @returns
|
|
72
|
+
*/
|
|
73
|
+
function noOpAuthPlugin() {
|
|
74
|
+
var _this = this;
|
|
75
|
+
return {
|
|
76
|
+
authenticateRequest: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
77
|
+
return [2 /*return*/, true];
|
|
78
|
+
}); }); },
|
|
79
|
+
createToken: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
80
|
+
return [2 /*return*/, "mock-token"];
|
|
81
|
+
}); }); },
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
exports.noOpAuthPlugin = noOpAuthPlugin;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flink-app/test-utils",
|
|
3
|
-
"version": "0.2.0-beta.
|
|
3
|
+
"version": "0.2.0-beta.17",
|
|
4
4
|
"description": "Test utils for Flink",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "echo \"Error: no test specified\"",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"qs": "^6.7.0"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
|
-
"@flink-app/flink": "^0.2.0-beta.
|
|
22
|
+
"@flink-app/flink": "^0.2.0-beta.17",
|
|
23
23
|
"@types/express": "^4.17.12",
|
|
24
24
|
"@types/got": "^9.6.12",
|
|
25
25
|
"@types/node": "^15.6.2",
|
|
@@ -29,5 +29,5 @@
|
|
|
29
29
|
"tsc-watch": "^4.2.9",
|
|
30
30
|
"typescript": "^4.2.4"
|
|
31
31
|
},
|
|
32
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "76e4647bd059afadeb0070e9392c61e01a494de9"
|
|
33
33
|
}
|