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);
- // }
- }
-}