Migrate remaining legacy operator workflows

This commit is contained in:
2026-07-12 05:39:27 +09:00
parent ffb8f43c19
commit a01836a2d7
132 changed files with 20566 additions and 720 deletions

View File

@@ -142,6 +142,65 @@ test("search responses reject duplicates, ambiguous names, invalid rows and reor
})), null);
});
test("UC7 name-sort toggles descending first and ascending second", () => {
assert.equal(workflow.nextTradingHaltNameSort(null), "descending");
assert.equal(workflow.nextTradingHaltNameSort("descending"), "ascending");
assert.equal(workflow.nextTradingHaltNameSort("ascending"), "descending");
});
test("display-only name sort handles mixed markets and deterministic duplicate-name ties", () => {
const rows = [
{ market: "kospi", stockCode: "000002", displayName: "동명" },
{ market: "kosdaq", stockCode: "000003", displayName: "동명" },
{ market: "kospi", stockCode: "000004", displayName: "마지막" },
{ market: "kosdaq", stockCode: "000001", displayName: "동명" },
{ market: "kospi", stockCode: "000005", displayName: "가나다" }
];
const original = [...rows];
assert.deepEqual(
workflow.sortTradingHaltsForDisplay(rows, "ascending").map(value => `${value.displayName}|${value.market}|${value.stockCode}`),
[
"가나다|kospi|000005",
"동명|kosdaq|000001",
"동명|kosdaq|000003",
"동명|kospi|000002",
"마지막|kospi|000004"
]);
assert.deepEqual(
workflow.sortTradingHaltsForDisplay(rows, "descending").map(value => `${value.displayName}|${value.market}|${value.stockCode}`),
[
"마지막|kospi|000004",
"동명|kosdaq|000001",
"동명|kosdaq|000003",
"동명|kospi|000002",
"가나다|kospi|000005"
]);
const selectedIdentity = workflow.tradingHaltIdentity(rows[0]);
const selectedAfterSort = workflow.sortTradingHaltsForDisplay(rows, "ascending")
.find(value => workflow.tradingHaltIdentity(value) === selectedIdentity);
assert.equal(selectedAfterSort, rows[0]);
const serverOrder = workflow.sortTradingHaltsForDisplay(rows, null);
assert.deepEqual(rows, original);
assert.deepEqual(serverOrder, rows);
assert.notEqual(serverOrder, rows);
assert.equal(serverOrder[0], rows[0]);
assert.throws(() => workflow.sortTradingHaltsForDisplay(rows, "server"), /ascending/i);
});
test("trading-halt selection identity is market plus stock code, independent of display name", () => {
assert.equal(
workflow.tradingHaltIdentity({ market: "kospi", stockCode: "005930", displayName: "삼성전자" }),
"kospi\u0000005930");
assert.equal(
workflow.tradingHaltIdentity({ market: "kospi", stockCode: "005930", displayName: "표시명 변경" }),
"kospi\u0000005930");
assert.notEqual(
workflow.tradingHaltIdentity({ market: "kosdaq", stockCode: "005930", displayName: "삼성전자" }),
"kospi\u0000005930");
assert.equal(workflow.tradingHaltIdentity(null), "");
});
test("5001 current selections bind the exact halted-stock Core contract", () => {
for (const [stock, groupCode] of [[kospi, "KOSPI"], [kosdaq, "KOSDAQ"]]) {
const mapping = workflow.buildTradingHaltSelection("current", stock, {