Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- Fixes a bug where invalid C# code is generated when API path contains an underscore [#6698](https://github.com/microsoft/kiota/issues/6698)
- Fixed a bug where union of integer and boolean types collection would not compile in dotnet. [#6834](https://github.com/microsoft/kiota/issues/6834)
- Fixed a bug where default values for query parameters are not generated in C# code. [#6836](https://github.com/microsoft/kiota/issues/6836)
Comment thread
baywet marked this conversation as resolved.
Outdated

## [1.28.0] - 2025-07-11

Expand Down
21 changes: 15 additions & 6 deletions src/Kiota.Builder/KiotaBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1201,12 +1201,21 @@ openApiExtension is OpenApiPrimaryErrorMessageExtension primaryErrorMessageExten
if (prop.IsOfKind(CodePropertyKind.Custom, CodePropertyKind.QueryParameter) &&
!propertyName.Equals(childIdentifier, StringComparison.Ordinal))
prop.SerializationName = childIdentifier;
if (kind == CodePropertyKind.Custom &&
propertySchema?.Default is JsonValue stringDefaultJsonValue &&
stringDefaultJsonValue.TryGetValue<string>(out var stringDefaultValue) &&
!string.IsNullOrEmpty(stringDefaultValue) &&
!"null".Equals(stringDefaultValue, StringComparison.OrdinalIgnoreCase))
prop.DefaultValue = $"\"{stringDefaultValue}\"";
if ((kind == CodePropertyKind.Custom || kind == CodePropertyKind.QueryParameter) &&
propertySchema?.Default is JsonValue defaultJsonValue &&
defaultJsonValue.TryGetValue<string>(out var stringDefaultValue) &&
!string.IsNullOrEmpty(stringDefaultValue) &&
!"null".Equals(stringDefaultValue, StringComparison.OrdinalIgnoreCase))
{
if (propertySchema.Type == JsonSchemaType.Integer && int.TryParse(stringDefaultValue, out var intValue))
Comment thread
martin-machacek-tfs marked this conversation as resolved.
Outdated
prop.DefaultValue = intValue.ToString(CultureInfo.InvariantCulture);
else if (propertySchema.Type == JsonSchemaType.Number && double.TryParse(stringDefaultValue, out var doubleValue))
prop.DefaultValue = doubleValue.ToString(CultureInfo.InvariantCulture);
else if (propertySchema.Type == JsonSchemaType.Boolean && bool.TryParse(stringDefaultValue, out var boolValue))
prop.DefaultValue = boolValue.ToString().ToLowerInvariant();
else
prop.DefaultValue = $"\"{stringDefaultValue}\"";
}

if (existingType == null)
{
Expand Down
13 changes: 13 additions & 0 deletions src/Kiota.Builder/Writers/CSharp/CodePropertyWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,19 @@ private void WritePropertyInternal(CodeProperty codeElement, LanguageWriter writ
var setterAccessModifier = codeElement.ReadOnly && codeElement.Access > AccessModifier.Private ? "private " : string.Empty;
var simpleBody = $"get; {setterAccessModifier}set;";
var defaultValue = string.Empty;
if (!string.IsNullOrEmpty(codeElement.DefaultValue))
{
if (codeElement.Type is CodeType propertyCodeType && propertyCodeType.TypeDefinition is CodeEnum enumDefinition)
{
var enumTypeName = conventions.GetTypeString(codeElement.Type, codeElement).TrimEnd('?');
Comment thread
martin-machacek-tfs marked this conversation as resolved.
Outdated
var enumValue = codeElement.DefaultValue.Trim('"').CleanupSymbolName().ToFirstCharacterUpperCase();
defaultValue = $" = {enumTypeName}.{enumValue};";
}
else
{
defaultValue = $" = {codeElement.DefaultValue};";
}
}
switch (codeElement.Kind)
{
case CodePropertyKind.RequestBuilder:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,99 @@ public void WritesCustomProperty()
Assert.Contains("get; set;", result);
}
[Fact]
public void WritesCustomPropertyWithDefaultValue()
{
property.Kind = CodePropertyKind.Custom;
property.DefaultValue = $"new {TypeName}()";
writer.Write(property);
var result = tw.ToString();
Assert.Contains($"{TypeName} {PropertyName}", result);
Assert.Contains("get; set;", result);
Assert.Contains($" = new {TypeName}()", result);
}
[Fact]
public void WritesQueryParameterWithDefaultEnumValue()
{
var enumProperty = new CodeProperty
{
Name = "EnumProperty",
Type = new CodeType
{
Name = "SomeEnum",
TypeDefinition = rootNamespace.AddEnum(new CodeEnum
{
Name = "SomeEnum"
}).First()
},
Kind = CodePropertyKind.QueryParameter,
DefaultValue = "EnumValue2",
};
parentClass.AddProperty(enumProperty, new()
{
Name = "queryParameter",
Kind = CodePropertyKind.QueryParameter,
Type = new CodeType
{
Name = "QueryParameter",
},
});
writer.Write(enumProperty);
var result = tw.ToString();
Assert.Contains("SomeEnum? EnumProperty { get; set; } = global::defaultNamespace.SomeEnum.EnumValue2;", result);
}
[Fact]
public void WritesQueryParameterWithDefaultIntValue()
{
var integerProperty = new CodeProperty
{
Name = "IntegerProperty",
Type = new CodeType
{
Name = "Int32"
},
Kind = CodePropertyKind.QueryParameter,
DefaultValue = "3",
};
parentClass.AddProperty(integerProperty, new()
{
Name = "queryParameter",
Kind = CodePropertyKind.QueryParameter,
Type = new CodeType
{
Name = "QueryParameter",
},
});
writer.Write(integerProperty);
var result = tw.ToString();
Assert.Contains("Int32? IntegerProperty { get; set; } = 3;", result);
}
[Fact]
public void WritesQueryParameterWithDefaultStringValue()
{
var stringProperty = new CodeProperty
{
Name = "StringProperty",
Type = new CodeType
{
Name = "String"
},
Kind = CodePropertyKind.QueryParameter,
DefaultValue = "\"SomeString\"",
};
parentClass.AddProperty(stringProperty, new()
{
Name = "queryParameter",
Kind = CodePropertyKind.QueryParameter,
Type = new CodeType
{
Name = "QueryParameter",
},
});
writer.Write(stringProperty);
var result = tw.ToString();
Assert.Contains("public String? StringProperty { get; set; } = \"SomeString\";", result);
}
[Fact]
public void WritesPrivateSetter()
{
property.Kind = CodePropertyKind.Custom;
Expand Down
Loading