mirror of https://github.com/Squidex/squidex.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
255 lines
7.3 KiB
255 lines
7.3 KiB
// ==========================================================================
|
|
// Squidex Headless CMS
|
|
// ==========================================================================
|
|
// Copyright (c) Squidex UG (haftungsbeschränkt)
|
|
// All rights reserved. Licensed under the MIT license.
|
|
// ==========================================================================
|
|
|
|
using FakeItEasy;
|
|
using Microsoft.OData.Edm;
|
|
using MongoDB.Bson.Serialization;
|
|
using MongoDB.Driver;
|
|
using Squidex.Domain.Apps.Entities.Assets.Edm;
|
|
using Squidex.Domain.Apps.Entities.MongoDb.Assets;
|
|
using Squidex.Domain.Apps.Entities.MongoDb.Assets.Visitors;
|
|
using Squidex.Infrastructure.MongoDb;
|
|
using Squidex.Infrastructure.MongoDb.OData;
|
|
using Xunit;
|
|
|
|
namespace Squidex.Domain.Apps.Entities.Assets.OData
|
|
{
|
|
public class ODataQueryTests
|
|
{
|
|
private readonly IBsonSerializerRegistry registry = BsonSerializer.SerializerRegistry;
|
|
private readonly IBsonSerializer<MongoAssetEntity> serializer = BsonSerializer.SerializerRegistry.GetSerializer<MongoAssetEntity>();
|
|
private readonly IEdmModel edmModel = EdmAssetModel.Edm;
|
|
|
|
static ODataQueryTests()
|
|
{
|
|
InstantSerializer.Register();
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_parse_query()
|
|
{
|
|
var parser = edmModel.ParseQuery("$filter=lastModifiedBy eq 'Sebastian'");
|
|
|
|
Assert.NotNull(parser);
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_query_with_lastModified()
|
|
{
|
|
var i = F("$filter=lastModified eq 1988-01-19T12:00:00Z");
|
|
var o = C("{ 'LastModified' : ISODate('1988-01-19T12:00:00Z') }");
|
|
|
|
Assert.Equal(o, i);
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_query_with_lastModifiedBy()
|
|
{
|
|
var i = F("$filter=lastModifiedBy eq 'Me'");
|
|
var o = C("{ 'LastModifiedBy' : 'Me' }");
|
|
|
|
Assert.Equal(o, i);
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_query_with_created()
|
|
{
|
|
var i = F("$filter=created eq 1988-01-19T12:00:00Z");
|
|
var o = C("{ 'Created' : ISODate('1988-01-19T12:00:00Z') }");
|
|
|
|
Assert.Equal(o, i);
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_query_with_createdBy()
|
|
{
|
|
var i = F("$filter=createdBy eq 'Me'");
|
|
var o = C("{ 'CreatedBy' : 'Me' }");
|
|
|
|
Assert.Equal(o, i);
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_query_with_version()
|
|
{
|
|
var i = F("$filter=version eq 0");
|
|
var o = C("{ 'Version' : NumberLong(0) }");
|
|
|
|
Assert.Equal(o, i);
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_query_with_fileName()
|
|
{
|
|
var i = F("$filter=fileName eq 'Logo.png'");
|
|
var o = C("{ 'FileName' : 'Logo.png' }");
|
|
|
|
Assert.Equal(o, i);
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_query_with_fileSize()
|
|
{
|
|
var i = F("$filter=fileSize eq 1024");
|
|
var o = C("{ 'FileSize' : NumberLong(1024) }");
|
|
|
|
Assert.Equal(o, i);
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_query_with_fileVersion()
|
|
{
|
|
var i = F("$filter=fileVersion eq 2");
|
|
var o = C("{ 'FileVersion' : NumberLong(2) }");
|
|
|
|
Assert.Equal(o, i);
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_query_with_isImage()
|
|
{
|
|
var i = F("$filter=isImage eq true");
|
|
var o = C("{ 'IsImage' : true }");
|
|
|
|
Assert.Equal(o, i);
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_query_with_mimeType()
|
|
{
|
|
var i = F("$filter=mimeType eq 'text/json'");
|
|
var o = C("{ 'MimeType' : 'text/json' }");
|
|
|
|
Assert.Equal(o, i);
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_query_with_pixelHeight()
|
|
{
|
|
var i = F("$filter=pixelHeight eq 600");
|
|
var o = C("{ 'PixelHeight' : 600 }");
|
|
|
|
Assert.Equal(o, i);
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_query_with_pixelWidth()
|
|
{
|
|
var i = F("$filter=pixelWidth eq 600");
|
|
var o = C("{ 'PixelWidth' : 600 }");
|
|
|
|
Assert.Equal(o, i);
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_orderby_with_single_field()
|
|
{
|
|
var i = S("$orderby=lastModified desc");
|
|
var o = C("{ 'LastModified' : -1 }");
|
|
|
|
Assert.Equal(o, i);
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_orderby_with_multiple_field()
|
|
{
|
|
var i = S("$orderby=lastModified, lastModifiedBy desc");
|
|
var o = C("{ 'LastModified' : 1, 'LastModifiedBy' : -1 }");
|
|
|
|
Assert.Equal(o, i);
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_top_statement()
|
|
{
|
|
var parser = edmModel.ParseQuery("$top=3");
|
|
var cursor = A.Fake<IFindFluent<MongoAssetEntity, MongoAssetEntity>>();
|
|
|
|
cursor.AssetTake(parser);
|
|
|
|
A.CallTo(() => cursor.Limit(3)).MustHaveHappened();
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_top_statement_with_limit()
|
|
{
|
|
var parser = edmModel.ParseQuery("$top=300");
|
|
var cursor = A.Fake<IFindFluent<MongoAssetEntity, MongoAssetEntity>>();
|
|
|
|
cursor.AssetTake(parser);
|
|
|
|
A.CallTo(() => cursor.Limit(200)).MustHaveHappened();
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_top_statement_with_default_value()
|
|
{
|
|
var parser = edmModel.ParseQuery(string.Empty);
|
|
var cursor = A.Fake<IFindFluent<MongoAssetEntity, MongoAssetEntity>>();
|
|
|
|
cursor.AssetTake(parser);
|
|
|
|
A.CallTo(() => cursor.Limit(20)).MustHaveHappened();
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_skip_statement()
|
|
{
|
|
var parser = edmModel.ParseQuery("$skip=3");
|
|
var cursor = A.Fake<IFindFluent<MongoAssetEntity, MongoAssetEntity>>();
|
|
|
|
cursor.AssetSkip(parser);
|
|
|
|
A.CallTo(() => cursor.Skip(3)).MustHaveHappened();
|
|
}
|
|
|
|
[Fact]
|
|
public void Should_make_skip_statement_with_default_value()
|
|
{
|
|
var parser = edmModel.ParseQuery(string.Empty);
|
|
var cursor = A.Fake<IFindFluent<MongoAssetEntity, MongoAssetEntity>>();
|
|
|
|
cursor.AssetSkip(parser);
|
|
|
|
A.CallTo(() => cursor.Skip(A<int>.Ignored)).MustNotHaveHappened();
|
|
}
|
|
|
|
private static string C(string value)
|
|
{
|
|
return value.Replace('\'', '"');
|
|
}
|
|
|
|
private string S(string value)
|
|
{
|
|
var parser = edmModel.ParseQuery(value);
|
|
var cursor = A.Fake<IFindFluent<MongoAssetEntity, MongoAssetEntity>>();
|
|
|
|
var i = string.Empty;
|
|
|
|
A.CallTo(() => cursor.Sort(A<SortDefinition<MongoAssetEntity>>.Ignored))
|
|
.Invokes((SortDefinition<MongoAssetEntity> sortDefinition) =>
|
|
{
|
|
i = sortDefinition.Render(serializer, registry).ToString();
|
|
});
|
|
|
|
cursor.AssetSort(parser);
|
|
|
|
return i;
|
|
}
|
|
|
|
private string F(string value)
|
|
{
|
|
var parser = edmModel.ParseQuery(value);
|
|
|
|
var query =
|
|
parser.BuildFilter<MongoAssetEntity>()
|
|
.Filter.Render(serializer, registry).ToString();
|
|
|
|
return query;
|
|
}
|
|
}
|
|
}
|