Skip to content

Commit e5db30a

Browse files
Replace url segment (#2313)
* Replace URL and query parameter instead of adding one more with the same name * Add tests: - Multiple query parameters with the same name - Query parameters with non-string values
1 parent 0c5bb20 commit e5db30a

File tree

3 files changed

+42
-3
lines changed

3 files changed

+42
-3
lines changed

src/RestSharp/Request/RestRequestExtensions.Url.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public static partial class RestRequestExtensions {
2626
/// <param name="encode">Encode the value or not, default true</param>
2727
/// <returns></returns>
2828
public RestRequest AddUrlSegment(string name, string? value, bool encode = true)
29-
=> request.AddParameter(new UrlSegmentParameter(name, value, encode));
29+
=> request.AddOrUpdateParameter(new UrlSegmentParameter(name, value, encode));
3030

3131
/// <summary>
3232
/// Adds a URL segment parameter to the request. The resource URL must have a placeholder for the parameter for it to work.

test/RestSharp.Tests/Parameters/UrlSegmentTests.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,20 +54,33 @@ public void UrlSegmentParameter_WithValueWithEncodedSlash_WillReplaceEncodedSlas
5454
var urlSegmentParameter = new UrlSegmentParameter("foo", inputValue);
5555
urlSegmentParameter.Value.Should().BeEquivalentTo("bar/BAR");
5656
}
57-
57+
5858
[Theory]
5959
[InlineData("bar%2fBAR")]
6060
[InlineData("bar%2FBAR")]
6161
public void UrlSegmentParameter_WithValueWithEncodedSlash_CanReplaceEncodedSlash(string inputValue) {
6262
var urlSegmentParameter = new UrlSegmentParameter("foo", inputValue, replaceEncodedSlash: true);
6363
urlSegmentParameter.Value.Should().BeEquivalentTo("bar/BAR");
6464
}
65-
65+
6666
[Theory]
6767
[InlineData("bar%2fBAR")]
6868
[InlineData("bar%2FBAR")]
6969
public void UrlSegmentParameter_WithValueWithEncodedSlash_CanLeaveEncodedSlash(string inputValue) {
7070
var urlSegmentParameter = new UrlSegmentParameter("foo", inputValue, replaceEncodedSlash: false);
7171
urlSegmentParameter.Value.Should().BeEquivalentTo(inputValue);
7272
}
73+
74+
[Fact]
75+
public void AddSameUrlSegmentTwice_ShouldReplaceFirst() {
76+
var client = new RestClient();
77+
var request = new RestRequest("https://api.example.com/orgs/{segment}/something");
78+
request.AddUrlSegment("segment", 1);
79+
var url1 = client.BuildUri(request);
80+
request.AddUrlSegment("segment", 2);
81+
var url2 = client.BuildUri(request);
82+
83+
url1.AbsolutePath.Should().Be("/orgs/1/something");
84+
url2.AbsolutePath.Should().Be("/orgs/2/something");
85+
}
7386
}

test/RestSharp.Tests/UrlBuilderTests.Get.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,4 +198,30 @@ public void GET_wth_trailing_slash_and_query_parameters() {
198198
var output = client.BuildUri(request);
199199
Assert.Equal(expected, output);
200200
}
201+
202+
[Fact]
203+
public void Multiple_query_parameters_with_same_name() {
204+
var request = new RestRequest($"/{Resource}/")
205+
.AddQueryParameter("foo", "bar")
206+
.AddQueryParameter("foo", "baz");
207+
var expected = new Uri($"{Base}/{Resource}/?foo=bar&foo=baz");
208+
209+
using var client = new RestClient(Base);
210+
211+
var output = client.BuildUri(request);
212+
Assert.Equal(expected, output);
213+
}
214+
215+
[Fact]
216+
public void Query_parameter_with_non_string_value() {
217+
var request = new RestRequest($"/{Resource}/")
218+
.AddQueryParameter("foo", 123)
219+
.AddQueryParameter("bar", true);
220+
var expected = new Uri($"{Base}/{Resource}/?foo=123&bar=True");
221+
222+
using var client = new RestClient(Base);
223+
224+
var output = client.BuildUri(request);
225+
Assert.Equal(expected, output);
226+
}
201227
}

0 commit comments

Comments
 (0)