Merge pull request #66 from github/thyeggman/job-output-steps-context
Add tests for validation and completion
This commit is contained in:
@@ -778,6 +778,57 @@ jobs:
|
|||||||
expect(result.map(x => x.label)).toEqual(["container", "services", "status"]);
|
expect(result.map(x => x.label)).toEqual(["container", "services", "status"]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("job context is suggested within a job output", async () => {
|
||||||
|
const input = `
|
||||||
|
on: push
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
environment: \${{ | }}
|
||||||
|
steps:
|
||||||
|
- id: a
|
||||||
|
run: echo hi
|
||||||
|
`;
|
||||||
|
|
||||||
|
const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig);
|
||||||
|
expect(result.map(x => x.label)).toEqual([
|
||||||
|
"env",
|
||||||
|
"github",
|
||||||
|
"inputs",
|
||||||
|
"job",
|
||||||
|
"needs",
|
||||||
|
"runner",
|
||||||
|
"secrets",
|
||||||
|
"steps",
|
||||||
|
"vars",
|
||||||
|
"contains",
|
||||||
|
"endsWith",
|
||||||
|
"format",
|
||||||
|
"fromJson",
|
||||||
|
"join",
|
||||||
|
"startsWith",
|
||||||
|
"toJson",
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("step context is suggested within a job output", async () => {
|
||||||
|
const input = `
|
||||||
|
on: push
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
environment: \${{ steps.| }}
|
||||||
|
steps:
|
||||||
|
- id: foo
|
||||||
|
run: echo hi
|
||||||
|
`;
|
||||||
|
|
||||||
|
const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig);
|
||||||
|
expect(result.map(x => x.label)).toEqual(["foo"]);
|
||||||
|
});
|
||||||
|
|
||||||
it("container context is suggested within a job container", async () => {
|
it("container context is suggested within a job container", async () => {
|
||||||
const input = `
|
const input = `
|
||||||
on: push
|
on: push
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ export function getWorkflowContext(
|
|||||||
// Iterate through the token path to find the job and step
|
// Iterate through the token path to find the job and step
|
||||||
for (const token of tokenPath) {
|
for (const token of tokenPath) {
|
||||||
switch (token.definition?.key) {
|
switch (token.definition?.key) {
|
||||||
case "job-id": {
|
case "job": {
|
||||||
const jobID = (token as StringToken).value;
|
const jobID = (token as StringToken).value;
|
||||||
context.job = template.jobs.find(job => job.id.value === jobID);
|
context.job = template.jobs.find(job => job.id.value === jobID);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ jobs:
|
|||||||
["workflow-root-strict", TokenType.Mapping],
|
["workflow-root-strict", TokenType.Mapping],
|
||||||
["jobs", TokenType.String, "jobs"],
|
["jobs", TokenType.String, "jobs"],
|
||||||
["jobs", TokenType.Mapping],
|
["jobs", TokenType.Mapping],
|
||||||
["job-id", TokenType.String, "build"],
|
["job", TokenType.String, "build"],
|
||||||
["job-factory", TokenType.Mapping],
|
["job-factory", TokenType.Mapping],
|
||||||
["runs-on", TokenType.String, "runs-on"],
|
["runs-on", TokenType.String, "runs-on"],
|
||||||
["runs-on", TokenType.Sequence]
|
["runs-on", TokenType.Sequence]
|
||||||
@@ -180,7 +180,7 @@ jobs:
|
|||||||
["workflow-root-strict", TokenType.Mapping],
|
["workflow-root-strict", TokenType.Mapping],
|
||||||
["jobs", TokenType.String, "jobs"],
|
["jobs", TokenType.String, "jobs"],
|
||||||
["jobs", TokenType.Mapping],
|
["jobs", TokenType.Mapping],
|
||||||
["job-id", TokenType.String, "build"],
|
["job", TokenType.String, "build"],
|
||||||
["job-factory", TokenType.Mapping],
|
["job-factory", TokenType.Mapping],
|
||||||
["runs-on", TokenType.String, "runs-on"]
|
["runs-on", TokenType.String, "runs-on"]
|
||||||
],
|
],
|
||||||
@@ -201,7 +201,7 @@ jobs:
|
|||||||
["workflow-root-strict", TokenType.Mapping],
|
["workflow-root-strict", TokenType.Mapping],
|
||||||
["jobs", TokenType.String, "jobs"],
|
["jobs", TokenType.String, "jobs"],
|
||||||
["jobs", TokenType.Mapping],
|
["jobs", TokenType.Mapping],
|
||||||
["job-id", TokenType.String, "build"],
|
["job", TokenType.String, "build"],
|
||||||
["job-factory", TokenType.Mapping]
|
["job-factory", TokenType.Mapping]
|
||||||
],
|
],
|
||||||
parent: ["job-factory", TokenType.Mapping],
|
parent: ["job-factory", TokenType.Mapping],
|
||||||
@@ -221,7 +221,7 @@ jobs:
|
|||||||
["workflow-root-strict", TokenType.Mapping],
|
["workflow-root-strict", TokenType.Mapping],
|
||||||
["jobs", TokenType.String, "jobs"],
|
["jobs", TokenType.String, "jobs"],
|
||||||
["jobs", TokenType.Mapping],
|
["jobs", TokenType.Mapping],
|
||||||
["job-id", TokenType.String, "build"],
|
["job", TokenType.String, "build"],
|
||||||
["job-factory", TokenType.Mapping]
|
["job-factory", TokenType.Mapping]
|
||||||
],
|
],
|
||||||
parent: ["job-factory", TokenType.Mapping],
|
parent: ["job-factory", TokenType.Mapping],
|
||||||
@@ -241,7 +241,7 @@ jobs:
|
|||||||
["workflow-root-strict", TokenType.Mapping],
|
["workflow-root-strict", TokenType.Mapping],
|
||||||
["jobs", TokenType.String, "jobs"],
|
["jobs", TokenType.String, "jobs"],
|
||||||
["jobs", TokenType.Mapping],
|
["jobs", TokenType.Mapping],
|
||||||
["job-id", TokenType.String, "build"],
|
["job", TokenType.String, "build"],
|
||||||
["job-factory", TokenType.Mapping]
|
["job-factory", TokenType.Mapping]
|
||||||
],
|
],
|
||||||
parent: ["job-factory", TokenType.Mapping],
|
parent: ["job-factory", TokenType.Mapping],
|
||||||
@@ -261,10 +261,10 @@ jobs:
|
|||||||
["workflow-root-strict", TokenType.Mapping],
|
["workflow-root-strict", TokenType.Mapping],
|
||||||
["jobs", TokenType.String, "jobs"],
|
["jobs", TokenType.String, "jobs"],
|
||||||
["jobs", TokenType.Mapping],
|
["jobs", TokenType.Mapping],
|
||||||
["job-id", TokenType.String, "build"]
|
["job", TokenType.String, "build"]
|
||||||
],
|
],
|
||||||
parent: ["jobs", TokenType.Mapping],
|
parent: ["jobs", TokenType.Mapping],
|
||||||
key: ["job-id", TokenType.String, "build"],
|
key: ["job", TokenType.String, "build"],
|
||||||
token: [null, TokenType.String, "continue-on-error:foo"]
|
token: [null, TokenType.String, "continue-on-error:foo"]
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -280,7 +280,7 @@ jobs:
|
|||||||
["workflow-root-strict", TokenType.Mapping],
|
["workflow-root-strict", TokenType.Mapping],
|
||||||
["jobs", TokenType.String, "jobs"],
|
["jobs", TokenType.String, "jobs"],
|
||||||
["jobs", TokenType.Mapping],
|
["jobs", TokenType.Mapping],
|
||||||
["job-id", TokenType.String, "build"],
|
["job", TokenType.String, "build"],
|
||||||
["job-factory", TokenType.Mapping]
|
["job-factory", TokenType.Mapping]
|
||||||
],
|
],
|
||||||
parent: ["job-factory", TokenType.Mapping],
|
parent: ["job-factory", TokenType.Mapping],
|
||||||
@@ -300,7 +300,7 @@ jobs:
|
|||||||
["workflow-root-strict", TokenType.Mapping],
|
["workflow-root-strict", TokenType.Mapping],
|
||||||
["jobs", TokenType.String, "jobs"],
|
["jobs", TokenType.String, "jobs"],
|
||||||
["jobs", TokenType.Mapping],
|
["jobs", TokenType.Mapping],
|
||||||
["job-id", TokenType.String, "build"],
|
["job", TokenType.String, "build"],
|
||||||
["job-factory", TokenType.Mapping]
|
["job-factory", TokenType.Mapping]
|
||||||
],
|
],
|
||||||
parent: ["job-factory", TokenType.Mapping],
|
parent: ["job-factory", TokenType.Mapping],
|
||||||
@@ -320,10 +320,10 @@ jobs:
|
|||||||
["workflow-root-strict", TokenType.Mapping],
|
["workflow-root-strict", TokenType.Mapping],
|
||||||
["jobs", TokenType.String, "jobs"],
|
["jobs", TokenType.String, "jobs"],
|
||||||
["jobs", TokenType.Mapping],
|
["jobs", TokenType.Mapping],
|
||||||
["job-id", TokenType.String, "build"]
|
["job", TokenType.String, "build"]
|
||||||
],
|
],
|
||||||
parent: ["jobs", TokenType.Mapping],
|
parent: ["jobs", TokenType.Mapping],
|
||||||
key: ["job-id", TokenType.String, "build"],
|
key: ["job", TokenType.String, "build"],
|
||||||
token: [null, TokenType.String, "runs-"]
|
token: [null, TokenType.String, "runs-"]
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -340,10 +340,10 @@ jobs:
|
|||||||
["workflow-root-strict", TokenType.Mapping],
|
["workflow-root-strict", TokenType.Mapping],
|
||||||
["jobs", TokenType.String, "jobs"],
|
["jobs", TokenType.String, "jobs"],
|
||||||
["jobs", TokenType.Mapping],
|
["jobs", TokenType.Mapping],
|
||||||
["job-id", TokenType.String, "build"]
|
["job", TokenType.String, "build"]
|
||||||
],
|
],
|
||||||
parent: ["jobs", TokenType.Mapping],
|
parent: ["jobs", TokenType.Mapping],
|
||||||
key: ["job-id", TokenType.String, "build"],
|
key: ["job", TokenType.String, "build"],
|
||||||
token: [null, TokenType.String, "runs-"]
|
token: [null, TokenType.String, "runs-"]
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -360,7 +360,7 @@ jobs:
|
|||||||
["workflow-root-strict", TokenType.Mapping],
|
["workflow-root-strict", TokenType.Mapping],
|
||||||
["jobs", TokenType.String, "jobs"],
|
["jobs", TokenType.String, "jobs"],
|
||||||
["jobs", TokenType.Mapping],
|
["jobs", TokenType.Mapping],
|
||||||
["job-id", TokenType.String, "build"],
|
["job", TokenType.String, "build"],
|
||||||
["job-factory", TokenType.Mapping],
|
["job-factory", TokenType.Mapping],
|
||||||
["runs-on", TokenType.String, "runs-on"]
|
["runs-on", TokenType.String, "runs-on"]
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -190,6 +190,39 @@ jobs:
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("reference of invalid step in job outputs", async () => {
|
||||||
|
const input = `
|
||||||
|
on: push
|
||||||
|
jobs:
|
||||||
|
a:
|
||||||
|
outputs:
|
||||||
|
environment: \${{ steps.foo }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- id: a
|
||||||
|
run: echo hello a
|
||||||
|
`;
|
||||||
|
|
||||||
|
const result = await validate(createDocument("wf.yaml", input));
|
||||||
|
|
||||||
|
expect(result).toEqual([
|
||||||
|
{
|
||||||
|
"message": "Context access might be invalid: foo",
|
||||||
|
"range": {
|
||||||
|
"end": {
|
||||||
|
"character": 41,
|
||||||
|
"line": 5,
|
||||||
|
},
|
||||||
|
"start": {
|
||||||
|
"character": 25,
|
||||||
|
"line": 5,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"severity": 2,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
it("invalid reference of generated step name", async () => {
|
it("invalid reference of generated step name", async () => {
|
||||||
const input = `
|
const input = `
|
||||||
on: push
|
on: push
|
||||||
|
|||||||
Generated
+6
-6
@@ -702,9 +702,9 @@
|
|||||||
"link": true
|
"link": true
|
||||||
},
|
},
|
||||||
"node_modules/@github/actions-workflow-parser": {
|
"node_modules/@github/actions-workflow-parser": {
|
||||||
"version": "0.0.38",
|
"version": "0.0.39",
|
||||||
"resolved": "https://npm.pkg.github.com/download/@github/actions-workflow-parser/0.0.38/e696d29d18f20c008147bc09c0d2c9b5777ba7ba",
|
"resolved": "https://npm.pkg.github.com/download/@github/actions-workflow-parser/0.0.39/ba3e9e02e489175e0f284f0aebd9bde92ad4e935",
|
||||||
"integrity": "sha512-FfFUS8CJOwodvmw2b/0K7W9sEd2uwuCzmO8cyjp+Ew4uzDRtjX7Q7TkMras7/U4LrpvDhpYZ2TucF3yY+seSkA==",
|
"integrity": "sha512-Iw8OkCUxdgFvXpJkg6dAIEpGQrS09o3TC1I0looCJ1lHMBDBD7aVXasE8zJzlQUTdgRTGMiptNMgZS2MnGC76Q==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@github/actions-expressions": "*",
|
"@github/actions-expressions": "*",
|
||||||
@@ -13565,9 +13565,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@github/actions-workflow-parser": {
|
"@github/actions-workflow-parser": {
|
||||||
"version": "0.0.38",
|
"version": "0.0.39",
|
||||||
"resolved": "https://npm.pkg.github.com/download/@github/actions-workflow-parser/0.0.38/e696d29d18f20c008147bc09c0d2c9b5777ba7ba",
|
"resolved": "https://npm.pkg.github.com/download/@github/actions-workflow-parser/0.0.39/ba3e9e02e489175e0f284f0aebd9bde92ad4e935",
|
||||||
"integrity": "sha512-FfFUS8CJOwodvmw2b/0K7W9sEd2uwuCzmO8cyjp+Ew4uzDRtjX7Q7TkMras7/U4LrpvDhpYZ2TucF3yY+seSkA==",
|
"integrity": "sha512-Iw8OkCUxdgFvXpJkg6dAIEpGQrS09o3TC1I0looCJ1lHMBDBD7aVXasE8zJzlQUTdgRTGMiptNMgZS2MnGC76Q==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@github/actions-expressions": "*",
|
"@github/actions-expressions": "*",
|
||||||
"yaml": "^2.0.0-8"
|
"yaml": "^2.0.0-8"
|
||||||
|
|||||||
Reference in New Issue
Block a user