added unit testing.
This commit is contained in:
parent
2510567a10
commit
54f40a2586
6
Data.sln
6
Data.sln
@ -13,6 +13,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
|
||||
README.md = README.md
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PoweredSoft.Data.EntityFrameworkCore.Test", "PoweredSoft.Data.EntityFrameworkCore.Test\PoweredSoft.Data.EntityFrameworkCore.Test.csproj", "{1F0B95F6-2E97-4FC2-A452-F8A071CBEF4B}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@ -27,6 +29,10 @@ Global
|
||||
{78EEC90C-F2C3-4B59-93DA-DE22BFD1FD30}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{78EEC90C-F2C3-4B59-93DA-DE22BFD1FD30}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{78EEC90C-F2C3-4B59-93DA-DE22BFD1FD30}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{1F0B95F6-2E97-4FC2-A452-F8A071CBEF4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1F0B95F6-2E97-4FC2-A452-F8A071CBEF4B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1F0B95F6-2E97-4FC2-A452-F8A071CBEF4B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1F0B95F6-2E97-4FC2-A452-F8A071CBEF4B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
@ -0,0 +1,37 @@
|
||||
using PoweredSoft.Test.Mock;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using Xunit;
|
||||
using Xunit.Abstractions;
|
||||
|
||||
namespace PoweredSoft.Data.EntityFrameworkCore.Test
|
||||
{
|
||||
public class DbContextFactoryPrimaryKeyTests
|
||||
{
|
||||
private readonly ITestOutputHelper output;
|
||||
|
||||
public DbContextFactoryPrimaryKeyTests(ITestOutputHelper output)
|
||||
{
|
||||
this.output = output;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Simple()
|
||||
{
|
||||
MockContextFactory.SeedAndTestContextFor("DbContextFactoryPrimaryKeyTests_Simple", TestSeeders.SimpleSeedScenario, ctx =>
|
||||
{
|
||||
var sw = new Stopwatch();
|
||||
sw.Start();
|
||||
var factory = new DbContextFactory(ctx);
|
||||
var keys = factory.GetKeyProperties(typeof(Order));
|
||||
Assert.Single<PropertyInfo>(keys, t => t.Name == "Id");
|
||||
sw.Stop();
|
||||
output.WriteLine($"Stop Watch of success took: {sw.Elapsed}");
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
47
PoweredSoft.Data.EntityFrameworkCore.Test/Mock/Entities.cs
Normal file
47
PoweredSoft.Data.EntityFrameworkCore.Test/Mock/Entities.cs
Normal file
@ -0,0 +1,47 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace PoweredSoft.Test.Mock
|
||||
{
|
||||
public class Order
|
||||
{
|
||||
public long Id { get; set; }
|
||||
public long OrderNum { get; set; }
|
||||
public DateTime Date { get; set; }
|
||||
public long CustomerId { get; set; }
|
||||
|
||||
public virtual Customer Customer { get; set; }
|
||||
public ICollection<OrderItem> OrderItems { get; set; } = new HashSet<OrderItem>();
|
||||
}
|
||||
|
||||
public class Customer
|
||||
{
|
||||
public long Id { get; set; }
|
||||
public string FirstName { get; set; }
|
||||
public string LastName { get; set; }
|
||||
|
||||
|
||||
public ICollection<Order> Orders { get; set; } = new HashSet<Order>();
|
||||
}
|
||||
|
||||
public class Item
|
||||
{
|
||||
public long Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public decimal Price { get; set; }
|
||||
|
||||
public virtual ICollection<OrderItem> OrderItems { get; set; } = new HashSet<OrderItem>();
|
||||
}
|
||||
|
||||
public class OrderItem
|
||||
{
|
||||
public long Id { get; set; }
|
||||
public long Quantity { get; set; }
|
||||
public decimal PriceAtTheTime { get; set; }
|
||||
public long ItemId { get; set; }
|
||||
public long OrderId { get; set; }
|
||||
|
||||
public virtual Item Item { get; set; }
|
||||
public virtual Order Order { get; set; }
|
||||
}
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace PoweredSoft.Test.Mock
|
||||
{
|
||||
public class MockContext : DbContext
|
||||
{
|
||||
public virtual DbSet<Customer> Customers { get; set; }
|
||||
public virtual DbSet<Item> Items { get; set; }
|
||||
public virtual DbSet<Order> Orders { get; set; }
|
||||
public virtual DbSet<OrderItem> OrderItems { get; set; }
|
||||
public virtual DbSet<Ticket> Tickets { get; set; }
|
||||
|
||||
public MockContext()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public MockContext(DbContextOptions<MockContext> options)
|
||||
: base(options)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Engine.ClientProtocol;
|
||||
using Xunit.Sdk;
|
||||
|
||||
namespace PoweredSoft.Test.Mock
|
||||
{
|
||||
public static class MockContextFactory
|
||||
{
|
||||
public static void TestContextFor(string testName, Action<MockContext> action)
|
||||
{
|
||||
var options = new DbContextOptionsBuilder<MockContext>().UseInMemoryDatabase(databaseName: testName).Options;
|
||||
using (var ctx = new MockContext(options))
|
||||
action(ctx);
|
||||
}
|
||||
|
||||
public static void SeedAndTestContextFor(string testName, Action<string> seedAction, Action<MockContext> action)
|
||||
{
|
||||
seedAction(testName);
|
||||
TestContextFor(testName, action);
|
||||
}
|
||||
}
|
||||
}
|
139
PoweredSoft.Data.EntityFrameworkCore.Test/Mock/TestSeeders.cs
Normal file
139
PoweredSoft.Data.EntityFrameworkCore.Test/Mock/TestSeeders.cs
Normal file
@ -0,0 +1,139 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace PoweredSoft.Test.Mock
|
||||
{
|
||||
public static class TestSeeders
|
||||
{
|
||||
public static void SimpleSeedScenario(string testName)
|
||||
{
|
||||
MockContextFactory.TestContextFor(testName, ctx =>
|
||||
{
|
||||
ctx.AddRange(new Customer[]
|
||||
{
|
||||
new Customer() { Id = 1, FirstName = "David", LastName = "Lebee" },
|
||||
new Customer() { Id = 2, FirstName = "John", LastName = "Doe" },
|
||||
new Customer() { Id = 3, FirstName = "Chuck", LastName = "Norris" },
|
||||
new Customer() { Id = 4, FirstName = "Nelson", LastName = "Mendela" },
|
||||
new Customer() { Id = 5, FirstName = "Jimi", LastName = "Hendrix" },
|
||||
new Customer() { Id = 6, FirstName = "Axel", LastName = "Rose" },
|
||||
new Customer() { Id = 7, FirstName = "John", LastName = "Frusciante" },
|
||||
new Customer() { Id = 8, FirstName = "Michael", LastName = "Jackson" },
|
||||
new Customer() { Id = 9, FirstName = "Anita", LastName = "Franklin" },
|
||||
});
|
||||
|
||||
ctx.AddRange(new Item[]
|
||||
{
|
||||
new Item { Id = 1, Name = "Computer", Price = 1000M },
|
||||
new Item { Id = 2, Name = "Mice", Price = 25.99M },
|
||||
new Item { Id = 3, Name = "Keyboard", Price = 100M },
|
||||
new Item { Id = 4, Name = "Screen", Price = 499.98M },
|
||||
new Item { Id = 5, Name = "Printer", Price = 230.95M },
|
||||
new Item { Id = 6, Name = "HDMI Cables", Price = 20M },
|
||||
new Item { Id = 7, Name = "Power Cables", Price = 5.99M }
|
||||
});
|
||||
|
||||
ctx.Orders.AddRange(new Order[]
|
||||
{
|
||||
new Order()
|
||||
{
|
||||
Id = 1,
|
||||
OrderNum = 1000,
|
||||
CustomerId = 1,
|
||||
Date = new DateTime(2018, 1, 1),
|
||||
OrderItems = new List<OrderItem>()
|
||||
{
|
||||
new OrderItem() { Id = 1, ItemId = 1, PriceAtTheTime = 1000M, Quantity = 1 },
|
||||
new OrderItem() { Id = 2, ItemId = 2, PriceAtTheTime = 30M, Quantity = 1 },
|
||||
new OrderItem() { Id = 3, ItemId = 4, PriceAtTheTime = 399.99M, Quantity = 2 },
|
||||
new OrderItem() { Id = 4, ItemId = 6, PriceAtTheTime = 20, Quantity = 2 },
|
||||
new OrderItem() { Id = 8, ItemId = 6, PriceAtTheTime = 3.99M, Quantity = 3 }
|
||||
}
|
||||
},
|
||||
new Order()
|
||||
{
|
||||
Id = 2,
|
||||
OrderNum = 1001,
|
||||
CustomerId = 2,
|
||||
Date = new DateTime(2018, 2, 1),
|
||||
OrderItems = new List<OrderItem>()
|
||||
{
|
||||
new OrderItem() { Id = 9, ItemId = 6, PriceAtTheTime = 20, Quantity = 2 },
|
||||
new OrderItem() { Id = 10, ItemId = 6, PriceAtTheTime = 3.99M, Quantity = 3 }
|
||||
}
|
||||
},
|
||||
new Order()
|
||||
{
|
||||
Id = 3,
|
||||
OrderNum = 1002,
|
||||
CustomerId = 3,
|
||||
Date = new DateTime(2018, 2, 1),
|
||||
OrderItems = new List<OrderItem>()
|
||||
{
|
||||
new OrderItem() { Id = 11, ItemId = 5, PriceAtTheTime = 499.99M, Quantity = 1 },
|
||||
new OrderItem() { Id = 12, ItemId = 6, PriceAtTheTime = 20, Quantity = 1 },
|
||||
new OrderItem() { Id = 13, ItemId = 7, PriceAtTheTime = 3.99M, Quantity = 1 }
|
||||
}
|
||||
},
|
||||
new Order()
|
||||
{
|
||||
Id = 4,
|
||||
OrderNum = 1003,
|
||||
CustomerId = 1,
|
||||
Date = new DateTime(2018, 3, 1),
|
||||
OrderItems = new List<OrderItem>()
|
||||
{
|
||||
new OrderItem() { Id = 14, ItemId = 2, PriceAtTheTime = 50M, Quantity = 1 },
|
||||
new OrderItem() { Id = 15, ItemId = 3, PriceAtTheTime = 75.50M, Quantity = 1 },
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
ctx.SaveChanges();
|
||||
});
|
||||
}
|
||||
|
||||
internal static void SeedTicketScenario(string testName)
|
||||
{
|
||||
MockContextFactory.TestContextFor(testName, ctx =>
|
||||
{
|
||||
var faker = new Bogus.Faker<Ticket>()
|
||||
.RuleFor(t => t.TicketType, (f, u) => f.PickRandom("new", "open", "refused", "closed"))
|
||||
.RuleFor(t => t.Title, (f, u) => f.Lorem.Sentence())
|
||||
.RuleFor(t => t.Details, (f, u) => f.Lorem.Paragraph())
|
||||
.RuleFor(t => t.IsHtml, (f, u) => false)
|
||||
.RuleFor(t => t.TagList, (f, u) => string.Join(",", f.Commerce.Categories(3)))
|
||||
.RuleFor(t => t.CreatedDate, (f, u) => f.Date.Recent(100))
|
||||
.RuleFor(t => t.Owner, (f, u) => f.Person.FullName)
|
||||
.RuleFor(t => t.AssignedTo, (f, u) => f.Person.FullName)
|
||||
.RuleFor(t => t.TicketStatus, (f, u) => f.PickRandom(1, 2, 3))
|
||||
.RuleFor(t => t.LastUpdateBy, (f, u) => f.Person.FullName)
|
||||
.RuleFor(t => t.LastUpdateDate, (f, u) => f.Date.Soon(5))
|
||||
.RuleFor(t => t.Priority, (f, u) => f.PickRandom("low", "medium", "high", "critical"))
|
||||
.RuleFor(t => t.AffectedCustomer, (f, u) => f.PickRandom(true, false))
|
||||
.RuleFor(t => t.Version, (f, u) => f.PickRandom("1.0.0", "1.1.0", "2.0.0"))
|
||||
.RuleFor(t => t.ProjectId, (f, u) => f.Random.Number(100))
|
||||
.RuleFor(t => t.DueDate, (f, u) => f.Date.Soon(5))
|
||||
.RuleFor(t => t.EstimatedDuration, (f, u) => f.Random.Number(20))
|
||||
.RuleFor(t => t.ActualDuration, (f, u) => f.Random.Number(20))
|
||||
.RuleFor(t => t.TargetDate, (f, u) => f.Date.Soon(5))
|
||||
.RuleFor(t => t.ResolutionDate, (f, u) => f.Date.Soon(5))
|
||||
.RuleFor(t => t.Type, (f, u) => f.PickRandom(1, 2, 3))
|
||||
.RuleFor(t => t.ParentId, () => 0)
|
||||
.RuleFor(t => t.PreferredLanguage, (f, u) => f.PickRandom("fr", "en", "es"))
|
||||
;
|
||||
|
||||
var fakeModels = new List<Ticket>();
|
||||
for (var i = 0; i < 500; i++)
|
||||
{
|
||||
var t = faker.Generate();
|
||||
t.TicketId = i + 1;
|
||||
fakeModels.Add(t);
|
||||
}
|
||||
|
||||
ctx.AddRange(fakeModels);
|
||||
ctx.SaveChanges();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
36
PoweredSoft.Data.EntityFrameworkCore.Test/Mock/Ticket.cs
Normal file
36
PoweredSoft.Data.EntityFrameworkCore.Test/Mock/Ticket.cs
Normal file
@ -0,0 +1,36 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace PoweredSoft.Test.Mock
|
||||
{
|
||||
public class Ticket
|
||||
{
|
||||
public int TicketId { get; set; }
|
||||
public string TicketType { get; set; }
|
||||
public string Title { get; set; }
|
||||
public string Details { get; set; }
|
||||
public bool IsHtml { get; set; }
|
||||
public string TagList { get; set; }
|
||||
public DateTimeOffset CreatedDate { get; set; }
|
||||
public string Owner { get; set; }
|
||||
public string AssignedTo { get; set; }
|
||||
public int TicketStatus { get; set; }
|
||||
public DateTimeOffset CurrentStatusDate { get; set; }
|
||||
public string CurrentStatusSetBy { get; set; }
|
||||
public string LastUpdateBy { get; set; }
|
||||
public DateTimeOffset LastUpdateDate { get; set; }
|
||||
public string Priority { get; set; }
|
||||
public bool AffectedCustomer { get; set; }
|
||||
public string Version { get; set; }
|
||||
public int ProjectId { get; set; }
|
||||
public DateTimeOffset DueDate { get; set; }
|
||||
public decimal EstimatedDuration { get; set; }
|
||||
public decimal ActualDuration { get; set; }
|
||||
public DateTimeOffset TargetDate { get; set; }
|
||||
public DateTimeOffset ResolutionDate { get; set; }
|
||||
public int Type { get; set; }
|
||||
public int ParentId { get; set; }
|
||||
public string PreferredLanguage { get; set; }
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Bogus" Version="24.3.1" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="2.1.4" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" />
|
||||
<PackageReference Include="xunit" Version="2.3.1" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\PoweredSoft.Data.EntityFrameworkCore\PoweredSoft.Data.EntityFrameworkCore.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
Loading…
Reference in New Issue
Block a user