From 999a1deb60e4a6144eb47f84539726d4385bd11e Mon Sep 17 00:00:00 2001 From: Jacob Wallraff Date: Wed, 15 Feb 2023 15:57:44 -0800 Subject: [PATCH] Use file provider in test --- .../src/description-provider.ts | 6 ++--- .../reusable-workflow-input.ts | 7 +++--- .../src/hover.reusable-workflow.test.ts | 25 ++++++++++++++----- actions-languageservice/src/hover.ts | 9 ++++--- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/actions-languageserver/src/description-provider.ts b/actions-languageserver/src/description-provider.ts index fc0758f..8da4c7f 100644 --- a/actions-languageserver/src/description-provider.ts +++ b/actions-languageserver/src/description-provider.ts @@ -5,7 +5,7 @@ import {getReusableWorkflowInputDescription} from "./description-providers/reusa import {TTLCache} from "./utils/cache"; export function descriptionProvider(client: Octokit | undefined, cache: TTLCache): DescriptionProvider { - const getDescription: DescriptionProvider["getDescription"] = async (context, token, path, fileProvider) => { + const getDescription: DescriptionProvider["getDescription"] = async (context, token, path, template) => { if (!client) { return undefined; } @@ -15,8 +15,8 @@ export function descriptionProvider(client: Octokit | undefined, cache: TTLCache return await getActionInputDescription(client, cache, context.step, token); } - if (context.reusableWorkflowJob && fileProvider && parent.definition?.key === "workflow-job-with") { - return await getReusableWorkflowInputDescription(client, cache, context.reusableWorkflowJob, token, fileProvider); + if (context.reusableWorkflowJob && template && parent.definition?.key === "workflow-job-with") { + return await getReusableWorkflowInputDescription(client, cache, context.reusableWorkflowJob, token, template); } }; diff --git a/actions-languageserver/src/description-providers/reusable-workflow-input.ts b/actions-languageserver/src/description-providers/reusable-workflow-input.ts index 3914abf..9c50c90 100644 --- a/actions-languageserver/src/description-providers/reusable-workflow-input.ts +++ b/actions-languageserver/src/description-providers/reusable-workflow-input.ts @@ -1,11 +1,10 @@ -import {parseActionReference} from "@github/actions-languageservice/action"; +import {parseFileReference} from "@github/actions-workflow-parser/workflows/file-reference"; import {isString} from "@github/actions-workflow-parser"; -import {isActionStep, isReusableWorkflowJob} from "@github/actions-workflow-parser/model/type-guards"; +import {isReusableWorkflowJob} from "@github/actions-workflow-parser/model/type-guards"; import {FileProvider} from "@github/actions-workflow-parser/workflows/file-provider"; import {ReusableWorkflowJob} from "@github/actions-workflow-parser/model/workflow-template"; import {TemplateToken} from "@github/actions-workflow-parser/templates/tokens/template-token"; import {Octokit} from "@octokit/rest"; -import {fetchActionMetadata} from "../utils/action-metadata"; import {TTLCache} from "../utils/cache"; export async function getReusableWorkflowInputDescription( @@ -13,7 +12,7 @@ export async function getReusableWorkflowInputDescription( cache: TTLCache, reusableWorkflowJob: ReusableWorkflowJob, token: TemplateToken, - fileProvider: FileProvider + template: FileProvider ): Promise { if (!isReusableWorkflowJob(reusableWorkflowJob)) { return undefined; diff --git a/actions-languageservice/src/hover.reusable-workflow.test.ts b/actions-languageservice/src/hover.reusable-workflow.test.ts index d53e858..3ddc69b 100644 --- a/actions-languageservice/src/hover.reusable-workflow.test.ts +++ b/actions-languageservice/src/hover.reusable-workflow.test.ts @@ -1,13 +1,26 @@ +import {isString} from "@github/actions-workflow-parser"; +import {StringToken} from "@github/actions-workflow-parser/templates/tokens/string-token"; import {CompletionItem, MarkupContent} from "vscode-languageserver-types"; import {DescriptionProvider, hover, HoverConfig} from "./hover"; -import {testHoverConfig} from "./hover.test"; import {getPositionFromCursor} from "./test-utils/cursor-position"; import {testFileProvider} from "./test-utils/test-file-provider"; -function mapResult(result: CompletionItem[]) { - return result.map(x => { - return {label: x.label, description: (x.documentation as MarkupContent).value}; - }); +export function testHoverReusableWorkflowConfig(tokenValue: string, tokenKey: string) { + return { + descriptionProvider: { + getDescription: async (_, token, __) => { + if (!isString(token)) { + throw new Error("Test provider only supports string tokens"); + } + + expect((token as StringToken).value).toEqual(tokenValue); + expect(token.definition!.key).toEqual(tokenKey); + + return token.description; + } + } satisfies DescriptionProvider, + fileProvider: testFileProvider + } satisfies HoverConfig; } describe("completion with reusable workflows", () => { @@ -23,7 +36,7 @@ jobs: `; const result = await hover( ...getPositionFromCursor(input), - {fileProvider: testFileProvider} + testHoverReusableWorkflowConfig("username", "scalar-needs-context") ); expect(result).not.toBeUndefined(); expect(result?.contents).toEqual( diff --git a/actions-languageservice/src/hover.ts b/actions-languageservice/src/hover.ts index 69f0d69..48045ef 100644 --- a/actions-languageservice/src/hover.ts +++ b/actions-languageservice/src/hover.ts @@ -2,6 +2,7 @@ import {DescriptionDictionary, Parser} from "@github/actions-expressions"; import {FunctionInfo} from "@github/actions-expressions/funcs/info"; import {Lexer} from "@github/actions-expressions/lexer"; import {convertWorkflowTemplate, parseWorkflow, ParseWorkflowResult} from "@github/actions-workflow-parser"; +import {WorkflowTemplate} from "@github/actions-workflow-parser"; import {ErrorPolicy} from "@github/actions-workflow-parser/model/convert"; import {getCronDescription} from "@github/actions-workflow-parser/model/converter/cron"; import {splitAllowedContext} from "@github/actions-workflow-parser/templates/allowed-context"; @@ -35,7 +36,7 @@ export type DescriptionProvider = { context: WorkflowContext, token: TemplateToken, path: TemplateToken[], - fileProvider?: FileProvider + template?: WorkflowTemplate ): Promise }; @@ -110,8 +111,8 @@ async function getDescription( path: TemplateToken[] ) { const defaultDescription = token.description || ""; - // TODO fix this check - if (!result?.value || !config?.descriptionProvider) { + // TODO fix this check - description provider is null for rusable workflows + if (!result?.value/* || !config?.descriptionProvider*/) { return defaultDescription; } @@ -125,7 +126,7 @@ async function getDescription( } ); const workflowContext = getWorkflowContext(document.uri, template, path); - const description = await config.descriptionProvider.getDescription(workflowContext, token, path, config.fileProvider); + const description = await config?.descriptionProvider?.getDescription(workflowContext, token, path, template); return description || defaultDescription; }