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 System;
using Xunit.Abstractions;
using System.Threading.Tasks;
namespace StackExchange.Redis.Tests
{
......@@ -173,7 +174,7 @@ public void GeoRadius()
}
[Fact]
public void GeoRadiusOverloads()
public async Task GeoRadiusOverloads()
{
using (var conn = Create())
{
......@@ -185,13 +186,19 @@ public void GeoRadiusOverloads()
Assert.True(db.GeoAdd(key, -1.759925, 52.19493, "steve"));
Assert.True(db.GeoAdd(key, -3.360655, 54.66395, "dave"));
// Invalid overload, but due to implcit double => RedisValue conversion it happily calls
var ex = Assert.Throws<RedisServerException>(() => db.GeoRadius(key, -1.759925, 52.19493, GeoUnit.Miles, 500, Order.Ascending, GeoRadiusOptions.WithDistance));
Assert.Equal("ERR could not decode requested zset member", ex.Message);
// Invalid overload
// Since this would throw ERR could not decode requested zset member, we catch and return something more useful to the user earlier.
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
GeoRadiusResult[] result = db.GeoRadius(key, -1.759925, 52.19493, 500, unit: GeoUnit.Miles, order: Order.Ascending, options: GeoRadiusOptions.WithDistance);
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
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));
}
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));
}
......
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