using System; using PetaPoco.Tests.Integration.Models; using Shouldly; using Xunit; namespace PetaPoco.Tests.Integration.Databases { public abstract class BaseQueryLinqTests : BaseDatabase { private readonly Order _order = new Order { PoNumber = "Peta's Order", Status = OrderStatus.Accepted, CreatedOn = new DateTime(1948, 1, 11, 4, 2, 4, DateTimeKind.Utc), CreatedBy = "Harry" }; private readonly OrderLine _orderLine = new OrderLine { Quantity = 5, SellPrice = 4.99m, Status = OrderLineStatus.Pending }; private readonly Person _person = new Person { Id = Guid.NewGuid(), Age = 18, Dob = new DateTime(1945, 1, 12, 5, 9, 4, DateTimeKind.Utc), Height = 180, Name = "Peta" }; protected BaseQueryLinqTests(DBTestProvider provider) : base(provider) { } [Fact] public void Single_GivenPrimaryKeyMatchingOneRecord_ShouldReturnPoco() { var pk = DB.Insert(_person); DB.Single(pk).ShouldNotBeNull(); } [Fact] public void Single_GivenPrimaryKeyMatchingNoRecord_ShouldThrow() { Should.Throw(() => DB.Single(Guid.NewGuid())); } [Fact] public void Single_GivenSqlStringMatchingOneRecord_ShouldReturnPoco() { DB.Insert(_person); DB.Single($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18).ShouldNotBeNull(); } [Fact] public void Single_GivenSqlStringMatchingTwoRecords_ShouldThrow() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); Should.Throw(() => DB.Single($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)); } [Fact] public void Single_GivenSqlStringMatchingNoRecord_ShouldThrow() { Should.Throw(() => DB.Single($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)); } [Fact] public void Single_GivenSqlMatchingOneRecord_ShouldReturnPoco() { DB.Insert(_person); DB.Single(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldNotBeNull(); } [Fact] public void Single_GivenSqlMatchingTwoRecords_ShouldThrow() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); Should.Throw(() => DB.Single(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))); } [Fact] public void Single_GivenSqlMatchingNoRecord_ShouldThrow() { Should.Throw(() => DB.Single(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))); } [Fact] public void SingleOrDefault_GivenPrimaryKeyMatchingOneRecord_ShouldReturnPoco() { var pk = DB.Insert(_person); DB.SingleOrDefault(pk).ShouldNotBeNull(); } [Fact] public void SingleOrDefault_GivenPrimaryKeyMatchingNoRecord_ShouldBeNull() { DB.SingleOrDefault(Guid.NewGuid()).ShouldBeNull(); } [Fact] public void SingleOrDefault_GivenSqlStringMatchingOneRecord_ShouldReturnPoco() { DB.Insert(_person); DB.SingleOrDefault($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18).ShouldNotBeNull(); } [Fact] public void SingleOrDefault_GivenSqlStringMatchingTwoRecords_ShouldThrow() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); Should.Throw(() => DB.Single($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)); } [Fact] public void SingleOrDefault_GivenSqlStringMatchingNoRecord_ShouldBeNull() { DB.SingleOrDefault($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18).ShouldBeNull(); } [Fact] public void SingleOrDefault_GivenSqlMatchingOneRecord_ShouldReturnPoco() { DB.Insert(_person); DB.SingleOrDefault(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldNotBeNull(); } [Fact] public void SingleOrDefault_GivenSqlMatchingTwoRecords_ShouldThrow() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); Should.Throw(() => DB.Single(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))); } [Fact] public void SingleOrDefault_GivenSqlMatchingNoRecord_ShouldBeNull() { DB.SingleOrDefault(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldBeNull(); } [Fact] public void First_GivenSqlStringAndMatchingOneRecord_ShouldReturnPoco() { DB.Insert(_person); DB.First($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18).ShouldNotBeNull(); } [Fact] public void First_GivenSqlStringAndMatchingTwoRecords_ShouldReturnFirstRecord() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); DB.First($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18).ShouldNotBeNull(); } [Fact] public void First_GivenSqlStringMatchingNoRecord_ShouldThrow() { Should.Throw(() => DB.First($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)); } [Fact] public void First_GivenSqlMatchingOneRecord_ShouldReturnPoco() { DB.Insert(_person); DB.First(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldNotBeNull(); } [Fact] public void First_GivenSqlMatchingTwoRecords_ShouldReturnFirstPoco() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); DB.First(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldNotBeNull(); } [Fact] public void First_GivenSqlMatchingNoRecord_ShouldThrow() { Should.Throw(() => DB.First(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))); } [Fact] public void FirstOrDefault_GivenSqlStringAndMatchingOneRecord_ShouldReturnPoco() { DB.Insert(_person); DB.FirstOrDefault($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18).ShouldNotBeNull(); } [Fact] public void FirstOrDefault_GivenSqlStringAndMatchingTwoRecords_ShouldReturnFirstRecord() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); DB.FirstOrDefault($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18).ShouldNotBeNull(); } [Fact] public void FirstOrDefault_GivenSqlStringMatchingNoRecord_ShouldBeNull() { DB.FirstOrDefault(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldBeNull(); } [Fact] public void FirstOrDefault_GivenSqlMatchingOneRecord_ShouldReturnPoco() { DB.Insert(_person); DB.FirstOrDefault(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldNotBeNull(); } [Fact] public void FirstOrDefault_GivenSqlMatchingTwoRecords_ShouldReturnFirstPoco() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); DB.FirstOrDefault(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldNotBeNull(); } [Fact] public void FirstOrDefault_GivenSqlMatchingNoRecord_ShouldBeNull() { DB.FirstOrDefault(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldBeNull(); } [Fact] public void Exists_GivenPrimaryKeyMatchingOneRecord_ShouldBeTrue() { var pk = DB.Insert(_person); DB.Exists(pk).ShouldBeTrue(); } [Fact] public void Exists_GivenPrimaryKeyMatchingNoRecord_ShouldBeFalse() { DB.Exists(Guid.NewGuid()).ShouldBeFalse(); } /// /// Support the older syntax of starting with a WHERE clause. /// [Fact] public void Exists_Regression_GivenSqlStringMatchingOneRecord_ShouldBeTrue() { DB.Insert(_person); DB.Exists($"{DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18).ShouldBeTrue(); } [Fact] public void Exists_GivenSqlStringMatchingOneRecord_ShouldBeTrue() { DB.Insert(_person); DB.Exists($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18).ShouldBeTrue(); } [Fact] public void Exists_GivenSqlStringMatchingMoreThanOneRecord_ShouldBeTrue() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); DB.Exists($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18).ShouldBeTrue(); } [Fact] public void Exists_GivenSqlStringMatchingNoRecord_ShouldBeFalse() { DB.Exists($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18).ShouldBeFalse(); } [Fact] public async void ExistsAsync_GivenPrimaryKeyMatchingOneRecord_ShouldBeTrue() { var pk = DB.Insert(_person); (await DB.ExistsAsync(pk)).ShouldBeTrue(); } [Fact] public async void ExistsAsync_GivenPrimaryKeyMatchingNoRecord_ShouldBeFalse() { (await DB.ExistsAsync(Guid.NewGuid())).ShouldBeFalse(); } /// /// Support the older syntax of starting with a WHERE clause. /// [Fact] public async void ExistsAsync_Regression_GivenSqlStringMatchingOneRecord_ShouldBeTrue() { DB.Insert(_person); (await DB.ExistsAsync($"{DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldBeTrue(); } [Fact] public async void ExistsAsync_GivenSqlStringMatchingOneRecord_ShouldBeTrue() { DB.Insert(_person); (await DB.ExistsAsync($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldBeTrue(); } [Fact] public async void ExistsAsync_GivenSqlStringMatchingMoreThanOneRecord_ShouldBeTrue() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); (await DB.ExistsAsync($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldBeTrue(); } [Fact] public async void ExistsAsync_GivenSqlStringMatchingNoRecord_ShouldBeFalse() { (await DB.ExistsAsync($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldBeFalse(); } [Fact] public async void SingleAsync_GivenPrimaryKeyMatchingOneRecord_ShouldReturnPoco() { var pk = DB.Insert(_person); (await DB.SingleAsync(pk)).ShouldNotBeNull(); } [Fact] public void SingleAsync_GivenPrimaryKeyMatchingNoRecord_ShouldThrow() { Should.Throw(DB.SingleAsync(Guid.NewGuid())); } [Fact] public async void SingleAsync_GivenSqlStringMatchingOneRecord_ShouldReturnPoco() { DB.Insert(_person); (await DB.SingleAsync($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldNotBeNull(); } [Fact] public void SingleAsync_GivenSqlStringMatchingTwoRecords_ShouldThrow() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); Should.Throw(DB.SingleAsync($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)); } [Fact] public void SingleAsync_GivenSqlStringMatchingNoRecord_ShouldThrow() { Should.Throw(DB.SingleAsync($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)); } [Fact] public async void SingleAsync_GivenSqlMatchingOneRecord_ShouldReturnPoco() { DB.Insert(_person); (await DB.SingleAsync(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))).ShouldNotBeNull(); } [Fact] public void SingleAsync_GivenSqlMatchingTwoRecords_ShouldThrow() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); Should.Throw(DB.SingleAsync(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))); } [Fact] public void SingleAsync_GivenSqlMatchingNoRecord_ShouldThrow() { Should.Throw(DB.SingleAsync(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))); } [Fact] public async void SingleOrDefaultAsync_GivenPrimaryKeyMatchingOneRecord_ShouldReturnPoco() { var pk = DB.Insert(_person); (await DB.SingleOrDefaultAsync(pk)).ShouldNotBeNull(); } [Fact] public async void SingleOrDefaultAsync_GivenPrimaryKeyMatchingNoRecord_ShouldBeNull() { (await DB.SingleOrDefaultAsync(Guid.NewGuid())).ShouldBeNull(); } [Fact] public async void SingleOrDefaultAsync_GivenSqlStringMatchingOneRecord_ShouldReturnPoco() { DB.Insert(_person); (await DB.SingleOrDefaultAsync($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldNotBeNull(); } [Fact] public void SingleOrDefaultAsync_GivenSqlStringMatchingTwoRecords_ShouldThrow() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); Should.Throw(DB.SingleAsync($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)); } [Fact] public async void SingleOrDefaultAsync_GivenSqlStringMatchingNoRecord_ShouldBeNull() { (await DB.SingleOrDefaultAsync($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldBeNull(); } [Fact] public async void SingleOrDefaultAsync_GivenSqlMatchingOneRecord_ShouldReturnPoco() { DB.Insert(_person); (await DB.SingleOrDefaultAsync(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))).ShouldNotBeNull(); } [Fact] public void SingleOrDefaultAsync_GivenSqlMatchingTwoRecords_ShouldThrow() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); Should.Throw(DB.SingleAsync(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))); } [Fact] public async void SingleOrDefaultAsync_GivenSqlMatchingNoRecord_ShouldBeNull() { (await DB.SingleOrDefaultAsync(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))).ShouldBeNull(); } [Fact] public async void FirstAsync_GivenSqlStringAndMatchingOneRecord_ShouldReturnPoco() { DB.Insert(_person); (await DB.FirstAsync($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldNotBeNull(); } [Fact] public async void FirstAsync_GivenSqlStringAndMatchingTwoRecords_ShouldReturnFirstRecord() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); (await DB.FirstAsync($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldNotBeNull(); } [Fact] public void FirstAsync_GivenSqlStringMatchingNoRecord_ShouldThrow() { Should.Throw(DB.FirstAsync($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)); } [Fact] public async void FirstAsync_GivenSqlMatchingOneRecord_ShouldReturnPoco() { DB.Insert(_person); (await DB.FirstAsync(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))).ShouldNotBeNull(); } [Fact] public async void FirstAsync_GivenSqlMatchingTwoRecords_ShouldReturnFirstPoco() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); (await DB.FirstAsync(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))).ShouldNotBeNull(); } [Fact] public void FirstAsync_GivenSqlMatchingNoRecord_ShouldThrow() { Should.Throw(DB.FirstAsync(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))); } [Fact] public async void FirstOrDefaultAsync_GivenSqlStringAndMatchingOneRecord_ShouldReturnPoco() { DB.Insert(_person); (await DB.FirstOrDefaultAsync($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldNotBeNull(); } [Fact] public async void FirstOrDefaultAsync_GivenSqlStringAndMatchingTwoRecords_ShouldReturnFirstRecord() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); (await DB.FirstOrDefaultAsync($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18)).ShouldNotBeNull(); } [Fact] public async void FirstOrDefaultAsync_GivenSqlStringMatchingNoRecord_ShouldBeNull() { (await DB.FirstOrDefaultAsync(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))).ShouldBeNull(); } [Fact] public async void FirstOrDefaultAsync_GivenSqlMatchingOneRecord_ShouldReturnPoco() { DB.Insert(_person); (await DB.FirstOrDefaultAsync(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))).ShouldNotBeNull(); } [Fact] public async void FirstOrDefaultAsync_GivenSqlMatchingTwoRecords_ShouldReturnFirstPoco() { DB.Insert(_person); _person.Id = Guid.NewGuid(); DB.Insert(_person); (await DB.FirstOrDefaultAsync(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))).ShouldNotBeNull(); } [Fact] public async void FirstOrDefaultAsync_GivenSqlMatchingNoRecord_ShouldBeNull() { (await DB.FirstOrDefaultAsync(new Sql($"WHERE {DB.Provider.EscapeSqlIdentifier("Age")} = @0", 18))).ShouldBeNull(); } } }