From e494eb1fa5d8620c62d2a4ff205a7864072c7453 Mon Sep 17 00:00:00 2001 From: Garvin Date: Wed, 16 Aug 2017 22:50:54 -0400 Subject: [PATCH 1/8] Use EF Core 2 in tests and add pgsql --- Dockerfile-test | 2 +- docker-compose-test.yaml | 9 +++ .../DatatablesParser.Tests.csproj | 11 +-- .../LinqToObjectTests.cs | 6 +- .../MssqlEntityTests.cs | 6 +- .../MysqlEntityTests.cs | 6 +- .../PgsqlEntityTests.cs | 69 +++++++++++++++++++ test/DatatablesParser.Tests/TestHelper.cs | 33 +++++++-- test/DatatablesParser.Tests/test-runner.sh | 2 +- 9 files changed, 123 insertions(+), 21 deletions(-) create mode 100644 test/DatatablesParser.Tests/PgsqlEntityTests.cs diff --git a/Dockerfile-test b/Dockerfile-test index f39549b..3712e7b 100644 --- a/Dockerfile-test +++ b/Dockerfile-test @@ -1,4 +1,4 @@ -FROM microsoft/dotnet:1.1.2-sdk +FROM microsoft/dotnet:2.0.0-sdk RUN apt-get update && apt-get install -y netcat COPY /src /src COPY /test /test diff --git a/docker-compose-test.yaml b/docker-compose-test.yaml index 283b251..820ff0d 100644 --- a/docker-compose-test.yaml +++ b/docker-compose-test.yaml @@ -8,6 +8,7 @@ services: depends_on: - mysql - mssql + - pgsql mysql: image: mysql container_name: dotnet-test-mysql @@ -23,3 +24,11 @@ services: environment: ACCEPT_EULA: "Y" SA_PASSWORD: "Rea11ytrong_3" + pgsql: + image: postgres + environment: + POSTGRES_PASSWORD: "Rea11ytrong_3" + POSTGRES_USER: "tester" + POSTGRES_DB: "dotnettest" + ports: + - 5432:5432 \ No newline at end of file diff --git a/test/DatatablesParser.Tests/DatatablesParser.Tests.csproj b/test/DatatablesParser.Tests/DatatablesParser.Tests.csproj index 24783f7..fad622b 100644 --- a/test/DatatablesParser.Tests/DatatablesParser.Tests.csproj +++ b/test/DatatablesParser.Tests/DatatablesParser.Tests.csproj @@ -1,6 +1,6 @@ - netcoreapp1.1.2 + netcoreapp2.0 DatatablesParser.Tests DatatablesParser.Tests @@ -8,10 +8,11 @@ - - - - + + + + + diff --git a/test/DatatablesParser.Tests/LinqToObjectTests.cs b/test/DatatablesParser.Tests/LinqToObjectTests.cs index a71fb11..5722a8e 100644 --- a/test/DatatablesParser.Tests/LinqToObjectTests.cs +++ b/test/DatatablesParser.Tests/LinqToObjectTests.cs @@ -19,7 +19,7 @@ public void TotalRecordsTest() var parser = new Parser(p, context.People.AsQueryable()); - Console.WriteLine("Total People TotalRecordsTest: {0}",context.People.Count()); + Console.WriteLine("InMemory - Total People TotalRecordsTest: {0}",context.People.Count()); Assert.Equal(context.People.Count(),parser.Parse().recordsTotal); @@ -39,7 +39,7 @@ public void TotalResultsTest() var parser = new Parser(p, context.People.AsQueryable()); - Console.WriteLine("Total People TotalResultsTest: {0}",context.People.Count()); + Console.WriteLine("InMemory - Total People TotalResultsTest: {0}",context.People.Count()); Assert.Equal(resultLength, parser.Parse().data.Count); @@ -58,7 +58,7 @@ public void TotalDisplayTest() var parser = new Parser(p, context.People.ToList().AsQueryable()); - Console.WriteLine("Total People TotalDisplayTest: {0}",context.People.Count()); + Console.WriteLine("InMemory - Total People TotalDisplayTest: {0}",context.People.Count()); Assert.Equal(displayLength, parser.Parse().recordsFiltered); diff --git a/test/DatatablesParser.Tests/MssqlEntityTests.cs b/test/DatatablesParser.Tests/MssqlEntityTests.cs index afb1281..6cc5f8c 100644 --- a/test/DatatablesParser.Tests/MssqlEntityTests.cs +++ b/test/DatatablesParser.Tests/MssqlEntityTests.cs @@ -19,7 +19,7 @@ public void TotalRecordsTest() var parser = new Parser(p, context.People.AsQueryable()); - Console.WriteLine("Total People TotalRecordsTest: {0}",context.People.Count()); + Console.WriteLine("Mssql - Total People TotalRecordsTest: {0}",context.People.Count()); Assert.Equal(context.People.Count(),parser.Parse().recordsTotal); @@ -39,7 +39,7 @@ public void TotalResultsTest() var parser = new Parser(p, context.People.AsQueryable()); - Console.WriteLine("Total People TotalResultsTest: {0}",context.People.Count()); + Console.WriteLine("Mssql - Total People TotalResultsTest: {0}",context.People.Count()); Assert.Equal(resultLength, parser.Parse().data.Count); @@ -58,7 +58,7 @@ public void TotalDisplayTest() var parser = new Parser(p, context.People.AsQueryable()); - Console.WriteLine("Total People TotalDisplayTest: {0}",context.People.Count()); + Console.WriteLine("Mssql - Total People TotalDisplayTest: {0}",context.People.Count()); Assert.Equal(displayLength, parser.Parse().recordsFiltered); diff --git a/test/DatatablesParser.Tests/MysqlEntityTests.cs b/test/DatatablesParser.Tests/MysqlEntityTests.cs index f1cbc7f..c259435 100644 --- a/test/DatatablesParser.Tests/MysqlEntityTests.cs +++ b/test/DatatablesParser.Tests/MysqlEntityTests.cs @@ -19,7 +19,7 @@ public void TotalRecordsTest() var parser = new Parser(p, context.People.AsQueryable()); - Console.WriteLine("Total People TotalRecordsTest: {0}",context.People.Count()); + Console.WriteLine("Mysql - Total People TotalRecordsTest: {0}",context.People.Count()); Assert.Equal(context.People.Count(),parser.Parse().recordsTotal); @@ -39,7 +39,7 @@ public void TotalResultsTest() var parser = new Parser(p, context.People.AsQueryable()); - Console.WriteLine("Total People TotalResultsTest: {0}",context.People.Count()); + Console.WriteLine("Mysql - Total People TotalResultsTest: {0}",context.People.Count()); Assert.Equal(resultLength, parser.Parse().data.Count); @@ -58,7 +58,7 @@ public void TotalDisplayTest() var parser = new Parser(p, context.People.AsQueryable()); - Console.WriteLine("Total People TotalDisplayTest: {0}",context.People.Count()); + Console.WriteLine("Mysql - Total People TotalDisplayTest: {0}",context.People.Count()); Assert.Equal(displayLength, parser.Parse().recordsFiltered); diff --git a/test/DatatablesParser.Tests/PgsqlEntityTests.cs b/test/DatatablesParser.Tests/PgsqlEntityTests.cs new file mode 100644 index 0000000..d61e7c1 --- /dev/null +++ b/test/DatatablesParser.Tests/PgsqlEntityTests.cs @@ -0,0 +1,69 @@ +using System; +using Xunit; +using DataTablesParser; +using System.Linq; +using Microsoft.Extensions.Primitives; + +namespace DataTablesParser.Tests +{ + + public class PgsqlEntityTests + { + + [Fact] + public void TotalRecordsTest() + { + var context = TestHelper.GetPgsqlContext(); + + var p = TestHelper.CreateParams(); + + var parser = new Parser(p, context.People.AsQueryable()); + + Console.WriteLine("Pgsql - Total People TotalRecordsTest: {0}",context.People.Count()); + + Assert.Equal(context.People.Count(),parser.Parse().recordsTotal); + + } + + [Fact] + public void TotalResultsTest() + { + var context = TestHelper.GetPgsqlContext(); + + var p = TestHelper.CreateParams(); + + var resultLength = 3; + + //override display length + p[Constants.DISPLAY_LENGTH] = new StringValues(Convert.ToString(resultLength)); + + var parser = new Parser(p, context.People.AsQueryable()); + + Console.WriteLine("Pgsql - Total People TotalResultsTest: {0}",context.People.Count()); + + Assert.Equal(resultLength, parser.Parse().data.Count); + + } + + [Fact] + public void TotalDisplayTest() + { + var context = TestHelper.GetPgsqlContext(); + var p = TestHelper.CreateParams(); + var displayLength = 1; + + + //Set filter parameter + p[Constants.SEARCH_KEY] = new StringValues("Cromie"); + + var parser = new Parser(p, context.People.AsQueryable()); + + Console.WriteLine("Pgsql - Total People TotalDisplayTest: {0}",context.People.Count()); + + Assert.Equal(displayLength, parser.Parse().recordsFiltered); + + } + + + } +} \ No newline at end of file diff --git a/test/DatatablesParser.Tests/TestHelper.cs b/test/DatatablesParser.Tests/TestHelper.cs index 1474cb5..84ad4a7 100755 --- a/test/DatatablesParser.Tests/TestHelper.cs +++ b/test/DatatablesParser.Tests/TestHelper.cs @@ -5,8 +5,8 @@ using System.Linq; using Microsoft.Extensions.DependencyInjection; using Microsoft.EntityFrameworkCore; -using MySQL.Data.EntityFrameworkCore.Extensions; -using MySQL.Data.EntityFrameworkCore; +using Pomelo.EntityFrameworkCore.MySql; +using Npgsql.EntityFrameworkCore.PostgreSQL; namespace DataTablesParser.Tests { @@ -154,7 +154,7 @@ public static PersonContext GetInMemoryContext() .BuildServiceProvider(); var builder = new DbContextOptionsBuilder(); - builder.UseInMemoryDatabase() + builder.UseInMemoryDatabase("testdb") .UseInternalServiceProvider(serviceProvider); var context = new PersonContext(builder.Options); @@ -169,11 +169,11 @@ public static PersonContext GetMysqlContext() { var serviceProvider = new ServiceCollection() - .AddEntityFrameworkMySQL() + .AddEntityFrameworkMySql() .BuildServiceProvider(); var builder = new DbContextOptionsBuilder(); - builder.UseMySQL(@"server=mysql;database=dotnettest;user=tester;password=Rea11ytrong_3") + builder.UseMySql(@"server=mysql;database=dotnettest;user=tester;password=Rea11ytrong_3") .UseInternalServiceProvider(serviceProvider); var context = new PersonContext(builder.Options); @@ -187,6 +187,29 @@ public static PersonContext GetMysqlContext() return context; } + + public static PersonContext GetPgsqlContext() + { + + var serviceProvider = new ServiceCollection() + .AddEntityFrameworkNpgsql() + .BuildServiceProvider(); + + var builder = new DbContextOptionsBuilder(); + builder.UseNpgsql(@"Host=pgsql;Database=dotnettest;User ID=tester;Password=Rea11ytrong_3") + .UseInternalServiceProvider(serviceProvider); + + var context = new PersonContext(builder.Options); + + context.Database.EnsureCreated(); + context.Database.ExecuteSqlCommand("truncate table public.\"People\";"); + + context.People.AddRange(CreateData()); + context.SaveChanges(); + + return context; + + } public static PersonContext GetMssqlContext() diff --git a/test/DatatablesParser.Tests/test-runner.sh b/test/DatatablesParser.Tests/test-runner.sh index 250bbc3..707d692 100755 --- a/test/DatatablesParser.Tests/test-runner.sh +++ b/test/DatatablesParser.Tests/test-runner.sh @@ -5,7 +5,7 @@ echo "Restore and build while db servers are starting" dotnet restore dotnet build echo "Testing connections to test db servers" -while ! ( nc -w 1 mssql 1433 &> /dev/null && nc -w 1 mysql 3306 &> /dev/null ) ; do +while ! ( nc -w 1 mssql 1433 &> /dev/null && nc -w 1 mysql 3306 &> /dev/null && nc -w 1 pgsql 5432 &> /dev/null) ; do sleep 3; echo "Test db servers not ready. Trying again" done From c290e0aa328e6a0be77b916b458e43c860b91a07 Mon Sep 17 00:00:00 2001 From: Garvin Date: Wed, 16 Aug 2017 22:56:08 -0400 Subject: [PATCH 2/8] don't expose ports in travis build --- docker-compose-test.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/docker-compose-test.yaml b/docker-compose-test.yaml index 820ff0d..13c3411 100644 --- a/docker-compose-test.yaml +++ b/docker-compose-test.yaml @@ -30,5 +30,3 @@ services: POSTGRES_PASSWORD: "Rea11ytrong_3" POSTGRES_USER: "tester" POSTGRES_DB: "dotnettest" - ports: - - 5432:5432 \ No newline at end of file From 66f60fcbd316648b6e3acea7ed154c72b315a7d5 Mon Sep 17 00:00:00 2001 From: Garvin Date: Wed, 16 Aug 2017 23:29:29 -0400 Subject: [PATCH 3/8] ensure trusty sudo --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 7155b12..efb171c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ +dist: trusty sudo: required language: c From ba00b60d3bcc0592b543ff4a9d290c21db4021a4 Mon Sep 17 00:00:00 2001 From: Garvin Date: Wed, 16 Aug 2017 23:36:06 -0400 Subject: [PATCH 4/8] Stop default db servers --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index efb171c..2bffd44 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,5 +6,9 @@ language: c services: - docker +before_install: + - sudo /etc/init.d/mysql stop + - sudo /etc/init.d/postgresql stop + script: - docker-compose -f docker-compose-test.yaml up --force-recreate --exit-code-from test-runner --build test-runner \ No newline at end of file From e05e7c5f944536912abfb2bd1a27455a81df9650 Mon Sep 17 00:00:00 2001 From: Garvin Date: Thu, 17 Aug 2017 02:05:45 -0400 Subject: [PATCH 5/8] Adding logger to validate sql generated in tests --- test/DatatablesParser.Tests/EFlogger.cs | 36 +++++++++++++++++++++++ test/DatatablesParser.Tests/TestHelper.cs | 11 +++++-- 2 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 test/DatatablesParser.Tests/EFlogger.cs diff --git a/test/DatatablesParser.Tests/EFlogger.cs b/test/DatatablesParser.Tests/EFlogger.cs new file mode 100644 index 0000000..6c17a0a --- /dev/null +++ b/test/DatatablesParser.Tests/EFlogger.cs @@ -0,0 +1,36 @@ +using Microsoft.Extensions.Logging; +using System; +using System.IO; + +namespace DataTablesParser.Tests +{ + public class EFlogger : ILoggerProvider + { + public ILogger CreateLogger(string categoryName) + { + return new MyLogger(); + } + + public void Dispose() + { } + + private class MyLogger : ILogger + { + public bool IsEnabled(LogLevel logLevel) + { + return true; + } + + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) + { + + Console.WriteLine(formatter(state, exception)); + } + + public IDisposable BeginScope(TState state) + { + return null; + } + } + } +} \ No newline at end of file diff --git a/test/DatatablesParser.Tests/TestHelper.cs b/test/DatatablesParser.Tests/TestHelper.cs index 84ad4a7..f925ff7 100755 --- a/test/DatatablesParser.Tests/TestHelper.cs +++ b/test/DatatablesParser.Tests/TestHelper.cs @@ -7,6 +7,7 @@ using Microsoft.EntityFrameworkCore; using Pomelo.EntityFrameworkCore.MySql; using Npgsql.EntityFrameworkCore.PostgreSQL; +using Microsoft.Extensions.Logging; namespace DataTablesParser.Tests { @@ -167,15 +168,19 @@ public static PersonContext GetInMemoryContext() public static PersonContext GetMysqlContext() { - + var serviceProvider = new ServiceCollection() .AddEntityFrameworkMySql() .BuildServiceProvider(); - + + + var lf = serviceProvider.GetService(); + lf.AddProvider(new EFlogger()); + var builder = new DbContextOptionsBuilder(); builder.UseMySql(@"server=mysql;database=dotnettest;user=tester;password=Rea11ytrong_3") .UseInternalServiceProvider(serviceProvider); - + var context = new PersonContext(builder.Options); context.Database.EnsureCreated(); From 45fd24b9321e6ccf7ac091f1dacde369b5fb18df Mon Sep 17 00:00:00 2001 From: Garvin Date: Thu, 17 Aug 2017 02:47:54 -0400 Subject: [PATCH 6/8] Return support for numeric and date filters. Add logger to all tests. --- src/DatatablesParser/DatatablesParser.cs | 33 ++++++++++++++++++----- test/DatatablesParser.Tests/TestHelper.cs | 7 ++++- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/DatatablesParser/DatatablesParser.cs b/src/DatatablesParser/DatatablesParser.cs index 7443a6f..e1c25f7 100755 --- a/src/DatatablesParser/DatatablesParser.cs +++ b/src/DatatablesParser/DatatablesParser.cs @@ -21,10 +21,18 @@ public class Parser where T : class private bool _sortDisabled = false; - private Type[] _translatable = + private Type[] _convertable = { - typeof(string) - + typeof(int), + typeof(Nullable), + typeof(decimal), + typeof(Nullable), + typeof(float), + typeof(Nullable), + typeof(double), + typeof(Nullable), + typeof(DateTime), + typeof(Nullable) }; public Parser(IEnumerable> configParams, IQueryable queriable) @@ -239,14 +247,23 @@ private Expression> GenerateEntityFilter() foreach (var propMap in _propertyMap) { var property = propMap.Value.Property; - - if (!property.CanWrite || !propMap.Value.Searchable || !_translatable.Any(t => t == property.PropertyType) ) + var isString = property.PropertyType == typeof(string); + if (!property.CanWrite || !propMap.Value.Searchable || (!_convertable.Any(t => t == property.PropertyType) && !isString ) ) { continue; } + + Expression propExp = Expression.Property(paramExpression, property); + + if (!isString) + { + var toString = property.PropertyType.GetMethod("ToString", Type.EmptyTypes); - var propExp = Expression.Property(paramExpression, property); - var toLower = Expression.Call(propExp,typeof(string).GetMethod("ToLower", new Type[0])); + propExp = Expression.Call(propExp, toString); + + } + + var toLower = Expression.Call(propExp,typeof(string).GetMethod("ToLower", Type.EmptyTypes)); searchProps.Add(Expression.Call(toLower, typeof(string).GetMethod("Contains"), searchExpression)); @@ -279,6 +296,8 @@ private class PropertyMapping public string SearchInput { get; set; } //Not yet implemented } + + } public class FormatedList { diff --git a/test/DatatablesParser.Tests/TestHelper.cs b/test/DatatablesParser.Tests/TestHelper.cs index f925ff7..762585f 100755 --- a/test/DatatablesParser.Tests/TestHelper.cs +++ b/test/DatatablesParser.Tests/TestHelper.cs @@ -173,7 +173,6 @@ public static PersonContext GetMysqlContext() .AddEntityFrameworkMySql() .BuildServiceProvider(); - var lf = serviceProvider.GetService(); lf.AddProvider(new EFlogger()); @@ -200,6 +199,9 @@ public static PersonContext GetPgsqlContext() .AddEntityFrameworkNpgsql() .BuildServiceProvider(); + var lf = serviceProvider.GetService(); + lf.AddProvider(new EFlogger()); + var builder = new DbContextOptionsBuilder(); builder.UseNpgsql(@"Host=pgsql;Database=dotnettest;User ID=tester;Password=Rea11ytrong_3") .UseInternalServiceProvider(serviceProvider); @@ -224,6 +226,9 @@ public static PersonContext GetMssqlContext() .AddEntityFrameworkSqlServer() .BuildServiceProvider(); + var lf = serviceProvider.GetService(); + lf.AddProvider(new EFlogger()); + var builder = new DbContextOptionsBuilder(); builder.UseSqlServer(@"Data Source=mssql;Initial Catalog=TestNetCoreEF;user id=sa;password=Rea11ytrong_3") .UseInternalServiceProvider(serviceProvider); From c442dcb4c2e20d2df702397a162647be2c3267ff Mon Sep 17 00:00:00 2001 From: Garvin Date: Thu, 17 Aug 2017 19:23:07 -0400 Subject: [PATCH 7/8] release version of asp.net core --- src/aspnet-core-sample/aspnet-core-sample.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aspnet-core-sample/aspnet-core-sample.csproj b/src/aspnet-core-sample/aspnet-core-sample.csproj index 291ea30..143c105 100644 --- a/src/aspnet-core-sample/aspnet-core-sample.csproj +++ b/src/aspnet-core-sample/aspnet-core-sample.csproj @@ -8,7 +8,7 @@ - + From e9af0939bb908af88ca300451f6085ef49b29feb Mon Sep 17 00:00:00 2001 From: Garvin Casimir Date: Tue, 29 Aug 2017 19:25:50 -0400 Subject: [PATCH 8/8] Updating Pomelo mysql --- test/DatatablesParser.Tests/DatatablesParser.Tests.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/DatatablesParser.Tests/DatatablesParser.Tests.csproj b/test/DatatablesParser.Tests/DatatablesParser.Tests.csproj index fad622b..14d4269 100644 --- a/test/DatatablesParser.Tests/DatatablesParser.Tests.csproj +++ b/test/DatatablesParser.Tests/DatatablesParser.Tests.csproj @@ -11,9 +11,9 @@ - + - \ No newline at end of file +