0fe31c6656
* Setup CodeActions and add quickfix for missing inputs * PR feedback * Update languageservice/src/code-actions/quickfix/add-missing-inputs.ts Co-authored-by: Salman Chishti <salmanmkc@GitHub.com> * Fix indentSize detection for code actions after rebase - Add indentSize to MissingInputsDiagnosticData interface - Pass indentSize parameter from validate.ts to validateActionReference - Detect indentSize from workflow structure (jobs key to first child) - Fall back to detecting from with: block children when available * update typescript * formatting * linting * Gate missing inputs quickfix behind feature flag * Address PR review: rename files, move position calculation to quickfix - Rename index.ts files to follow repo patterns: - code-actions/index.ts → code-actions/code-actions.ts - code-actions/quickfix/index.ts → quickfix/quickfix-providers.ts - Move position calculation from validation to quickfix: - MissingInputsDiagnosticData now passes raw token ranges - Quickfix computes insertion position and indentation at code action time - detectIndentSize moved from validate.ts to validate-action-reference.ts * wip * Remove pointless comment --------- Co-authored-by: Salman Chishti <salmanmkc@GitHub.com>
91 lines
2.5 KiB
TypeScript
91 lines
2.5 KiB
TypeScript
import * as path from "path";
|
|
import {fileURLToPath} from "url";
|
|
import {loadTestCases, runTestCase} from "./runner.js";
|
|
import {ValidationConfig} from "../../validate.js";
|
|
import {ActionMetadata, ActionReference} from "../../action.js";
|
|
import {clearCache} from "../../utils/workflow-cache.js";
|
|
|
|
// ESM-compatible __dirname
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = path.dirname(__filename);
|
|
|
|
// Mock action metadata provider for tests
|
|
const validationConfig: ValidationConfig = {
|
|
actionsMetadataProvider: {
|
|
fetchActionMetadata: (ref: ActionReference): Promise<ActionMetadata | undefined> => {
|
|
const key = `${ref.owner}/${ref.name}@${ref.ref}`;
|
|
|
|
const metadata: Record<string, ActionMetadata> = {
|
|
"actions/cache@v1": {
|
|
name: "Cache",
|
|
description: "Cache dependencies",
|
|
inputs: {
|
|
path: {
|
|
description: "A list of files to cache",
|
|
required: true
|
|
},
|
|
key: {
|
|
description: "Cache key",
|
|
required: true
|
|
},
|
|
"restore-keys": {
|
|
description: "Restore keys",
|
|
required: false
|
|
}
|
|
}
|
|
},
|
|
"actions/setup-node@v3": {
|
|
name: "Setup Node",
|
|
description: "Setup Node.js",
|
|
inputs: {
|
|
"node-version": {
|
|
description: "Node version",
|
|
required: true,
|
|
default: "16"
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
return Promise.resolve(metadata[key]);
|
|
}
|
|
}
|
|
};
|
|
|
|
// Point to the source testdata directory
|
|
const testdataDir = path.join(__dirname, "testdata");
|
|
|
|
beforeEach(() => {
|
|
clearCache();
|
|
});
|
|
|
|
describe("code action golden tests", () => {
|
|
const testCases = loadTestCases(testdataDir);
|
|
|
|
if (testCases.length === 0) {
|
|
it.todo("no test cases found - add .yml files to testdata/");
|
|
return;
|
|
}
|
|
|
|
for (const testCase of testCases) {
|
|
it(testCase.name, async () => {
|
|
const result = await runTestCase(testCase, validationConfig);
|
|
|
|
if (!result.passed) {
|
|
let errorMessage = result.error || "Test failed";
|
|
|
|
if (result.expected !== undefined && result.actual !== undefined) {
|
|
errorMessage += "\n\n";
|
|
errorMessage += "=== EXPECTED (golden file) ===\n";
|
|
errorMessage += result.expected;
|
|
errorMessage += "\n\n";
|
|
errorMessage += "=== ACTUAL ===\n";
|
|
errorMessage += result.actual;
|
|
}
|
|
|
|
throw new Error(errorMessage);
|
|
}
|
|
});
|
|
}
|
|
});
|