From 57880ab9aecd6e122bdfbd4fe0d752138e60a2a8 Mon Sep 17 00:00:00 2001 From: Ruidy Nemausat Date: Fri, 21 Feb 2020 10:54:33 +0100 Subject: [PATCH 1/6] installed Moq --- Controllers/ProjectsController.cs | 1 + .../UnitTests/ProjectControllerTests.cs | 39 +++++++++++++++++-- TicketManager.csproj | 1 + 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/Controllers/ProjectsController.cs b/Controllers/ProjectsController.cs index d6d8ee6..bfd87db 100644 --- a/Controllers/ProjectsController.cs +++ b/Controllers/ProjectsController.cs @@ -50,6 +50,7 @@ namespace TicketManager.Controllers /// GET: api/Projects/2 /// /// + /// Identifier of the ressource /// Returns a specific project /// If the required project is null [HttpGet("{id}")] diff --git a/Tests/TicketManager.Tests/UnitTests/ProjectControllerTests.cs b/Tests/TicketManager.Tests/UnitTests/ProjectControllerTests.cs index 6e1d788..6e22d36 100644 --- a/Tests/TicketManager.Tests/UnitTests/ProjectControllerTests.cs +++ b/Tests/TicketManager.Tests/UnitTests/ProjectControllerTests.cs @@ -1,21 +1,52 @@ using System; using Xunit; using System.Collections.Generic; +using System.Threading.Tasks; +using Moq; using TicketManager.Controllers; using TicketManager.Data; using TicketManager.Models; + namespace TicketManager.Tests { public class ProjectsControllerTests { - - - public ProjectsControllerTests() + [Fact] + public async Task Get_ReturnsAListofProjects() { - // _context = context; + // 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); } + 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; + } + + // [Fact] // public void Get_ReturnsProjectList() // { diff --git a/TicketManager.csproj b/TicketManager.csproj index 1cab36c..db8150f 100644 --- a/TicketManager.csproj +++ b/TicketManager.csproj @@ -28,6 +28,7 @@ + From 611289c02f11f4ae4c5873f208db8457a93c9074 Mon Sep 17 00:00:00 2001 From: Ruidy Nemausat Date: Tue, 25 Feb 2020 14:19:44 +0100 Subject: [PATCH 2/6] - --- Controllers/ProjectsController.cs | 3 +- Data/ProjectRepository.cs | 4 ++- Models/Project.cs | 4 +++ Startup.cs | 6 +++- .../UnitTests/ProjectControllerTests.cs | 32 ++++++++++++++++++- 5 files changed, 44 insertions(+), 5 deletions(-) diff --git a/Controllers/ProjectsController.cs b/Controllers/ProjectsController.cs index e3b52a5..82a1ee9 100644 --- a/Controllers/ProjectsController.cs +++ b/Controllers/ProjectsController.cs @@ -38,7 +38,6 @@ namespace TicketManager.Controllers [ProducesResponseType(StatusCodes.Status200OK)] public async Task> GetProjects() { - return await _projects.List(); } @@ -196,7 +195,7 @@ namespace TicketManager.Controllers /// Not Found [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status404NotFound)] - [HttpPut("{id}/members")] + [HttpPatch("{id}/members")] public async Task> SetProjectMembers(int id, List projectMembers) { Project project = await _projects.Get(id); diff --git a/Data/ProjectRepository.cs b/Data/ProjectRepository.cs index ec8dede..202f9d9 100644 --- a/Data/ProjectRepository.cs +++ b/Data/ProjectRepository.cs @@ -15,7 +15,9 @@ namespace TicketManager.Data .Include(p => p.Assignments).ThenInclude(a => a.User) .Include(p => p.Tickets) .Include(p => p.Manager) - .Include(p => p.Files); + .Include(p => p.Files) + // .AsNoTracking() + ; } public override async Task Get(int id) diff --git a/Models/Project.cs b/Models/Project.cs index fceedcf..7f1df5a 100644 --- a/Models/Project.cs +++ b/Models/Project.cs @@ -95,6 +95,10 @@ namespace TicketManager.Models public void RemoveMembers(List membersToRemove) { this.Assignments.RemoveAll(a => membersToRemove.Contains(a.User)); + + // membersToRemove.ForEach( + // m => m.Assignments.RemoveAll(a => (a.Project == this)) + // ); } public void SetMembers(List projectMembers) diff --git a/Startup.cs b/Startup.cs index f86c247..6edc27f 100644 --- a/Startup.cs +++ b/Startup.cs @@ -36,7 +36,11 @@ namespace TicketManager public void ConfigureServices(IServiceCollection services) { services.AddDbContext(options => - options.UseSqlite(Configuration.GetConnectionString("Sqlite"))); + { + options.UseSqlite(Configuration.GetConnectionString("Sqlite")); + options.EnableSensitiveDataLogging(true); //Remove in production. + } + ); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/Tests/TicketManager.Tests/UnitTests/ProjectControllerTests.cs b/Tests/TicketManager.Tests/UnitTests/ProjectControllerTests.cs index 6e22d36..ce54e8f 100644 --- a/Tests/TicketManager.Tests/UnitTests/ProjectControllerTests.cs +++ b/Tests/TicketManager.Tests/UnitTests/ProjectControllerTests.cs @@ -6,7 +6,7 @@ using Moq; using TicketManager.Controllers; using TicketManager.Data; using TicketManager.Models; - +using TicketManager.DTO; namespace TicketManager.Tests { @@ -28,6 +28,22 @@ namespace TicketManager.Tests 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(); @@ -46,6 +62,20 @@ namespace TicketManager.Tests 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() From d30bd3295a19dae88df4a6534eeba3a8735252c6 Mon Sep 17 00:00:00 2001 From: Ruidy Nemausat Date: Wed, 26 Feb 2020 09:47:00 +0100 Subject: [PATCH 3/6] - --- .gitignore | 10 +++--- Data/ProjectRepository.cs | 49 --------------------------- DataTransfertObjects/AppUserDTO.cs | 53 ------------------------------ DataTransfertObjects/ProjectDTO.cs | 47 -------------------------- DataTransfertObjects/TicketDTO.cs | 51 ---------------------------- Properties/launchSettings.json | 2 +- Startup.cs | 6 ++-- TicketManager.csproj | 6 +++- 8 files changed, 14 insertions(+), 210 deletions(-) delete mode 100644 Data/ProjectRepository.cs delete mode 100644 DataTransfertObjects/AppUserDTO.cs delete mode 100644 DataTransfertObjects/ProjectDTO.cs delete mode 100644 DataTransfertObjects/TicketDTO.cs diff --git a/.gitignore b/.gitignore index f7577c8..435d3bb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,14 @@ -bin/ -obj/ .vs/ .vscode/ -Migrations/ -app.db* .DS_Store -app.db +bin/ +obj/ +app.db* Data/Interfaces Data/UnitOfWork.cs Data/*Repository.cs +Migrations/ +Properties/ # client client/src/pages/TestPage.tsx diff --git a/Data/ProjectRepository.cs b/Data/ProjectRepository.cs deleted file mode 100644 index 202f9d9..0000000 --- a/Data/ProjectRepository.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Threading.Tasks; -using TicketManager.Models; -using System.Linq; -using Microsoft.EntityFrameworkCore; -using System.Collections.Generic; - -namespace TicketManager.Data -{ - public class ProjectRepository : GenericRepository, IProjectRepository - { - private readonly IQueryable _query; - public ProjectRepository(AppDbContext context) : base(context) - { - _query = _dbSet - .Include(p => p.Assignments).ThenInclude(a => a.User) - .Include(p => p.Tickets) - .Include(p => p.Manager) - .Include(p => p.Files) - // .AsNoTracking() - ; - } - - public override async Task Get(int id) - { - return await _query.FirstOrDefaultAsync(p => p.Id == id); - } - - public override async Task> List() - { - return await _query.ToListAsync(); - } - - public bool Exists(int id) - { - return _dbSet.Any(e => e.Id == id); - } - - public async Task> GetMembers(int id) - { - Project project = await Get(id); - return project.GetMembers(); - } - public async Task SetMembers(int id, List usersToAdd) - { - Project project = await Get(id); - project.SetMembers(usersToAdd); - } - } -} \ No newline at end of file diff --git a/DataTransfertObjects/AppUserDTO.cs b/DataTransfertObjects/AppUserDTO.cs deleted file mode 100644 index 250fbcc..0000000 --- a/DataTransfertObjects/AppUserDTO.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using TicketManager.Models; - -namespace TicketManager.DTO -{ - public class AppUserDTO - { - public AppUserDTO(AppUser user) - { - Id = user.Id; - FirstName = user.FirstName; - LastName = user.LastName; - Presentation = user.Presentation; - Email = user.Email; - Phone = user.Phone; - Created_at = user.Created_at; - Picture = user.Picture; - Activities = user.Activities; - Projects = user.GetProjects(); - Tickets = user.GetTickets(); - } - - public Guid Id { get; set; } - - public string FirstName { get; set; } - - public string LastName { get; set; } - - public string FullName => $"{FirstName} {LastName}"; - - public string Presentation { get; set; } - - [DataType(DataType.EmailAddress)] - public string Email { get; set; } - - [DataType(DataType.PhoneNumber)] - public string Phone { get; set; } - - [DataType(DataType.Date)] - public DateTime Created_at { get; private set; } = DateTime.Now; - - public string Picture { get; set; } - - public List Activities { get; set; } = new List(); - - public List Projects { get; set; } = new List(); - - public List Tickets { get; set; } = new List(); - - } -} \ No newline at end of file diff --git a/DataTransfertObjects/ProjectDTO.cs b/DataTransfertObjects/ProjectDTO.cs deleted file mode 100644 index ccfa8a3..0000000 --- a/DataTransfertObjects/ProjectDTO.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; -using TicketManager.Models; - -namespace TicketManager.DTO -{ - public class ProjectDTO - { - public ProjectDTO(Project project) - { - Id = project.Id; - Title = project.Title; - Description = project.Description; - CreatedAt = project.CreatedAt; - Progression = project.Progression; - Status = project.Status.ToString(); - Manager = project.Manager; - Users = project.GetMembers(); - Tickets = project.Tickets; - Activities = project.Activities; - Files = project.Files; - } - - public int Id { get; set; } - - public string Title { get; set; } - - public string Description { get; set; } - - public DateTime CreatedAt { get; private set; } = DateTime.Now; - - public DateTime PlannedEnding { get; set; } - - public decimal Progression { get; set; } - - public string Status { get; set; } - - public AppUser Manager { get; set; } - public List Users { get; set; } = new List(); - - public List Tickets { get; set; } = new List(); - - public List Activities { get; set; } = new List(); - - public List Files { get; set; } = new List(); - } -} \ No newline at end of file diff --git a/DataTransfertObjects/TicketDTO.cs b/DataTransfertObjects/TicketDTO.cs deleted file mode 100644 index 4ff3bae..0000000 --- a/DataTransfertObjects/TicketDTO.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using TicketManager.Models; - -namespace TicketManager.DTO -{ - public class TicketDTO - { - public TicketDTO(Ticket ticket) - { - Id = ticket.Id; - Title = ticket.Title; - Description = ticket.Description; - CreatedAt = ticket.CreatedAt; - PlannedEnding = ticket.PlannedEnding; - Status = ticket.Status.ToString(); - Impact = ticket.Impact.ToString(); - Difficulty = ticket.Difficulty.ToString(); - Category = ticket.Category.ToString(); - CreatorId = ticket.CreatorId; - Project = ticket.Project; - Notes = ticket.Notes; - Activities = ticket.Activities; - Files = ticket.Files; - Users = ticket.GetAssignees(); - } - public int Id { get; set; } - - public string Title { get; set; } - - public string Description { get; set; } - - [DataType(DataType.Date)] - public DateTime CreatedAt { get; private set; } - - [DataType(DataType.Date)] - public DateTime PlannedEnding { get; set; } - - public string Status { get; set; } - public string Impact { get; set; } - public string Difficulty { get; set; } - public string Category { get; set; } - public Guid CreatorId { get; set; } - public Project Project { get; set; } - public List Notes { get; set; } = new List(); - public List Activities { get; set; } = new List(); - public List Files { get; set; } = new List(); - public List Users { get; set; } = new List(); - } -} \ No newline at end of file diff --git a/Properties/launchSettings.json b/Properties/launchSettings.json index 42e74be..7fb0bbb 100644 --- a/Properties/launchSettings.json +++ b/Properties/launchSettings.json @@ -20,7 +20,7 @@ "TicketManager": { "commandName": "Project", "launchBrowser": true, - "launchUrl": "weatherforecast", + "launchUrl": "/", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, diff --git a/Startup.cs b/Startup.cs index 6edc27f..9cd7ec7 100644 --- a/Startup.cs +++ b/Startup.cs @@ -41,9 +41,9 @@ namespace TicketManager options.EnableSensitiveDataLogging(true); //Remove in production. } ); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); + // services.AddScoped(); + // services.AddScoped(); + // services.AddScoped(); services.AddAuthentication(options => { diff --git a/TicketManager.csproj b/TicketManager.csproj index 9a81c04..d68b951 100644 --- a/TicketManager.csproj +++ b/TicketManager.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 - + 8.0 @@ -30,6 +30,10 @@ + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + From 89078bb24acd46e1b67c4ed5f911d2f0e7cb7f62 Mon Sep 17 00:00:00 2001 From: Ruidy Nemausat Date: Wed, 26 Feb 2020 09:47:07 +0100 Subject: [PATCH 4/6] - --- DTOs/AppUserDTO.cs | 52 ++++++++++++++++++++++++++++++++++++++++ DTOs/ProjectDTO.cs | 48 +++++++++++++++++++++++++++++++++++++ DTOs/TicketDTO.cs | 60 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 DTOs/AppUserDTO.cs create mode 100644 DTOs/ProjectDTO.cs create mode 100644 DTOs/TicketDTO.cs diff --git a/DTOs/AppUserDTO.cs b/DTOs/AppUserDTO.cs new file mode 100644 index 0000000..b2009d3 --- /dev/null +++ b/DTOs/AppUserDTO.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using TicketManager.Models; + +namespace TicketManager.DTO +{ + public class AppUserDTO + { + public AppUserDTO(AppUser user) + { + Id = user.Id; + FirstName = user.FirstName; + LastName = user.LastName; + Presentation = user.Presentation; + Email = user.Email; + Phone = user.Phone; + Created_at = user.Created_at; + Picture = user.Picture; + Activities = user.Activities; + Projects = user.GetProjects(); + Tickets = user.GetTickets(); + } + + public Guid Id { get; set; } + + public string FirstName { get; set; } + + public string LastName { get; set; } + + public string FullName => $"{FirstName} {LastName}"; + + public string Presentation { get; set; } + + [DataType(DataType.EmailAddress)] + public string Email { get; set; } + + [DataType(DataType.PhoneNumber)] + public string Phone { get; set; } + + [DataType(DataType.Date)] + public DateTime Created_at { get; private set; } = DateTime.Now; + + public string Picture { get; set; } + + public List Activities { get; set; } = new List(); + + public List Projects { get; set; } = new List(); + + public List Tickets { get; set; } = new List(); + } +} \ No newline at end of file diff --git a/DTOs/ProjectDTO.cs b/DTOs/ProjectDTO.cs new file mode 100644 index 0000000..ba8d098 --- /dev/null +++ b/DTOs/ProjectDTO.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using TicketManager.Models; + +namespace TicketManager.DTO +{ + public class ProjectDTO + { + public ProjectDTO(Project project) + { + Id = project.Id; + Title = project.Title; + Description = project.Description; + CreatedAt = project.CreatedAt; + Progression = project.Progression; + Status = project.Status.ToString(); + Manager = project.Manager; + Users = project.GetMembers(); + Tickets = project.Tickets; + Activities = project.Activities; + Files = project.Files; + } + + public int Id { get; set; } + + public string Title { get; set; } + + public string Description { get; set; } + + public DateTime CreatedAt { get; private set; } = DateTime.Now; + + public DateTime PlannedEnding { get; set; } + + public decimal Progression { get; set; } + + public string Status { get; set; } + + public AppUser Manager { get; set; } + + public List Users { get; set; } = new List(); + + public List Tickets { get; set; } = new List(); + + public List Activities { get; set; } = new List(); + + public List Files { get; set; } = new List(); + } +} \ No newline at end of file diff --git a/DTOs/TicketDTO.cs b/DTOs/TicketDTO.cs new file mode 100644 index 0000000..cdacb99 --- /dev/null +++ b/DTOs/TicketDTO.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using TicketManager.Models; + +namespace TicketManager.DTO +{ + public class TicketDTO + { + public TicketDTO(Ticket ticket) + { + Id = ticket.Id; + Title = ticket.Title; + Description = ticket.Description; + CreatedAt = ticket.CreatedAt; + PlannedEnding = ticket.PlannedEnding; + Status = ticket.Status.ToString(); + Impact = ticket.Impact.ToString(); + Difficulty = ticket.Difficulty.ToString(); + Category = ticket.Category.ToString(); + CreatorId = ticket.CreatorId; + Project = ticket.Project; + Notes = ticket.Notes; + Activities = ticket.Activities; + Files = ticket.Files; + Users = ticket.GetAssignees(); + } + public int Id { get; set; } + + public string Title { get; set; } + + public string Description { get; set; } + + [DataType(DataType.Date)] + public DateTime CreatedAt { get; private set; } + + [DataType(DataType.Date)] + public DateTime PlannedEnding { get; set; } + + public string Status { get; set; } + + public string Impact { get; set; } + + public string Difficulty { get; set; } + + public string Category { get; set; } + + public Guid CreatorId { get; set; } + + public Project Project { get; set; } + + public List Notes { get; set; } = new List(); + + public List Activities { get; set; } = new List(); + + public List Files { get; set; } = new List(); + + public List Users { get; set; } = new List(); + } +} \ No newline at end of file From faab56610c172fbb7d49253e20e81edbc77ad8a7 Mon Sep 17 00:00:00 2001 From: Ruidy Nemausat Date: Wed, 26 Feb 2020 11:34:55 +0100 Subject: [PATCH 5/6] 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); - // } - } -} From ea6395f86300e990ca38b4c20bd0a060c1c849c6 Mon Sep 17 00:00:00 2001 From: Ruidy Nemausat Date: Wed, 26 Feb 2020 14:52:07 +0100 Subject: [PATCH 6/6] Wrote Project COntrollers Test --- .gitignore | 2 + .../ControllersTests/ControllerTests.cs | 44 --- .../ProjectControllerTests.cs | 279 +++++++++++++----- .../UnitTests/ControllersTests/SeedDb.cs | 34 --- .../UnitTests/ModelTests/AppUserModelTests.cs | 14 +- 5 files changed, 214 insertions(+), 159 deletions(-) delete mode 100644 Tests/TicketManager.Tests/UnitTests/ControllersTests/ControllerTests.cs delete mode 100644 Tests/TicketManager.Tests/UnitTests/ControllersTests/SeedDb.cs diff --git a/.gitignore b/.gitignore index 435d3bb..e2a1839 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,8 @@ Data/UnitOfWork.cs Data/*Repository.cs Migrations/ Properties/ +Tests/TicketManager.Tests/UnitTests/ControllersTests/ControllerTests.cs +Tests/TicketManager.Tests/UnitTests/ControllersTests/SeedDb.cs # client client/src/pages/TestPage.tsx diff --git a/Tests/TicketManager.Tests/UnitTests/ControllersTests/ControllerTests.cs b/Tests/TicketManager.Tests/UnitTests/ControllersTests/ControllerTests.cs deleted file mode 100644 index b91586d..0000000 --- a/Tests/TicketManager.Tests/UnitTests/ControllersTests/ControllerTests.cs +++ /dev/null @@ -1,44 +0,0 @@ -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 index dc92819..6bda2fb 100644 --- a/Tests/TicketManager.Tests/UnitTests/ControllersTests/ProjectControllerTests.cs +++ b/Tests/TicketManager.Tests/UnitTests/ControllersTests/ProjectControllerTests.cs @@ -2,121 +2,252 @@ using System; using Xunit; using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Data.Sqlite; 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() + public async Task Get_ReturnsListWith2Projects() { - ControllersTests.Wrapper(Test_GetProjects, SeedDb.Projects); - } + var connection = new SqliteConnection("DataSource=:memory:"); + connection.Open(); - private static async Task Test_GetProjects(DbContextOptions options) - { - using (var context = new AppDbContext(options)) + try { - var controller = new ProjectsController(context); + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; - var result = await controller.GetProjects(); + // creates DB schema + using (var context = new AppDbContext(options)) + { + context.Database.EnsureCreated(); + } - Assert.IsAssignableFrom>(result); - Assert.Equal(2, result.Count); + // Seed DB usng one context instance + SeedDb(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); + } + } + finally + { + connection.Close(); } } [Fact] - public void Get1_Returns1Project() + public async Task Get1_Returns1Project() { - ControllersTests.Wrapper(Test_GetProject, SeedDb.Projects); - } + var connection = new SqliteConnection("DataSource=:memory:"); + connection.Open(); - private static async Task Test_GetProject(DbContextOptions options) - { - using (var context = new AppDbContext(options)) + try { - var controller = new ProjectsController(context); + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; - // Should Return 1 Project - var result = await controller.GetProject(1); - Assert.IsAssignableFrom(result); + // creates DB schema + using (var context = new AppDbContext(options)) + { + context.Database.EnsureCreated(); + } - // Should Return NotFound - result = await controller.GetProject(3); - Assert.IsType(result); + // Seed DB usng one context instance + SeedDb(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); + } + } + finally + { + connection.Close(); } } [Fact] - public void Put1_Updates1Project() + public async Task Put1_Updates1Project() { - ControllersTests.Wrapper(Test_PutProject, SeedDb.Projects); - } + // ControllersTests.Wrapper(Test_PutProject, SeedDb); + // } - private static async Task Test_PutProject(DbContextOptions options) - { - using (var context = new AppDbContext(options)) + // private static async Task Test_PutProject() + // { + var connection = new SqliteConnection("DataSource=:memory:"); + connection.Open(); + + try { - var controller = new ProjectsController(context); + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; - 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) - } - ); + // creates DB schema + using (var context = new AppDbContext(options)) + { + context.Database.EnsureCreated(); + } - // 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); + // Seed DB usng one context instance + SeedDb(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).PlannedEnding); + 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) - } - ); + 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); + // 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(); + // 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) - } - ); + 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); + // 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).PlannedEnding); + } + } + + finally + { + connection.Close(); } } + [Fact] + public async Task Post_CreatesProject() + { + // 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 + using (var context = new AppDbContext(options)) + { + var proj = new Project() + { + Title = "The Third", + Description = "Thrice in a row", + PlannedEnding = DateTime.Now + }; + + var controller = new ProjectsController(context); + + var result = await controller.PostProject(proj); + + Assert.IsAssignableFrom(result); + Assert.Equal(3, await context.Projects.CountAsync()); + } + } + finally + { + connection.Close(); + } + } + + private static void SeedDb(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(); + } + } } } diff --git a/Tests/TicketManager.Tests/UnitTests/ControllersTests/SeedDb.cs b/Tests/TicketManager.Tests/UnitTests/ControllersTests/SeedDb.cs deleted file mode 100644 index 186313a..0000000 --- a/Tests/TicketManager.Tests/UnitTests/ControllersTests/SeedDb.cs +++ /dev/null @@ -1,34 +0,0 @@ -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/ModelTests/AppUserModelTests.cs b/Tests/TicketManager.Tests/UnitTests/ModelTests/AppUserModelTests.cs index 8243ef1..2016528 100644 --- a/Tests/TicketManager.Tests/UnitTests/ModelTests/AppUserModelTests.cs +++ b/Tests/TicketManager.Tests/UnitTests/ModelTests/AppUserModelTests.cs @@ -50,6 +50,13 @@ namespace TicketManager.Tests Ticket t5 = new Ticket(); Ticket t6 = new Ticket(); + p1.Tickets.Add(t1); + p2.Tickets.Add(t2); + p2.Tickets.Add(t3); + p3.Tickets.Add(t4); + p3.Tickets.Add(t5); + p3.Tickets.Add(t6); + Assignment a1 = new Assignment() { User = user, @@ -69,13 +76,6 @@ namespace TicketManager.Tests }; user.Assignments.Add(a3); - p1.Tickets.Add(t1); - p2.Tickets.Add(t2); - p2.Tickets.Add(t3); - p3.Tickets.Add(t4); - p3.Tickets.Add(t5); - p3.Tickets.Add(t6); - var res = user.GetTickets().Count; Assert.Equal(6, res); }