From 8f187be9951a76c44e47534533e38096fa96c8db Mon Sep 17 00:00:00 2001 From: Travis Prescott Date: Fri, 14 Apr 2023 11:16:55 -0700 Subject: [PATCH 1/3] Add test cases. --- .../test/versioned-dependencies.test.ts | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/packages/versioning/test/versioned-dependencies.test.ts b/packages/versioning/test/versioned-dependencies.test.ts index 41ebd2ce224..005a44180e7 100644 --- a/packages/versioning/test/versioned-dependencies.test.ts +++ b/packages/versioning/test/versioned-dependencies.test.ts @@ -26,6 +26,9 @@ describe("versioning: reference versioned library", () => { name: string; @added(Versions.l2) age: int32; } + + @removed(Versions.l2) + op Operation(...TParams): TResponse; } ${code}`, }); @@ -47,6 +50,8 @@ describe("versioning: reference versioned library", () => { @useDependency(VersionedLib.Versions.l1) @test namespace MyService { @test model Test extends VersionedLib.Foo {} + @test op test1 is VersionedLib.Operation<{name: string}, int32>; + alias test2 = VersionedLib.Operation<{name: string}, int32>; } `)) as { MyService: Namespace; Test: Model }; const versions = buildVersionProjections(runner.program, MyService); @@ -74,6 +79,8 @@ describe("versioning: reference versioned library", () => { @test model Test extends VersionedLib.Foo {} @test op getBar(): OtherVersionedLib.Bar; + @test op test1 is VersionedLib.Operation<{name: string}, int32>; + alias test2 = VersionedLib.Operation<{name: string}, int32>; } `)) as { MyService: Namespace; Test: Model; getBar: Operation }; const versions = buildVersionProjections(runner.program, MyService); @@ -116,6 +123,8 @@ describe("versioning: reference versioned library", () => { v2 } @test model Test extends VersionedLib.Foo {} + @test op test1 is VersionedLib.Operation<{name: string}, int32>; + alias test2 = VersionedLib.Operation<{name: string}, int32>; } `)) as { MyService: Namespace; Test: Model }; const versions = buildVersionProjections(runner.program, MyService); @@ -144,6 +153,8 @@ describe("versioning: reference versioned library", () => { v2 } @test model Test extends VersionedLib.Foo {} + @test op test1 is VersionedLib.Operation<{name: string}, int32>; + alias test2 = VersionedLib.Operation<{name: string}, int32>; } `)) as { MyService: Namespace; Test: Model }; const versions = buildVersionProjections(runner.program, MyService); @@ -213,6 +224,32 @@ describe("versioning: reference versioned library", () => { }); }); + it("emit diagnostic when using an operation with is", async () => { + const diagnostics = await runner.diagnose(` + namespace MyService { + op test is VersionedLib.Operation<{name: string}, int32>; + } + `); + expectDiagnostics(diagnostics, { + code: "@typespec/versioning/using-versioned-library", + message: + "Namespace 'MyService' is referencing types from versioned namespace 'VersionedLib' but didn't specify which versions with @useDependency.", + }); + }); + + it("emit diagnostic when using an operation as an alias", async () => { + const diagnostics = await runner.diagnose(` + namespace MyService { + alias test = VersionedLib.Operation<{name: string}, int32>; + } + `); + expectDiagnostics(diagnostics, { + code: "@typespec/versioning/using-versioned-library", + message: + "Namespace 'MyService' is referencing types from versioned namespace 'VersionedLib' but didn't specify which versions with @useDependency.", + }); + }); + it("emit diagnostic when used in properties", async () => { const diagnostics = await runner.diagnose(` namespace MyService { From 6953ab53cb57f3d93d945900d8ced0390fe0ca42 Mon Sep 17 00:00:00 2001 From: Travis Prescott Date: Fri, 14 Apr 2023 12:09:12 -0700 Subject: [PATCH 2/3] Add more test cases. --- packages/versioning/src/validate.ts | 2 ++ .../test/versioned-dependencies.test.ts | 32 +++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/packages/versioning/src/validate.ts b/packages/versioning/src/validate.ts index 6c06433e5a1..5f3a1a81fce 100644 --- a/packages/versioning/src/validate.ts +++ b/packages/versioning/src/validate.ts @@ -42,6 +42,7 @@ export function $onValidate(program: Program) { if (isTemplateInstance(model)) { return; } + // FIXME: Needs to account for if the model references a versioned namespace through "is" or "alias" addDependency(model.namespace, model.baseModel); for (const prop of model.properties.values()) { addDependency(model.namespace, prop.type); @@ -75,6 +76,7 @@ export function $onValidate(program: Program) { } const namespace = op.namespace ?? op.interface?.namespace; + // FIXME: Needs to account for if the operation itself is derived from a versioned namespace addDependency(namespace, op.parameters); addDependency(namespace, op.returnType); diff --git a/packages/versioning/test/versioned-dependencies.test.ts b/packages/versioning/test/versioned-dependencies.test.ts index 005a44180e7..5052b056129 100644 --- a/packages/versioning/test/versioned-dependencies.test.ts +++ b/packages/versioning/test/versioned-dependencies.test.ts @@ -211,7 +211,7 @@ describe("versioning: reference versioned library", () => { }); describe("when using versioned library without @useDependency", () => { - it("emit diagnostic when used in extends", async () => { + it("emit diagnostic when model uses extends", async () => { const diagnostics = await runner.diagnose(` namespace MyService { model Test extends VersionedLib.Foo {} @@ -224,7 +224,33 @@ describe("versioning: reference versioned library", () => { }); }); - it("emit diagnostic when using an operation with is", async () => { + it("emit diagnostic when model uses is", async () => { + const diagnostics = await runner.diagnose(` + namespace MyService { + model Test is VersionedLib.Foo {} + } + `); + expectDiagnostics(diagnostics, { + code: "@typespec/versioning/using-versioned-library", + message: + "Namespace 'MyService' is referencing types from versioned namespace 'VersionedLib' but didn't specify which versions with @useDependency.", + }); + }); + + it("emit diagnostic when model uses alias", async () => { + const diagnostics = await runner.diagnose(` + namespace MyService { + alias Test = VersionedLib.Foo {} + } + `); + expectDiagnostics(diagnostics, { + code: "@typespec/versioning/using-versioned-library", + message: + "Namespace 'MyService' is referencing types from versioned namespace 'VersionedLib' but didn't specify which versions with @useDependency.", + }); + }); + + it("emit diagnostic when operation uses is", async () => { const diagnostics = await runner.diagnose(` namespace MyService { op test is VersionedLib.Operation<{name: string}, int32>; @@ -237,7 +263,7 @@ describe("versioning: reference versioned library", () => { }); }); - it("emit diagnostic when using an operation as an alias", async () => { + it("emit diagnostic when operation uses alias", async () => { const diagnostics = await runner.diagnose(` namespace MyService { alias test = VersionedLib.Operation<{name: string}, int32>; From a03221b6d55f13958c6c2a690f8ab3ad1810796d Mon Sep 17 00:00:00 2001 From: Travis Prescott Date: Tue, 25 Apr 2023 11:31:47 -0700 Subject: [PATCH 3/3] Update versioning logic. --- .../versioning-FixTestCases_2023-04-25-18-50.json | 10 ++++++++++ packages/versioning/src/validate.ts | 4 ++-- .../versioning/test/versioned-dependencies.test.ts | 4 +++- 3 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 common/changes/@typespec/versioning/versioning-FixTestCases_2023-04-25-18-50.json diff --git a/common/changes/@typespec/versioning/versioning-FixTestCases_2023-04-25-18-50.json b/common/changes/@typespec/versioning/versioning-FixTestCases_2023-04-25-18-50.json new file mode 100644 index 00000000000..365ebf974b8 --- /dev/null +++ b/common/changes/@typespec/versioning/versioning-FixTestCases_2023-04-25-18-50.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@typespec/versioning", + "comment": "Fix issue where \"is\" dependencies were not detected.", + "type": "none" + } + ], + "packageName": "@typespec/versioning" +} \ No newline at end of file diff --git a/packages/versioning/src/validate.ts b/packages/versioning/src/validate.ts index 5f3a1a81fce..1e7d6ad1da4 100644 --- a/packages/versioning/src/validate.ts +++ b/packages/versioning/src/validate.ts @@ -42,7 +42,7 @@ export function $onValidate(program: Program) { if (isTemplateInstance(model)) { return; } - // FIXME: Needs to account for if the model references a versioned namespace through "is" or "alias" + addDependency(model.namespace, model.sourceModel); addDependency(model.namespace, model.baseModel); for (const prop of model.properties.values()) { addDependency(model.namespace, prop.type); @@ -76,7 +76,7 @@ export function $onValidate(program: Program) { } const namespace = op.namespace ?? op.interface?.namespace; - // FIXME: Needs to account for if the operation itself is derived from a versioned namespace + addDependency(namespace, op.sourceOperation); addDependency(namespace, op.parameters); addDependency(namespace, op.returnType); diff --git a/packages/versioning/test/versioned-dependencies.test.ts b/packages/versioning/test/versioned-dependencies.test.ts index 5052b056129..664013654c4 100644 --- a/packages/versioning/test/versioned-dependencies.test.ts +++ b/packages/versioning/test/versioned-dependencies.test.ts @@ -240,7 +240,8 @@ describe("versioning: reference versioned library", () => { it("emit diagnostic when model uses alias", async () => { const diagnostics = await runner.diagnose(` namespace MyService { - alias Test = VersionedLib.Foo {} + alias Test = VersionedLib.Foo; + op test(): Test; } `); expectDiagnostics(diagnostics, { @@ -267,6 +268,7 @@ describe("versioning: reference versioned library", () => { const diagnostics = await runner.diagnose(` namespace MyService { alias test = VersionedLib.Operation<{name: string}, int32>; + op myTest is test; } `); expectDiagnostics(diagnostics, {