From faab56610c172fbb7d49253e20e81edbc77ad8a7 Mon Sep 17 00:00:00 2001 From: Ruidy Nemausat Date: Wed, 26 Feb 2020 11:34:55 +0100 Subject: [PATCH] Wrote Project COntrollers Test --- Controllers/ProjectsController.cs | 2 +- Startup.cs | 12 +- .../ControllersTests/ControllerTests.cs | 44 +++++++ .../ProjectControllerTests.cs | 122 ++++++++++++++++++ .../UnitTests/ControllersTests/SeedDb.cs | 34 +++++ .../{ => ModelTests}/AppUserModelTests.cs | 0 .../{ => ModelTests}/ProjectModelTests.cs | 0 .../{ => ModelTests}/TicketModelTests.cs | 0 .../UnitTests/ProjectControllerTests.cs | 93 ------------- 9 files changed, 205 insertions(+), 102 deletions(-) create mode 100644 Tests/TicketManager.Tests/UnitTests/ControllersTests/ControllerTests.cs create mode 100644 Tests/TicketManager.Tests/UnitTests/ControllersTests/ProjectControllerTests.cs create mode 100644 Tests/TicketManager.Tests/UnitTests/ControllersTests/SeedDb.cs rename Tests/TicketManager.Tests/UnitTests/{ => ModelTests}/AppUserModelTests.cs (100%) rename Tests/TicketManager.Tests/UnitTests/{ => ModelTests}/ProjectModelTests.cs (100%) rename Tests/TicketManager.Tests/UnitTests/{ => ModelTests}/TicketModelTests.cs (100%) delete mode 100644 Tests/TicketManager.Tests/UnitTests/ProjectControllerTests.cs diff --git a/Controllers/ProjectsController.cs b/Controllers/ProjectsController.cs index bc9543b..0b98104 100644 --- a/Controllers/ProjectsController.cs +++ b/Controllers/ProjectsController.cs @@ -37,7 +37,7 @@ namespace TicketManager.Controllers /// Returns a list of projects [HttpGet] [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetProjects() + public async Task> GetProjects() { return await _context.Projects .Include(p => p.Assignments) diff --git a/Startup.cs b/Startup.cs index 9cd7ec7..a663213 100644 --- a/Startup.cs +++ b/Startup.cs @@ -1,7 +1,6 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; +using System.Reflection; +using System.IO; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.HttpsPolicy; @@ -13,13 +12,10 @@ using Microsoft.Extensions.Logging; using Microsoft.AspNetCore.SpaServices.ReactDevelopmentServer; using Microsoft.EntityFrameworkCore; using Microsoft.OpenApi.Models; -using System.Reflection; -using System.IO; -using TicketManager.Data; -using TicketManager.Models; using Microsoft.AspNetCore.Mvc.NewtonsoftJson; -using Newtonsoft.Json; using Microsoft.AspNetCore.Authentication.JwtBearer; +using Newtonsoft.Json; +using TicketManager.Data; [assembly: ApiController] namespace TicketManager diff --git a/Tests/TicketManager.Tests/UnitTests/ControllersTests/ControllerTests.cs b/Tests/TicketManager.Tests/UnitTests/ControllersTests/ControllerTests.cs new file mode 100644 index 0000000..b91586d --- /dev/null +++ b/Tests/TicketManager.Tests/UnitTests/ControllersTests/ControllerTests.cs @@ -0,0 +1,44 @@ +using System; +using System.Threading.Tasks; +using TicketManager.Data; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; + +namespace TicketManager.Tests +{ + public class ControllersTests + { + + public static void Wrapper( + Func, Task> Test, + Action> SeedDb) + { + // Create inMemory Test Database + var connection = new SqliteConnection("DataSource=:memory:"); + connection.Open(); + + try + { + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; + + // creates DB schema + using (var context = new AppDbContext(options)) + { + context.Database.EnsureCreated(); + } + + // Seed DB usng one context instance + SeedDb(options); + + // use another context instance to run the test + Test(options); + } + finally + { + connection.Close(); + } + } + } +} \ No newline at end of file diff --git a/Tests/TicketManager.Tests/UnitTests/ControllersTests/ProjectControllerTests.cs b/Tests/TicketManager.Tests/UnitTests/ControllersTests/ProjectControllerTests.cs new file mode 100644 index 0000000..dc92819 --- /dev/null +++ b/Tests/TicketManager.Tests/UnitTests/ControllersTests/ProjectControllerTests.cs @@ -0,0 +1,122 @@ +using System; +using Xunit; +using System.Collections.Generic; +using System.Threading.Tasks; +using TicketManager.Controllers; +using TicketManager.Data; +using TicketManager.Models; +using TicketManager.DTO; +using Microsoft.EntityFrameworkCore; +using Microsoft.AspNetCore.Mvc; + +namespace TicketManager.Tests +{ + public class ProjectsControllerTests + { + [Fact] + public void Get_ReturnsListWith2Projects() + { + ControllersTests.Wrapper(Test_GetProjects, SeedDb.Projects); + } + + private static async Task Test_GetProjects(DbContextOptions options) + { + using (var context = new AppDbContext(options)) + { + var controller = new ProjectsController(context); + + var result = await controller.GetProjects(); + + Assert.IsAssignableFrom>(result); + Assert.Equal(2, result.Count); + } + } + + [Fact] + public void Get1_Returns1Project() + { + ControllersTests.Wrapper(Test_GetProject, SeedDb.Projects); + } + + private static async Task Test_GetProject(DbContextOptions options) + { + using (var context = new AppDbContext(options)) + { + var controller = new ProjectsController(context); + + // Should Return 1 Project + var result = await controller.GetProject(1); + Assert.IsAssignableFrom(result); + + // Should Return NotFound + result = await controller.GetProject(3); + Assert.IsType(result); + } + } + + [Fact] + public void Put1_Updates1Project() + { + ControllersTests.Wrapper(Test_PutProject, SeedDb.Projects); + } + + private static async Task Test_PutProject(DbContextOptions options) + { + using (var context = new AppDbContext(options)) + { + var controller = new ProjectsController(context); + + var result = await controller.PutProject(1, + new Project() + { + Id = 1, + Title = "Top Secret Project", + Description = "Shht Don't Ask don't tell", + PlannedEnding = new DateTime(2020, 7, 21) + } + ); + + // Should Update + Assert.Equal("Top Secret Project", context.Projects.Find(1).Title); + Assert.Equal(new DateTime(2020, 7, 21), context.Projects.Find(1).CreatedAt); + Assert.IsType(result); + + + result = await controller.PutProject(2, + new Project() + { + Id = 1, + Title = "Top Secret Project", + Description = "Shht Don't Ask don't tell", + PlannedEnding = new DateTime(2020, 7, 21) + } + ); + + // Should Return BadRequest + Assert.NotEqual("Top Secret Project", context.Projects.Find(2).Title); + Assert.NotEqual(new DateTime(2020, 7, 21), context.Projects.Find(2).CreatedAt); + Assert.IsType(result); + + // Delete updated project + context.Projects.RemoveRange(context.Projects.Find(1)); + await context.SaveChangesAsync(); + + result = await controller.PutProject(1, + new Project() + { + Id = 1, + Title = "Top Secret Project", + Description = "Shht Don't Ask don't tell", + PlannedEnding = new DateTime(2020, 7, 21) + } + ); + + // Should Throw + Assert.IsType(result); + Assert.Equal("Top Secret Project", context.Projects.Find(1).Title); + Assert.Equal(new DateTime(2020, 7, 21), context.Projects.Find(1).CreatedAt); + } + } + + } +} diff --git a/Tests/TicketManager.Tests/UnitTests/ControllersTests/SeedDb.cs b/Tests/TicketManager.Tests/UnitTests/ControllersTests/SeedDb.cs new file mode 100644 index 0000000..186313a --- /dev/null +++ b/Tests/TicketManager.Tests/UnitTests/ControllersTests/SeedDb.cs @@ -0,0 +1,34 @@ +using System; +using TicketManager.Data; +using TicketManager.Models; +using Microsoft.EntityFrameworkCore; + +namespace TicketManager.Tests +{ + public class SeedDb + { + public static void Projects(DbContextOptions options) + // Seed DB usng one context instance + { + using (var context = new AppDbContext(options)) + { + context.Projects.AddRange( + new Project() + { + Id = 1, + Title = "Secret Project", + Description = "Shht Don't Ask don't tell", + PlannedEnding = new DateTime(2021, 7, 21) + }, + new Project() + { + Id = 2, + Title = "Public Project", + Description = "It's quite obvious, isn't it?!", + PlannedEnding = new DateTime(2036, 6, 16) + }); + context.SaveChanges(); + } + } + } +} \ No newline at end of file diff --git a/Tests/TicketManager.Tests/UnitTests/AppUserModelTests.cs b/Tests/TicketManager.Tests/UnitTests/ModelTests/AppUserModelTests.cs similarity index 100% rename from Tests/TicketManager.Tests/UnitTests/AppUserModelTests.cs rename to Tests/TicketManager.Tests/UnitTests/ModelTests/AppUserModelTests.cs diff --git a/Tests/TicketManager.Tests/UnitTests/ProjectModelTests.cs b/Tests/TicketManager.Tests/UnitTests/ModelTests/ProjectModelTests.cs similarity index 100% rename from Tests/TicketManager.Tests/UnitTests/ProjectModelTests.cs rename to Tests/TicketManager.Tests/UnitTests/ModelTests/ProjectModelTests.cs diff --git a/Tests/TicketManager.Tests/UnitTests/TicketModelTests.cs b/Tests/TicketManager.Tests/UnitTests/ModelTests/TicketModelTests.cs similarity index 100% rename from Tests/TicketManager.Tests/UnitTests/TicketModelTests.cs rename to Tests/TicketManager.Tests/UnitTests/ModelTests/TicketModelTests.cs diff --git a/Tests/TicketManager.Tests/UnitTests/ProjectControllerTests.cs b/Tests/TicketManager.Tests/UnitTests/ProjectControllerTests.cs deleted file mode 100644 index ce54e8f..0000000 --- a/Tests/TicketManager.Tests/UnitTests/ProjectControllerTests.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using Xunit; -using System.Collections.Generic; -using System.Threading.Tasks; -using Moq; -using TicketManager.Controllers; -using TicketManager.Data; -using TicketManager.Models; -using TicketManager.DTO; - -namespace TicketManager.Tests -{ - public class ProjectsControllerTests - { - [Fact] - public async Task Get_ReturnsAListofProjects() - { - // Arrange - var mockRepo = new Mock(); - mockRepo.Setup(r => r.List()) - .ReturnsAsync(GetTestProjects()); - var controller = new ProjectsController(mockRepo.Object); - - // Act - var result = await controller.GetProjects(); - - // Assert - var viewResult = Assert.IsAssignableFrom>(result); - } - - [Fact] - public async Task Get1_ReturnsProject1() - { - // Arrange - var mockRepo = new Mock(); - mockRepo.Setup(r => r.Get(1)); - // .ReturnsAsync(GetProjectDTO()); - var controller = new ProjectsController(mockRepo.Object); - - // Act - var result = await controller.GetProject(1); - - // Assert - var viewResult = Assert.IsAssignableFrom(result); - } - - private List GetTestProjects() - { - var projects = new List(); - projects.Add(new Project() - { - PlannedEnding = new DateTime(2016, 7, 2), - Id = 1, - Title = "Test One", - }); - projects.Add(new Project() - { - PlannedEnding = new DateTime(2016, 7, 1), - Id = 2, - Title = "Test Two" - }); - return projects; - } - - private ProjectDTO GetProjectDTO() - { - var project = new Project() - { - Id = 1, - PlannedEnding = new DateTime(2016, 7, 2), - Title = "Test One", - Description = "Lorem Ipsum", - Status = Status.InProgress - }; - - return new ProjectDTO(project); - } - - - // [Fact] - // public void Get_ReturnsProjectList() - // { - // // Arange - // // var controller = new ProjectsController(); - - // // Act - // // var result = controller.GetProjects(); - - // // Assert - // // Assert.IsType>(result); - // } - } -}