diff --git a/.travis.yml b/.travis.yml index 7155b12..2bffd44 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ +dist: trusty sudo: required language: c @@ -5,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 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..13c3411 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,9 @@ services: environment: ACCEPT_EULA: "Y" SA_PASSWORD: "Rea11ytrong_3" + pgsql: + image: postgres + environment: + POSTGRES_PASSWORD: "Rea11ytrong_3" + POSTGRES_USER: "tester" + POSTGRES_DB: "dotnettest" 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/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 @@ - + diff --git a/test/DatatablesParser.Tests/DatatablesParser.Tests.csproj b/test/DatatablesParser.Tests/DatatablesParser.Tests.csproj index 24783f7..14d4269 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,11 +8,12 @@ - - - - + + + + + - \ No newline at end of file + 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/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..762585f 100755 --- a/test/DatatablesParser.Tests/TestHelper.cs +++ b/test/DatatablesParser.Tests/TestHelper.cs @@ -5,8 +5,9 @@ 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; +using Microsoft.Extensions.Logging; namespace DataTablesParser.Tests { @@ -154,7 +155,7 @@ public static PersonContext GetInMemoryContext() .BuildServiceProvider(); var builder = new DbContextOptionsBuilder(); - builder.UseInMemoryDatabase() + builder.UseInMemoryDatabase("testdb") .UseInternalServiceProvider(serviceProvider); var context = new PersonContext(builder.Options); @@ -166,20 +167,49 @@ 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(); + context.Database.ExecuteSqlCommand("truncate table People;"); + + context.People.AddRange(CreateData()); + context.SaveChanges(); + + return context; + + } + + public static PersonContext GetPgsqlContext() { var serviceProvider = new ServiceCollection() - .AddEntityFrameworkMySQL() + .AddEntityFrameworkNpgsql() .BuildServiceProvider(); + var lf = serviceProvider.GetService(); + lf.AddProvider(new EFlogger()); + var builder = new DbContextOptionsBuilder(); - builder.UseMySQL(@"server=mysql;database=dotnettest;user=tester;password=Rea11ytrong_3") + 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 People;"); + context.Database.ExecuteSqlCommand("truncate table public.\"People\";"); context.People.AddRange(CreateData()); context.SaveChanges(); @@ -196,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); 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