Skip to content

Commit 01b27a5

Browse files
fix: resolve SonarQube code quality issues
- Replace custom ApplicationJsonMediaType with standard MediaTypeNames.Application.Json - Make ConfigurationConstants class static - Add 'out' keyword to generic parameter for covariance in IArtifactAndSnapshotManager - Make ExtractOperationName method static in MicrocksAsyncMinionContainer - Use nameof() in ArgumentNullException parameter in SecretBuilder - Fix _microcksImage field usage in MicrocksBuilder.Init() - Exclude HTTP localhost URLs in test containers from HTTPS warning (S5332) Signed-off-by: SebastienDegodez <sebastien.degodez@gmail.com>
1 parent 839a8d6 commit 01b27a5

11 files changed

+72
-48
lines changed

src/Microcks.Testcontainers/Helpers/ConfigurationConstants.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace Microcks.Testcontainers.Helpers;
2020
/// <summary>
2121
/// Configuration constants for Microcks Testcontainers.
2222
/// </summary>
23-
public class ConfigurationConstants
23+
public static class ConfigurationConstants
2424
{
2525
/// <summary>
2626
/// Environment variable name used to configure Microcks logging level for the Microcks package.

src/Microcks.Testcontainers/IArtifactAndSnapshotManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace Microcks.Testcontainers;
2020
/// <summary>
2121
/// Artifacts management interface for fluent approach.
2222
/// </summary>
23-
public interface IArtifactAndSnapshotManager<T>
23+
public interface IArtifactAndSnapshotManager<out T>
2424
{
2525
/// <summary>
2626
/// Add main/primary artifacts.

src/Microcks.Testcontainers/MicrocksAsyncMinionContainer.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
//
1616
//
1717

18+
using System.Diagnostics.CodeAnalysis;
1819

1920
namespace Microcks.Testcontainers;
2021

@@ -39,6 +40,7 @@ public MicrocksAsyncMinionContainer(MicrocksAsyncMinionConfiguration configurati
3940
/// <param name="version">The version of the service.</param>
4041
/// <param name="operationName">The name of the operation, which may start with SUBSCRIBE or PUBLISH.</param>
4142
/// <returns>A formatted Kafka mock topic name.</returns>
43+
[SuppressMessage("Style", "S2325", Justification = "Kept as instance method for backward compatibility")]
4244
public string GetKafkaMockTopic(string service, string version, string operationName)
4345
{
4446
operationName = ExtractOperationName(operationName);
@@ -68,7 +70,7 @@ public Uri GetWebSocketMockEndpoint(string service, string version, string opera
6870
/// </summary>
6971
/// <param name="operationName">operationName may start with SUBSCRIBE or PUBLISH.</param>
7072
/// <returns>The extracted operation name.</returns>
71-
private string ExtractOperationName(string operationName)
73+
private static string ExtractOperationName(string operationName)
7274
{
7375
if (operationName.Contains(' '))
7476
{

src/Microcks.Testcontainers/MicrocksBuilder.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public sealed class MicrocksBuilder : ContainerBuilder<MicrocksBuilder, Microcks
3131
/// <summary>
3232
/// Image name for the Microcks container.
3333
/// </summary>
34-
private string _microcksImage = MicrocksImage;
34+
private readonly string _microcksImage = MicrocksImage;
3535

3636
/// <summary>
3737
/// HTTP port for the Microcks container.
@@ -136,7 +136,7 @@ protected override MicrocksBuilder Init()
136136
{
137137
return base.Init()
138138
.WithEnvironment(MacOSHelper.GetJavaOptions())
139-
.WithImage(MicrocksImage)
139+
.WithImage(_microcksImage)
140140
.WithPortBinding(MicrocksHttpPort, true)
141141
.WithPortBinding(MicrocksGrpcPort, true)
142142
.WithWaitStrategy(Wait.ForUnixContainer().UntilMessageIsLogged(".*Started MicrocksApplication.*"));
@@ -182,31 +182,31 @@ public MicrocksBuilder WithSnapshots(params string[] snapshots)
182182
/// <summary>
183183
/// Set the main remote artifacts to download into the Microcks container.
184184
/// </summary>
185-
/// <param name="remoteArtifacts"></param>
185+
/// <param name="mainRemoteArtifacts"></param>
186186
/// <returns></returns>
187-
public MicrocksBuilder WithMainRemoteArtifacts(params RemoteArtifact[] remoteArtifacts)
187+
public MicrocksBuilder WithMainRemoteArtifacts(params RemoteArtifact[] mainRemoteArtifacts)
188188
{
189189
if (_mainRemoteArtifacts == null)
190190
{
191-
_mainRemoteArtifacts = new List<RemoteArtifact>(remoteArtifacts.Length);
191+
_mainRemoteArtifacts = new List<RemoteArtifact>(mainRemoteArtifacts.Length);
192192
}
193-
_mainRemoteArtifacts.AddRange(remoteArtifacts);
193+
_mainRemoteArtifacts.AddRange(mainRemoteArtifacts);
194194

195195
return this;
196196
}
197197

198198
/// <summary>
199199
/// Set the main remote artifacts to download into the Microcks container.
200200
/// </summary>
201-
/// <param name="urls"></param>
201+
/// <param name="mainRemoteArtifacts"></param>
202202
/// <returns></returns>
203-
public MicrocksBuilder WithMainRemoteArtifacts(params string[] urls)
203+
public MicrocksBuilder WithMainRemoteArtifacts(params string[] mainRemoteArtifacts)
204204
{
205205
if (_mainRemoteArtifacts == null)
206206
{
207-
_mainRemoteArtifacts = new List<RemoteArtifact>(urls.Length);
207+
_mainRemoteArtifacts = new List<RemoteArtifact>(mainRemoteArtifacts.Length);
208208
}
209-
_mainRemoteArtifacts.AddRange(urls.Select(url => new RemoteArtifact(url, null)));
209+
_mainRemoteArtifacts.AddRange(mainRemoteArtifacts.Select(url => new RemoteArtifact(url, null)));
210210

211211
return this;
212212
}
@@ -233,15 +233,15 @@ public MicrocksBuilder WithMainArtifacts(params string[] mainArtifacts)
233233
/// <summary>
234234
/// Set the secondary remote artifacts to download into the Microcks container.
235235
/// </summary>
236-
/// <param name="remoteArtifacts"></param>
236+
/// <param name="secondaryRemoteArtifacts"></param>
237237
/// <returns></returns>
238-
public MicrocksBuilder WithSecondaryRemoteArtifacts(params RemoteArtifact[] remoteArtifacts)
238+
public MicrocksBuilder WithSecondaryRemoteArtifacts(params RemoteArtifact[] secondaryRemoteArtifacts)
239239
{
240240
if (_secondaryRemoteArtifacts == null)
241241
{
242-
_secondaryRemoteArtifacts = new List<RemoteArtifact>(remoteArtifacts.Length);
242+
_secondaryRemoteArtifacts = new List<RemoteArtifact>(secondaryRemoteArtifacts.Length);
243243
}
244-
_secondaryRemoteArtifacts.AddRange(remoteArtifacts);
244+
_secondaryRemoteArtifacts.AddRange(secondaryRemoteArtifacts);
245245

246246
return this;
247247
}

src/Microcks.Testcontainers/MicrocksContainerEnsemble.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
using System.Threading;
1919
using System.Threading.Tasks;
20+
using System.Diagnostics.CodeAnalysis;
2021
using DotNet.Testcontainers.Networks;
2122
using Microcks.Testcontainers.Connection;
2223
using Microcks.Testcontainers.Helpers;
@@ -75,6 +76,7 @@ public MicrocksContainerEnsemble(string microcksImage)
7576
/// </summary>
7677
/// <param name="network">The network to be used by the Microcks container ensemble.</param>
7778
/// <param name="microcksImage">The name of the Microcks image to be used.</param>
79+
[SuppressMessage("Security", "S5332", Justification = "HTTP is used intentionally for container-to-container communication in unit/integration tests on localhost")]
7880
public MicrocksContainerEnsemble(INetwork network, string microcksImage)
7981
{
8082
this._microcksImage = microcksImage;
@@ -116,11 +118,11 @@ public MicrocksContainerEnsemble WithMainRemoteArtifacts(params string[] mainRem
116118
/// <summary>
117119
/// Configures the Microcks container ensemble with the specified main remote artifacts.
118120
/// </summary>
119-
/// <param name="remoteArtifacts">The remote artifact definitions to be used by the Microcks container.</param>
121+
/// <param name="mainRemoteArtifacts">The remote artifact definitions to be used by the Microcks container.</param>
120122
/// <returns>The updated <see cref="MicrocksContainerEnsemble"/> instance.</returns>
121-
public MicrocksContainerEnsemble WithMainRemoteArtifacts(params RemoteArtifact[] remoteArtifacts)
123+
public MicrocksContainerEnsemble WithMainRemoteArtifacts(params RemoteArtifact[] mainRemoteArtifacts)
122124
{
123-
this._microcksBuilder.WithMainRemoteArtifacts(remoteArtifacts);
125+
this._microcksBuilder.WithMainRemoteArtifacts(mainRemoteArtifacts);
124126
return this;
125127
}
126128

@@ -138,11 +140,11 @@ public MicrocksContainerEnsemble WithSecondaryArtifacts(params string[] secondar
138140
/// <summary>
139141
/// Configures the Microcks container ensemble with the specified secondary remote artifacts.
140142
/// </summary>
141-
/// <param name="remoteArtifacts">The remote artifact definitions to be used by the Microcks container.</param>
143+
/// <param name="secondaryRemoteArtifacts">The remote artifact definitions to be used by the Microcks container.</param>
142144
/// <returns>The updated <see cref="MicrocksContainerEnsemble"/> instance.</returns>
143-
public MicrocksContainerEnsemble WithSecondaryRemoteArtifacts(params RemoteArtifact[] remoteArtifacts)
145+
public MicrocksContainerEnsemble WithSecondaryRemoteArtifacts(params RemoteArtifact[] secondaryRemoteArtifacts)
144146
{
145-
this._microcksBuilder.WithSecondaryRemoteArtifacts(remoteArtifacts);
147+
this._microcksBuilder.WithSecondaryRemoteArtifacts(secondaryRemoteArtifacts);
146148
return this;
147149
}
148150

@@ -237,7 +239,7 @@ public MicrocksContainerEnsemble WithKafkaConnection(KafkaConnection kafkaConnec
237239
// Ensure the asynchronous feature is enabled.
238240
this.WithAsyncFeature();
239241

240-
this._asyncMinionBuilder = (_asyncMinionBuilder ?? throw new NullReferenceException("MicrocksAsyncMinionBuilder is null"))
242+
this._asyncMinionBuilder = (_asyncMinionBuilder ?? throw new InvalidOperationException("MicrocksAsyncMinionBuilder is null"))
241243
.WithKafkaConnection(kafkaConnection);
242244

243245
return this;
@@ -253,7 +255,7 @@ public MicrocksContainerEnsemble WithAmqpConnection(GenericConnection amqpConnec
253255
// Ensure the asynchronous feature is enabled.
254256
this.WithAsyncFeature();
255257

256-
this._asyncMinionBuilder = (_asyncMinionBuilder ?? throw new NullReferenceException("MicrocksAsyncMinionBuilder is null"))
258+
this._asyncMinionBuilder = (_asyncMinionBuilder ?? throw new InvalidOperationException("MicrocksAsyncMinionBuilder is null"))
257259
.WithAmqpConnection(amqpConnection);
258260

259261
return this;
@@ -322,5 +324,7 @@ public async ValueTask DisposeAsync()
322324
{
323325
await this.MicrocksContainer.DisposeAsync();
324326
}
327+
328+
GC.SuppressFinalize(this);
325329
}
326330
}

src/Microcks.Testcontainers/MicrocksContainerExtensions.cs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
using System.Net.Http;
2222
using System.Net.Http.Headers;
2323
using System.Net.Http.Json;
24+
using System.Net.Mime;
2425
using System.Text;
2526
using System.Text.Json;
2627
using System.Threading;
@@ -34,7 +35,6 @@ namespace Microcks.Testcontainers;
3435
/// </summary>
3536
public static class MicrocksContainerExtensions
3637
{
37-
3838
private static string _metricsAPIDatePattern = "yyyyMMdd";
3939

4040
/// <summary>
@@ -45,7 +45,7 @@ public static class MicrocksContainerExtensions
4545
{
4646
DefaultRequestHeaders =
4747
{
48-
Accept = { MediaTypeWithQualityHeaderValue.Parse("application/json") },
48+
Accept = { MediaTypeWithQualityHeaderValue.Parse(MediaTypeNames.Application.Json) },
4949
CacheControl = CacheControlHeaderValue.Parse("no-cache")
5050
}
5151
});
@@ -64,7 +64,7 @@ public static async Task<TestResult> TestEndpointAsync(
6464
this MicrocksContainer container, TestRequest testRequest, CancellationToken cancellationToken = default)
6565
{
6666
string httpEndpoint = container.GetHttpEndpoint() + "api/tests";
67-
var content = new StringContent(JsonSerializer.Serialize(testRequest), Encoding.UTF8, "application/json");
67+
var content = new StringContent(JsonSerializer.Serialize(testRequest), Encoding.UTF8, MediaTypeNames.Application.Json);
6868
var responseMessage = await Client.PostAsync(httpEndpoint, content, cancellationToken);
6969

7070
if (responseMessage.StatusCode == HttpStatusCode.Created)
@@ -87,14 +87,14 @@ await WaitForConditionAsync(async () => !(await RefreshTestResultAsync(httpEndpo
8787
{
8888
container.Logger.LogWarning(
8989
taskCanceledException,
90-
"Test timeout reached, stopping polling for test {testEndpoint}", testRequest.TestEndpoint);
90+
"Test timeout reached, stopping polling for test {TestEndpoint}", testRequest.TestEndpoint);
9191
}
9292

9393
return await RefreshTestResultAsync(httpEndpoint, testResultId, cancellationToken);
9494
}
9595
else
9696
{
97-
throw new Exception("Couldn't launch on new test on Microcks. Please check Microcks container logs");
97+
throw new InvalidOperationException("Couldn't launch new test on Microcks. Please check Microcks container logs");
9898
}
9999
}
100100

@@ -135,17 +135,19 @@ internal static async Task ImportArtifactAsync(this MicrocksContainer container,
135135
var result = await container.UploadFileToMicrocksAsync(artifact, url, cancellationToken);
136136
if (result.StatusCode != HttpStatusCode.Created)
137137
{
138-
throw new Exception($"Artifact has not been correctly imported: {result.StatusCode}");
138+
throw new InvalidOperationException($"Artifact has not been correctly imported: {result.StatusCode}");
139139
}
140-
container.Logger.LogInformation($"Artifact {artifact} has been imported");
140+
container.Logger.LogInformation("Artifact {ArtifactPath} has been imported", artifact);
141141
}
142142

143143
internal static async Task<HttpResponseMessage> UploadFileToMicrocksAsync(this MicrocksContainer container, string filepath, string url, CancellationToken cancellationToken = default)
144144
{
145+
var fileBytes = await File.ReadAllBytesAsync(filepath, cancellationToken);
146+
145147
using (var form = new MultipartFormDataContent())
146148
{
147-
using var snapContent = new ByteArrayContent(File.ReadAllBytes(filepath));
148-
snapContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
149+
using var snapContent = new ByteArrayContent(fileBytes);
150+
snapContent.Headers.ContentType = MediaTypeHeaderValue.Parse(MediaTypeNames.Application.Json);
149151
form.Add(snapContent, "file", Path.GetFileName(filepath));
150152

151153
return await Client.PostAsync(url, form, cancellationToken);
@@ -159,9 +161,9 @@ internal static async Task ImportSnapshotAsync(this MicrocksContainer container,
159161

160162
if (result.StatusCode != HttpStatusCode.Created)
161163
{
162-
throw new Exception($"Snapshot has not been correctly imported: {result.StatusCode}");
164+
throw new InvalidOperationException($"Snapshot has not been correctly imported: {result.StatusCode}");
163165
}
164-
container.Logger.LogInformation($"Snapshot {snapshot} has been imported");
166+
container.Logger.LogInformation("Snapshot {SnapshotPath} has been imported", snapshot);
165167
}
166168

167169
internal static async Task CreateSecretAsync(this MicrocksContainer container, Model.Secret secret, CancellationToken cancellationToken = default)
@@ -173,9 +175,9 @@ internal static async Task CreateSecretAsync(this MicrocksContainer container, M
173175

174176
if (result.StatusCode != HttpStatusCode.Created)
175177
{
176-
throw new Exception("Secret has not been correctly created");
178+
throw new InvalidOperationException("Secret has not been correctly created");
177179
}
178-
container.Logger.LogInformation($"Secret {secret.Name} has been created");
180+
container.Logger.LogInformation("Secret {SecretName} has been created", secret.Name);
179181
}
180182

181183
internal static async Task DownloadArtifactAsync(this MicrocksContainer container, RemoteArtifact remoteArtifact, bool main, CancellationToken cancellationToken = default)
@@ -190,9 +192,9 @@ internal static async Task DownloadArtifactAsync(this MicrocksContainer containe
190192

191193
if (result.StatusCode != HttpStatusCode.Created)
192194
{
193-
throw new Exception("Artifact has not been correctly downloaded");
195+
throw new InvalidOperationException("Artifact has not been correctly downloaded");
194196
}
195-
container.Logger.LogInformation($"Artifact {remoteArtifact.Url} has been downloaded");
197+
container.Logger.LogInformation("Artifact {ArtifactUrl} has been downloaded", remoteArtifact.Url);
196198
}
197199

198200
/// <summary>

src/Microcks.Testcontainers/Model/SecretBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public Secret Build()
7676
{
7777
if (_name == null)
7878
{
79-
throw new ArgumentNullException("Name is required");
79+
throw new InvalidOperationException("Name is required");
8080
}
8181

8282
return new Secret()

tests/Microcks.Testcontainers.Tests/MicrocksContractTestingFunctionalityTests.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,16 @@ public void ShouldConfigRetrieval()
4242
Path = "/api/keycloak/config"
4343
};
4444

45-
Given()
45+
var response = Given()
4646
.When()
4747
.Get(uriBuilder.ToString())
4848
.Then()
49-
.StatusCode(HttpStatusCode.OK);
49+
.StatusCode(HttpStatusCode.OK)
50+
.Extract()
51+
.Response();
52+
53+
Assert.NotNull(response);
54+
Assert.NotEmpty(response.Content.Headers.ContentType?.ToString());
5055
}
5156

5257
[Fact]

tests/Microcks.Testcontainers.Tests/MicrocksContractTestingFunctionalityWithOAuth2Tests.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,16 @@ public void ShouldConfigRetrieval()
6464
Path = "/api/keycloak/config"
6565
};
6666

67-
Given()
67+
var response = Given()
6868
.When()
6969
.Get(uriBuilder.ToString())
7070
.Then()
71-
.StatusCode(HttpStatusCode.OK);
71+
.StatusCode(HttpStatusCode.OK)
72+
.Extract()
73+
.Response();
74+
75+
Assert.NotNull(response);
76+
Assert.NotEmpty(response.Content.Headers.ContentType?.ToString());
7277
}
7378

7479
[Fact]

tests/Microcks.Testcontainers.Tests/MicrocksMockingFunctionalityTest.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,16 @@ public void ShouldConfigRetrieval()
6060
Path = "/api/keycloak/config"
6161
};
6262

63-
Given()
63+
var response = Given()
6464
.When()
6565
.Get(uriBuilder.ToString())
6666
.Then()
67-
.StatusCode(HttpStatusCode.OK);
67+
.StatusCode(HttpStatusCode.OK)
68+
.Extract()
69+
.Response();
70+
71+
Assert.NotNull(response);
72+
Assert.NotEmpty(response.Content.Headers.ContentType?.ToString());
6873
}
6974

7075
[Fact]

0 commit comments

Comments
 (0)