Skip to content

Commit 47fea19

Browse files
committed
test: fix failing, test trailing slash handling behavior
1 parent 0eaf854 commit 47fea19

File tree

5 files changed

+213
-2
lines changed

5 files changed

+213
-2
lines changed

tests/Kiota.Builder.Tests/Extensions/StringExtensionsTests.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public void NormalizeNameSpaceName()
8585
Assert.Equal("Toto", "toto".NormalizeNameSpaceName("-"));
8686
Assert.Equal("Microsoft_Graph_Message_Content", "microsoft.Graph.Message.Content".NormalizeNameSpaceName("_"));
8787
}
88-
[InlineData("\" !#$%&'()*+,./:;<=>?@[]\\^`{}|~-", "plus")]
88+
[InlineData("\" !#$%&'()*+,./:;<=>?@[]^`{}|~-", "plus")]
8989
[InlineData("unchanged", "unchanged")]
9090
[InlineData("@odata.changed", "OdataChanged")]
9191
[InlineData("specialLast@", "specialLast")]
@@ -98,6 +98,9 @@ public void NormalizeNameSpaceName()
9898
[InlineData("-1-", "minus_1")]
9999
[InlineData("-1-1", "minus_11")]
100100
[InlineData("-", "minus")]
101+
[InlineData("\\", "Slash")]
102+
[InlineData("Param\\", "ParamSlash")]
103+
[InlineData("Param\\RequestBuilder", "ParamSlashRequestBuilder")]
101104
[Theory]
102105
public void CleansUpSymbolNames(string input, string expected)
103106
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
namespace Kiota.Builder.Tests.OpenApiSampleFiles;
2+
3+
public static class TrailingSlashSampleYml
4+
{
5+
/**
6+
* An OpenAPI 3.0.0 sample document with trailing slashes on some paths.
7+
*/
8+
public static readonly string OpenApiYaml = @"
9+
openapi: 3.0.0
10+
info:
11+
title: Sample API
12+
description: A sample API that uses trailing slashes.
13+
version: 1.0.0
14+
servers:
15+
- url: https://api.example.com/v1
16+
paths:
17+
/foo:
18+
get:
19+
summary: Get foo
20+
description: Returns foo.
21+
responses:
22+
'200':
23+
description: foo
24+
content:
25+
text/plain:
26+
schema:
27+
type: string
28+
/foo/:
29+
get:
30+
summary: Get foo slash
31+
description: Returns foo slash.
32+
responses:
33+
'200':
34+
description: foo slash
35+
content:
36+
text/plain:
37+
schema:
38+
type: string
39+
/message/{id}:
40+
get:
41+
summary: Get a Message
42+
description: Returns a single Message object.
43+
parameters:
44+
- name: id
45+
in: path
46+
required: true
47+
schema:
48+
type: string
49+
responses:
50+
'200':
51+
description: A Message object
52+
content:
53+
application/json:
54+
schema:
55+
$ref: '#/components/schemas/Message'
56+
/message/{id}/:
57+
get:
58+
summary: Get replies to a Message
59+
description: Returns a list of Message object replies for a Message.
60+
parameters:
61+
- name: id
62+
in: path
63+
required: true
64+
schema:
65+
type: string
66+
responses:
67+
'200':
68+
description: A list of Message objects
69+
content:
70+
application/json:
71+
schema:
72+
type: array
73+
items:
74+
$ref: '#/components/schemas/Message'
75+
/bucket/{name}/:
76+
get:
77+
summary: List items in a bucket
78+
description: Returns a list of BucketFiles in a bucket.
79+
parameters:
80+
- name: name
81+
in: path
82+
required: true
83+
schema:
84+
type: string
85+
responses:
86+
'200':
87+
description: A list of BucketFile objects
88+
content:
89+
application/json:
90+
schema:
91+
type: array
92+
items:
93+
$ref: '#/components/schemas/BucketFile'
94+
/bucket/{name}/{id}:
95+
get:
96+
summary: Get a bucket item
97+
description: Returns a single BucketFile object.
98+
parameters:
99+
- name: name
100+
in: path
101+
required: true
102+
schema:
103+
type: string
104+
- name: id
105+
in: path
106+
required: true
107+
schema:
108+
type: string
109+
responses:
110+
'200':
111+
description: A BucketFile object
112+
content:
113+
application/json:
114+
schema:
115+
$ref: '#/components/schemas/BucketFile'
116+
components:
117+
schemas:
118+
Message:
119+
type: object
120+
properties:
121+
Guid:
122+
type: string
123+
required:
124+
- Guid
125+
BucketFile:
126+
type: object
127+
properties:
128+
Guid:
129+
type: string
130+
required:
131+
- Guid";
132+
}

tests/Kiota.Builder.Tests/Refiners/TypeScriptLanguageRefinerTests.cs

+49
Original file line numberDiff line numberDiff line change
@@ -961,6 +961,55 @@ public async Task ParsesAndRefinesUnionOfPrimitiveValuesAsync()
961961
var unionType = modelCodeFile.GetChildElements().Where(x => x is CodeFunction function && TypeScriptRefiner.GetOriginalComposedType(function.OriginalLocalMethod.ReturnType) is not null).ToList();
962962
Assert.True(unionType.Count > 0);
963963
}
964+
[Fact]
965+
public async Task ParsesAndRefinesPathsWithTrailingSlashAsync()
966+
{
967+
var generationConfiguration = new GenerationConfiguration { Language = GenerationLanguage.TypeScript };
968+
var tempFilePath = Path.Combine(Path.GetTempPath(), Path.GetTempFileName());
969+
await File.WriteAllTextAsync(tempFilePath, TrailingSlashSampleYml.OpenApiYaml);
970+
var mockLogger = new Mock<ILogger<KiotaBuilder>>();
971+
var builder = new KiotaBuilder(mockLogger.Object, new GenerationConfiguration { ClientClassName = "Testing", Serializers = ["none"], Deserializers = ["none"] }, _httpClient);
972+
await using var fs = new FileStream(tempFilePath, FileMode.Open);
973+
var document = await builder.CreateOpenApiDocumentAsync(fs);
974+
var node = builder.CreateUriSpace(document);
975+
builder.SetApiRootUrl();
976+
var codeModel = builder.CreateSourceModel(node);
977+
var rootNS = codeModel.FindNamespaceByName("ApiSdk");
978+
Assert.NotNull(rootNS);
979+
await ILanguageRefiner.RefineAsync(generationConfiguration, rootNS);
980+
Assert.NotNull(rootNS);
981+
982+
var fooNS = rootNS.FindNamespaceByName("ApiSdk.foo");
983+
Assert.NotNull(fooNS);
984+
var fooCodeFile = fooNS.FindChildByName<CodeFile>("fooRequestBuilder", false);
985+
Assert.NotNull(fooCodeFile);
986+
var fooRequestBuilder = fooCodeFile.FindChildByName<CodeInterface>("fooRequestBuilder", false);
987+
var fooSlashRequestBuilder = fooCodeFile.FindChildByName<CodeInterface>("fooSlashRequestBuilder", false);
988+
Assert.NotNull(fooRequestBuilder);
989+
Assert.NotNull(fooSlashRequestBuilder);
990+
991+
var messageNS = rootNS.FindNamespaceByName("ApiSdk.message");
992+
Assert.NotNull(messageNS);
993+
var messageCodeFile = messageNS.FindChildByName<CodeFile>("messageRequestBuilder", false);
994+
Assert.NotNull(messageCodeFile);
995+
var messageRequestBuilder = messageCodeFile.FindChildByName<CodeInterface>("messageRequestBuilder", false);
996+
Assert.NotNull(messageRequestBuilder);
997+
var messageWithIdSlashMethod = messageRequestBuilder.FindChildByName<CodeMethod>("withIdSlash", false);
998+
var messageByIdMethod = messageRequestBuilder.FindChildByName<CodeMethod>("byId", false);
999+
Assert.NotNull(messageWithIdSlashMethod);
1000+
Assert.NotNull(messageByIdMethod);
1001+
1002+
var bucketNS = rootNS.FindNamespaceByName("ApiSdk.bucket");
1003+
Assert.NotNull(bucketNS);
1004+
var bucketItemNS = bucketNS.FindChildByName<CodeNamespace>("ApiSdk.bucket.item", false);
1005+
Assert.NotNull(bucketItemNS);
1006+
var bucketItemCodeFile = bucketItemNS.FindChildByName<CodeFile>("WithNameItemRequestBuilder", false);
1007+
Assert.NotNull(bucketItemCodeFile);
1008+
var bucketWithNameItemRequestBuilder = bucketItemCodeFile.FindChildByName<CodeInterface>("WithNameItemRequestBuilder", false);
1009+
var bucketWithNameSlashRequestBuilder = bucketItemCodeFile.FindChildByName<CodeInterface>("WithNameSlashRequestBuilder", false);
1010+
Assert.NotNull(bucketWithNameItemRequestBuilder);
1011+
Assert.NotNull(bucketWithNameSlashRequestBuilder);
1012+
}
9641013

9651014
[Fact]
9661015
public void GetOriginalComposedType_ReturnsNull_WhenElementIsNull()

tests/Kiota.Builder.Tests/Writers/CSharp/CodeEnumWriterTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public void NamesDontDiffer_DoesntWriteEnumMember()
8282
}
8383

8484
[Theory]
85-
[InlineData("\\", "BackSlash")]
85+
[InlineData("\\", "Slash")]
8686
[InlineData("?", "QuestionMark")]
8787
[InlineData("$", "Dollar")]
8888
[InlineData("~", "Tilde")]

tests/Kiota.Builder.Tests/Writers/TypeScript/CodeConstantWriterTests.cs

+27
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,33 @@ public void WritesRequestExecutorBody()
477477
Assert.Contains("403: createError403FromDiscriminatorValue as ParsableFactory<Parsable>", result);
478478
}
479479
[Fact]
480+
public void WritesRequestsMetadataWithCorrectUriTemplate()
481+
{
482+
parentClass.Kind = CodeClassKind.RequestBuilder;
483+
method.Kind = CodeMethodKind.RequestExecutor;
484+
method.HttpMethod = HttpMethod.Get;
485+
AddRequestProperties();
486+
AddRequestBodyParameters();
487+
var constant = CodeConstant.FromRequestBuilderToRequestsMetadata(parentClass);
488+
var codeFile = root.TryAddCodeFile("foo", constant);
489+
codeFile.AddElements(new CodeConstant
490+
{
491+
Name = "firstAndWrongUriTemplate",
492+
Kind = CodeConstantKind.UriTemplate,
493+
UriTemplate = "{+baseurl}/foo/"
494+
});
495+
codeFile.AddElements(new CodeConstant
496+
{
497+
Name = "parentClassUriTemplate",
498+
Kind = CodeConstantKind.UriTemplate,
499+
UriTemplate = "{+baseurl}/foo"
500+
});
501+
writer.Write(constant);
502+
var result = tw.ToString();
503+
Assert.Contains("uriTemplate: ParentClassUriTemplate", result);
504+
AssertExtensions.CurlyBracesAreClosed(result);
505+
}
506+
[Fact]
480507
public void WritesIndexer()
481508
{
482509
AddRequestProperties();

0 commit comments

Comments
 (0)