diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 4f48799..14c413b 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -8,6 +8,13 @@ "dotnet-ef" ], "rollForward": false + }, + "csharpier": { + "version": "0.30.2", + "commands": [ + "dotnet-csharpier" + ], + "rollForward": false } } } \ No newline at end of file diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b4995df..2587966 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,9 +1,17 @@ -name: ci +name: Continuous Integration on: [push] jobs: - build: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install tools + run: dotnet tool restore + - name: Run csharpier + run: dotnet csharpier --check . + test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 diff --git a/TodoApi.Tests/Controllers/TodoListsControllerTests.cs b/TodoApi.Tests/Controllers/TodoListsControllerTests.cs index f409f55..dab7d64 100644 --- a/TodoApi.Tests/Controllers/TodoListsControllerTests.cs +++ b/TodoApi.Tests/Controllers/TodoListsControllerTests.cs @@ -1,131 +1,125 @@ -using TodoApi.Controllers; -using TodoApi.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using TodoApi.Controllers; +using TodoApi.Models; namespace TodoApi.Tests; #nullable disable public class TodoListsControllerTests { - private DbContextOptions DatabaseContextOptions() - { - return new DbContextOptionsBuilder() - .UseInMemoryDatabase(Guid.NewGuid().ToString()) - .Options; - } - - private void PopulateDatabaseContext(TodoContext context) - { - context.TodoList.Add(new TodoList { Id = 1, Name = "Task 1" }); - context.TodoList.Add(new TodoList { Id = 2, Name = "Task 2" }); - context.SaveChanges(); - } - - [Fact] - public async Task GetTodoList_WhenCalled_ReturnsTodoListList() - { - using (var context = new TodoContext(DatabaseContextOptions())) + private DbContextOptions DatabaseContextOptions() + { + return new DbContextOptionsBuilder() + .UseInMemoryDatabase(Guid.NewGuid().ToString()) + .Options; + } + + private void PopulateDatabaseContext(TodoContext context) + { + context.TodoList.Add(new TodoList { Id = 1, Name = "Task 1" }); + context.TodoList.Add(new TodoList { Id = 2, Name = "Task 2" }); + context.SaveChanges(); + } + + [Fact] + public async Task GetTodoList_WhenCalled_ReturnsTodoListList() { - PopulateDatabaseContext(context); + using (var context = new TodoContext(DatabaseContextOptions())) + { + PopulateDatabaseContext(context); - var controller = new TodoListsController(context); + var controller = new TodoListsController(context); - var result = await controller.GetTodoLists(); + var result = await controller.GetTodoLists(); - Assert.IsType(result.Result); - Assert.Equal( - 2, - ((result.Result as OkObjectResult).Value as IList).Count - ); + Assert.IsType(result.Result); + Assert.Equal(2, ((result.Result as OkObjectResult).Value as IList).Count); + } } - } - [Fact] - public async Task GetTodoList_WhenCalled_ReturnsTodoListById() - { - using (var context = new TodoContext(DatabaseContextOptions())) + [Fact] + public async Task GetTodoList_WhenCalled_ReturnsTodoListById() { - PopulateDatabaseContext(context); + using (var context = new TodoContext(DatabaseContextOptions())) + { + PopulateDatabaseContext(context); - var controller = new TodoListsController(context); + var controller = new TodoListsController(context); - var result = await controller.GetTodoList(1); + var result = await controller.GetTodoList(1); - Assert.IsType(result.Result); - Assert.Equal( - 1, - ((result.Result as OkObjectResult).Value as TodoList).Id - ); + Assert.IsType(result.Result); + Assert.Equal(1, ((result.Result as OkObjectResult).Value as TodoList).Id); + } } - } - [Fact] - public async Task PutTodoList_WhenTodoListDoesntExist_ReturnsBadRequest() - { - using (var context = new TodoContext(DatabaseContextOptions())) + [Fact] + public async Task PutTodoList_WhenTodoListDoesntExist_ReturnsBadRequest() { - PopulateDatabaseContext(context); + using (var context = new TodoContext(DatabaseContextOptions())) + { + PopulateDatabaseContext(context); - var controller = new TodoListsController(context); + var controller = new TodoListsController(context); - var result = await controller.PutTodoList(3, new Dtos.UpdateTodoList { Name = "Task 3" }); + var result = await controller.PutTodoList( + 3, + new Dtos.UpdateTodoList { Name = "Task 3" } + ); - Assert.IsType(result); + Assert.IsType(result); + } } - } - [Fact] - public async Task PutTodoList_WhenCalled_UpdatesTheTodoList() - { - using (var context = new TodoContext(DatabaseContextOptions())) + [Fact] + public async Task PutTodoList_WhenCalled_UpdatesTheTodoList() { - PopulateDatabaseContext(context); + using (var context = new TodoContext(DatabaseContextOptions())) + { + PopulateDatabaseContext(context); - var controller = new TodoListsController(context); + var controller = new TodoListsController(context); - var todoList = await context.TodoList.Where(x => x.Id == 2).FirstAsync(); - var result = await controller.PutTodoList(todoList.Id, new Dtos.UpdateTodoList { Name = "Changed Task 2" }); + var todoList = await context.TodoList.Where(x => x.Id == 2).FirstAsync(); + var result = await controller.PutTodoList( + todoList.Id, + new Dtos.UpdateTodoList { Name = "Changed Task 2" } + ); - Assert.IsType(result); + Assert.IsType(result); + } } - } - [Fact] - public async Task PostTodoList_WhenCalled_CreatesTodoList() - { - using (var context = new TodoContext(DatabaseContextOptions())) + [Fact] + public async Task PostTodoList_WhenCalled_CreatesTodoList() { - PopulateDatabaseContext(context); + using (var context = new TodoContext(DatabaseContextOptions())) + { + PopulateDatabaseContext(context); - var controller = new TodoListsController(context); + var controller = new TodoListsController(context); - var result = await controller.PostTodoList(new Dtos.CreateTodoList { Name = "Task 3" }); + var result = await controller.PostTodoList(new Dtos.CreateTodoList { Name = "Task 3" }); - Assert.IsType(result.Result); - Assert.Equal( - 3, - context.TodoList.Count() - ); + Assert.IsType(result.Result); + Assert.Equal(3, context.TodoList.Count()); + } } - } - [Fact] - public async Task DeleteTodoList_WhenCalled_RemovesTodoList() - { - using (var context = new TodoContext(DatabaseContextOptions())) + [Fact] + public async Task DeleteTodoList_WhenCalled_RemovesTodoList() { - PopulateDatabaseContext(context); + using (var context = new TodoContext(DatabaseContextOptions())) + { + PopulateDatabaseContext(context); - var controller = new TodoListsController(context); + var controller = new TodoListsController(context); - var result = await controller.DeleteTodoList(2); + var result = await controller.DeleteTodoList(2); - Assert.IsType(result); - Assert.Equal( - 1, - context.TodoList.Count() - ); + Assert.IsType(result); + Assert.Equal(1, context.TodoList.Count()); + } } - } -} \ No newline at end of file +} diff --git a/TodoApi.Tests/Usings.cs b/TodoApi.Tests/Usings.cs index 8c927eb..c802f44 100644 --- a/TodoApi.Tests/Usings.cs +++ b/TodoApi.Tests/Usings.cs @@ -1 +1 @@ -global using Xunit; \ No newline at end of file +global using Xunit; diff --git a/TodoApi/Controllers/TodoListsController.cs b/TodoApi/Controllers/TodoListsController.cs index 5803251..162ae8a 100644 --- a/TodoApi/Controllers/TodoListsController.cs +++ b/TodoApi/Controllers/TodoListsController.cs @@ -5,88 +5,88 @@ namespace TodoApi.Controllers { - [Route("api/todolists")] - [ApiController] - public class TodoListsController : ControllerBase - { - private readonly TodoContext _context; - - public TodoListsController(TodoContext context) - { - _context = context; - } - - // GET: api/todolists - [HttpGet] - public async Task>> GetTodoLists() - { - return Ok(await _context.TodoList.ToListAsync()); - } - - // GET: api/todolists/5 - [HttpGet("{id}")] - public async Task> GetTodoList(long id) - { - var todoList = await _context.TodoList.FindAsync(id); - - if (todoList == null) - { - return NotFound(); - } - - return Ok(todoList); - } - - // PUT: api/todolists/5 - // To protect from over-posting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754 - [HttpPut("{id}")] - public async Task PutTodoList(long id, UpdateTodoList payload) - { - var todoList = await _context.TodoList.FindAsync(id); - - if (todoList == null) - { - return NotFound(); - } - - todoList.Name = payload.Name; - await _context.SaveChangesAsync(); - - return Ok(todoList); - } - - // POST: api/todolists - // To protect from over-posting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754 - [HttpPost] - public async Task> PostTodoList(CreateTodoList payload) - { - var todoList = new TodoList { Name = payload.Name }; - - _context.TodoList.Add(todoList); - await _context.SaveChangesAsync(); - - return CreatedAtAction("GetTodoList", new { id = todoList.Id }, todoList); - } - - // DELETE: api/todolists/5 - [HttpDelete("{id}")] - public async Task DeleteTodoList(long id) - { - var todoList = await _context.TodoList.FindAsync(id); - if (todoList == null) - { - return NotFound(); - } - - _context.TodoList.Remove(todoList); - await _context.SaveChangesAsync(); - - return NoContent(); - } - - private bool TodoListExists(long id) + [Route("api/todolists")] + [ApiController] + public class TodoListsController : ControllerBase { - return (_context.TodoList?.Any(e => e.Id == id)).GetValueOrDefault(); + private readonly TodoContext _context; + + public TodoListsController(TodoContext context) + { + _context = context; + } + + // GET: api/todolists + [HttpGet] + public async Task>> GetTodoLists() + { + return Ok(await _context.TodoList.ToListAsync()); + } + + // GET: api/todolists/5 + [HttpGet("{id}")] + public async Task> GetTodoList(long id) + { + var todoList = await _context.TodoList.FindAsync(id); + + if (todoList == null) + { + return NotFound(); + } + + return Ok(todoList); + } + + // PUT: api/todolists/5 + // To protect from over-posting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754 + [HttpPut("{id}")] + public async Task PutTodoList(long id, UpdateTodoList payload) + { + var todoList = await _context.TodoList.FindAsync(id); + + if (todoList == null) + { + return NotFound(); + } + + todoList.Name = payload.Name; + await _context.SaveChangesAsync(); + + return Ok(todoList); + } + + // POST: api/todolists + // To protect from over-posting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754 + [HttpPost] + public async Task> PostTodoList(CreateTodoList payload) + { + var todoList = new TodoList { Name = payload.Name }; + + _context.TodoList.Add(todoList); + await _context.SaveChangesAsync(); + + return CreatedAtAction("GetTodoList", new { id = todoList.Id }, todoList); + } + + // DELETE: api/todolists/5 + [HttpDelete("{id}")] + public async Task DeleteTodoList(long id) + { + var todoList = await _context.TodoList.FindAsync(id); + if (todoList == null) + { + return NotFound(); + } + + _context.TodoList.Remove(todoList); + await _context.SaveChangesAsync(); + + return NoContent(); + } + + private bool TodoListExists(long id) + { + return (_context.TodoList?.Any(e => e.Id == id)).GetValueOrDefault(); + } } - } } diff --git a/TodoApi/Data/TodoContext.cs b/TodoApi/Data/TodoContext.cs index 64b96db..b37699d 100644 --- a/TodoApi/Data/TodoContext.cs +++ b/TodoApi/Data/TodoContext.cs @@ -3,10 +3,8 @@ public class TodoContext : DbContext { - public TodoContext(DbContextOptions options) - : base(options) - { - } + public TodoContext(DbContextOptions options) + : base(options) { } - public DbSet TodoList { get; set; } = default!; + public DbSet TodoList { get; set; } = default!; } diff --git a/TodoApi/Migrations/20241126134649_CreateTodoLists.cs b/TodoApi/Migrations/20241126134649_CreateTodoLists.cs index 1e6a347..7901998 100644 --- a/TodoApi/Migrations/20241126134649_CreateTodoLists.cs +++ b/TodoApi/Migrations/20241126134649_CreateTodoLists.cs @@ -14,21 +14,22 @@ protected override void Up(MigrationBuilder migrationBuilder) name: "TodoList", columns: table => new { - Id = table.Column(type: "bigint", nullable: false) + Id = table + .Column(type: "bigint", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), - Name = table.Column(type: "nvarchar(max)", nullable: false) + Name = table.Column(type: "nvarchar(max)", nullable: false), }, constraints: table => { table.PrimaryKey("PK_TodoList", x => x.Id); - }); + } + ); } /// protected override void Down(MigrationBuilder migrationBuilder) { - migrationBuilder.DropTable( - name: "TodoList"); + migrationBuilder.DropTable(name: "TodoList"); } } } diff --git a/TodoApi/Models/TodoList.cs b/TodoApi/Models/TodoList.cs index f0b99e9..3f0675e 100644 --- a/TodoApi/Models/TodoList.cs +++ b/TodoApi/Models/TodoList.cs @@ -2,6 +2,6 @@ namespace TodoApi.Models; public class TodoList { - public long Id { get; set; } - public required string Name { get; set; } + public long Id { get; set; } + public required string Name { get; set; } } diff --git a/TodoApi/Program.cs b/TodoApi/Program.cs index c384259..854a6ab 100644 --- a/TodoApi/Program.cs +++ b/TodoApi/Program.cs @@ -1,9 +1,9 @@ using Microsoft.EntityFrameworkCore; var builder = WebApplication.CreateBuilder(args); -builder.Services - .AddDbContext( - opt => opt.UseSqlServer(builder.Configuration.GetConnectionString("TodoContext")) +builder + .Services.AddDbContext(opt => + opt.UseSqlServer(builder.Configuration.GetConnectionString("TodoContext")) ) .AddEndpointsApiExplorer() .AddControllers(); @@ -15,4 +15,4 @@ app.UseAuthorization(); app.MapControllers(); -app.Run(); \ No newline at end of file +app.Run();