Skip to content

Commit 3d03004

Browse files
author
Matthias Gessinger
committed
Add deprecation policy to ApIVersionPolicyBuilder
1 parent 012bf1c commit 3d03004

File tree

3 files changed

+88
-2
lines changed

3 files changed

+88
-2
lines changed

src/Abstractions/src/Asp.Versioning.Abstractions/IApiVersioningPolicyBuilder.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,14 @@ public interface IApiVersioningPolicyBuilder
2323
/// <exception cref="ArgumentException">The <paramref name="name"/> and <paramref name="apiVersion"/>
2424
/// parameters are both <c>null</c>.</exception>
2525
ISunsetPolicyBuilder Sunset( string? name, ApiVersion? apiVersion );
26+
27+
/// <summary>
28+
/// Creates and returns a new deprecation policy builder.
29+
/// </summary>
30+
/// <param name="name">The optional name of the API the policy is for.</param>
31+
/// <param name="apiVersion">The optional <see cref="ApiVersion">API version</see> the policy is for.</param>
32+
/// <returns>A new <see cref="IDeprecationPolicyBuilder">deprecation policy builder</see>.</returns>
33+
/// <exception cref="ArgumentException">The <paramref name="name"/> and <paramref name="apiVersion"/>
34+
/// parameters are both <c>null</c>.</exception>
35+
public IDeprecationPolicyBuilder Deprecate( string? name, ApiVersion? apiVersion );
2636
}

src/Common/src/Common/ApiVersioningPolicyBuilder.cs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,18 @@ namespace Asp.Versioning;
1010
public class ApiVersioningPolicyBuilder : IApiVersioningPolicyBuilder
1111
{
1212
private Dictionary<PolicyKey, ISunsetPolicyBuilder>? sunsetPolicies;
13+
private Dictionary<PolicyKey, IDeprecationPolicyBuilder>? deprecationPolicies;
1314

1415
/// <inheritdoc />
1516
public virtual IReadOnlyList<T> OfType<T>() where T : notnull
1617
{
1718
if ( typeof( T ) == typeof( ISunsetPolicyBuilder ) && sunsetPolicies != null )
1819
{
19-
return ( sunsetPolicies.Values.ToArray() as IReadOnlyList<T> )!;
20+
return sunsetPolicies.Values.Cast<T>().ToArray();
21+
}
22+
else if ( typeof( T ) == typeof( IDeprecationPolicyBuilder ) && deprecationPolicies != null )
23+
{
24+
return deprecationPolicies.Values.Cast<T>().ToArray();
2025
}
2126

2227
return Array.Empty<T>();
@@ -42,4 +47,25 @@ public virtual ISunsetPolicyBuilder Sunset( string? name, ApiVersion? apiVersion
4247

4348
return builder;
4449
}
50+
51+
/// <inheritdoc />
52+
public virtual IDeprecationPolicyBuilder Deprecate( string? name, ApiVersion? apiVersion )
53+
{
54+
if ( string.IsNullOrEmpty( name ) && apiVersion == null )
55+
{
56+
var message = string.Format( CultureInfo.CurrentCulture, Format.InvalidPolicyKey, nameof( name ), nameof( apiVersion ) );
57+
throw new System.ArgumentException( message );
58+
}
59+
60+
var key = new PolicyKey( name, apiVersion );
61+
62+
deprecationPolicies ??= [];
63+
64+
if ( !deprecationPolicies.TryGetValue( key, out var builder ) )
65+
{
66+
deprecationPolicies.Add( key, builder = new DeprecationPolicyBuilder( name, apiVersion ) );
67+
}
68+
69+
return builder;
70+
}
4571
}

src/Common/test/Common.Tests/ApiVersioningPolicyBuilderTest.cs

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,38 @@ public void sunset_should_return_same_policy_builder( string name, double? versi
3636
result.Should().BeSameAs( expected );
3737
}
3838

39+
[Fact]
40+
public void deprecate_should_not_allow_empty_name_and_version()
41+
{
42+
// arrange
43+
var builder = new ApiVersioningPolicyBuilder();
44+
45+
// act
46+
Func<IDeprecationPolicyBuilder> deprecation = () => builder.Deprecate( default, default );
47+
48+
// assert
49+
deprecation.Should().Throw<ArgumentException>().And
50+
.Message.Should().Be( "'name' and 'apiVersion' cannot both be null." );
51+
}
52+
53+
[Theory]
54+
[InlineData( "Test", null )]
55+
[InlineData( null, 1.1 )]
56+
[InlineData( "Test", 1.1 )]
57+
public void deprecate_should_return_same_policy_builder( string name, double? version )
58+
{
59+
// arrange
60+
var apiVersion = version is null ? default : new ApiVersion( version.Value );
61+
var builder = new ApiVersioningPolicyBuilder();
62+
var expected = builder.Deprecate( name, apiVersion );
63+
64+
// act
65+
var result = builder.Deprecate( name, apiVersion );
66+
67+
// assert
68+
result.Should().BeSameAs( expected );
69+
}
70+
3971
[Fact]
4072
public void of_type_should_return_empty_list_for_unknown_type()
4173
{
@@ -50,16 +82,34 @@ public void of_type_should_return_empty_list_for_unknown_type()
5082
}
5183

5284
[Fact]
53-
public void of_type_should_return_filtered_builders()
85+
public void of_type_sunset_should_return_filtered_builders()
5486
{
5587
// arrange
5688
var builder = new ApiVersioningPolicyBuilder();
5789
var expected = builder.Sunset( default, ApiVersion.Default );
90+
var deprecation = builder.Deprecate( default, ApiVersion.Default );
5891

5992
// act
6093
var list = builder.OfType<ISunsetPolicyBuilder>();
6194

6295
// assert
6396
list.Single().Should().BeSameAs( expected );
97+
list.Single().Should().NotBeSameAs( deprecation );
98+
}
99+
100+
[Fact]
101+
public void of_type_deprecation_should_return_filtered_builders()
102+
{
103+
// arrange
104+
var builder = new ApiVersioningPolicyBuilder();
105+
var sunset = builder.Sunset( default, ApiVersion.Default );
106+
var expected = builder.Deprecate( default, ApiVersion.Default );
107+
108+
// act
109+
var list = builder.OfType<IDeprecationPolicyBuilder>();
110+
111+
// assert
112+
list.Single().Should().BeSameAs( expected );
113+
list.Single().Should().NotBeSameAs( sunset );
64114
}
65115
}

0 commit comments

Comments
 (0)