// -----------------------------------------------------------------------
//
// Copyright (c) Hibernating Rhinos LTD. All rights reserved.
//
// -----------------------------------------------------------------------
using System.Linq;
using Raven.Abstractions.Indexing;
using Raven.Abstractions.Util;
using Raven.Client;
using Raven.Client.Indexes;
using Raven.Tests.Helpers;
using Xunit;
namespace Raven.Tests.Issues
{
public class RavenDB_4300 : RavenTestBase
{
// The search text must
// (1) contain a space
// (2) end in a backslash
private const string SearchText = "Thing One \\";
[Fact]
public void Escaping_Beforehand_Works()
{
using (var store = NewRemoteDocumentStore())
{
new ExampleIndex().Execute(store);
Populate(store);
WaitForIndexing(store);
using (var session = store.OpenSession())
{
var query = session.Query();
query.Customize(c => c.WaitForNonStaleResultsAsOfLastWrite());
var results =
query.Where(x => x.Name == RavenQuery.Escape(SearchText, false, false))
.As()
.ToList();
Assert.NotEmpty(results);
}
}
}
[Fact]
public void No_Escaping_Causes_Error()
{
using (var store = NewRemoteDocumentStore())
{
new ExampleIndex().Execute(store);
Populate(store);
WaitForIndexing(store);
using (var session = store.OpenSession())
{
var query = session.Query();
query.Customize(c => c.WaitForNonStaleResultsAsOfLastWrite());
var results =
query.Where(x => x.Name == SearchText)
.As()
.ToList();
Assert.NotEmpty(results);
}
}
}
private static void Populate(IDocumentStore store)
{
using (var session = store.OpenSession())
{
var example1 = new Example { Name = "Thing One \\" };
var example2 = new Example { Name = "Thing Two" };
var example3 = new Example { Name = "Thing Three" };
session.Store(example1);
session.Store(example2);
session.Store(example3);
session.SaveChanges();
}
}
public class Example
{
public string Name { get; set; }
}
public class ExampleIndex : AbstractIndexCreationTask
{
public ExampleIndex()
{
Map = venues => from v in venues
select new
{
v.Name,
};
Index(x => x.Name, FieldIndexing.Analyzed);
}
public class ReduceResult
{
public string Name { get; set; }
}
}
}
}