forked from microsoft/typespec
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoverloads.test.ts
133 lines (116 loc) · 5.19 KB
/
overloads.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import { Operation } from "@typespec/compiler";
import { BasicTestRunner, expectDiagnostics } from "@typespec/compiler/testing";
import { strictEqual } from "assert";
import { beforeEach, describe, it } from "vitest";
import { getHttpOperation, listHttpOperationsIn } from "../src/index.js";
import { createHttpTestRunner } from "./test-host.js";
describe("http: overloads", () => {
let runner: BasicTestRunner;
beforeEach(async () => {
runner = await createHttpTestRunner();
});
it("overloads inherit base overload route and verb", async () => {
const { uploadString, uploadBytes } = (await runner.compile(`
@route("/upload")
@put
op upload(data: string | bytes, @header contentType: "text/plain" | "application/octet-stream"): void;
@overload(upload)
@test op uploadString(data: string, @header contentType: "text/plain" ): void;
@overload(upload)
@test op uploadBytes(data: bytes, @header contentType: "application/octet-stream"): void;
`)) as { uploadString: Operation; uploadBytes: Operation };
const [uploadStringHttp] = getHttpOperation(runner.program, uploadString);
const [uploadBytesHttp] = getHttpOperation(runner.program, uploadBytes);
strictEqual(uploadStringHttp.path, "/upload");
strictEqual(uploadStringHttp.verb, "put");
strictEqual(uploadBytesHttp.path, "/upload");
strictEqual(uploadBytesHttp.verb, "put");
});
it("overloads can change their route or verb", async () => {
const { upload, uploadString, uploadBytes } = (await runner.compile(`
@route("/upload")
@put
@test op upload(data: string | bytes, @header contentType: "text/plain" | "application/octet-stream"): void;
@overload(upload)
@route("/uploadString")
@test op uploadString(data: string, @header contentType: "text/plain" ): void;
@overload(upload)
@post @test op uploadBytes(data: bytes, @header contentType: "application/octet-stream"): void;
`)) as { upload: Operation; uploadString: Operation; uploadBytes: Operation };
const [uploadHttp] = getHttpOperation(runner.program, upload);
const [uploadStringHttp] = getHttpOperation(runner.program, uploadString);
const [uploadBytesHttp] = getHttpOperation(runner.program, uploadBytes);
strictEqual(uploadHttp.path, "/upload");
strictEqual(uploadHttp.verb, "put");
// Change to /uploadString
strictEqual(uploadStringHttp.path, "/uploadString");
strictEqual(uploadStringHttp.verb, "put");
// Changed to post
strictEqual(uploadBytesHttp.path, "/upload");
strictEqual(uploadBytesHttp.verb, "post");
});
it("links overloads", async () => {
await runner.compile(`
@route("/upload")
@put
op upload(data: string | bytes, @header contentType: "text/plain" | "application/octet-stream"): void;
@overload(upload)
op uploadString(data: string, @header contentType: "text/plain" ): void;
@overload(upload)
op uploadBytes(data: bytes, @header contentType: "application/octet-stream"): void;
`);
const [[overload, uploadString, uploadBytes]] = listHttpOperationsIn(
runner.program,
runner.program.getGlobalNamespaceType()
);
strictEqual(uploadString.overloading, overload);
strictEqual(uploadBytes.overloading, overload);
strictEqual(overload.overloads?.[0], uploadString);
strictEqual(overload.overloads?.[1], uploadBytes);
});
it("overload base route should still be unique with other operations", async () => {
const diagnostics = await runner.diagnose(`
@route("/upload")
op otherUpload(data: bytes): void;
@route("/upload")
op upload(data: string | bytes, @header contentType: "text/plain" | "application/octet-stream"): void;
@overload(upload)
op uploadString(data: string, @header contentType: "text/plain" ): void;
@overload(upload)
op uploadBytes(data: bytes, @header contentType: "application/octet-stream"): void;
`);
expectDiagnostics(diagnostics, [
{
code: "@typespec/http/duplicate-operation",
message: `Duplicate operation "otherUpload" routed at "post /upload".`,
},
{
code: "@typespec/http/duplicate-operation",
message: `Duplicate operation "upload" routed at "post /upload".`,
},
]);
});
it("overloads route should still be unique with other operations", async () => {
const diagnostics = await runner.diagnose(`
@route("/uploadString")
op otherUploadString(data: string): void;
@route("/upload")
op upload(data: string | bytes, @header contentType: "text/plain" | "application/octet-stream"): void;
@overload(upload)
@route("/uploadString")
op uploadString(data: string, @header contentType: "text/plain" ): void;
@overload(upload)
op uploadBytes(data: bytes, @header contentType: "application/octet-stream"): void;
`);
expectDiagnostics(diagnostics, [
{
code: "@typespec/http/duplicate-operation",
message: `Duplicate operation "otherUploadString" routed at "post /uploadString".`,
},
{
code: "@typespec/http/duplicate-operation",
message: `Duplicate operation "uploadString" routed at "post /uploadString".`,
},
]);
});
});