@vaallk/plsql-test-mcp
v0.1.12
Published
MCP server for IFS PL/SQL unit test analysis, annotation, generation, and execution
Readme
PL/SQL Test MCP
MCP server for IFS Cloud PL/SQL unit testing — mirrors the architecture of integration-testing-mcp and delegates deploy/run steps to ifs-f1-codegen-dev.
Develop MCP to identify if a function/procedure is unit testable and generate the test.
Workflow
flowchart TD
A[checkUnitTestability] --> B{Testable?}
B -->|No| C[annotateIgnoreUnitTest]
B -->|Yes| D[generateUnitTest]
D --> E[generate_code / generate_and_deploy via ifs-f1-codegen-dev]
E --> F[Verify test passes]
C --> ETools
| Tool | Description |
|------|-------------|
| checkUnitTestability | Parse .plsql/.plsvc and assess pltst testability |
| annotateIgnoreUnitTest | Add @IgnoreUnitTest <reason> before a method |
| generateUnitTest | Analyze method body, generate deploy-safe mocks, data-driven FOR loops, and assertions |
| processUnitTestCoverage | Batch: annotate all non-testable methods + generate all missing auto-safe tests for one file |
| runUnitTest | Return generate_and_deploy instructions for ifs-f1-codegen-dev |
| runPlsqlTestWorkflow | End-to-end: check → annotate OR generate → run prep |
| getIgnoreUnitTestRules | List supported ignore reasons |
Supported @IgnoreUnitTest reasons
| Reason | When to use |
|--------|-------------|
| TrivialFunction | Simple getter/pass-through |
| MethodOverride | @Override CRUD/framework methods |
| DMLOperation | INSERT/UPDATE/DELETE/MERGE in body |
| NoOutParams | Procedure with no OUT/IN OUT params |
| DynamicStatement | EXECUTE IMMEDIATE / dynamic SQL |
| BLOBDataType / CLOBDataType | Large object types |
| PLSQLInSQL | PL/SQL embedded in SQL views |
| PipelinedFunction | Pipelined table functions |
Cursor integration
Add to Cursor MCP settings:
{
"mcpServers": {
"plsql-test": {
"command": "node",
"args": ["C:/ifsapps-new/plsql-test-mcp/dist/index.js"]
}
}
}Or after publishing:
{
"mcpServers": {
"plsql-test": {
"command": "npx",
"args": ["-y", "@ifs/[email protected]"]
}
}
}Development
cd c:/ifsapps-new/plsql-test-mcp
npm install
npm run build
npm startDeploy-safe generation (v0.1.4)
The generator avoids patterns that break AV_*_TST compilation:
- No UTF-8 BOM on written
.pltstfiles VARCHAR2(2000)for all generated IS-section locals (bareVARCHAR2causes PLS-00215)- Pre-write validation rejects bare VARCHAR2, BOM, and post-loop generated tests
- Skips
%ROWTYPEreturn types andSELECT * INTO %ROWTYPE(manual test required) - Skips CRUD modify methods using
Get_Object_By_Id___+Unpack___ - Expression SELECT columns (
round(cast(...))) mapped to safe mock column names - FOR loop column order matches IFS convention:
expected_ | input_param_ - Not-found cases stay inside the FOR loop (no post-loop statements)
- Skips
@IgnoreUnitTestwhen the method already has a UNITTEST block - Special mocks for
Get_Wp_Id,Has_Skills_Assigned_In_Turn,Get_Fault_Id_From_Record_Id,Get_AOS_Days,Get_Hm_Contract_Id_By_Barcode
Batch coverage example
processUnitTestCoverage({
sourceFile: "C:/ifsapps-new/workspace/adcom/source/adcom/database/AvFault.plsql",
workspace: "C:/ifsapps-new/workspace",
jiraKey: "PJZ-12345",
confirmed: true
})Example
Analyze McprActivityRelation.plsql:
checkUnitTestability({
sourceFile: "C:/ifsapps-new/workspace/prjrep/source/prjrep/database/McprActivityRelation.plsql",
methodName: "Is_Circular_Link___"
})Generate test:
generateUnitTest({
sourceFile: ".../McprActivityRelation.plsql",
methodName: "Is_Circular_Link___",
workspace: "C:/ifsapps-new/workspace",
jiraKey: "PJZ-12345",
confirmed: true
})Run via ifs-f1-codegen-dev:
generate_and_deploy({
input_files: [".../McprActivityRelation.plsql", ".../McprActivityRelation.pltst"],
environment_key: "26r1-dev-lkp",
workspace: "C:/ifsapps-new/workspace",
confirmed: true
})Note on plvst
IFS uses .pltst files for both .plsql and .plsvc unit tests. No separate .plvst extension exists in the codebase — this MCP targets .pltst.
Related
- integration-testing-mcp — reference MCP architecture
- ifs-f1-codegen-dev — code generation, SQLcl deploy, live DB inspect
