@fintekkers/ledger-models 0.4.36 → 0.4.38
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/node/fintekkers/models/portfolio/portfolio_pb.d.ts +13 -0
- package/node/fintekkers/models/portfolio/portfolio_pb.js +123 -1
- package/node/fintekkers/models/position/position_filter_pb.d.ts +13 -0
- package/node/fintekkers/models/position/position_filter_pb.js +123 -1
- package/node/fintekkers/models/position/position_pb.d.ts +13 -0
- package/node/fintekkers/models/position/position_pb.js +123 -1
- package/node/fintekkers/models/price/price_pb.d.ts +13 -0
- package/node/fintekkers/models/price/price_pb.js +123 -1
- package/node/fintekkers/models/security/bond/issuance_pb.d.ts +13 -0
- package/node/fintekkers/models/security/bond/issuance_pb.js +123 -1
- package/node/fintekkers/models/security/identifier/identifier_pb.d.ts +13 -0
- package/node/fintekkers/models/security/identifier/identifier_pb.js +123 -1
- package/node/fintekkers/models/security/index_composition_pb.d.ts +13 -0
- package/node/fintekkers/models/security/index_composition_pb.js +123 -1
- package/node/fintekkers/models/security/security_pb.d.ts +13 -0
- package/node/fintekkers/models/security/security_pb.js +123 -1
- package/node/fintekkers/models/security/tenor_pb.d.ts +13 -0
- package/node/fintekkers/models/security/tenor_pb.js +123 -1
- package/node/fintekkers/models/strategy/strategy_allocation_pb.d.ts +13 -0
- package/node/fintekkers/models/strategy/strategy_allocation_pb.js +123 -1
- package/node/fintekkers/models/strategy/strategy_pb.d.ts +13 -0
- package/node/fintekkers/models/strategy/strategy_pb.js +123 -1
- package/node/fintekkers/models/transaction/transaction_pb.d.ts +13 -0
- package/node/fintekkers/models/transaction/transaction_pb.js +123 -1
- package/node/fintekkers/models/util/api/api_key_pb.d.ts +13 -0
- package/node/fintekkers/models/util/api/api_key_pb.js +123 -1
- package/node/fintekkers/models/util/date_range_pb.d.ts +13 -0
- package/node/fintekkers/models/util/date_range_pb.js +123 -1
- package/node/fintekkers/models/util/lock/node_partition_pb.d.ts +13 -0
- package/node/fintekkers/models/util/lock/node_partition_pb.js +123 -1
- package/node/fintekkers/models/util/lock/node_state_pb.d.ts +13 -0
- package/node/fintekkers/models/util/lock/node_state_pb.js +123 -1
- package/node/fintekkers/models/util/object_type_grpc_pb.js +1 -0
- package/node/fintekkers/models/util/object_type_pb.d.ts +63 -0
- package/node/fintekkers/models/util/object_type_pb.js +109 -0
- package/node/fintekkers/requests/index_composition/create_index_composition_request_pb.d.ts +25 -0
- package/node/fintekkers/requests/index_composition/create_index_composition_request_pb.js +244 -2
- package/node/fintekkers/requests/index_composition/get_index_composition_request_pb.d.ts +25 -0
- package/node/fintekkers/requests/index_composition/get_index_composition_request_pb.js +244 -2
- package/node/fintekkers/requests/portfolio/create_portfolio_request_pb.d.ts +13 -0
- package/node/fintekkers/requests/portfolio/create_portfolio_request_pb.js +123 -1
- package/node/fintekkers/requests/portfolio/create_portfolio_response_pb.d.ts +13 -0
- package/node/fintekkers/requests/portfolio/create_portfolio_response_pb.js +123 -1
- package/node/fintekkers/requests/portfolio/query_portfolio_request_pb.d.ts +13 -0
- package/node/fintekkers/requests/portfolio/query_portfolio_request_pb.js +123 -1
- package/node/fintekkers/requests/portfolio/query_portfolio_response_pb.d.ts +13 -0
- package/node/fintekkers/requests/portfolio/query_portfolio_response_pb.js +123 -1
- package/node/fintekkers/requests/position/query_position_request_pb.d.ts +13 -0
- package/node/fintekkers/requests/position/query_position_request_pb.js +123 -1
- package/node/fintekkers/requests/position/query_position_response_pb.d.ts +13 -0
- package/node/fintekkers/requests/position/query_position_response_pb.js +123 -1
- package/node/fintekkers/requests/price/create_price_request_pb.d.ts +13 -0
- package/node/fintekkers/requests/price/create_price_request_pb.js +123 -1
- package/node/fintekkers/requests/price/create_price_response_pb.d.ts +13 -0
- package/node/fintekkers/requests/price/create_price_response_pb.js +123 -1
- package/node/fintekkers/requests/price/query_price_request_pb.d.ts +13 -0
- package/node/fintekkers/requests/price/query_price_request_pb.js +123 -1
- package/node/fintekkers/requests/price/query_price_response_pb.d.ts +13 -0
- package/node/fintekkers/requests/price/query_price_response_pb.js +123 -1
- package/node/fintekkers/requests/security/create_security_request_pb.d.ts +13 -0
- package/node/fintekkers/requests/security/create_security_request_pb.js +123 -1
- package/node/fintekkers/requests/security/create_security_response_pb.d.ts +13 -0
- package/node/fintekkers/requests/security/create_security_response_pb.js +123 -1
- package/node/fintekkers/requests/security/get_field_values_request_pb.d.ts +13 -0
- package/node/fintekkers/requests/security/get_field_values_request_pb.js +123 -1
- package/node/fintekkers/requests/security/get_field_values_response_pb.d.ts +13 -0
- package/node/fintekkers/requests/security/get_field_values_response_pb.js +123 -1
- package/node/fintekkers/requests/security/get_fields_response_pb.d.ts +13 -0
- package/node/fintekkers/requests/security/get_fields_response_pb.js +123 -1
- package/node/fintekkers/requests/security/query_security_request_pb.d.ts +13 -0
- package/node/fintekkers/requests/security/query_security_request_pb.js +123 -1
- package/node/fintekkers/requests/security/query_security_response_pb.d.ts +13 -0
- package/node/fintekkers/requests/security/query_security_response_pb.js +123 -1
- package/node/fintekkers/requests/transaction/create_transaction_request_pb.d.ts +13 -0
- package/node/fintekkers/requests/transaction/create_transaction_request_pb.js +123 -1
- package/node/fintekkers/requests/transaction/create_transaction_response_pb.d.ts +13 -0
- package/node/fintekkers/requests/transaction/create_transaction_response_pb.js +123 -1
- package/node/fintekkers/requests/transaction/query_transaction_request_pb.d.ts +13 -0
- package/node/fintekkers/requests/transaction/query_transaction_request_pb.js +123 -1
- package/node/fintekkers/requests/transaction/query_transaction_response_pb.d.ts +13 -0
- package/node/fintekkers/requests/transaction/query_transaction_response_pb.js +123 -1
- package/node/fintekkers/requests/util/delete_request_pb.d.ts +25 -0
- package/node/fintekkers/requests/util/delete_request_pb.js +244 -2
- package/node/fintekkers/requests/util/lock/lock_request_pb.d.ts +13 -0
- package/node/fintekkers/requests/util/lock/lock_request_pb.js +123 -1
- package/node/fintekkers/requests/util/lock/lock_response_pb.d.ts +13 -0
- package/node/fintekkers/requests/util/lock/lock_response_pb.js +123 -1
- package/node/fintekkers/requests/valuation/curve_request_pb.d.ts +13 -0
- package/node/fintekkers/requests/valuation/curve_request_pb.js +123 -1
- package/node/fintekkers/requests/valuation/curve_response_pb.d.ts +13 -0
- package/node/fintekkers/requests/valuation/curve_response_pb.js +123 -1
- package/node/fintekkers/requests/valuation/valuation_request_pb.d.ts +13 -0
- package/node/fintekkers/requests/valuation/valuation_request_pb.js +123 -1
- package/node/fintekkers/requests/valuation/valuation_response_pb.d.ts +13 -0
- package/node/fintekkers/requests/valuation/valuation_response_pb.js +123 -1
- package/node/wrappers/models/position/position_matcher.js +1 -0
- package/node/wrappers/models/position/position_matcher.js.map +1 -0
- package/node/wrappers/models/position/position_matcher.test.js +1 -0
- package/node/wrappers/models/position/position_matcher.test.js.map +1 -0
- package/node/wrappers/models/position/positionfilter.js +3 -2
- package/node/wrappers/models/position/positionfilter.js.map +1 -1
- package/node/wrappers/models/position/positionfilter.ts +3 -2
- package/node/wrappers/models/price/Price.js +4 -4
- package/node/wrappers/models/price/Price.js.map +1 -1
- package/node/wrappers/models/price/Price.ts +4 -4
- package/node/wrappers/models/transaction/transaction.js +4 -4
- package/node/wrappers/models/transaction/transaction.js.map +1 -1
- package/node/wrappers/models/transaction/transaction.ts +4 -4
- package/node/wrappers/models/transaction/transaction_constructor.test.js +29 -0
- package/node/wrappers/models/transaction/transaction_constructor.test.js.map +1 -1
- package/node/wrappers/requests/position/QueryPositionRequest.js +3 -2
- package/node/wrappers/requests/position/QueryPositionRequest.js.map +1 -1
- package/node/wrappers/requests/position/QueryPositionRequest.ts +3 -2
- package/node/wrappers/services/portfolio-service/PortfolioService.js +5 -6
- package/node/wrappers/services/portfolio-service/PortfolioService.js.map +1 -1
- package/node/wrappers/services/portfolio-service/PortfolioService.ts +5 -6
- package/node/wrappers/services/price-service/PriceService.js +5 -6
- package/node/wrappers/services/price-service/PriceService.js.map +1 -1
- package/node/wrappers/services/price-service/PriceService.ts +5 -6
- package/node/wrappers/services/security-service/SecurityService.js +5 -6
- package/node/wrappers/services/security-service/SecurityService.js.map +1 -1
- package/node/wrappers/services/security-service/SecurityService.ts +5 -6
- package/node/wrappers/services/transaction-service/TransactionService.js +5 -6
- package/node/wrappers/services/transaction-service/TransactionService.js.map +1 -1
- package/node/wrappers/services/transaction-service/TransactionService.ts +5 -6
- package/node/wrappers/util/link-resolver.js +5 -6
- package/node/wrappers/util/link-resolver.js.map +1 -1
- package/node/wrappers/util/link-resolver.ts +5 -6
- package/node/wrappers/util/object-type-legacy.json +21 -0
- package/node/wrappers/util/object-types.d.ts +62 -0
- package/node/wrappers/util/object-types.js +193 -0
- package/node/wrappers/util/object-types.js.map +1 -0
- package/node/wrappers/util/object-types.test.d.ts +1 -0
- package/node/wrappers/util/object-types.test.js +311 -0
- package/node/wrappers/util/object-types.test.js.map +1 -0
- package/node/wrappers/util/object-types.test.ts +307 -0
- package/node/wrappers/util/object-types.ts +207 -0
- package/package.json +1 -1
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
// Compact object type and version (LM-297): writers set both forms, readers
|
|
39
|
+
// translate the strings-only form. Rows come from the shared fixture
|
|
40
|
+
// test-fixtures/object-type-legacy.json, which Java, Python and Rust also load.
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const decimal_js_1 = require("decimal.js");
|
|
44
|
+
const object_type_pb_1 = require("../../fintekkers/models/util/object_type_pb");
|
|
45
|
+
const security_pb_1 = require("../../fintekkers/models/security/security_pb");
|
|
46
|
+
const price_pb_1 = require("../../fintekkers/models/price/price_pb");
|
|
47
|
+
const transaction_pb_1 = require("../../fintekkers/models/transaction/transaction_pb");
|
|
48
|
+
const portfolio_pb_1 = require("../../fintekkers/models/portfolio/portfolio_pb");
|
|
49
|
+
const transaction_type_pb_1 = require("../../fintekkers/models/transaction/transaction_type_pb");
|
|
50
|
+
const position_pb_1 = require("../../fintekkers/models/position/position_pb");
|
|
51
|
+
const query_security_response_pb_1 = require("../../fintekkers/requests/security/query_security_response_pb");
|
|
52
|
+
const query_portfolio_response_pb_1 = require("../../fintekkers/requests/portfolio/query_portfolio_response_pb");
|
|
53
|
+
const query_transaction_response_pb_1 = require("../../fintekkers/requests/transaction/query_transaction_response_pb");
|
|
54
|
+
const summary_pb_1 = require("../../fintekkers/requests/util/errors/summary_pb");
|
|
55
|
+
const objectTypes = __importStar(require("./object-types"));
|
|
56
|
+
const link_resolver_1 = __importDefault(require("./link-resolver"));
|
|
57
|
+
const Price_1 = __importDefault(require("../models/price/Price"));
|
|
58
|
+
const security_1 = __importDefault(require("../models/security/security"));
|
|
59
|
+
const portfolio_1 = __importDefault(require("../models/portfolio/portfolio"));
|
|
60
|
+
const transaction_1 = __importDefault(require("../models/transaction/transaction"));
|
|
61
|
+
const transaction_type_1 = require("../models/transaction/transaction_type");
|
|
62
|
+
const positionfilter_1 = require("../models/position/positionfilter");
|
|
63
|
+
const QueryPositionRequest_1 = require("../requests/position/QueryPositionRequest");
|
|
64
|
+
const uuid_1 = require("../models/utils/uuid");
|
|
65
|
+
const datetime_1 = require("../models/utils/datetime");
|
|
66
|
+
const PriceService_1 = require("../services/price-service/PriceService");
|
|
67
|
+
const SecurityService_1 = require("../services/security-service/SecurityService");
|
|
68
|
+
const TransactionService_1 = require("../services/transaction-service/TransactionService");
|
|
69
|
+
const PortfolioService_1 = require("../services/portfolio-service/PortfolioService");
|
|
70
|
+
const REPO_ROOT = path.resolve(__dirname, '../../../..');
|
|
71
|
+
const CASES = JSON.parse(fs.readFileSync(path.join(REPO_ROOT, 'test-fixtures', 'object-type-legacy.json'), 'utf8')).cases;
|
|
72
|
+
const COMPACT_NUMBERS = {
|
|
73
|
+
object_type: 1001, version_major: 1002, version_minor: 1003, version_patch: 1004,
|
|
74
|
+
};
|
|
75
|
+
/** Generated message classes by proto full name: the package is the directory under node/. */
|
|
76
|
+
function messageClasses() {
|
|
77
|
+
const root = path.resolve(__dirname, '../../fintekkers');
|
|
78
|
+
const classes = new Map();
|
|
79
|
+
const walk = (dir) => {
|
|
80
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
81
|
+
const full = path.join(dir, entry.name);
|
|
82
|
+
if (entry.isDirectory()) {
|
|
83
|
+
walk(full);
|
|
84
|
+
}
|
|
85
|
+
else if (entry.name.endsWith('_pb.js')) {
|
|
86
|
+
const pkg = path.relative(path.dirname(root), dir).split(path.sep).join('.');
|
|
87
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
88
|
+
for (const [name, cls] of Object.entries(require(full))) {
|
|
89
|
+
classes.set(`${pkg}.${name}`, cls);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
walk(root);
|
|
95
|
+
return classes;
|
|
96
|
+
}
|
|
97
|
+
const CLASSES = messageClasses();
|
|
98
|
+
function decode(c) {
|
|
99
|
+
const cls = CLASSES.get(c.message);
|
|
100
|
+
if (!cls)
|
|
101
|
+
throw new Error(`no generated class for ${c.message}`);
|
|
102
|
+
return cls.deserializeBinary(Buffer.from(c.bytes, 'base64'));
|
|
103
|
+
}
|
|
104
|
+
/** Field numbers present at the top level of an encoded message. */
|
|
105
|
+
function topLevelFieldNumbers(data) {
|
|
106
|
+
const numbers = [];
|
|
107
|
+
let i = 0;
|
|
108
|
+
const varint = () => {
|
|
109
|
+
let result = 0;
|
|
110
|
+
let scale = 1;
|
|
111
|
+
for (;;) {
|
|
112
|
+
const b = data[i++];
|
|
113
|
+
result += (b & 0x7f) * scale;
|
|
114
|
+
scale *= 128;
|
|
115
|
+
if (!(b & 0x80))
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
while (i < data.length) {
|
|
120
|
+
const key = varint();
|
|
121
|
+
numbers.push(Math.floor(key / 8));
|
|
122
|
+
const wireType = key % 8;
|
|
123
|
+
if (wireType === 0)
|
|
124
|
+
varint();
|
|
125
|
+
else if (wireType === 1)
|
|
126
|
+
i += 8;
|
|
127
|
+
else if (wireType === 2) {
|
|
128
|
+
const length = varint();
|
|
129
|
+
i += length;
|
|
130
|
+
}
|
|
131
|
+
else if (wireType === 5)
|
|
132
|
+
i += 4;
|
|
133
|
+
else
|
|
134
|
+
throw new Error(`unexpected wire type ${wireType}`);
|
|
135
|
+
}
|
|
136
|
+
return numbers;
|
|
137
|
+
}
|
|
138
|
+
let warn;
|
|
139
|
+
beforeEach(() => {
|
|
140
|
+
objectTypes.resetWarningsForTests();
|
|
141
|
+
warn = jest.spyOn(console, 'warn').mockImplementation(() => undefined);
|
|
142
|
+
});
|
|
143
|
+
afterEach(() => {
|
|
144
|
+
warn.mockRestore();
|
|
145
|
+
objectTypes.resetWarningsForTests();
|
|
146
|
+
});
|
|
147
|
+
const fallbackWarnings = () => warn.mock.calls.filter((args) => String(args[0]).includes('(LM-297)')).length;
|
|
148
|
+
// ---- Loading the old form translates it (metric 3) ----
|
|
149
|
+
describe.each(CASES.map((c) => [c.name, c]))('fixture row %s', (_name, c) => {
|
|
150
|
+
test('decodes to the expected type and version', () => {
|
|
151
|
+
const message = decode(c);
|
|
152
|
+
expect(objectTypes.readType(message)).toBe(object_type_pb_1.ObjectTypeProto[c.expect.object_type]);
|
|
153
|
+
expect(objectTypes.readVersion(message)).toEqual(c.expect.version);
|
|
154
|
+
expect(fallbackWarnings()).toBe(c.expect.warns ? 1 : 0);
|
|
155
|
+
});
|
|
156
|
+
test('re-serialises with the compact fields once upgraded', () => {
|
|
157
|
+
const data = objectTypes.upgrade(decode(c)).serializeBinary();
|
|
158
|
+
const expected = {
|
|
159
|
+
object_type: object_type_pb_1.ObjectTypeProto[c.expect.object_type],
|
|
160
|
+
version_major: c.expect.version[0],
|
|
161
|
+
version_minor: c.expect.version[1],
|
|
162
|
+
version_patch: c.expect.version[2],
|
|
163
|
+
};
|
|
164
|
+
const present = topLevelFieldNumbers(data);
|
|
165
|
+
for (const [name, number] of Object.entries(COMPACT_NUMBERS)) {
|
|
166
|
+
expect([name, present.includes(number)]).toEqual([name, expected[name] !== 0]);
|
|
167
|
+
}
|
|
168
|
+
const reread = CLASSES.get(c.message).deserializeBinary(data);
|
|
169
|
+
expect([reread.getObjectType(), reread.getVersionMajor(), reread.getVersionMinor(), reread.getVersionPatch()])
|
|
170
|
+
.toEqual([expected.object_type, expected.version_major, expected.version_minor, expected.version_patch]);
|
|
171
|
+
expect([reread.getObjectClass(), reread.getVersion()]).toEqual([c.object_class, c.version]);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
// ---- Reading the strings is deprecated (metric 4) ----
|
|
175
|
+
test('three strings-only decodes of one type warn once', () => {
|
|
176
|
+
const c = CASES.find((row) => row.name === 'js-PositionFilterProto');
|
|
177
|
+
for (let i = 0; i < 3; i++) {
|
|
178
|
+
objectTypes.upgrade(decode(c));
|
|
179
|
+
}
|
|
180
|
+
expect(fallbackWarnings()).toBe(1);
|
|
181
|
+
});
|
|
182
|
+
test('the new form does not warn', () => {
|
|
183
|
+
const message = objectTypes.stamp(new price_pb_1.PriceProto(), object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_PRICE, 'Price', '0.0.1');
|
|
184
|
+
objectTypes.readType(message);
|
|
185
|
+
objectTypes.readVersion(message);
|
|
186
|
+
expect(fallbackWarnings()).toBe(0);
|
|
187
|
+
});
|
|
188
|
+
// ---- Writers set both forms (metric 2) ----
|
|
189
|
+
/** A service with its gRPC client swapped for one that records each request. */
|
|
190
|
+
function capturingService(cls, response) {
|
|
191
|
+
const requests = [];
|
|
192
|
+
const unary = (request, callback) => {
|
|
193
|
+
requests.push(request);
|
|
194
|
+
callback(null, response());
|
|
195
|
+
};
|
|
196
|
+
const stream = (request) => {
|
|
197
|
+
requests.push(request);
|
|
198
|
+
const handlers = {};
|
|
199
|
+
setImmediate(() => { var _a; return (_a = handlers.end) === null || _a === void 0 ? void 0 : _a.call(handlers); });
|
|
200
|
+
return { on(event, handler) { handlers[event] = handler; return this; } };
|
|
201
|
+
};
|
|
202
|
+
const service = Object.create(cls.prototype);
|
|
203
|
+
service.client = {
|
|
204
|
+
validateCreateOrUpdate: unary, search: stream,
|
|
205
|
+
};
|
|
206
|
+
return { service, requests };
|
|
207
|
+
}
|
|
208
|
+
const asOf = datetime_1.ZonedDateTime.now().toProto();
|
|
209
|
+
const filter = () => new positionfilter_1.PositionFilter();
|
|
210
|
+
function security() {
|
|
211
|
+
return security_1.default.create(new security_pb_1.SecurityProto().setUuid(uuid_1.UUID.random().toUUIDProto()).setAssetClass('Equity'));
|
|
212
|
+
}
|
|
213
|
+
function portfolio() {
|
|
214
|
+
return new portfolio_1.default(new portfolio_pb_1.PortfolioProto().setUuid(uuid_1.UUID.random().toUUIDProto()).setPortfolioName('P').setAsOf(asOf));
|
|
215
|
+
}
|
|
216
|
+
function linkResolverRequests() {
|
|
217
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
218
|
+
const requests = [];
|
|
219
|
+
const client = (response) => ({
|
|
220
|
+
getByIds: (request, callback) => {
|
|
221
|
+
requests.push(request);
|
|
222
|
+
callback(null, response());
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
const resolver = new link_resolver_1.default({
|
|
226
|
+
securityClient: client(() => new query_security_response_pb_1.QuerySecurityResponseProto()),
|
|
227
|
+
portfolioClient: client(() => new query_portfolio_response_pb_1.QueryPortfolioResponseProto()),
|
|
228
|
+
transactionClient: client(() => new query_transaction_response_pb_1.QueryTransactionResponseProto()),
|
|
229
|
+
});
|
|
230
|
+
// Nothing comes back, so each lookup rejects as not found.
|
|
231
|
+
yield expect(resolver.getSecurity(uuid_1.UUID.random())).rejects.toThrow();
|
|
232
|
+
yield expect(resolver.getPortfolio(uuid_1.UUID.random())).rejects.toThrow();
|
|
233
|
+
yield expect(resolver.getTransaction(uuid_1.UUID.random())).rejects.toThrow();
|
|
234
|
+
return requests;
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
function lastRequest(cls, call) {
|
|
238
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
239
|
+
const { service, requests } = capturingService(cls, () => new summary_pb_1.SummaryProto());
|
|
240
|
+
yield call(service);
|
|
241
|
+
return requests[requests.length - 1];
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
const LIBRARY_WRITERS = [
|
|
245
|
+
['Price.fromSimple', () => __awaiter(void 0, void 0, void 0, function* () { return Price_1.default.fromSimple(uuid_1.UUID.random().toString(), 1, new Date()).proto; }),
|
|
246
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_PRICE, 'Price', '0.0.1'],
|
|
247
|
+
['Price.create', () => __awaiter(void 0, void 0, void 0, function* () { return Price_1.default.create(new decimal_js_1.Decimal(1), security(), datetime_1.ZonedDateTime.now()).proto; }),
|
|
248
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_PRICE, 'Price', '0.0.1'],
|
|
249
|
+
['PositionFilter.toProto', () => __awaiter(void 0, void 0, void 0, function* () { return filter().toProto(); }),
|
|
250
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_POSITION_FILTER, 'PositionFilter', '0.0.1'],
|
|
251
|
+
['QueryPositionRequest.toProto', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
252
|
+
return new QueryPositionRequest_1.QueryPositionRequest(filter(), position_pb_1.PositionTypeProto.TRANSACTION, position_pb_1.PositionViewProto.DEFAULT_VIEW, [], [], datetime_1.ZonedDateTime.now()).toProto();
|
|
253
|
+
}),
|
|
254
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_QUERY_POSITION_REQUEST, '', '1.0.0'],
|
|
255
|
+
['Transaction', () => __awaiter(void 0, void 0, void 0, function* () { return transaction().proto; }),
|
|
256
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_TRANSACTION, 'Transaction', '0.0.1'],
|
|
257
|
+
['Transaction strategy allocation', () => __awaiter(void 0, void 0, void 0, function* () { return transaction().proto.getStrategyAllocation(); }),
|
|
258
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_STRATEGY_ALLOCATION, 'StrategyAllocation', '0.0.1'],
|
|
259
|
+
['PriceService.validateCreateOrUpdate', () => lastRequest(PriceService_1.PriceService, (s) => s.validateCreateOrUpdate(new price_pb_1.PriceProto())),
|
|
260
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_CREATE_PRICE_REQUEST, 'PriceRequest', '0.0.1'],
|
|
261
|
+
['PriceService.search', () => lastRequest(PriceService_1.PriceService, (s) => s.search(asOf, filter())),
|
|
262
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_QUERY_PRICE_REQUEST, 'PriceRequest', '0.0.1'],
|
|
263
|
+
['SecurityService.validateCreateSecurity', () => lastRequest(SecurityService_1.SecurityService, (s) => s.validateCreateSecurity(new security_pb_1.SecurityProto())),
|
|
264
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_CREATE_SECURITY_REQUEST, 'SecurityRequest', '0.0.1'],
|
|
265
|
+
['SecurityService.searchSecurity', () => lastRequest(SecurityService_1.SecurityService, (s) => s.searchSecurity(asOf, filter())),
|
|
266
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_QUERY_SECURITY_REQUEST, 'SecurityRequest', '0.0.1'],
|
|
267
|
+
['TransactionService.validateCreateTransaction', () => lastRequest(TransactionService_1.TransactionService, (s) => s.validateCreateTransaction({ proto: new transaction_pb_1.TransactionProto() })),
|
|
268
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_CREATE_TRANSACTION_REQUEST, 'TransactionRequest', '0.0.1'],
|
|
269
|
+
['TransactionService.searchTransaction', () => lastRequest(TransactionService_1.TransactionService, (s) => s.searchTransaction(asOf, filter())),
|
|
270
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_QUERY_TRANSACTION_REQUEST, 'SecurityRequest', '0.0.1'],
|
|
271
|
+
['PortfolioService.validateCreatePortfolio', () => lastRequest(PortfolioService_1.PortfolioService, (s) => s.validateCreatePortfolio(new portfolio_pb_1.PortfolioProto())),
|
|
272
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_CREATE_PORTFOLIO_REQUEST, 'PortfolioRequest', '0.0.1'],
|
|
273
|
+
['PortfolioService.searchPortfolio', () => lastRequest(PortfolioService_1.PortfolioService, (s) => s.searchPortfolio(asOf, filter())),
|
|
274
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_QUERY_PORTFOLIO_REQUEST, 'PortfolioRequest', '0.0.1'],
|
|
275
|
+
['LinkResolver securities', () => __awaiter(void 0, void 0, void 0, function* () { return (yield linkResolverRequests())[0]; }),
|
|
276
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_QUERY_SECURITY_REQUEST, 'SecurityRequest', '0.0.1'],
|
|
277
|
+
['LinkResolver portfolios', () => __awaiter(void 0, void 0, void 0, function* () { return (yield linkResolverRequests())[1]; }),
|
|
278
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_QUERY_PORTFOLIO_REQUEST, 'PortfolioRequest', '0.0.1'],
|
|
279
|
+
['LinkResolver transactions', () => __awaiter(void 0, void 0, void 0, function* () { return (yield linkResolverRequests())[2]; }),
|
|
280
|
+
object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_QUERY_TRANSACTION_REQUEST, 'TransactionRequest', '0.0.1'],
|
|
281
|
+
];
|
|
282
|
+
function transaction() {
|
|
283
|
+
return new transaction_1.default({
|
|
284
|
+
tradeDate: new Date(2024, 0, 15),
|
|
285
|
+
settlementDate: new Date(2024, 0, 17),
|
|
286
|
+
asOfDate: new Date(2024, 0, 15, 10, 30, 0),
|
|
287
|
+
price: new decimal_js_1.Decimal('100.50'),
|
|
288
|
+
security: security(),
|
|
289
|
+
transactionType: new transaction_type_1.TransactionType(transaction_type_pb_1.TransactionTypeProto.BUY),
|
|
290
|
+
portfolio: portfolio(),
|
|
291
|
+
quantity: new decimal_js_1.Decimal('10'),
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
test.each(LIBRARY_WRITERS)('%s sets strings and compact fields that agree', (_name, build, type, objectClass, version) => __awaiter(void 0, void 0, void 0, function* () {
|
|
295
|
+
const message = yield build();
|
|
296
|
+
expect([message.getObjectClass(), message.getVersion()]).toEqual([objectClass, version]);
|
|
297
|
+
// The message's own type. Some JS writers put a query request's string on the
|
|
298
|
+
// create request too; the string still sits on one enum value.
|
|
299
|
+
expect(message.getObjectType()).toBe(type);
|
|
300
|
+
if (objectClass) {
|
|
301
|
+
expect(objectTypes.fromLegacy(objectClass)).not.toBe(object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_UNKNOWN);
|
|
302
|
+
}
|
|
303
|
+
expect([message.getVersionMajor(), message.getVersionMinor(), message.getVersionPatch()])
|
|
304
|
+
.toEqual(objectTypes.parseVersion(version));
|
|
305
|
+
expect(objectTypes.readVersion(message)).toEqual(objectTypes.parseVersion(version));
|
|
306
|
+
expect(fallbackWarnings()).toBe(0);
|
|
307
|
+
}));
|
|
308
|
+
test('stamp rejects a malformed version', () => {
|
|
309
|
+
expect(() => objectTypes.stamp(new price_pb_1.PriceProto(), object_type_pb_1.ObjectTypeProto.OBJECT_TYPE_PRICE, 'Price', '1.2')).toThrow();
|
|
310
|
+
});
|
|
311
|
+
//# sourceMappingURL=object-types.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-types.test.js","sourceRoot":"","sources":["object-types.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
// Compact object type and version (LM-297): writers set both forms, readers
|
|
2
|
+
// translate the strings-only form. Rows come from the shared fixture
|
|
3
|
+
// test-fixtures/object-type-legacy.json, which Java, Python and Rust also load.
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { Decimal } from 'decimal.js';
|
|
7
|
+
|
|
8
|
+
import { ObjectTypeProto } from '../../fintekkers/models/util/object_type_pb';
|
|
9
|
+
import { SecurityProto } from '../../fintekkers/models/security/security_pb';
|
|
10
|
+
import { PriceProto } from '../../fintekkers/models/price/price_pb';
|
|
11
|
+
import { TransactionProto } from '../../fintekkers/models/transaction/transaction_pb';
|
|
12
|
+
import { PortfolioProto } from '../../fintekkers/models/portfolio/portfolio_pb';
|
|
13
|
+
import { TransactionTypeProto } from '../../fintekkers/models/transaction/transaction_type_pb';
|
|
14
|
+
import { PositionTypeProto, PositionViewProto } from '../../fintekkers/models/position/position_pb';
|
|
15
|
+
import { QuerySecurityResponseProto } from '../../fintekkers/requests/security/query_security_response_pb';
|
|
16
|
+
import { QueryPortfolioResponseProto } from '../../fintekkers/requests/portfolio/query_portfolio_response_pb';
|
|
17
|
+
import { QueryTransactionResponseProto } from '../../fintekkers/requests/transaction/query_transaction_response_pb';
|
|
18
|
+
import { SummaryProto } from '../../fintekkers/requests/util/errors/summary_pb';
|
|
19
|
+
|
|
20
|
+
import * as objectTypes from './object-types';
|
|
21
|
+
import { ObjectTyped } from './object-types';
|
|
22
|
+
import LinkResolver from './link-resolver';
|
|
23
|
+
import Price from '../models/price/Price';
|
|
24
|
+
import Security from '../models/security/security';
|
|
25
|
+
import Portfolio from '../models/portfolio/portfolio';
|
|
26
|
+
import Transaction from '../models/transaction/transaction';
|
|
27
|
+
import { TransactionType } from '../models/transaction/transaction_type';
|
|
28
|
+
import { PositionFilter } from '../models/position/positionfilter';
|
|
29
|
+
import { QueryPositionRequest } from '../requests/position/QueryPositionRequest';
|
|
30
|
+
import { UUID } from '../models/utils/uuid';
|
|
31
|
+
import { ZonedDateTime } from '../models/utils/datetime';
|
|
32
|
+
import { PriceService } from '../services/price-service/PriceService';
|
|
33
|
+
import { SecurityService } from '../services/security-service/SecurityService';
|
|
34
|
+
import { TransactionService } from '../services/transaction-service/TransactionService';
|
|
35
|
+
import { PortfolioService } from '../services/portfolio-service/PortfolioService';
|
|
36
|
+
|
|
37
|
+
interface FixtureCase {
|
|
38
|
+
name: string;
|
|
39
|
+
source: string;
|
|
40
|
+
message: string;
|
|
41
|
+
object_class: string;
|
|
42
|
+
version: string;
|
|
43
|
+
bytes: string;
|
|
44
|
+
expect: { object_type: keyof typeof ObjectTypeProto; version: number[]; warns: boolean };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const REPO_ROOT = path.resolve(__dirname, '../../../..');
|
|
48
|
+
const CASES: FixtureCase[] = JSON.parse(
|
|
49
|
+
fs.readFileSync(path.join(REPO_ROOT, 'test-fixtures', 'object-type-legacy.json'), 'utf8')).cases;
|
|
50
|
+
const COMPACT_NUMBERS: Record<string, number> = {
|
|
51
|
+
object_type: 1001, version_major: 1002, version_minor: 1003, version_patch: 1004,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
type MessageClass = { deserializeBinary(bytes: Uint8Array): ObjectTyped & { serializeBinary(): Uint8Array } };
|
|
55
|
+
|
|
56
|
+
/** Generated message classes by proto full name: the package is the directory under node/. */
|
|
57
|
+
function messageClasses(): Map<string, MessageClass> {
|
|
58
|
+
const root = path.resolve(__dirname, '../../fintekkers');
|
|
59
|
+
const classes = new Map<string, MessageClass>();
|
|
60
|
+
const walk = (dir: string): void => {
|
|
61
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
62
|
+
const full = path.join(dir, entry.name);
|
|
63
|
+
if (entry.isDirectory()) {
|
|
64
|
+
walk(full);
|
|
65
|
+
} else if (entry.name.endsWith('_pb.js')) {
|
|
66
|
+
const pkg = path.relative(path.dirname(root), dir).split(path.sep).join('.');
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
68
|
+
for (const [name, cls] of Object.entries(require(full))) {
|
|
69
|
+
classes.set(`${pkg}.${name}`, cls as MessageClass);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
walk(root);
|
|
75
|
+
return classes;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const CLASSES = messageClasses();
|
|
79
|
+
|
|
80
|
+
function decode(c: FixtureCase) {
|
|
81
|
+
const cls = CLASSES.get(c.message);
|
|
82
|
+
if (!cls) throw new Error(`no generated class for ${c.message}`);
|
|
83
|
+
return cls.deserializeBinary(Buffer.from(c.bytes, 'base64'));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Field numbers present at the top level of an encoded message. */
|
|
87
|
+
function topLevelFieldNumbers(data: Uint8Array): number[] {
|
|
88
|
+
const numbers: number[] = [];
|
|
89
|
+
let i = 0;
|
|
90
|
+
const varint = (): number => {
|
|
91
|
+
let result = 0;
|
|
92
|
+
let scale = 1;
|
|
93
|
+
for (;;) {
|
|
94
|
+
const b = data[i++];
|
|
95
|
+
result += (b & 0x7f) * scale;
|
|
96
|
+
scale *= 128;
|
|
97
|
+
if (!(b & 0x80)) return result;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
while (i < data.length) {
|
|
101
|
+
const key = varint();
|
|
102
|
+
numbers.push(Math.floor(key / 8));
|
|
103
|
+
const wireType = key % 8;
|
|
104
|
+
if (wireType === 0) varint();
|
|
105
|
+
else if (wireType === 1) i += 8;
|
|
106
|
+
else if (wireType === 2) {
|
|
107
|
+
const length = varint();
|
|
108
|
+
i += length;
|
|
109
|
+
}
|
|
110
|
+
else if (wireType === 5) i += 4;
|
|
111
|
+
else throw new Error(`unexpected wire type ${wireType}`);
|
|
112
|
+
}
|
|
113
|
+
return numbers;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
let warn: jest.SpyInstance;
|
|
117
|
+
|
|
118
|
+
beforeEach(() => {
|
|
119
|
+
objectTypes.resetWarningsForTests();
|
|
120
|
+
warn = jest.spyOn(console, 'warn').mockImplementation(() => undefined);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
afterEach(() => {
|
|
124
|
+
warn.mockRestore();
|
|
125
|
+
objectTypes.resetWarningsForTests();
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
const fallbackWarnings = (): number => warn.mock.calls.filter((args) => String(args[0]).includes('(LM-297)')).length;
|
|
129
|
+
|
|
130
|
+
// ---- Loading the old form translates it (metric 3) ----
|
|
131
|
+
|
|
132
|
+
describe.each(CASES.map((c) => [c.name, c] as const))('fixture row %s', (_name, c) => {
|
|
133
|
+
test('decodes to the expected type and version', () => {
|
|
134
|
+
const message = decode(c);
|
|
135
|
+
expect(objectTypes.readType(message)).toBe(ObjectTypeProto[c.expect.object_type]);
|
|
136
|
+
expect(objectTypes.readVersion(message)).toEqual(c.expect.version);
|
|
137
|
+
expect(fallbackWarnings()).toBe(c.expect.warns ? 1 : 0);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
test('re-serialises with the compact fields once upgraded', () => {
|
|
141
|
+
const data = objectTypes.upgrade(decode(c)).serializeBinary();
|
|
142
|
+
const expected: Record<string, number> = {
|
|
143
|
+
object_type: ObjectTypeProto[c.expect.object_type],
|
|
144
|
+
version_major: c.expect.version[0],
|
|
145
|
+
version_minor: c.expect.version[1],
|
|
146
|
+
version_patch: c.expect.version[2],
|
|
147
|
+
};
|
|
148
|
+
const present = topLevelFieldNumbers(data);
|
|
149
|
+
for (const [name, number] of Object.entries(COMPACT_NUMBERS)) {
|
|
150
|
+
expect([name, present.includes(number)]).toEqual([name, expected[name] !== 0]);
|
|
151
|
+
}
|
|
152
|
+
const reread = CLASSES.get(c.message)!.deserializeBinary(data);
|
|
153
|
+
expect([reread.getObjectType(), reread.getVersionMajor(), reread.getVersionMinor(), reread.getVersionPatch()])
|
|
154
|
+
.toEqual([expected.object_type, expected.version_major, expected.version_minor, expected.version_patch]);
|
|
155
|
+
expect([reread.getObjectClass(), reread.getVersion()]).toEqual([c.object_class, c.version]);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
// ---- Reading the strings is deprecated (metric 4) ----
|
|
160
|
+
|
|
161
|
+
test('three strings-only decodes of one type warn once', () => {
|
|
162
|
+
const c = CASES.find((row) => row.name === 'js-PositionFilterProto')!;
|
|
163
|
+
for (let i = 0; i < 3; i++) {
|
|
164
|
+
objectTypes.upgrade(decode(c));
|
|
165
|
+
}
|
|
166
|
+
expect(fallbackWarnings()).toBe(1);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
test('the new form does not warn', () => {
|
|
170
|
+
const message = objectTypes.stamp(new PriceProto(), ObjectTypeProto.OBJECT_TYPE_PRICE, 'Price', '0.0.1');
|
|
171
|
+
objectTypes.readType(message);
|
|
172
|
+
objectTypes.readVersion(message);
|
|
173
|
+
expect(fallbackWarnings()).toBe(0);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// ---- Writers set both forms (metric 2) ----
|
|
177
|
+
|
|
178
|
+
/** A service with its gRPC client swapped for one that records each request. */
|
|
179
|
+
function capturingService<S extends object>(cls: { prototype: S }, response: () => unknown): { service: S; requests: ObjectTyped[] } {
|
|
180
|
+
const requests: ObjectTyped[] = [];
|
|
181
|
+
const unary = (request: ObjectTyped, callback: (err: unknown, res: unknown) => void) => {
|
|
182
|
+
requests.push(request);
|
|
183
|
+
callback(null, response());
|
|
184
|
+
};
|
|
185
|
+
const stream = (request: ObjectTyped) => {
|
|
186
|
+
requests.push(request);
|
|
187
|
+
const handlers: Record<string, () => void> = {};
|
|
188
|
+
setImmediate(() => handlers.end?.());
|
|
189
|
+
return { on(event: string, handler: () => void) { handlers[event] = handler; return this; } };
|
|
190
|
+
};
|
|
191
|
+
const service = Object.create(cls.prototype) as S;
|
|
192
|
+
(service as unknown as { client: unknown }).client = {
|
|
193
|
+
validateCreateOrUpdate: unary, search: stream,
|
|
194
|
+
};
|
|
195
|
+
return { service, requests };
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const asOf = ZonedDateTime.now().toProto();
|
|
199
|
+
const filter = (): PositionFilter => new PositionFilter();
|
|
200
|
+
|
|
201
|
+
function security(): Security {
|
|
202
|
+
return Security.create(new SecurityProto().setUuid(UUID.random().toUUIDProto()).setAssetClass('Equity'));
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function portfolio(): Portfolio {
|
|
206
|
+
return new Portfolio(new PortfolioProto().setUuid(UUID.random().toUUIDProto()).setPortfolioName('P').setAsOf(asOf));
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
async function linkResolverRequests(): Promise<ObjectTyped[]> {
|
|
210
|
+
const requests: ObjectTyped[] = [];
|
|
211
|
+
const client = (response: () => unknown) => ({
|
|
212
|
+
getByIds: (request: ObjectTyped, callback: (err: unknown, res: unknown) => void) => {
|
|
213
|
+
requests.push(request);
|
|
214
|
+
callback(null, response());
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
const resolver = new LinkResolver({
|
|
218
|
+
securityClient: client(() => new QuerySecurityResponseProto()) as never,
|
|
219
|
+
portfolioClient: client(() => new QueryPortfolioResponseProto()) as never,
|
|
220
|
+
transactionClient: client(() => new QueryTransactionResponseProto()) as never,
|
|
221
|
+
});
|
|
222
|
+
// Nothing comes back, so each lookup rejects as not found.
|
|
223
|
+
await expect(resolver.getSecurity(UUID.random())).rejects.toThrow();
|
|
224
|
+
await expect(resolver.getPortfolio(UUID.random())).rejects.toThrow();
|
|
225
|
+
await expect(resolver.getTransaction(UUID.random())).rejects.toThrow();
|
|
226
|
+
return requests;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
type Writer = [string, () => Promise<ObjectTyped>, ObjectTypeProto, string, string];
|
|
230
|
+
|
|
231
|
+
async function lastRequest<S extends object>(cls: { prototype: S }, call: (service: S) => Promise<unknown>): Promise<ObjectTyped> {
|
|
232
|
+
const { service, requests } = capturingService(cls, () => new SummaryProto());
|
|
233
|
+
await call(service);
|
|
234
|
+
return requests[requests.length - 1];
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
const LIBRARY_WRITERS: Writer[] = [
|
|
238
|
+
['Price.fromSimple', async () => Price.fromSimple(UUID.random().toString(), 1, new Date()).proto,
|
|
239
|
+
ObjectTypeProto.OBJECT_TYPE_PRICE, 'Price', '0.0.1'],
|
|
240
|
+
['Price.create', async () => Price.create(new Decimal(1), security(), ZonedDateTime.now()).proto,
|
|
241
|
+
ObjectTypeProto.OBJECT_TYPE_PRICE, 'Price', '0.0.1'],
|
|
242
|
+
['PositionFilter.toProto', async () => filter().toProto(),
|
|
243
|
+
ObjectTypeProto.OBJECT_TYPE_POSITION_FILTER, 'PositionFilter', '0.0.1'],
|
|
244
|
+
['QueryPositionRequest.toProto', async () => new QueryPositionRequest(
|
|
245
|
+
filter(), PositionTypeProto.TRANSACTION, PositionViewProto.DEFAULT_VIEW, [], [], ZonedDateTime.now()).toProto(),
|
|
246
|
+
ObjectTypeProto.OBJECT_TYPE_QUERY_POSITION_REQUEST, '', '1.0.0'],
|
|
247
|
+
['Transaction', async () => transaction().proto,
|
|
248
|
+
ObjectTypeProto.OBJECT_TYPE_TRANSACTION, 'Transaction', '0.0.1'],
|
|
249
|
+
['Transaction strategy allocation', async () => transaction().proto.getStrategyAllocation()!,
|
|
250
|
+
ObjectTypeProto.OBJECT_TYPE_STRATEGY_ALLOCATION, 'StrategyAllocation', '0.0.1'],
|
|
251
|
+
['PriceService.validateCreateOrUpdate', () => lastRequest(PriceService, (s) => s.validateCreateOrUpdate(new PriceProto())),
|
|
252
|
+
ObjectTypeProto.OBJECT_TYPE_CREATE_PRICE_REQUEST, 'PriceRequest', '0.0.1'],
|
|
253
|
+
['PriceService.search', () => lastRequest(PriceService, (s) => s.search(asOf, filter())),
|
|
254
|
+
ObjectTypeProto.OBJECT_TYPE_QUERY_PRICE_REQUEST, 'PriceRequest', '0.0.1'],
|
|
255
|
+
['SecurityService.validateCreateSecurity', () => lastRequest(SecurityService, (s) => s.validateCreateSecurity(new SecurityProto())),
|
|
256
|
+
ObjectTypeProto.OBJECT_TYPE_CREATE_SECURITY_REQUEST, 'SecurityRequest', '0.0.1'],
|
|
257
|
+
['SecurityService.searchSecurity', () => lastRequest(SecurityService, (s) => s.searchSecurity(asOf, filter())),
|
|
258
|
+
ObjectTypeProto.OBJECT_TYPE_QUERY_SECURITY_REQUEST, 'SecurityRequest', '0.0.1'],
|
|
259
|
+
['TransactionService.validateCreateTransaction', () => lastRequest(TransactionService,
|
|
260
|
+
(s) => s.validateCreateTransaction({ proto: new TransactionProto() } as Transaction)),
|
|
261
|
+
ObjectTypeProto.OBJECT_TYPE_CREATE_TRANSACTION_REQUEST, 'TransactionRequest', '0.0.1'],
|
|
262
|
+
['TransactionService.searchTransaction', () => lastRequest(TransactionService, (s) => s.searchTransaction(asOf, filter())),
|
|
263
|
+
ObjectTypeProto.OBJECT_TYPE_QUERY_TRANSACTION_REQUEST, 'SecurityRequest', '0.0.1'],
|
|
264
|
+
['PortfolioService.validateCreatePortfolio', () => lastRequest(PortfolioService, (s) => s.validateCreatePortfolio(new PortfolioProto())),
|
|
265
|
+
ObjectTypeProto.OBJECT_TYPE_CREATE_PORTFOLIO_REQUEST, 'PortfolioRequest', '0.0.1'],
|
|
266
|
+
['PortfolioService.searchPortfolio', () => lastRequest(PortfolioService, (s) => s.searchPortfolio(asOf, filter())),
|
|
267
|
+
ObjectTypeProto.OBJECT_TYPE_QUERY_PORTFOLIO_REQUEST, 'PortfolioRequest', '0.0.1'],
|
|
268
|
+
['LinkResolver securities', async () => (await linkResolverRequests())[0],
|
|
269
|
+
ObjectTypeProto.OBJECT_TYPE_QUERY_SECURITY_REQUEST, 'SecurityRequest', '0.0.1'],
|
|
270
|
+
['LinkResolver portfolios', async () => (await linkResolverRequests())[1],
|
|
271
|
+
ObjectTypeProto.OBJECT_TYPE_QUERY_PORTFOLIO_REQUEST, 'PortfolioRequest', '0.0.1'],
|
|
272
|
+
['LinkResolver transactions', async () => (await linkResolverRequests())[2],
|
|
273
|
+
ObjectTypeProto.OBJECT_TYPE_QUERY_TRANSACTION_REQUEST, 'TransactionRequest', '0.0.1'],
|
|
274
|
+
];
|
|
275
|
+
|
|
276
|
+
function transaction(): Transaction {
|
|
277
|
+
return new Transaction({
|
|
278
|
+
tradeDate: new Date(2024, 0, 15),
|
|
279
|
+
settlementDate: new Date(2024, 0, 17),
|
|
280
|
+
asOfDate: new Date(2024, 0, 15, 10, 30, 0),
|
|
281
|
+
price: new Decimal('100.50'),
|
|
282
|
+
security: security(),
|
|
283
|
+
transactionType: new TransactionType(TransactionTypeProto.BUY),
|
|
284
|
+
portfolio: portfolio(),
|
|
285
|
+
quantity: new Decimal('10'),
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
test.each(LIBRARY_WRITERS)('%s sets strings and compact fields that agree', async (_name, build, type, objectClass, version) => {
|
|
290
|
+
const message = await build();
|
|
291
|
+
|
|
292
|
+
expect([message.getObjectClass(), message.getVersion()]).toEqual([objectClass, version]);
|
|
293
|
+
// The message's own type. Some JS writers put a query request's string on the
|
|
294
|
+
// create request too; the string still sits on one enum value.
|
|
295
|
+
expect(message.getObjectType()).toBe(type);
|
|
296
|
+
if (objectClass) {
|
|
297
|
+
expect(objectTypes.fromLegacy(objectClass)).not.toBe(ObjectTypeProto.OBJECT_TYPE_UNKNOWN);
|
|
298
|
+
}
|
|
299
|
+
expect([message.getVersionMajor(), message.getVersionMinor(), message.getVersionPatch()])
|
|
300
|
+
.toEqual(objectTypes.parseVersion(version));
|
|
301
|
+
expect(objectTypes.readVersion(message)).toEqual(objectTypes.parseVersion(version));
|
|
302
|
+
expect(fallbackWarnings()).toBe(0);
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
test('stamp rejects a malformed version', () => {
|
|
306
|
+
expect(() => objectTypes.stamp(new PriceProto(), ObjectTypeProto.OBJECT_TYPE_PRICE, 'Price', '1.2')).toThrow();
|
|
307
|
+
});
|