From 20396f465d97e74282e864903025ae549f4a972a Mon Sep 17 00:00:00 2001 From: Kenichiro NOGI Date: Sat, 5 Sep 2026 14:35:08 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20Process=E6=8A=BD=E5=87=BA=E3=83=BB?= =?UTF-8?q?=E5=9B=9E=E7=AD=94=E7=85=A7=E5=90=88=E3=83=BB=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E5=8A=9B=E5=88=A4=E5=AE=9A=E3=83=AD=E3=82=B8=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/lib/processFlow.js | 30 +++++++++++ .../test/processFlow.test.js | 53 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 NodeSrv/apps/healthcheck-survey-bot/src/lib/processFlow.js create mode 100644 NodeSrv/apps/healthcheck-survey-bot/test/processFlow.test.js diff --git a/NodeSrv/apps/healthcheck-survey-bot/src/lib/processFlow.js b/NodeSrv/apps/healthcheck-survey-bot/src/lib/processFlow.js new file mode 100644 index 00000000..a1d44303 --- /dev/null +++ b/NodeSrv/apps/healthcheck-survey-bot/src/lib/processFlow.js @@ -0,0 +1,30 @@ +function extractProcessesForStatus(processes, status) { + return processes.filter((p) => p.CurrentStatus === status || p.CurrentStatus === -1); +} + +function matchProcessByLabel(processes, text) { + const trimmed = String(text ?? "").trim(); + return processes.find((p) => (p.DisplayName || p.Name) === trimmed) || null; +} + +function getValidationColumnNames(process) { + if (!Array.isArray(process.ValidateInputs)) return []; + return process.ValidateInputs.map((v) => v.ColumnName).filter(Boolean); +} + +function classifyAwaitInput(process) { + const columnNames = getValidationColumnNames(process); + if (columnNames.length === 0) { + return { awaitInput: "none", column: null }; + } + const column = columnNames[0]; + if (column.startsWith("Date")) { + return { awaitInput: "date", column }; + } + if (column.startsWith("Attachments")) { + return { awaitInput: "file", column }; + } + return { awaitInput: "none", column: null }; +} + +module.exports = { extractProcessesForStatus, matchProcessByLabel, classifyAwaitInput }; diff --git a/NodeSrv/apps/healthcheck-survey-bot/test/processFlow.test.js b/NodeSrv/apps/healthcheck-survey-bot/test/processFlow.test.js new file mode 100644 index 00000000..91344e01 --- /dev/null +++ b/NodeSrv/apps/healthcheck-survey-bot/test/processFlow.test.js @@ -0,0 +1,53 @@ +const { test } = require("node:test"); +const assert = require("node:assert"); +const { + extractProcessesForStatus, + matchProcessByLabel, + classifyAwaitInput, +} = require("../src/lib/processFlow"); + +const processes = [ + { Id: 1, Name: "了承", DisplayName: "了承", CurrentStatus: 100, ChangedStatus: 200 }, + { Id: 2, Name: "日程変更", DisplayName: "日程変更", CurrentStatus: 100, ChangedStatus: 150, ValidateInputs: [{ Id: 1, ColumnName: "Date001", Required: true }] }, + { Id: 3, Name: "受けた", DisplayName: "受けた", CurrentStatus: 200, ChangedStatus: 300 }, + { Id: 4, Name: "結果受取り", DisplayName: "受け取った", CurrentStatus: 300, ChangedStatus: 900, ValidateInputs: [{ Id: 1, ColumnName: "AttachmentsA", Required: true }] }, +]; + +test("extractProcessesForStatus: 現在のStatusに一致するProcessのみ返す", () => { + const result = extractProcessesForStatus(processes, 100); + assert.strictEqual(result.length, 2); + assert.deepStrictEqual(result.map((p) => p.Id), [1, 2]); +}); + +test("extractProcessesForStatus: 一致するProcessが無ければ空配列", () => { + assert.deepStrictEqual(extractProcessesForStatus(processes, 999), []); +}); + +test("matchProcessByLabel: DisplayNameが完全一致するProcessを返す", () => { + const candidates = extractProcessesForStatus(processes, 100); + const matched = matchProcessByLabel(candidates, "日程変更"); + assert.strictEqual(matched.Id, 2); +}); + +test("matchProcessByLabel: 前後の空白を無視して一致判定する", () => { + const candidates = extractProcessesForStatus(processes, 100); + const matched = matchProcessByLabel(candidates, " 了承 "); + assert.strictEqual(matched.Id, 1); +}); + +test("matchProcessByLabel: 一致しなければnull", () => { + const candidates = extractProcessesForStatus(processes, 100); + assert.strictEqual(matchProcessByLabel(candidates, "存在しない選択肢"), null); +}); + +test("classifyAwaitInput: ValidateInputsが無いProcessはnone", () => { + assert.deepStrictEqual(classifyAwaitInput(processes[0]), { awaitInput: "none", column: null }); +}); + +test("classifyAwaitInput: Date*列はdate", () => { + assert.deepStrictEqual(classifyAwaitInput(processes[1]), { awaitInput: "date", column: "Date001" }); +}); + +test("classifyAwaitInput: Attachments*列はfile", () => { + assert.deepStrictEqual(classifyAwaitInput(processes[3]), { awaitInput: "file", column: "AttachmentsA" }); +});