Skip to content

Commit ac1f4e8

Browse files
authored
[tsp-client] Add acceptance tests (#29811)
1 parent 1aa9126 commit ac1f4e8

File tree

9 files changed

+164
-4
lines changed

9 files changed

+164
-4
lines changed

.github/workflows/_reusable-eng-tools-test.yaml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ on:
88
description: Name of package under eng/tools
99
required: true
1010
type: string
11+
sparse-checkout-paths:
12+
description: Paths for sparse checkout
13+
type: string
1114

1215
jobs:
1316
test:
@@ -24,9 +27,15 @@ jobs:
2427
runs-on: ${{ matrix.os }}
2528

2629
steps:
30+
- if: runner.os == 'Windows'
31+
run: git config --global core.longpaths true
32+
shell: pwsh
33+
2734
- uses: actions/checkout@v4
2835
with:
29-
sparse-checkout: eng
36+
sparse-checkout: |
37+
eng
38+
${{ inputs.sparse-checkout-paths }}
3039
3140
- name: Use Node ${{ matrix.node-version }}.x
3241
uses: actions/setup-node@v4
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
name: tsp-client - Test
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
pull_request:
8+
paths:
9+
- package-lock.json
10+
- package.json
11+
- tsconfig.json
12+
- .github/workflows/_reusable-eng-tools-test.yaml
13+
- .github/workflows/tsp-client-test.yaml
14+
- eng/tools/package.json
15+
- eng/tools/tsconfig.json
16+
- eng/tools/tsp-client/**
17+
- specification/keyvault
18+
- specification/sphere
19+
20+
jobs:
21+
tsp-client:
22+
uses: ./.github/workflows/_reusable-eng-tools-test.yaml
23+
with:
24+
package: tsp-client-tests
25+
sparse-checkout-paths: |
26+
specification/common-types
27+
specification/keyvault
28+
specification/sphere

eng/tools/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"name": "azure-rest-api-specs-eng-tools",
33
"devDependencies": {
44
"@azure-tools/suppressions": "file:suppressions",
5+
"@azure-tools/tsp-client-tests": "file:tsp-client-tests",
56
"@azure-tools/typespec-requirement": "file:typespec-requirement",
67
"@azure-tools/typespec-validation": "file:typespec-validation"
78
},
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"name": "@azure-tools/tsp-client-tests",
3+
"private": true,
4+
"type": "module",
5+
"devDependencies": {
6+
"@types/node": "^18.19.31",
7+
"execa": "^9.3.0",
8+
"typescript": "~5.4.5",
9+
"vitest": "^1.6.0"
10+
},
11+
"scripts": {
12+
"build": "tsc",
13+
"postinstall": "npm run build",
14+
"test": "vitest",
15+
"test:ci": "vitest run --reporter=verbose"
16+
},
17+
"engines": {
18+
"node": ">= 18.0.0"
19+
}
20+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import { execa } from "execa";
2+
import { access, constants, mkdir, rm } from "fs/promises";
3+
import { dirname, join } from "path";
4+
import { ExpectStatic, test } from "vitest";
5+
6+
const repoRoot = join(__dirname, "..", "..", "..", "..");
7+
8+
async function tspClient(...args: string[]) {
9+
const allArgs = ["exec", "--no", "--", "tsp-client"].concat(args);
10+
11+
console.log(`${repoRoot}$ npm ${allArgs.join(" ")}`);
12+
13+
return await execa("npm", allArgs, { all: true, cwd: repoRoot, reject: false });
14+
}
15+
16+
async function convert(expect: ExpectStatic, readme: string) {
17+
const specFolder = dirname(dirname(join(repoRoot, readme)));
18+
const outputFolder = join(specFolder, "Test.TspClientConvert");
19+
20+
try {
21+
await mkdir(outputFolder);
22+
} catch {
23+
// Delete and retry
24+
await rm(outputFolder, { recursive: true, force: true });
25+
await mkdir(outputFolder);
26+
}
27+
28+
try {
29+
const { stdout, all, exitCode } = await tspClient(
30+
"convert",
31+
"--no-prompt",
32+
"--swagger-readme",
33+
readme,
34+
"-o",
35+
outputFolder,
36+
readme.includes("resource-manager") ? "--arm" : "",
37+
);
38+
39+
expect(stdout).toContain("Converting");
40+
expect(exitCode, all).toBe(0);
41+
42+
const tspConfigYaml = join(outputFolder, "tspconfig.yaml");
43+
await access(tspConfigYaml, constants.R_OK);
44+
console.log(`File exists: ${tspConfigYaml}`);
45+
46+
const mainTsp = join(outputFolder, "main.tsp");
47+
await access(mainTsp, constants.R_OK);
48+
console.log(`File exists: ${mainTsp}`);
49+
} finally {
50+
await rm(outputFolder, { recursive: true, force: true });
51+
}
52+
53+
// Ensure outputFolder is deleted
54+
expect(() => access(outputFolder)).rejects.toThrowError();
55+
}
56+
57+
// TODO: Convert to `test.concurrent()` once Azure/azure-sdk-tools#8610 is merged,
58+
// which should fix race condition bug calling `npx autorest`.
59+
test("Usage", async ({ expect }) => {
60+
const { stdout, exitCode } = await tspClient();
61+
62+
expect(stdout).toContain("Usage");
63+
expect(exitCode).not.toBe(0);
64+
});
65+
66+
test("Convert keyvault/data-plane", async ({ expect }) => {
67+
await convert(expect, "specification/keyvault/data-plane/readme.md");
68+
});
69+
70+
test("Convert sphere/resource-manager", async ({ expect }) => {
71+
await convert(expect, "specification/sphere/resource-manager/readme.md");
72+
});
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"extends": "../tsconfig.json",
3+
"compilerOptions": {
4+
"outDir": "./dist",
5+
}
6+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { defineConfig } from "vite";
2+
3+
export default defineConfig({
4+
test: {
5+
testTimeout: 240000,
6+
},
7+
});

eng/tools/typespec-requirement/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
"type": "module",
55
"devDependencies": {
66
"@types/node": "^18.19.31",
7-
"@vitest/coverage-v8": "^1.6.0",
87
"execa": "^9.3.0",
98
"typescript": "~5.4.5",
109
"vitest": "^1.6.0"
@@ -13,7 +12,7 @@
1312
"build": "tsc",
1413
"postinstall": "npm run build",
1514
"test": "vitest",
16-
"test:ci": "vitest run --coverage --reporter=verbose"
15+
"test:ci": "vitest run --reporter=verbose"
1716
},
1817
"engines": {
1918
"node": ">= 18.0.0"

package-lock.json

Lines changed: 19 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)