Commit dacf8445 authored by Nick Craver's avatar Nick Craver

Fix for #724

This now throws early for an invalid call, rather than a currently confusing server message to users (see #724 fo details).
parent a0c0a7d7
using Xunit; using Xunit;
using System; using System;
using Xunit.Abstractions; using Xunit.Abstractions;
using System.Threading.Tasks;
namespace StackExchange.Redis.Tests namespace StackExchange.Redis.Tests
{ {
...@@ -173,7 +174,7 @@ public void GeoRadius() ...@@ -173,7 +174,7 @@ public void GeoRadius()
} }
[Fact] [Fact]
public void GeoRadiusOverloads() public async Task GeoRadiusOverloads()
{ {
using (var conn = Create()) using (var conn = Create())
{ {
...@@ -185,13 +186,19 @@ public void GeoRadiusOverloads() ...@@ -185,13 +186,19 @@ public void GeoRadiusOverloads()
Assert.True(db.GeoAdd(key, -1.759925, 52.19493, "steve")); Assert.True(db.GeoAdd(key, -1.759925, 52.19493, "steve"));
Assert.True(db.GeoAdd(key, -3.360655, 54.66395, "dave")); Assert.True(db.GeoAdd(key, -3.360655, 54.66395, "dave"));
// Invalid overload, but due to implcit double => RedisValue conversion it happily calls // Invalid overload
var ex = Assert.Throws<RedisServerException>(() => db.GeoRadius(key, -1.759925, 52.19493, GeoUnit.Miles, 500, Order.Ascending, GeoRadiusOptions.WithDistance)); // Since this would throw ERR could not decode requested zset member, we catch and return something more useful to the user earlier.
Assert.Equal("ERR could not decode requested zset member", ex.Message); var ex = Assert.Throws<ArgumentException>(() => db.GeoRadius(key, -1.759925, 52.19493, GeoUnit.Miles, 500, Order.Ascending, GeoRadiusOptions.WithDistance));
Assert.Equal("Member should not be a double, you likely want the GeoRadius(RedisKey, double, double, ...) overload.\r\nParameter name: member", ex.Message);
ex = await Assert.ThrowsAsync<ArgumentException>(() => db.GeoRadiusAsync(key, -1.759925, 52.19493, GeoUnit.Miles, 500, Order.Ascending, GeoRadiusOptions.WithDistance)).ForAwait();
Assert.Equal("Member should not be a double, you likely want the GeoRadius(RedisKey, double, double, ...) overload.\r\nParameter name: member", ex.Message);
// The good stuff // The good stuff
GeoRadiusResult[] result = db.GeoRadius(key, -1.759925, 52.19493, 500, unit: GeoUnit.Miles, order: Order.Ascending, options: GeoRadiusOptions.WithDistance); GeoRadiusResult[] result = db.GeoRadius(key, -1.759925, 52.19493, 500, unit: GeoUnit.Miles, order: Order.Ascending, options: GeoRadiusOptions.WithDistance);
Assert.NotNull(result); Assert.NotNull(result);
result = await db.GeoRadiusAsync(key, -1.759925, 52.19493, 500, unit: GeoUnit.Miles, order: Order.Ascending, options: GeoRadiusOptions.WithDistance).ForAwait();
Assert.NotNull(result);
} }
} }
} }
......
...@@ -216,11 +216,21 @@ private Message GetGeoRadiusMessage(RedisKey key, RedisValue? member, double lon ...@@ -216,11 +216,21 @@ private Message GetGeoRadiusMessage(RedisKey key, RedisValue? member, double lon
public GeoRadiusResult[] GeoRadius(RedisKey key, RedisValue member, double radius, GeoUnit unit, int count, Order? order, GeoRadiusOptions options, CommandFlags flags) public GeoRadiusResult[] GeoRadius(RedisKey key, RedisValue member, double radius, GeoUnit unit, int count, Order? order, GeoRadiusOptions options, CommandFlags flags)
{ {
// This gets confused with the double overload below sometimes...throwing when this occurs.
if (member.Type == RedisValue.StorageType.Double)
{
throw new ArgumentException("Member should not be a double, you likely want the GeoRadius(RedisKey, double, double, ...) overload.", nameof(member));
}
return ExecuteSync(GetGeoRadiusMessage(key, member, double.NaN, double.NaN, radius, unit, count, order, options, flags), ResultProcessor.GeoRadiusArray(options)); return ExecuteSync(GetGeoRadiusMessage(key, member, double.NaN, double.NaN, radius, unit, count, order, options, flags), ResultProcessor.GeoRadiusArray(options));
} }
public Task<GeoRadiusResult[]> GeoRadiusAsync(RedisKey key, RedisValue member, double radius, GeoUnit unit, int count, Order? order, GeoRadiusOptions options, CommandFlags flags) public Task<GeoRadiusResult[]> GeoRadiusAsync(RedisKey key, RedisValue member, double radius, GeoUnit unit, int count, Order? order, GeoRadiusOptions options, CommandFlags flags)
{ {
// This gets confused with the double overload below sometimes...throwing when this occurs.
if (member.Type == RedisValue.StorageType.Double)
{
throw new ArgumentException("Member should not be a double, you likely want the GeoRadius(RedisKey, double, double, ...) overload.", nameof(member));
}
return ExecuteAsync(GetGeoRadiusMessage(key, member, double.NaN, double.NaN, radius, unit, count, order, options, flags), ResultProcessor.GeoRadiusArray(options)); return ExecuteAsync(GetGeoRadiusMessage(key, member, double.NaN, double.NaN, radius, unit, count, order, options, flags), ResultProcessor.GeoRadiusArray(options));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment