Skip to content

Commit be2e9fd

Browse files
committed
Refactored test to not use a new constructor but made Put/Get protected virtual to verify the API url
1 parent a5a53f4 commit be2e9fd

File tree

2 files changed

+59
-118
lines changed

2 files changed

+59
-118
lines changed
Lines changed: 57 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,24 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Net;
4-
using System.Net.Http;
5-
using System.Net.Http.Json;
61
using System.Threading;
72
using System.Threading.Tasks;
3+
using NServiceBus;
4+
using NServiceBus.Transport.RabbitMQ;
85
using NServiceBus.Transport.RabbitMQ.ManagementApi;
96
using NUnit.Framework;
107

118
[TestFixture]
129
public class ManagementClientApiUrlTests
1310
{
14-
TestHttpHandler handler = null!;
15-
ManagementClient client = null!;
11+
TestableManagementClient client = null!;
1612

1713
[SetUp]
18-
public void Setup()
19-
{
20-
handler = new TestHttpHandler();
21-
var httpClient = new HttpClient(handler) { BaseAddress = new Uri("http://localhost/xxx/") };
22-
client = new ManagementClient(httpClient);
23-
}
14+
public void Setup() => client = new TestableManagementClient();
2415

2516
[TearDown]
26-
public void Teardown()
27-
{
28-
client.Dispose();
29-
handler.Dispose();
30-
}
17+
public void Teardown() => client.Dispose();
3118

3219
[Test]
3320
public async Task CreatePolicy_PutsToCorrectUrl()
3421
{
35-
handler.Expect(HttpMethod.Put, "/xxx/api/policies/%2Fvhosttest/my-policy");
36-
3722
await client.CreatePolicy("my-policy", new Policy
3823
{
3924
Pattern = "my-pattern",
@@ -42,165 +27,127 @@ public async Task CreatePolicy_PutsToCorrectUrl()
4227

4328
});
4429

45-
handler.Verify();
30+
client.VerifyPut("api/policies/%2Fvhosttest/my-policy");
4631
}
4732

4833
[Test]
4934
public async Task GetBindingsForExchange_GetsFromCorrectUrl()
5035
{
51-
handler.Expect(HttpMethod.Get, "/xxx/api/exchanges/%2Fvhosttest/my-exchange/bindings/destination")
52-
.Returns(new List<Binding>());
53-
5436
await client.GetBindingsForExchange("my-exchange");
5537

56-
handler.Verify();
38+
client.VerifyGet("api/exchanges/%2Fvhosttest/my-exchange/bindings/destination");
5739
}
5840

5941
[Test]
6042
public async Task GetBindingsForQueue_GetsFromCorrectUrl()
6143
{
62-
handler.Expect(HttpMethod.Get, "/xxx/api/queues/%2Fvhosttest/my-queue/bindings")
63-
.Returns(new List<Binding>());
64-
6544
await client.GetBindingsForQueue("my-queue");
6645

67-
handler.Verify();
46+
client.VerifyGet("api/queues/%2Fvhosttest/my-queue/bindings");
6847
}
6948

7049
[Test]
7150
public async Task GetFeatureFlags_GetsFromCorrectUrl()
7251
{
73-
handler.Expect(HttpMethod.Get, "/xxx/api/feature-flags")
74-
.Returns(new List<FeatureFlag>());
75-
7652
await client.GetFeatureFlags();
7753

78-
handler.Verify();
54+
client.VerifyGet("api/feature-flags");
7955
}
8056

8157
[Test]
8258
public async Task GetOverview_GetsFromCorrectUrl()
8359
{
84-
handler.Expect(HttpMethod.Get, "/xxx/api/overview")
85-
.Returns(new Overview
86-
{
87-
BrokerVersion = "1.2.3",
88-
DisableStats = false,
89-
});
90-
9160
await client.GetOverview();
9261

93-
handler.Verify();
62+
client.VerifyGet("api/overview");
9463
}
9564

9665
[Test]
9766
public async Task GetQueue_GetsFromCorrectUrl()
9867
{
99-
handler.Expect(HttpMethod.Get, "/xxx/api/queues/%2Fvhosttest/my-queue")
100-
.Returns(new Queue
101-
{
102-
Name = "my-queue",
103-
Arguments = new QueueArguments()
104-
});
105-
106-
var result = await client.GetQueue("my-queue");
68+
await client.GetQueue("my-queue");
10769

108-
Assert.That(result.Name, Is.EqualTo("my-queue"));
109-
handler.Verify();
70+
client.VerifyGet("api/queues/%2Fvhosttest/my-queue");
11071
}
11172

11273
[Test]
11374
public async Task GetQueues_GetsFromCorrectUrlWithPagination()
11475
{
115-
handler.Expect(HttpMethod.Get, "/xxx/api/queues/%2Fvhosttest/?page=2&page_size=100")
116-
.Returns(new GetQueuesResult
117-
{
118-
Items = [],
119-
Page = 2,
120-
PageCount = 5
121-
});
122-
123-
var (_, morePages) = await client.GetQueues(page: 2, pageSize: 100);
76+
await client.GetQueues(page: 2, pageSize: 100);
12477

125-
Assert.That(morePages, Is.True);
126-
handler.Verify();
78+
client.VerifyGet("api/queues/%2Fvhosttest/?page=2&page_size=100");
12779
}
12880

12981
[Test]
13082
public async Task GetQueues_LastPage_ReturnsMorePagesFalse()
13183
{
132-
handler.Expect(HttpMethod.Get, "/xxx/api/queues/%2Fvhosttest/?page=5&page_size=100")
133-
.Returns(new GetQueuesResult
134-
{
135-
Items = [],
136-
Page = 5,
137-
PageCount = 5
138-
});
84+
client.SetupGetResult(new GetQueuesResult
85+
{
86+
Items = [],
87+
Page = 5,
88+
PageCount = 5
89+
});
13990

140-
var (_, morePages) = await client.GetQueues(page: 5, pageSize: 100);
91+
await client.GetQueues(page: 5, pageSize: 100);
14192

142-
Assert.That(morePages, Is.False);
143-
handler.Verify();
93+
client.VerifyGet("api/queues/%2Fvhosttest/?page=5&page_size=100");
14494
}
14595

14696
[Test]
14797
public async Task GetQueue_WithSpecialCharacters_EscapesCorrectly()
14898
{
149-
handler.Expect(HttpMethod.Get, "/xxx/api/queues/%2Fvhosttest/queue%2Fwith%2Fslashes")
150-
.Returns(new Queue
151-
{
152-
Name = "queue/with/slashes",
153-
Arguments = new QueueArguments()
154-
});
155-
15699
await client.GetQueue("queue/with/slashes");
157100

158-
handler.Verify();
101+
client.VerifyGet("api/queues/%2Fvhosttest/queue%2Fwith%2Fslashes");
159102
}
160103

161-
class TestHttpHandler : HttpMessageHandler
104+
class TestableManagementClient()
105+
: ManagementClient(
106+
ConnectionConfiguration.Create("host=.;virtualHost=/vhosttest;username=u;password=p;port=12345"),
107+
new ManagementApiConfiguration("http://localhost:12345/xxx", "u", "p")
108+
)
162109
{
163-
HttpMethod expectedMethod;
164-
string expectedPath;
165-
object responseObject;
166-
bool requestMade;
110+
string capturedGetUrl;
111+
string capturedPutUrl;
112+
object getResult;
113+
114+
public void SetupGetResult<T>(T result) => getResult = result;
167115

168-
public TestHttpHandler Expect(HttpMethod method, string path)
116+
protected override Task<T> Get<T>(string url, CancellationToken cancellationToken = default)
169117
{
170-
expectedMethod = method;
171-
expectedPath = path;
172-
return this;
118+
capturedGetUrl = url;
119+
120+
if (getResult is T typedResult)
121+
{
122+
return Task.FromResult(typedResult);
123+
}
124+
125+
return Task.FromResult(CreateDefaultResult<T>());
173126
}
174127

175-
public TestHttpHandler Returns(object obj)
128+
protected override Task Put<T>(string url, T value, CancellationToken cancellationToken = default)
176129
{
177-
responseObject = obj;
178-
return this;
130+
capturedPutUrl = url;
131+
return Task.CompletedTask;
179132
}
180133

181-
protected override Task<HttpResponseMessage> SendAsync(
182-
HttpRequestMessage request,
183-
#pragma warning disable PS0003
184-
CancellationToken cancellationToken
185-
#pragma warning restore PS0003
186-
)
187-
{
188-
requestMade = true;
134+
public void VerifyGet(string expectedUrl) => Assert.That(capturedGetUrl, Is.EqualTo(expectedUrl), $"Expected GET to {expectedUrl}, but got {capturedGetUrl}");
189135

190-
Assert.That(request.Method, Is.EqualTo(expectedMethod),
191-
$"Expected {expectedMethod}, got {request.Method}");
192-
Assert.That(request.RequestUri?.PathAndQuery, Is.EqualTo(expectedPath),
193-
$"Expected {expectedPath}, got {request.RequestUri?.PathAndQuery}");
136+
public void VerifyPut(string expectedUrl) => Assert.That(capturedPutUrl, Is.EqualTo(expectedUrl), $"Expected PUT to {expectedUrl}, but got {capturedPutUrl}");
194137

195-
var response = new HttpResponseMessage(HttpStatusCode.OK);
196-
if (responseObject is not null)
138+
static T CreateDefaultResult<T>()
139+
{
140+
if (typeof(T) == typeof(GetQueuesResult))
197141
{
198-
response.Content = JsonContent.Create(responseObject);
142+
return (T)(object)new GetQueuesResult
143+
{
144+
Items = [],
145+
Page = 1,
146+
PageCount = 1
147+
};
199148
}
200149

201-
return Task.FromResult(response);
150+
return default;
202151
}
203-
204-
public void Verify() => Assert.That(requestMade, Is.True, "Expected HTTP request was not made");
205152
}
206153
}

src/NServiceBus.Transport.RabbitMQ/Administration/ManagementApi/ManagementClient.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,6 @@ class ManagementClient : IDisposable
2121

2222
bool disposed;
2323

24-
internal ManagementClient(HttpClient httpClient)
25-
{
26-
escapedVirtualHost = Uri.EscapeDataString("/vhosttest");
27-
this.httpClient = httpClient;
28-
}
29-
3024
public ManagementClient(ConnectionConfiguration connectionConfiguration, ManagementApiConfiguration? managementApiConfiguration = null, bool disableRemoteCertificateValidation = false)
3125
{
3226
ArgumentNullException.ThrowIfNull(connectionConfiguration);
@@ -142,14 +136,14 @@ public async Task<Queue> GetQueue(string queueName, CancellationToken cancellati
142136
return (response.Items, response.Page < response.PageCount);
143137
}
144138

145-
async Task<T> Get<T>(string url, CancellationToken cancellationToken)
139+
protected virtual async Task<T> Get<T>(string url, CancellationToken cancellationToken = default)
146140
{
147141
var response = await httpClient.GetFromJsonAsync<T>(url, cancellationToken).ConfigureAwait(false);
148142

149143
return response ?? throw new HttpRequestException("RabbitMQ management API returned success but deserializing the response body returned null.");
150144
}
151145

152-
async Task Put<T>(string url, T value, CancellationToken cancellationToken)
146+
protected virtual async Task Put<T>(string url, T value, CancellationToken cancellationToken = default)
153147
{
154148
using var response = await httpClient.PutAsJsonAsync(url, value, cancellationToken).ConfigureAwait(false);
155149

0 commit comments

Comments
 (0)