Skip to content

Commit 205c6f9

Browse files
jenschudeHenr1k80
andauthored
Version 12.0.0 preparation (#360)
* Make the client using streams the default. Using strings is not sustainable (#359) * bump gh upload action * Update to .NET 6 (#361) * refactor loggerhandler (#273) * refactor loggerhandler * support multipe loglevel for exceptions * better logger format in CI * add test for logging * add test for default logging output * set defaultrequestversion in DependencyInjectionSetup * use SocketsHttpHandler * add NotFoundMiddleware add ClientBuilder * remove ClientFactory uses * refactor errorhandler * remove HttpVersion from clientbuilder invocations --------- Co-authored-by: Henrik <hg@impact.dk>
1 parent 4a4893a commit 205c6f9

File tree

36 files changed

+640
-131
lines changed

36 files changed

+640
-131
lines changed

commercetools.Sdk/Examples/commercetools.Api.ApmExample/Extensions/ClientInjectionSetup.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,14 @@ public static IHttpClientBuilder UseCommercetoolsScopedClient(this IServiceColle
3131
{
3232
var clientConfiguration = configuration.GetSection(clientName).Get<ClientConfiguration>();
3333
var tokenProvider = serviceProvider.GetService<ITokenProvider>();
34-
var client = ClientFactory.Create(clientName, clientConfiguration,
35-
serviceProvider.GetService<IHttpClientFactory>(),
36-
serviceProvider.GetService<IApiSerializerService>(),
37-
tokenProvider);
38-
client.Name = clientName;
34+
var client = new ClientBuilder()
35+
{
36+
ClientConfiguration = clientConfiguration,
37+
ClientName = clientName,
38+
TokenProvider = tokenProvider,
39+
SerializerService = serviceProvider.GetService<IApiSerializerService>(),
40+
HttpClient = serviceProvider.GetService<IHttpClientFactory>().CreateClient(clientName)
41+
}.Build();
3942
return client;
4043
});
4144

commercetools.Sdk/Examples/commercetools.Api.CheckoutApp/Extensions/ClientInjectionSetup.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,14 @@ public static IHttpClientBuilder UseCommercetoolsScopedClient(this IServiceColle
3131
{
3232
var clientConfiguration = configuration.GetSection(clientName).Get<ClientConfiguration>();
3333
var tokenProvider = serviceProvider.GetService<ITokenProvider>();
34-
var client = ClientFactory.Create(clientName, clientConfiguration,
35-
serviceProvider.GetService<IHttpClientFactory>(),
36-
serviceProvider.GetService<IApiSerializerService>(),
37-
tokenProvider);
38-
client.Name = clientName;
34+
var client = new ClientBuilder()
35+
{
36+
ClientName = clientName,
37+
ClientConfiguration = clientConfiguration,
38+
TokenProvider = tokenProvider,
39+
SerializerService =serviceProvider.GetService<IApiSerializerService>(),
40+
HttpClient = serviceProvider.GetService<IHttpClientFactory>().CreateClient(clientName)
41+
}.Build();
3942
return client;
4043
});
4144

commercetools.Sdk/Examples/commercetools.Api.ConsoleApp/Program.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,15 @@ public static async Task Main(string[] args)
3232
ProjectKey = ""
3333
};
3434
var clientFactory = serviceProvider.GetService<IHttpClientFactory>();
35-
var client = ClientFactory.Create(
36-
clientName,
37-
config,
38-
clientFactory,
39-
serviceProvider.GetService<IApiSerializerService>(),
40-
TokenProviderFactory.CreateClientCredentialsTokenProvider(config, clientFactory)
41-
);
35+
var client = new ClientBuilder()
36+
{
37+
ClientConfiguration = config,
38+
ClientName = clientName,
39+
TokenProvider = TokenProviderFactory.CreateClientCredentialsTokenProvider(config, clientFactory),
40+
SerializerService = serviceProvider.GetService<IApiSerializerService>(),
41+
HttpClient = clientFactory.CreateClient(clientName)
42+
}.Build();
43+
4244
var project = await new ApiRoot(client)
4345
.WithProjectKey(config.ProjectKey)
4446
.Get()

commercetools.Sdk/Examples/commercetools.Api.NewRelicExample/Extensions/ClientInjectionSetup.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,14 @@ public static IHttpClientBuilder UseCommercetoolsScopedClient(this IServiceColle
3131
{
3232
var clientConfiguration = configuration.GetSection(clientName).Get<ClientConfiguration>();
3333
var tokenProvider = serviceProvider.GetService<ITokenProvider>();
34-
var client = ClientFactory.Create(clientName, clientConfiguration,
35-
serviceProvider.GetService<IHttpClientFactory>(),
36-
serviceProvider.GetService<IApiSerializerService>(),
37-
tokenProvider);
34+
var client = new ClientBuilder()
35+
{
36+
ClientConfiguration = clientConfiguration,
37+
ClientName = clientName,
38+
TokenProvider = tokenProvider,
39+
SerializerService = serviceProvider.GetService<IApiSerializerService>(),
40+
HttpClient = serviceProvider.GetService<IHttpClientFactory>().CreateClient(clientName)
41+
}.Build();
3842
client.Name = clientName;
3943
return client;
4044
});

commercetools.Sdk/IntegrationTests/commercetools.Api.IntegrationTests/LoggingTest.cs

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,45 @@ namespace commercetools.Api.IntegrationTests;
1717

1818
public class LoggingTest
1919
{
20+
[Fact]
21+
public async void DefaultLogger()
22+
{
23+
var configuration = new ConfigurationBuilder().
24+
AddJsonFile("appsettings.test.Development.json", true).
25+
AddEnvironmentVariables().
26+
AddUserSecrets<ServiceProviderFixture>().
27+
AddEnvironmentVariables("CTP_").
28+
Build();
29+
var clientConfiguration = configuration.GetSection("Client").Get<ClientConfiguration>();
30+
var loggerClientConf = new ConfigurationBuilder()
31+
.AddInMemoryCollection(new Dictionary<string, string>()
32+
{
33+
{ "LoggerClient:ClientId", clientConfiguration.ClientId},
34+
{ "LoggerClient:ClientSecret", clientConfiguration.ClientSecret},
35+
{ "LoggerClient:ProjectKey", clientConfiguration.ProjectKey},
36+
})
37+
.Build();
38+
var logger = new TestLogger();
39+
var loggerFactory = LoggerFactory.Create(builder =>
40+
{
41+
builder
42+
.AddFilter("System.Net.Http.HttpClient", LogLevel.None) // disable HTTP client default logging
43+
.AddProvider(new TestLoggerProvider(logger));
44+
});
45+
var s = new ServiceCollection();
46+
s.AddSingleton(loggerFactory);
47+
s.UseCommercetoolsApi(loggerClientConf, "LoggerClient");
48+
var p = s.BuildServiceProvider();
49+
50+
var apiRoot = p.GetService<ProjectApiRoot>();
51+
52+
await apiRoot.Get().ExecuteAsync();
53+
54+
var messages = logger.GetLogMessages();
55+
Assert.StartsWith("GET https://api.europe-west1.gcp.commercetools.com/" + clientConfiguration.ProjectKey, messages.TrimEnd());
56+
}
57+
58+
2059
[Fact]
2160
public async void CustomLogger()
2261
{
@@ -55,7 +94,7 @@ public async void CustomLogger()
5594
var messages = logger.GetLogMessages();
5695
Assert.Equal("GET https://api.europe-west1.gcp.commercetools.com/" + clientConfiguration.ProjectKey, messages.TrimEnd());
5796
}
58-
97+
5998
public class CustomLoggerHandler : DelegatingHandler
6099
{
61100
private readonly ILogger logger;

commercetools.Sdk/IntegrationTests/commercetools.Api.IntegrationTests/Me/MeIntegrationTests.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,13 @@ private void CreateMeClient()
113113
CustomerServices.CustomerPassword));
114114

115115
//Create MeClient
116-
_meClient = ClientFactory.Create(
117-
"MeClient",
118-
meClientConfig,
119-
httpClientFactory,
120-
serializerService,
121-
passwordTokenProvider);
116+
_meClient = new ClientBuilder {
117+
ClientName = "MeClient",
118+
ClientConfiguration = meClientConfig,
119+
TokenProvider = passwordTokenProvider,
120+
HttpClient = httpClientFactory.CreateClient("MeClient"),
121+
SerializerService = serializerService,
122+
}.Build();
122123
}
123124
}
124125
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using System.Collections.Generic;
2+
using commercetools.Base.Client;
3+
using commercetools.Base.Client.Middlewares;
4+
using commercetools.Sdk.Api;
5+
using commercetools.Sdk.Api.Client;
6+
using Microsoft.Extensions.Configuration;
7+
using Microsoft.Extensions.DependencyInjection;
8+
using Xunit;
9+
10+
namespace commercetools.Api.IntegrationTests;
11+
12+
public class MiddlewareTest
13+
{
14+
[Fact]
15+
public async void not_found_middleware_stream_client()
16+
{
17+
var configuration = new ConfigurationBuilder().
18+
AddJsonFile("appsettings.test.Development.json", true).
19+
AddEnvironmentVariables().
20+
AddUserSecrets<ServiceProviderFixture>().
21+
AddEnvironmentVariables("CTP_").
22+
Build();
23+
24+
var s = new ServiceCollection();
25+
s.UseCommercetoolsApi(configuration, "Client", options: new ClientOptions() { ReadResponseAsStream = true},middlewares: new List<DelegatingMiddleware>()
26+
{
27+
new NotFoundMiddleware()
28+
});
29+
var p = s.BuildServiceProvider();
30+
31+
var apiConfig = configuration.GetSection("Client").Get<ClientConfiguration>();
32+
var apiRoot = p.GetService<ProjectApiRoot>();
33+
34+
Assert.Equal("Client", apiRoot.ClientName);
35+
var category = await apiRoot.Categories().WithKey("unknown-key").Get().ExecuteAsync().ConfigureAwait(false);
36+
37+
Assert.Null(category);
38+
}
39+
40+
[Fact]
41+
public async void not_found_middleware_string_client()
42+
{
43+
var configuration = new ConfigurationBuilder().
44+
AddJsonFile("appsettings.test.Development.json", true).
45+
AddEnvironmentVariables().
46+
AddUserSecrets<ServiceProviderFixture>().
47+
AddEnvironmentVariables("CTP_").
48+
Build();
49+
50+
var s = new ServiceCollection();
51+
s.UseCommercetoolsApi(configuration, "Client", options: new ClientOptions() { ReadResponseAsStream = false},middlewares: new List<DelegatingMiddleware>()
52+
{
53+
new NotFoundMiddleware()
54+
});
55+
var p = s.BuildServiceProvider();
56+
57+
var apiConfig = configuration.GetSection("Client").Get<ClientConfiguration>();
58+
var apiRoot = p.GetService<ProjectApiRoot>();
59+
60+
Assert.Equal("Client", apiRoot.ClientName);
61+
var category = await apiRoot.Categories().WithKey("unknown-key").Get().ExecuteAsync().ConfigureAwait(false);
62+
63+
Assert.Null(category);
64+
}
65+
66+
}

commercetools.Sdk/IntegrationTests/commercetools.Api.IntegrationTests/MultipleClientsTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
using System.Collections.Generic;
12
using System.Linq;
23
using commercetools.Api.IntegrationTests;
34
using commercetools.Base.Client;
5+
using commercetools.Base.Client.Middlewares;
46
using commercetools.Sdk.Api;
57
using commercetools.Sdk.Api.Extensions;
68
using commercetools.Sdk.ImportApi.Extensions;
@@ -82,6 +84,5 @@ public async void api_and_import_create_root()
8284

8385

8486
}
85-
8687
}
8788
}

commercetools.Sdk/IntegrationTests/commercetools.Api.IntegrationTests/ServiceProviderFixture.cs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
2+
using System.Collections.Generic;
23
using commercetools.Sdk.Api.Models.Errors;
34
using commercetools.Base.Client;
5+
using commercetools.Base.Client.Error;
46
using commercetools.Sdk.Api;
57
using commercetools.Sdk.Api.Serialization;
68
using Microsoft.Extensions.Configuration;
@@ -9,7 +11,7 @@
911

1012
namespace commercetools.Api.IntegrationTests
1113
{
12-
public class ServiceProviderFixture
14+
public sealed class ServiceProviderFixture
1315
{
1416
private readonly ServiceProvider serviceProvider;
1517
private readonly IConfiguration configuration;
@@ -20,20 +22,44 @@ public ServiceProviderFixture()
2022

2123
//services.AddLogging(configure => configure.AddConsole());
2224
this.configuration = new ConfigurationBuilder().
25+
AddInMemoryCollection(
26+
new Dictionary<string, string>()
27+
{
28+
{ "Logging:LogLevel:commercetoolsLoggerHandler", "Warning"},
29+
{ "Logging:LogLevel:System.Net.Http.HttpClient", "Warning"},
30+
}).
2331
AddJsonFile("appsettings.test.Development.json", true).
2432
AddEnvironmentVariables().
2533
AddUserSecrets<ServiceProviderFixture>().
2634
AddEnvironmentVariables("CTP_").
2735
Build();
2836

29-
var useStreamClient = Enum.Parse<ClientType>(configuration.GetValue("ClientType", "String")) == ClientType.Stream;
37+
var useStreamClient = Enum.Parse<ClientType>(configuration.GetValue("ClientType", "String")) != ClientType.String;
3038
services.UseCommercetoolsApi(configuration, "Client", options: new ClientOptions { ReadResponseAsStream = useStreamClient });
39+
services.AddLogging(c => c.AddConfiguration(configuration.GetSection("Logging")));
3140
services.AddLogging(c => c.AddProvider(new InMemoryLoggerProvider()));
41+
services.AddLogging(c => c.AddSimpleConsole(o =>
42+
{
43+
o.UseUtcTimestamp = true;
44+
o.IncludeScopes = true;
45+
o.TimestampFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFK ";
46+
o.SingleLine = true;
47+
}));
3248
services.SetupClient(
3349
"MeClient",
3450
errorTypeMapper => typeof(ErrorResponse),
3551
s => s.GetService<IApiSerializerService>()
3652
);
53+
services.AddSingleton<ILoggerHandlerOptions>(new LoggerHandlerOptions()
54+
{
55+
ResponseLogEvent = LogLevel.Information,
56+
DefaultExceptionLogEvent = LogLevel.Warning,
57+
ExceptionLogEvents = new Dictionary<System.Type, LogLevel>()
58+
{
59+
{ typeof(NotFoundException), LogLevel.Information },
60+
{ typeof(ConcurrentModificationException), LogLevel.Information}
61+
}
62+
});
3763
this.serviceProvider = services.BuildServiceProvider();
3864

3965
//set default ProjectKey

commercetools.Sdk/IntegrationTests/commercetools.GraphQL.Api.IntegrationTests/ServiceProviderFixture.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
namespace commercetools.GraphQL.Api.IntegrationTests
1010
{
11-
public class ServiceProviderFixture
11+
public sealed class ServiceProviderFixture
1212
{
1313
private readonly ServiceProvider serviceProvider;
1414
private readonly IConfiguration configuration;
@@ -24,7 +24,7 @@ public ServiceProviderFixture()
2424
AddUserSecrets<ServiceProviderFixture>().
2525
AddEnvironmentVariables("CTP_").
2626
Build();
27-
var useStreamClient = Enum.Parse<ClientType>(configuration.GetValue("ClientType", "String")) == ClientType.Stream;
27+
var useStreamClient = Enum.Parse<ClientType>(configuration.GetValue("ClientType", "String")) != ClientType.String;
2828

2929
services.UseCommercetoolsApi(configuration, "Client", options: new ClientOptions { ReadResponseAsStream = useStreamClient });
3030
services.AddLogging(c => c.AddProvider(new InMemoryLoggerProvider()));

commercetools.Sdk/IntegrationTests/commercetools.ImportApi.IntegrationTests/ServiceProviderFixture.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace commercetools.ImportApi.IntegrationTests
88
{
9-
public class ServiceProviderFixture
9+
public sealed class ServiceProviderFixture
1010
{
1111
private readonly ServiceProvider serviceProvider;
1212
private readonly IConfiguration configuration;
@@ -22,7 +22,7 @@ public ServiceProviderFixture()
2222
AddEnvironmentVariables("CTP_").
2323
Build();
2424

25-
var useStreamClient = Enum.Parse<ClientType>(configuration.GetValue("ClientType", "String")) == ClientType.Stream;
25+
var useStreamClient = Enum.Parse<ClientType>(configuration.GetValue("ClientType", "String")) != ClientType.String;
2626
services.UseCommercetoolsImportApi(configuration, "ImportClient", options: new ClientOptions { ReadResponseAsStream = useStreamClient });
2727
this.serviceProvider = services.BuildServiceProvider();
2828

commercetools.Sdk/Tests/commercetools.Sdk.Api.Tests/ClientsFactoryTests.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,47 @@ public void TestUserAgent()
6262
Assert.Equal("commercetools-sdk-dotnet-v2", agent.Product.Name);
6363
}
6464

65+
[Fact]
66+
public void TestClientConfigValidationBuilder()
67+
{
68+
//arrange
69+
var s = new ServiceCollection();
70+
s.UseCommercetoolsApiSerialization();
71+
var p = s.BuildServiceProvider();
72+
var serializerService = p.GetService<IApiSerializerService>();
73+
var clientConfig = new ClientConfiguration
74+
{
75+
ClientId = "ClientId",
76+
ClientSecret = "ClientSecret",
77+
ProjectKey = "test",
78+
ApiBaseAddress = "https://api.europe-west1.gcp.commercetools.com",
79+
AuthorizationBaseAddress = "https://auth.europe-west1.gcp.commercetools.com/"
80+
};
81+
82+
//act
83+
Exception validationEx = null;
84+
try
85+
{
86+
var tokenProvider = TokenProviderFactory
87+
.CreateClientCredentialsTokenProvider(clientConfig, null);
88+
89+
new ClientBuilder {
90+
ClientName = "test",
91+
ClientConfiguration = clientConfig,
92+
HttpClient = null,
93+
SerializerService = serializerService,
94+
TokenProvider = tokenProvider}.Build();
95+
}
96+
catch (Exception e)
97+
{
98+
validationEx = e;
99+
}
100+
101+
//assert
102+
Assert.NotNull(validationEx);
103+
Assert.IsType<ValidationException>(validationEx);
104+
}
105+
65106
[Fact]
66107
public void TestClientConfigValidation()
67108
{

commercetools.Sdk/commercetools.Base.Client/ApiMethod.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ public virtual HttpRequestMessage Build()
7474
{
7575
var requestPath = new Uri(RequestUrl + ToQueryString(QueryParams), UriKind.Relative);
7676
var request = new HttpRequestMessage();
77-
request.Version = HttpVersion.Version20;
7877
request.Method = this.Method;
7978
request.RequestUri = requestPath;
8079
request.AddHeaders(Headers);

0 commit comments

Comments
 (0)