2020-12-20 08:36:11 +01:00
// Copyright (c) Umbraco.
// See LICENSE for more details.
using System ;
2018-05-29 18:30:37 +02:00
using System.Diagnostics ;
2020-10-22 14:12:07 +02:00
using NPoco ;
2017-09-20 20:06:46 +02:00
using NUnit.Framework ;
2022-01-13 23:46:21 +00:00
using Umbraco.Cms.Core.Persistence ;
2021-02-12 13:36:50 +01:00
using Umbraco.Cms.Infrastructure.Persistence ;
using Umbraco.Cms.Infrastructure.Persistence.Dtos ;
using Umbraco.Cms.Infrastructure.Persistence.Querying ;
2021-02-10 14:45:44 +01:00
using Umbraco.Cms.Tests.Common.TestHelpers ;
2021-02-10 14:58:22 +01:00
using Umbraco.Cms.Tests.UnitTests.TestHelpers ;
2021-02-12 13:36:50 +01:00
using Umbraco.Extensions ;
2021-02-09 10:22:42 +01:00
using Constants = Umbraco . Cms . Core . Constants ;
2017-09-20 20:06:46 +02:00
2021-02-10 14:58:22 +01:00
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Persistence.NPocoTests
2017-09-20 20:06:46 +02:00
{
[TestFixture]
2020-10-22 15:17:16 +02:00
public class NPocoSqlTests : BaseUsingSqlSyntax
2017-09-20 20:06:46 +02:00
{
[Test]
public void Where_Clause_With_Starts_With_Additional_Parameters ( )
{
var content = new NodeDto ( ) { NodeId = 123 , Path = "-1,123" } ;
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( )
2017-09-20 20:06:46 +02:00
. Where < NodeDto > ( x = > x . Path . SqlStartsWith ( content . Path , TextColumnType . NVarchar ) ) ;
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE (upper([umbracoNode].[path]) LIKE upper(@0))" , sql . SQL . Replace ( "\n" , " " ) ) ;
Assert . AreEqual ( 1 , sql . Arguments . Length ) ;
Assert . AreEqual ( content . Path + "%" , sql . Arguments [ 0 ] ) ;
}
[Test]
public void Where_Clause_With_Starts_With_By_Variable ( )
{
2020-12-20 08:36:11 +01:00
var content = new NodeDto ( ) { NodeId = 123 , Path = "-1,123" } ;
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( )
2017-09-20 20:06:46 +02:00
. Where < NodeDto > ( x = > x . Path . StartsWith ( content . Path ) & & x . NodeId ! = content . NodeId ) ;
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE ((upper([umbracoNode].[path]) LIKE upper(@0) AND ([umbracoNode].[id] <> @1)))" , sql . SQL . Replace ( "\n" , " " ) ) ;
Assert . AreEqual ( 2 , sql . Arguments . Length ) ;
Assert . AreEqual ( content . Path + "%" , sql . Arguments [ 0 ] ) ;
Assert . AreEqual ( content . NodeId , sql . Arguments [ 1 ] ) ;
}
[Test]
public void Where_Clause_With_Not_Starts_With ( )
{
const int level = 1 ;
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( )
2017-09-20 20:06:46 +02:00
. Where < NodeDto > ( x = > x . Level = = level & & ! x . Path . StartsWith ( "-20" ) ) ;
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE ((([umbracoNode].[level] = @0) AND NOT (upper([umbracoNode].[path]) LIKE upper(@1))))" , sql . SQL . Replace ( "\n" , " " ) ) ;
Assert . AreEqual ( 2 , sql . Arguments . Length ) ;
Assert . AreEqual ( level , sql . Arguments [ 0 ] ) ;
Assert . AreEqual ( "-20%" , sql . Arguments [ 1 ] ) ;
}
[Test]
public void Where_Clause_With_EqualsFalse_Starts_With ( )
{
const int level = 1 ;
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( )
2017-09-20 20:06:46 +02:00
. Where < NodeDto > ( x = > x . Level = = level & & x . Path . StartsWith ( "-20" ) = = false ) ;
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE ((([umbracoNode].[level] = @0) AND NOT (upper([umbracoNode].[path]) LIKE upper(@1))))" , sql . SQL . Replace ( "\n" , " " ) ) ;
Assert . AreEqual ( 2 , sql . Arguments . Length ) ;
Assert . AreEqual ( level , sql . Arguments [ 0 ] ) ;
Assert . AreEqual ( "-20%" , sql . Arguments [ 1 ] ) ;
}
[Test]
public void Where_Clause_With_Equals_Clause ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( )
2017-09-20 20:06:46 +02:00
. Where < NodeDto > ( x = > x . Text . Equals ( "Hello@world.com" ) ) ;
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE (upper([umbracoNode].[text]) = upper(@0))" , sql . SQL . Replace ( "\n" , " " ) ) ;
Assert . AreEqual ( 1 , sql . Arguments . Length ) ;
Assert . AreEqual ( "Hello@world.com" , sql . Arguments [ 0 ] ) ;
}
[Test]
public void Where_Clause_With_False_Boolean ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( )
2017-09-20 20:06:46 +02:00
. Where < NodeDto > ( x = > x . Trashed = = false ) ;
2021-06-24 09:43:57 -06:00
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE ([umbracoNode].[trashed] = @0)" , sql . SQL . Replace ( "\n" , " " ) ) ;
2017-09-20 20:06:46 +02:00
Assert . AreEqual ( 1 , sql . Arguments . Length ) ;
2021-06-24 09:43:57 -06:00
Assert . AreEqual ( false , sql . Arguments [ 0 ] ) ;
2017-09-20 20:06:46 +02:00
}
[Test]
public void Where_Clause_With_EqualsFalse_Boolean ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( ) . Where < NodeDto > ( x = > x . Trashed = = false ) ;
2017-09-20 20:06:46 +02:00
2021-06-24 09:43:57 -06:00
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE ([umbracoNode].[trashed] = @0)" , sql . SQL . Replace ( "\n" , " " ) ) ;
2017-09-20 20:06:46 +02:00
Assert . AreEqual ( 1 , sql . Arguments . Length ) ;
2021-06-24 09:43:57 -06:00
Assert . AreEqual ( false , sql . Arguments [ 0 ] ) ;
2017-09-20 20:06:46 +02:00
}
[Test]
public void Where_Clause_With_Boolean ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( )
2017-09-20 20:06:46 +02:00
. Where < NodeDto > ( x = > x . Trashed ) ;
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE ([umbracoNode].[trashed] = @0)" , sql . SQL . Replace ( "\n" , " " ) ) ;
Assert . AreEqual ( 1 , sql . Arguments . Length ) ;
Assert . AreEqual ( true , sql . Arguments [ 0 ] ) ;
}
[Test]
public void Where_Clause_With_ToUpper ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( )
2017-09-20 20:06:46 +02:00
. Where < NodeDto > ( x = > x . Text . ToUpper ( ) = = "hello" . ToUpper ( ) ) ;
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE ((upper([umbracoNode].[text]) = upper(@0)))" , sql . SQL . Replace ( "\n" , " " ) ) ;
Assert . AreEqual ( 1 , sql . Arguments . Length ) ;
Assert . AreEqual ( "hello" , sql . Arguments [ 0 ] ) ;
}
[Test]
public void Where_Clause_With_ToString ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( )
2017-09-20 20:06:46 +02:00
. Where < NodeDto > ( x = > x . Text = = 1. ToString ( ) ) ;
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE (([umbracoNode].[text] = @0))" , sql . SQL . Replace ( "\n" , " " ) ) ;
Assert . AreEqual ( 1 , sql . Arguments . Length ) ;
Assert . AreEqual ( "1" , sql . Arguments [ 0 ] ) ;
}
[Test]
public void Where_Clause_With_Wildcard ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( )
2017-09-20 20:06:46 +02:00
. Where < NodeDto > ( x = > x . Text . StartsWith ( "D" ) ) ;
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE (upper([umbracoNode].[text]) LIKE upper(@0))" , sql . SQL . Replace ( "\n" , " " ) ) ;
Assert . AreEqual ( 1 , sql . Arguments . Length ) ;
Assert . AreEqual ( "D%" , sql . Arguments [ 0 ] ) ;
}
[Test]
public void Where_Clause_Single_Constant ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( )
2017-09-20 20:06:46 +02:00
. Where < NodeDto > ( x = > x . NodeId = = 2 ) ;
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE (([umbracoNode].[id] = @0))" , sql . SQL . Replace ( "\n" , " " ) ) ;
Assert . AreEqual ( 1 , sql . Arguments . Length ) ;
Assert . AreEqual ( 2 , sql . Arguments [ 0 ] ) ;
}
[Test]
public void Where_Clause_And_Constant ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( )
2017-09-20 20:06:46 +02:00
. Where < NodeDto > ( x = > x . NodeId ! = 2 & & x . NodeId ! = 3 ) ;
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE ((([umbracoNode].[id] <> @0) AND ([umbracoNode].[id] <> @1)))" , sql . SQL . Replace ( "\n" , " " ) ) ;
Assert . AreEqual ( 2 , sql . Arguments . Length ) ;
Assert . AreEqual ( 2 , sql . Arguments [ 0 ] ) ;
Assert . AreEqual ( 3 , sql . Arguments [ 1 ] ) ;
}
[Test]
public void Where_Clause_Or_Constant ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( )
2017-09-20 20:06:46 +02:00
. Where < NodeDto > ( x = > x . Text = = "hello" | | x . NodeId = = 3 ) ;
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE ((([umbracoNode].[text] = @0) OR ([umbracoNode].[id] = @1)))" , sql . SQL . Replace ( "\n" , " " ) ) ;
Assert . AreEqual ( 2 , sql . Arguments . Length ) ;
Assert . AreEqual ( "hello" , sql . Arguments [ 0 ] ) ;
Assert . AreEqual ( 3 , sql . Arguments [ 1 ] ) ;
}
2017-11-21 14:19:16 +01:00
[Test]
public void Where_Null ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( ) . WhereNull < NodeDto > ( x = > x . NodeId ) ;
2017-11-21 14:19:16 +01:00
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE (([umbracoNode].[id] IS NULL))" , sql . SQL . Replace ( "\n" , " " ) ) ;
}
[Test]
public void Where_Not_Null ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( ) . WhereNotNull < NodeDto > ( x = > x . NodeId ) ;
2017-11-21 14:19:16 +01:00
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE (([umbracoNode].[id] IS NOT NULL))" , sql . SQL . Replace ( "\n" , " " ) ) ;
}
[Test]
public void Where_Any ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) . SelectAll ( ) . From < NodeDto > ( ) . WhereAny (
2017-11-21 14:19:16 +01:00
s = > s . Where < NodeDto > ( x = > x . NodeId = = 1 ) ,
s = > s . Where < NodeDto > ( x = > x . NodeId = = 2 ) ) ;
Assert . AreEqual ( "SELECT * FROM [umbracoNode] WHERE (( (([umbracoNode].[id] = @0)) ) OR ( (([umbracoNode].[id] = @1)) ))" , sql . SQL . Replace ( "\n" , " " ) ) ;
}
2017-09-20 20:06:46 +02:00
[Test]
public void Can_Select_From_With_Type ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > expected = Sql ( ) ;
2018-03-22 17:17:01 +11:00
expected . SelectAll ( ) . From ( $"[{Constants.DatabaseSchema.Tables.Content}]" ) ;
2017-09-20 20:06:46 +02:00
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) ;
2017-09-20 20:06:46 +02:00
sql . SelectAll ( ) . From < ContentDto > ( ) ;
Assert . That ( sql . SQL , Is . EqualTo ( expected . SQL ) ) ;
Debug . Print ( sql . SQL ) ;
}
[Test]
public void Can_InnerJoin_With_Types ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > expected = Sql ( ) ;
2017-09-20 20:06:46 +02:00
expected . SelectAll ( )
2018-03-22 17:17:01 +11:00
. From ( $"[{Constants.DatabaseSchema.Tables.DocumentVersion}]" )
. InnerJoin ( $"[{Constants.DatabaseSchema.Tables.ContentVersion}]" )
. On ( $"[{Constants.DatabaseSchema.Tables.DocumentVersion}].[id] = [{Constants.DatabaseSchema.Tables.ContentVersion}].[id]" ) ;
2017-09-20 20:06:46 +02:00
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) ;
2017-11-07 19:49:14 +01:00
sql . SelectAll ( ) . From < DocumentVersionDto > ( )
2017-09-20 20:06:46 +02:00
. InnerJoin < ContentVersionDto > ( )
2017-11-07 19:49:14 +01:00
. On < DocumentVersionDto , ContentVersionDto > ( left = > left . Id , right = > right . Id ) ;
2017-09-20 20:06:46 +02:00
Assert . That ( sql . SQL , Is . EqualTo ( expected . SQL ) ) ;
Debug . Print ( sql . SQL ) ;
}
[Test]
public void Can_OrderBy_With_Type ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > expected = Sql ( ) ;
2018-03-22 17:17:01 +11:00
expected . SelectAll ( ) . From ( $"[{Constants.DatabaseSchema.Tables.Content}]" ) . OrderBy ( $"([{Constants.DatabaseSchema.Tables.Content}].[contentTypeId])" ) ;
2017-09-20 20:06:46 +02:00
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) ;
2017-09-20 20:06:46 +02:00
sql . SelectAll ( ) . From < ContentDto > ( ) . OrderBy < ContentDto > ( x = > x . ContentTypeId ) ;
Assert . That ( sql . SQL , Is . EqualTo ( expected . SQL ) ) ;
Debug . Print ( sql . SQL ) ;
}
[Test]
public void Can_GroupBy_With_Type ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > expected = Sql ( ) ;
2018-03-22 17:17:01 +11:00
expected . SelectAll ( ) . From ( $"[{Constants.DatabaseSchema.Tables.Content}]" ) . GroupBy ( $"[{Constants.DatabaseSchema.Tables.Content}].[contentTypeId]" ) ;
2017-09-20 20:06:46 +02:00
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) ;
2017-09-20 20:06:46 +02:00
sql . SelectAll ( ) . From < ContentDto > ( ) . GroupBy < ContentDto > ( x = > x . ContentTypeId ) ;
Assert . That ( sql . SQL , Is . EqualTo ( expected . SQL ) ) ;
Debug . Print ( sql . SQL ) ;
}
[Test]
public void Can_Use_Where_Predicate ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > expected = Sql ( ) ;
2018-03-22 17:17:01 +11:00
expected . SelectAll ( ) . From ( $"[{Constants.DatabaseSchema.Tables.Content}]" ) . Where ( $"([{Constants.DatabaseSchema.Tables.Content}].[nodeId] = @0)" , 1045 ) ;
2017-09-20 20:06:46 +02:00
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) ;
2017-09-20 20:06:46 +02:00
sql . SelectAll ( ) . From < ContentDto > ( ) . Where < ContentDto > ( x = > x . NodeId = = 1045 ) ;
Assert . That ( sql . SQL , Is . EqualTo ( expected . SQL ) ) ;
Debug . Print ( sql . SQL ) ;
}
[Test]
public void Can_Use_Where_And_Predicate ( )
{
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > expected = Sql ( ) ;
2017-09-20 20:06:46 +02:00
expected . SelectAll ( )
2018-03-22 17:17:01 +11:00
. From ( $"[{Constants.DatabaseSchema.Tables.Content}]" )
. Where ( $"([{Constants.DatabaseSchema.Tables.Content}].[nodeId] = @0)" , 1045 )
. Where ( $"([{Constants.DatabaseSchema.Tables.Content}].[contentTypeId] = @0)" , 1050 ) ;
2017-09-20 20:06:46 +02:00
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( ) ;
2017-09-20 20:06:46 +02:00
sql . SelectAll ( )
. From < ContentDto > ( )
. Where < ContentDto > ( x = > x . NodeId = = 1045 )
. Where < ContentDto > ( x = > x . ContentTypeId = = 1050 ) ;
Assert . That ( sql . SQL , Is . EqualTo ( expected . SQL ) ) ;
Debug . Print ( sql . SQL ) ;
}
2018-05-29 18:30:37 +02:00
[Test]
public void ForUpdate ( )
{
var sessionId = Guid . NewGuid ( ) ;
2020-12-20 08:36:11 +01:00
Sql < ISqlContext > sql = Sql ( )
2018-05-29 18:30:37 +02:00
. SelectAll ( )
. From < UserLoginDto > ( )
. Where < UserLoginDto > ( x = > x . SessionId = = sessionId ) ;
Assert . AreEqual ( "SELECT * FROM [umbracoUserLogin] WHERE (([umbracoUserLogin].[sessionId] = @0))" , sql . SQL . NoCrLf ( ) ) ;
sql = sql . ForUpdate ( ) ;
Assert . AreEqual ( "SELECT * FROM [umbracoUserLogin] WITH (UPDLOCK) WHERE (([umbracoUserLogin].[sessionId] = @0))" , sql . SQL . NoCrLf ( ) ) ;
}
2017-09-20 20:06:46 +02:00
}
}