diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/Csharp3-main/localdb.db b/Csharp3-main/localdb.db new file mode 100644 index 0000000..ac3ab25 Binary files /dev/null and b/Csharp3-main/localdb.db differ diff --git a/ToDoList/ToDoList.sln b/ToDoList/ToDoList.sln index f8c142d..fe2bc36 100644 --- a/ToDoList/ToDoList.sln +++ b/ToDoList/ToDoList.sln @@ -15,7 +15,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToDoList.Test", "tests\ToDo EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToDoList.Persistence", "src\ToDoList.Persistence\ToDoList.Persistence.csproj", "{9D93325A-6242-4417-AF1B-7B06DB3A7864}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToDoList.Frontend", "src\ToDoList.Frontend\ToDoList.Frontend.csproj", "{2A4A356C-0F7A-476E-88C9-E101784C9F30}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToDoList.Frontend", "src\ToDoList.Frontend\ToDoList.Frontend.csproj", "{04CA31F5-49D8-4978-B917-98D3B10CD156}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -42,16 +42,16 @@ Global {9D93325A-6242-4417-AF1B-7B06DB3A7864}.Debug|Any CPU.Build.0 = Debug|Any CPU {9D93325A-6242-4417-AF1B-7B06DB3A7864}.Release|Any CPU.ActiveCfg = Release|Any CPU {9D93325A-6242-4417-AF1B-7B06DB3A7864}.Release|Any CPU.Build.0 = Release|Any CPU - {2A4A356C-0F7A-476E-88C9-E101784C9F30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2A4A356C-0F7A-476E-88C9-E101784C9F30}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2A4A356C-0F7A-476E-88C9-E101784C9F30}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2A4A356C-0F7A-476E-88C9-E101784C9F30}.Release|Any CPU.Build.0 = Release|Any CPU + {04CA31F5-49D8-4978-B917-98D3B10CD156}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {04CA31F5-49D8-4978-B917-98D3B10CD156}.Debug|Any CPU.Build.0 = Debug|Any CPU + {04CA31F5-49D8-4978-B917-98D3B10CD156}.Release|Any CPU.ActiveCfg = Release|Any CPU + {04CA31F5-49D8-4978-B917-98D3B10CD156}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {D8E3A966-671F-4E7C-86BD-B51066E39B67} = {36FD4317-29CD-4B7B-AA95-92F1582DEC01} {61CAF0A1-2EBB-410B-BB40-DA9590E88664} = {36FD4317-29CD-4B7B-AA95-92F1582DEC01} {EEB409BA-8B59-4C14-84D3-301E75F542C4} = {D78FC9D1-46B7-4F93-AE9A-24719D8C82D2} {9D93325A-6242-4417-AF1B-7B06DB3A7864} = {36FD4317-29CD-4B7B-AA95-92F1582DEC01} - {2A4A356C-0F7A-476E-88C9-E101784C9F30} = {36FD4317-29CD-4B7B-AA95-92F1582DEC01} + {04CA31F5-49D8-4978-B917-98D3B10CD156} = {36FD4317-29CD-4B7B-AA95-92F1582DEC01} EndGlobalSection EndGlobal diff --git a/ToDoList/data/localdb.db b/ToDoList/data/localdb.db index cce3bb7..b8cc087 100644 Binary files a/ToDoList/data/localdb.db and b/ToDoList/data/localdb.db differ diff --git a/ToDoList/src/ToDoList.Domain/DTOs/ToDoItemCreateRequestDto.cs b/ToDoList/src/ToDoList.Domain/DTOs/ToDoItemCreateRequestDto.cs index 608d03c..9fbbc98 100644 --- a/ToDoList/src/ToDoList.Domain/DTOs/ToDoItemCreateRequestDto.cs +++ b/ToDoList/src/ToDoList.Domain/DTOs/ToDoItemCreateRequestDto.cs @@ -2,7 +2,7 @@ namespace ToDoList.Domain.DTOs; using ToDoList.Domain.Models; -public record ToDoItemCreateRequestDto(string Name, string Description, bool IsCompleted) //id is generated +public record ToDoItemCreateRequestDto(string Name, string Description, bool IsCompleted, string? Category) //id is generated { - public ToDoItem ToDomain() => new() { Name = Name, Description = Description, IsCompleted = IsCompleted }; + public ToDoItem ToDomain() => new() { Name = Name, Description = Description, IsCompleted = IsCompleted, Category = Category }; } diff --git a/ToDoList/src/ToDoList.Domain/DTOs/ToDoItemGetResponseDto.cs b/ToDoList/src/ToDoList.Domain/DTOs/ToDoItemGetResponseDto.cs index fa68fa7..5ed9a3e 100644 --- a/ToDoList/src/ToDoList.Domain/DTOs/ToDoItemGetResponseDto.cs +++ b/ToDoList/src/ToDoList.Domain/DTOs/ToDoItemGetResponseDto.cs @@ -1,7 +1,7 @@ namespace ToDoList.Domain.DTOs; using ToDoList.Domain.Models; -public record class ToDoItemGetResponseDto(int Id, string Name, string Description, bool IsCompleted) //let client know the Id +public record class ToDoItemGetResponseDto(int Id, string Name, string Description, bool IsCompleted, string? Category) //let client know the Id { - public static ToDoItemGetResponseDto FromDomain(ToDoItem item) => new(item.ToDoItemId, item.Name, item.Description, item.IsCompleted); + public static ToDoItemGetResponseDto FromDomain(ToDoItem item) => new(item.ToDoItemId, item.Name, item.Description, item.IsCompleted, item.Category); } diff --git a/ToDoList/src/ToDoList.Domain/DTOs/ToDoItemUpdateRequestDto.cs b/ToDoList/src/ToDoList.Domain/DTOs/ToDoItemUpdateRequestDto.cs index 0cd0486..a665166 100644 --- a/ToDoList/src/ToDoList.Domain/DTOs/ToDoItemUpdateRequestDto.cs +++ b/ToDoList/src/ToDoList.Domain/DTOs/ToDoItemUpdateRequestDto.cs @@ -1,7 +1,7 @@ namespace ToDoList.Domain.DTOs; using ToDoList.Domain.Models; -public record class ToDoItemUpdateRequestDto(string Name, string Description, bool IsCompleted) +public record class ToDoItemUpdateRequestDto(string Name, string Description, bool IsCompleted, string? Category) { - public ToDoItem ToDomain() => new() { Name = this.Name, Description = this.Description, IsCompleted = this.IsCompleted }; + public ToDoItem ToDomain() => new() { Name = this.Name, Description = this.Description, IsCompleted = this.IsCompleted, Category = this.Category }; } diff --git a/ToDoList/src/ToDoList.Domain/Models/ToDoItem.cs b/ToDoList/src/ToDoList.Domain/Models/ToDoItem.cs index 8451335..1219fbb 100644 --- a/ToDoList/src/ToDoList.Domain/Models/ToDoItem.cs +++ b/ToDoList/src/ToDoList.Domain/Models/ToDoItem.cs @@ -11,4 +11,6 @@ public class ToDoItem [StringLength(250)] public string Description { get; set; } public bool IsCompleted { get; set; } + + public string? Category { get; set; } } diff --git a/ToDoList/src/ToDoList.Frontend/Components/AhojSvete.razor b/ToDoList/src/ToDoList.Frontend/Components/AhojSvete.razor new file mode 100644 index 0000000..9b3d293 --- /dev/null +++ b/ToDoList/src/ToDoList.Frontend/Components/AhojSvete.razor @@ -0,0 +1,12 @@ +@page "/AhojSvete" + +Ahoj svete + +

@ahojSvete

+ +Vítej v moji aplikaci. + +@code +{ + string ahojSvete = "Ahoj světe přes c# z jiné stránky!"; +} diff --git a/ToDoList/src/ToDoList.Frontend/Components/Pages/AhojSvete.razor b/ToDoList/src/ToDoList.Frontend/Components/Pages/AhojSvete.razor deleted file mode 100644 index b8404e9..0000000 --- a/ToDoList/src/ToDoList.Frontend/Components/Pages/AhojSvete.razor +++ /dev/null @@ -1,12 +0,0 @@ -@page "/AhojSvete" - -Home - -

@ahojSvete

- -Vítej v mojí aplikaci. - -@code -{ - string ahojSvete = "Ahoj světe z jiné stránky!"; -} diff --git a/ToDoList/src/ToDoList.Frontend/Components/Pages/DashBoard muj.razor b/ToDoList/src/ToDoList.Frontend/Components/Pages/DashBoard muj.razor new file mode 100644 index 0000000..03501b6 --- /dev/null +++ b/ToDoList/src/ToDoList.Frontend/Components/Pages/DashBoard muj.razor @@ -0,0 +1,82 @@ +@page "/mujDashboard" +@rendermode InteractiveServer + +

DashBoard

+ + + + + + + + + + + @foreach (var todoItem in toDoItems) + { + + + + + } + +
+ ID Seřadit + + + Name Seřadit + +
@todoItem.ToDoItemId@todoItem.Name
+ +@code { +/* public string GenerateTable() +{ + var html = new System.Text.StringBuilder(); + html.Append(""); + foreach (var todoitem in toDoItems) + { + html.Append(""); + html.Append($""); + html.Append($""); + html.Append(""); + } + html.Append("
{todoitem.ToDoItemId}{todoitem.Name}
"); + return html.ToString(); +}*/ + private List toDoItems = new List + { + new ToDoItemView { ToDoItemId = 1, Name = "Udělat úkol na Czechitas", IsCompleted = false }, + new ToDoItemView { ToDoItemId = 2, Name = "Udělat nepovinný úkol na Czechitas", IsCompleted = false } + }; + + private bool isSortedByIdAscending = true; + private bool isSortedByNameAscending = true; + + private void OrderById() + { + if (isSortedByIdAscending) + toDoItems = toDoItems.OrderByDescending(item => item.ToDoItemId).ToList(); + else + toDoItems = toDoItems.OrderBy(item => item.ToDoItemId).ToList(); + + isSortedByIdAscending = !isSortedByIdAscending; + } + + private void OrderByName() + { + if (isSortedByNameAscending) + toDoItems = toDoItems.OrderByDescending(item => item.Name).ToList(); + else + toDoItems = toDoItems.OrderBy(item => item.Name).ToList(); + + isSortedByNameAscending = !isSortedByNameAscending; + } + + public class ToDoItemView + { + public int ToDoItemId { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public bool IsCompleted { get; set; } + } +} diff --git a/ToDoList/src/ToDoList.Frontend/Components/Pages/DashBoard.razor b/ToDoList/src/ToDoList.Frontend/Components/Pages/DashBoard.razor new file mode 100644 index 0000000..219bd97 --- /dev/null +++ b/ToDoList/src/ToDoList.Frontend/Components/Pages/DashBoard.razor @@ -0,0 +1,48 @@ +@using ToDoList.Frontend.Views +@using ToDoList.Frontend.Clients +@inject IToDoItemsClient ToDoItemsClient +@rendermode InteractiveServer + +

Dashboard

+ + + + + + + + +@if(toDoItems!=null) +{ + +} + @foreach(var toDoItem in toDoItems) + { + + + + + + + } +
@toDoItem.ToDoItemId@toDoItem.Name@toDoItem.Description@toDoItem.IsCompleted
+ + +@code +{ + protected override async Task OnInitializedAsync() + { + toDoItems = await ToDoItemsClient.ReadItemsAsync(); + } + private List? toDoItems = []; + + public void OrderByName() + { + toDoItems = toDoItems?.OrderBy(x => x.Name).ToList(); + } + + public void OrderById() + { + toDoItems = toDoItems?.OrderBy(x => x.ToDoItemId).ToList(); + } +} diff --git a/ToDoList/src/ToDoList.Frontend/Components/Pages/Home.razor b/ToDoList/src/ToDoList.Frontend/Components/Pages/Home.razor index 5c56c98..eaae7fd 100644 --- a/ToDoList/src/ToDoList.Frontend/Components/Pages/Home.razor +++ b/ToDoList/src/ToDoList.Frontend/Components/Pages/Home.razor @@ -1,27 +1,55 @@ @page "/" @rendermode InteractiveServer +Domovska stranka -Home + - + + } diff --git a/ToDoList/src/ToDoList.Frontend/Program.cs b/ToDoList/src/ToDoList.Frontend/Program.cs index b85f5ad..5b6ea19 100644 --- a/ToDoList/src/ToDoList.Frontend/Program.cs +++ b/ToDoList/src/ToDoList.Frontend/Program.cs @@ -5,7 +5,10 @@ // Add services to the container. builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); +.AddInteractiveServerComponents(); + +builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri("http://localhost:5000") }); +builder.Services.AddScoped(); builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri("http://localhost:5000") }); builder.Services.AddScoped(); @@ -26,6 +29,6 @@ app.UseAntiforgery(); app.MapRazorComponents() - .AddInteractiveServerRenderMode(); +.AddInteractiveServerRenderMode(); app.Run(); diff --git a/ToDoList/src/ToDoList.Persistence/Migrations/20241125120158_AddCategoryToToDoItem.Designer.cs b/ToDoList/src/ToDoList.Persistence/Migrations/20241125120158_AddCategoryToToDoItem.Designer.cs new file mode 100644 index 0000000..3cd9ddd --- /dev/null +++ b/ToDoList/src/ToDoList.Persistence/Migrations/20241125120158_AddCategoryToToDoItem.Designer.cs @@ -0,0 +1,50 @@ +// +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using ToDoList.Persistence; + +#nullable disable + +namespace ToDoList.Persistence.Migrations +{ + [DbContext(typeof(ToDoItemsContext))] + [Migration("20241125120158_AddCategoryToToDoItem")] + partial class AddCategoryToToDoItem + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "8.0.10"); + + modelBuilder.Entity("ToDoList.Domain.Models.ToDoItem", b => + { + b.Property("ToDoItemId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Category") + .HasColumnType("TEXT"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("TEXT"); + + b.Property("IsCompleted") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("ToDoItemId"); + + b.ToTable("ToDoItems"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ToDoList/src/ToDoList.Persistence/Migrations/20241125120158_AddCategoryToToDoItem.cs b/ToDoList/src/ToDoList.Persistence/Migrations/20241125120158_AddCategoryToToDoItem.cs new file mode 100644 index 0000000..deae25c --- /dev/null +++ b/ToDoList/src/ToDoList.Persistence/Migrations/20241125120158_AddCategoryToToDoItem.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ToDoList.Persistence.Migrations +{ + /// + public partial class AddCategoryToToDoItem : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "Category", + table: "ToDoItems", + type: "TEXT", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Category", + table: "ToDoItems"); + } + } +} diff --git a/ToDoList/src/ToDoList.Persistence/Migrations/ToDoItemsContextModelSnapshot.cs b/ToDoList/src/ToDoList.Persistence/Migrations/ToDoItemsContextModelSnapshot.cs index 38b43fb..b43b028 100644 --- a/ToDoList/src/ToDoList.Persistence/Migrations/ToDoItemsContextModelSnapshot.cs +++ b/ToDoList/src/ToDoList.Persistence/Migrations/ToDoItemsContextModelSnapshot.cs @@ -22,6 +22,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); + b.Property("Category") + .HasColumnType("TEXT"); + b.Property("Description") .IsRequired() .HasMaxLength(250) diff --git a/ToDoList/src/ToDoList.Persistence/Repositories/IRepository.cs b/ToDoList/src/ToDoList.Persistence/Repositories/IRepository.cs index 2a984fb..e0ab452 100644 --- a/ToDoList/src/ToDoList.Persistence/Repositories/IRepository.cs +++ b/ToDoList/src/ToDoList.Persistence/Repositories/IRepository.cs @@ -8,3 +8,11 @@ public interface IRepository where T : class public void Update(T item); public void Delete(T item); } +public interface IRepositoryAsync where T : class +{ + public Task CreateAsync(T item); + public Task> ReadAllAsync(); + public Task ReadByIdAsync(int id); + public Task UpdateAsync(T item); + public Task DeleteAsync(T item); +} diff --git a/ToDoList/src/ToDoList.Persistence/Repositories/ToDoItemsRepository.cs b/ToDoList/src/ToDoList.Persistence/Repositories/ToDoItemsRepository.cs index 3f4cae5..9c3fddc 100644 --- a/ToDoList/src/ToDoList.Persistence/Repositories/ToDoItemsRepository.cs +++ b/ToDoList/src/ToDoList.Persistence/Repositories/ToDoItemsRepository.cs @@ -1,9 +1,12 @@ namespace ToDoList.Persistence.Repositories; using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; using ToDoList.Domain.Models; -public class ToDoItemsRepository : IRepository +public class ToDoItemsRepository : IRepositoryAsync { private readonly ToDoItemsContext context; @@ -12,22 +15,31 @@ public ToDoItemsRepository(ToDoItemsContext context) this.context = context; } - public void Create(ToDoItem item) + public async Task CreateAsync(ToDoItem item) { - context.ToDoItems.Add(item); - context.SaveChanges(); + await context.ToDoItems.AddAsync(item); + await context.SaveChangesAsync(); } - public IEnumerable ReadAll() => context.ToDoItems.ToList(); - public ToDoItem? ReadById(int id) => context.ToDoItems.Find(id); - public void Update(ToDoItem item) + + public async Task> ReadAllAsync() + { + return await context.ToDoItems.ToListAsync(); + } + + public async Task ReadByIdAsync(int id) { - context.Entry(item).CurrentValues.SetValues(item); - context.SaveChanges(); + return await context.ToDoItems.FindAsync(id); } - public void Delete(ToDoItem item) + public async Task UpdateAsync(ToDoItem item) + { + var foundItem = await context.ToDoItems.FindAsync(item.ToDoItemId) ?? throw new ArgumentOutOfRangeException($"ToDo item with ID {item.ToDoItemId} not found."); + context.Entry(foundItem).CurrentValues.SetValues(item); + context.SaveChangesAsync(); + } + public async Task DeleteAsync(ToDoItem item) { context.ToDoItems.Remove(item); - context.SaveChanges(); + await context.SaveChangesAsync(); } } diff --git a/ToDoList/src/ToDoList.WebApi/Controllers/ToDoItemsController.cs b/ToDoList/src/ToDoList.WebApi/Controllers/ToDoItemsController.cs index bf9faf7..16a4eca 100644 --- a/ToDoList/src/ToDoList.WebApi/Controllers/ToDoItemsController.cs +++ b/ToDoList/src/ToDoList.WebApi/Controllers/ToDoItemsController.cs @@ -1,5 +1,9 @@ namespace ToDoList.WebApi.Controllers; + using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; using ToDoList.Domain.DTOs; using ToDoList.Domain.Models; using ToDoList.Persistence.Repositories; @@ -8,123 +12,114 @@ namespace ToDoList.WebApi.Controllers; [Route("api/[controller]")] public class ToDoItemsController : ControllerBase { - private readonly IRepository repository; + private readonly IRepositoryAsync repository; - public ToDoItemsController(IRepository repository) + public ToDoItemsController(IRepositoryAsync repository) { this.repository = repository; } [HttpPost] - public ActionResult Create(ToDoItemCreateRequestDto request) + public async Task> CreateAsync(ToDoItemCreateRequestDto request) { - //map to Domain object as soon as possible var item = request.ToDomain(); - //try to create an item try { - repository.Create(item); + await repository.CreateAsync(item); } catch (Exception ex) { - return Problem(ex.Message, null, StatusCodes.Status500InternalServerError); //500 + return Problem(ex.Message, null, StatusCodes.Status500InternalServerError); } - //respond to client return CreatedAtAction( - nameof(ReadById), + nameof(ReadByIdAsync), new { toDoItemId = item.ToDoItemId }, - ToDoItemGetResponseDto.FromDomain(item)); //201 + ToDoItemGetResponseDto.FromDomain(item)); } [HttpGet] - public ActionResult> Read() + [ActionName(nameof(ReadByIdAsync))] + public async Task>> ReadAsync() { IEnumerable itemsToGet; + try { - itemsToGet = repository.ReadAll(); + itemsToGet = await repository.ReadAllAsync(); } catch (Exception ex) { - return Problem(ex.Message, null, StatusCodes.Status500InternalServerError); //500 + return Problem(ex.Message, null, StatusCodes.Status500InternalServerError); } - //respond to client - return (itemsToGet is null || !itemsToGet.Any()) - ? NotFound() //404 - : Ok(itemsToGet.Select(ToDoItemGetResponseDto.FromDomain)); //200 + return itemsToGet is null || !itemsToGet.Any() + ? NotFound() + : Ok(itemsToGet.Select(ToDoItemGetResponseDto.FromDomain)); } [HttpGet("{toDoItemId:int}")] - public ActionResult ReadById(int toDoItemId) + public async Task> ReadByIdAsync(int toDoItemId) { - //try to retrieve the item by id ToDoItem? itemToGet; + try { - itemToGet = repository.ReadById(toDoItemId); + itemToGet = await repository.ReadByIdAsync(toDoItemId); } catch (Exception ex) { - return Problem(ex.Message, null, StatusCodes.Status500InternalServerError); //500 + return Problem(ex.Message, null, StatusCodes.Status500InternalServerError); } - //respond to client - return (itemToGet is null) - ? NotFound() //404 - : Ok(ToDoItemGetResponseDto.FromDomain(itemToGet)); //200 + return itemToGet is null + ? NotFound() + : Ok(ToDoItemGetResponseDto.FromDomain(itemToGet)); } [HttpPut("{toDoItemId:int}")] - public IActionResult UpdateById(int toDoItemId, [FromBody] ToDoItemUpdateRequestDto request) + public async Task UpdateByIdAsync(int toDoItemId, [FromBody] ToDoItemUpdateRequestDto request) { - //map to Domain object as soon as possible var updatedItem = request.ToDomain(); updatedItem.ToDoItemId = toDoItemId; - //try to update the item by retrieving it with given id try { - //retrieve the item - var itemToUpdate = repository.ReadById(toDoItemId); + var itemToUpdate = await repository.ReadByIdAsync(toDoItemId); if (itemToUpdate is null) { - return NotFound(); //404 + return NotFound(); } - repository.Update(updatedItem); + await repository.UpdateAsync(updatedItem); } catch (Exception ex) { - return Problem(ex.Message, null, StatusCodes.Status500InternalServerError); //500 + return Problem(ex.Message, null, StatusCodes.Status500InternalServerError); } - //respond to client - return NoContent(); //204 + return NoContent(); } [HttpDelete("{toDoItemId:int}")] - public IActionResult DeleteById(int toDoItemId) + public async Task DeleteByIdAsync(int toDoItemId) { - //try to delete the item try { - var itemToDelete = repository.ReadById(toDoItemId); + var itemToDelete = await repository.ReadByIdAsync(toDoItemId); if (itemToDelete is null) { - return NotFound(); //404 + return NotFound(); } - repository.Delete(itemToDelete); + await repository.DeleteAsync(itemToDelete); } catch (Exception ex) { return Problem(ex.Message, null, StatusCodes.Status500InternalServerError); } - //respond to client - return NoContent(); //204 + return NoContent(); } } diff --git a/ToDoList/src/ToDoList.WebApi/Controllers/ToDoItemsRequests.http b/ToDoList/src/ToDoList.WebApi/Controllers/ToDoItemsRequests.http index 4ef60a7..a10a7eb 100644 --- a/ToDoList/src/ToDoList.WebApi/Controllers/ToDoItemsRequests.http +++ b/ToDoList/src/ToDoList.WebApi/Controllers/ToDoItemsRequests.http @@ -9,7 +9,7 @@ GET {{host}}:{{port}}/api/ToDoItems ### //Get specific ToDoItem by id -@itemToGetId = 1 +@itemToGetId = 33 GET {{host}}:{{port}}/api/ToDoItems/{{itemToGetId}} ### @@ -21,13 +21,14 @@ Content-Type: application/json { "name": "Example New Task", "description": "Example New Description", - "isCompleted": false + "isCompleted": false, + "category": null } ### //Update existing ToDoItem by id -@itemToUpdateId = 1 +@itemToUpdateId = 16 PUT {{host}}:{{port}}/api/ToDoItems/{{itemToUpdateId}} Content-Type: application/json @@ -35,11 +36,12 @@ Content-Type: application/json { "name": "Updated Task", "description": "Updated Description", - "isCompleted": false + "isCompleted": false, + "category": "Updated" } ### //Delete exisiting ToDoItem by id -@itemToDeleteId = 1 +@itemToDeleteId = 19 DELETE {{host}}:{{port}}/api/ToDoItems/{{itemToDeleteId}} diff --git a/ToDoList/src/ToDoList.WebApi/Program.cs b/ToDoList/src/ToDoList.WebApi/Program.cs index c90426b..7f0d542 100644 --- a/ToDoList/src/ToDoList.WebApi/Program.cs +++ b/ToDoList/src/ToDoList.WebApi/Program.cs @@ -10,7 +10,7 @@ //Persistence services builder.Services.AddDbContext(); // pridalo ToDoItemsContext - builder.Services.AddScoped, ToDoItemsRepository>(); // pridalo ToDoItemsRepository + builder.Services.AddScoped, ToDoItemsRepository>(); // pridalo ToDoItemsRepository } var app = builder.Build(); diff --git a/ToDoList/tests/ToDoList.Test/IntegrationTests/DeleteTests.cs b/ToDoList/tests/ToDoList.Test/IntegrationTests/DeleteTests.cs index 6f10514..a58f64e 100644 --- a/ToDoList/tests/ToDoList.Test/IntegrationTests/DeleteTests.cs +++ b/ToDoList/tests/ToDoList.Test/IntegrationTests/DeleteTests.cs @@ -9,7 +9,7 @@ namespace ToDoList.Test.IntegrationTests; public class DeleteTests { [Fact] - public void Delete_ValidId_ReturnsNoContent() + public async void Delete_ValidId_ReturnsNoContent() { // Arrange var context = new ToDoItemsContext("Data Source=../../../../../data/localdb.db"); @@ -25,14 +25,14 @@ public void Delete_ValidId_ReturnsNoContent() context.SaveChanges(); // Act - var result = controller.DeleteById(toDoItem.ToDoItemId); + var result = await controller.DeleteByIdAsync(toDoItem.ToDoItemId); // Assert Assert.IsType(result); } [Fact] - public void Delete_InvalidId_ReturnsNotFound() + public async void Delete_InvalidId_ReturnsNotFound() { // Arrange var context = new ToDoItemsContext("Data Source=../../../../../data/localdb.db"); @@ -49,7 +49,7 @@ public void Delete_InvalidId_ReturnsNotFound() // Act var invalidId = -1; - var result = controller.DeleteById(invalidId); + var result =await controller.DeleteByIdAsync(invalidId); // Assert Assert.IsType(result); diff --git a/ToDoList/tests/ToDoList.Test/IntegrationTests/GetByIdTests.cs b/ToDoList/tests/ToDoList.Test/IntegrationTests/GetByIdTests.cs index a16bc7f..a2a96be 100644 --- a/ToDoList/tests/ToDoList.Test/IntegrationTests/GetByIdTests.cs +++ b/ToDoList/tests/ToDoList.Test/IntegrationTests/GetByIdTests.cs @@ -9,7 +9,7 @@ namespace ToDoList.Test.IntegrationTests; public class GetByIdTests { [Fact] - public void GetById_ValidId_ReturnsItem() + public async Task GetById_ValidId_ReturnsItem() { // Arrange var context = new ToDoItemsContext("Data Source=../../../../../data/localdb.db"); @@ -25,7 +25,7 @@ public void GetById_ValidId_ReturnsItem() context.SaveChanges(); // Act - var result = controller.ReadById(toDoItem.ToDoItemId); + var result = await controller.ReadByIdAsync(toDoItem.ToDoItemId); var resultResult = result.Result; var value = result.GetValue(); @@ -40,7 +40,7 @@ public void GetById_ValidId_ReturnsItem() } [Fact] - public void GetById_InvalidId_ReturnsNotFound() + public async Task GetById_InvalidId_ReturnsNotFound() { // Arrange var context = new ToDoItemsContext("Data Source=../../../../../data/localdb.db"); @@ -58,7 +58,7 @@ public void GetById_InvalidId_ReturnsNotFound() // Act var invalidId = -1; - var result = controller.ReadById(invalidId); + var result =await controller.ReadByIdAsync(invalidId); var resultResult = result.Result; // Assert diff --git a/ToDoList/tests/ToDoList.Test/IntegrationTests/GetTests.cs b/ToDoList/tests/ToDoList.Test/IntegrationTests/GetTests.cs index 118c62e..7666254 100644 --- a/ToDoList/tests/ToDoList.Test/IntegrationTests/GetTests.cs +++ b/ToDoList/tests/ToDoList.Test/IntegrationTests/GetTests.cs @@ -9,7 +9,7 @@ namespace ToDoList.Test.IntegrationTests; public class GetTests { [Fact] - public void Get_AllItems_ReturnsAllItems() + public async Task Get_AllItems_ReturnsAllItems() { // Arrange var context = new ToDoItemsContext("Data Source=../../../../../data/localdb.db"); @@ -26,7 +26,7 @@ public void Get_AllItems_ReturnsAllItems() context.SaveChanges(); // Act - var result = controller.Read(); + var result =await controller.ReadAsync(); var resultResult = result.Result; var value = result.GetValue(); diff --git a/ToDoList/tests/ToDoList.Test/IntegrationTests/PostTests.cs b/ToDoList/tests/ToDoList.Test/IntegrationTests/PostTests.cs index 0c02405..ccd7a87 100644 --- a/ToDoList/tests/ToDoList.Test/IntegrationTests/PostTests.cs +++ b/ToDoList/tests/ToDoList.Test/IntegrationTests/PostTests.cs @@ -9,7 +9,7 @@ namespace ToDoList.Test.IntegrationTests; public class PostTests { [Fact] - public void Post_ValidRequest_ReturnsNewItem() + public async void Post_ValidRequest_ReturnsNewItem() { // Arrange var context = new ToDoItemsContext("Data Source=../../../../../data/localdb.db"); @@ -18,11 +18,12 @@ public void Post_ValidRequest_ReturnsNewItem() var request = new ToDoItemCreateRequestDto( Name: "Jmeno", Description: "Popis", - IsCompleted: false + IsCompleted: false, + Category: null ); // Act - var result = controller.Create(request); + var result = await controller.CreateAsync(request); var resultResult = result.Result; var value = result.GetValue(); diff --git a/ToDoList/tests/ToDoList.Test/IntegrationTests/PutTests.cs b/ToDoList/tests/ToDoList.Test/IntegrationTests/PutTests.cs index bcda2b4..898ad37 100644 --- a/ToDoList/tests/ToDoList.Test/IntegrationTests/PutTests.cs +++ b/ToDoList/tests/ToDoList.Test/IntegrationTests/PutTests.cs @@ -10,7 +10,7 @@ namespace ToDoList.Test.IntegrationTests; public class PutTests { [Fact] - public void Put_ValidId_ReturnsNoContent() + public async Task Put_ValidId_ReturnsNoContent() { // Arrange var context = new ToDoItemsContext("Data Source=../../../../../data/localdb.db"); @@ -28,18 +28,19 @@ public void Put_ValidId_ReturnsNoContent() var request = new ToDoItemUpdateRequestDto( Name: "Jine jmeno", Description: "Jiny popis", - IsCompleted: true + IsCompleted: true, + Category: null ); // Act - var result = controller.UpdateById(toDoItem.ToDoItemId, request); + var result = await controller.UpdateByIdAsync(toDoItem.ToDoItemId, request); // Assert Assert.IsType(result); } [Fact] - public void Put_InvalidId_ReturnsNotFound() + public async Task Put_InvalidId_ReturnsNotFound() { // Arrange var context = new ToDoItemsContext("Data Source=../../../../../data/localdb.db"); @@ -57,12 +58,13 @@ public void Put_InvalidId_ReturnsNotFound() var request = new ToDoItemUpdateRequestDto( Name: "Jine jmeno", Description: "Jiny popis", - IsCompleted: true + IsCompleted: true, + Category: null ); // Act var invalidId = -1; - var result = controller.UpdateById(invalidId, request); + var result = await controller.UpdateByIdAsync(invalidId, request); // Assert Assert.IsType(result); diff --git a/ToDoList/tests/ToDoList.Test/ToDoList.Test.csproj b/ToDoList/tests/ToDoList.Test/ToDoList.Test.csproj index 13060b5..99fd0eb 100644 --- a/ToDoList/tests/ToDoList.Test/ToDoList.Test.csproj +++ b/ToDoList/tests/ToDoList.Test/ToDoList.Test.csproj @@ -22,6 +22,7 @@ + diff --git a/ToDoList/tests/ToDoList.Test/UnitTests/DeleteTests.cs b/ToDoList/tests/ToDoList.Test/UnitTests/DeleteTests.cs index 022b226..528de41 100644 --- a/ToDoList/tests/ToDoList.Test/UnitTests/DeleteTests.cs +++ b/ToDoList/tests/ToDoList.Test/UnitTests/DeleteTests.cs @@ -11,76 +11,76 @@ namespace ToDoList.Test.UnitTests; public class DeleteUnitTests { [Fact] - public void Delete_DeleteByIdValidItemId_ReturnsNoContent() + public async Task Delete_DeleteByIdValidItemId_ReturnsNoContent_Async() { // Arrange - var repositoryMock = Substitute.For>(); + var repositoryMock = Substitute.For>(); var controller = new ToDoItemsController(repositoryMock); - repositoryMock.ReadById(Arg.Any()).Returns(new ToDoItem { Name = "testItem", Description = "testDescription", IsCompleted = false }); + repositoryMock.ReadByIdAsync(Arg.Any()).Returns(new ToDoItem { Name = "testItem", Description = "testDescription", IsCompleted = false }); var someId = 1; // Act - var result = controller.DeleteById(someId); + var result = await controller.DeleteByIdAsync(someId); // Assert Assert.IsType(result); - repositoryMock.Received(1).ReadById(someId); - repositoryMock.Received(1).Delete(Arg.Any()); + await repositoryMock.Received(1).ReadByIdAsync(someId); + await repositoryMock.Received(1).DeleteAsync(Arg.Any()); } [Fact] - public void Delete_DeleteByIdInvalidItemId_ReturnsNotFound() + public async Task Delete_DeleteByIdInvalidItemId_ReturnsNotFound_Async() { // Arrange - var repositoryMock = Substitute.For>(); + var repositoryMock = Substitute.For>(); var controller = new ToDoItemsController(repositoryMock); - repositoryMock.ReadById(Arg.Any()).Returns(null as ToDoItem); + repositoryMock.ReadByIdAsync(Arg.Any()).Returns(null as ToDoItem); var someId = 1; // Act - var result = controller.DeleteById(someId); + var result = await controller.DeleteByIdAsync(someId); // Assert Assert.IsType(result); - repositoryMock.Received(1).ReadById(someId); - repositoryMock.Received(0).Delete(Arg.Any()); // make sure nothing was deleted + await repositoryMock.Received(1).ReadByIdAsync(someId); + await repositoryMock.Received(0).DeleteAsync(Arg.Any()); } [Fact] - public void Delete_DeleteByIdExceptionOccurredDuringRepositoryReadById_ReturnsInternalServerError() + public async Task Delete_DeleteByIdExceptionOccurredDuringRepositoryReadById_ReturnsInternalServerError_Async() { // Arrange - var repositoryMock = Substitute.For>(); + var repositoryMock = Substitute.For>(); var controller = new ToDoItemsController(repositoryMock); - repositoryMock.ReadById(Arg.Any()).Throws(new Exception()); + repositoryMock.When(r => r.ReadByIdAsync(Arg.Any())).Do(x => throw new Exception()); var someId = 1; // Act - var result = controller.DeleteById(someId); + var result = await controller.DeleteByIdAsync(someId); // Assert Assert.IsType(result); - repositoryMock.Received(1).ReadById(someId); + await repositoryMock.Received(1).ReadByIdAsync(someId); Assert.Equal(StatusCodes.Status500InternalServerError, ((ObjectResult)result).StatusCode); } [Fact] - public void Delete_DeleteByIdExceptionOccurredDuringRepositoryDelete_ReturnsInternalServerError() + public async Task Delete_DeleteByIdExceptionOccurredDuringRepositoryDelete_ReturnsInternalServerError_Async() { // Arrange - var repositoryMock = Substitute.For>(); + var repositoryMock = Substitute.For>(); var controller = new ToDoItemsController(repositoryMock); - repositoryMock.ReadById(Arg.Any()).Returns(new ToDoItem { Name = "testItem", Description = "testDescription", IsCompleted = false }); - repositoryMock.When(r => r.Delete(Arg.Any())).Do(r => throw new Exception()); + repositoryMock.ReadByIdAsync(Arg.Any()).Returns(new ToDoItem { Name = "testItem", Description = "testDescription", IsCompleted = false }); + repositoryMock.When(r => r.DeleteAsync(Arg.Any())).Do(x => throw new Exception()); var someId = 1; // Act - var result = controller.DeleteById(someId); + var result = await controller.DeleteByIdAsync(someId); // Assert Assert.IsType(result); - repositoryMock.Received(1).ReadById(someId); - repositoryMock.Received(1).Delete(Arg.Any()); + await repositoryMock.Received(1).ReadByIdAsync(someId); + await repositoryMock.Received(1).DeleteAsync(Arg.Any()); Assert.Equal(StatusCodes.Status500InternalServerError, ((ObjectResult)result).StatusCode); } } diff --git a/ToDoList/tests/ToDoList.Test/UnitTests/GetByIdTests.cs b/ToDoList/tests/ToDoList.Test/UnitTests/GetByIdTests.cs index d864cb0..a850c0e 100644 --- a/ToDoList/tests/ToDoList.Test/UnitTests/GetByIdTests.cs +++ b/ToDoList/tests/ToDoList.Test/UnitTests/GetByIdTests.cs @@ -12,57 +12,57 @@ namespace ToDoList.Test.UnitTests; public class GetByIdUnitTests { [Fact] - public void Get_ReadByIdWhenSomeItemAvailable_ReturnsOk() + public async Task Get_ReadByIdWhenSomeItemAvailable_ReturnsOk() { // Arrange - var repositoryMock = Substitute.For>(); + var repositoryMock = Substitute.For>(); var controller = new ToDoItemsController(repositoryMock); var someId = 1; - repositoryMock.ReadById(someId).Returns(new ToDoItem { Name = "testItem", Description = "testDescription", IsCompleted = false }); + repositoryMock.ReadByIdAsync(someId).Returns(new ToDoItem { Name = "testItem", Description = "testDescription", IsCompleted = false }); // Act - var result = controller.ReadById(someId); + var result = await controller.ReadByIdAsync(someId); var resultResult = result.Result; // Assert Assert.IsType(resultResult); - repositoryMock.Received(1).ReadById(someId); + await repositoryMock.Received(1).ReadByIdAsync(someId); } [Fact] - public void Get_ReadByIdWhenItemIsNull_ReturnsNotFound() + public async Task Get_ReadByIdWhenItemIsNull_ReturnsNotFound() { // Arrange - var repositoryMock = Substitute.For>(); + var repositoryMock = Substitute.For>(); var controller = new ToDoItemsController(repositoryMock); var someId = 1; - repositoryMock.ReadById(someId).ReturnsNull(); + repositoryMock.ReadByIdAsync(someId).ReturnsNull(); // Act - var result = controller.ReadById(someId); + var result = await controller.ReadByIdAsync(someId); var resultResult = result.Result; // Assert Assert.IsType(resultResult); - repositoryMock.Received(1).ReadById(someId); + await repositoryMock.Received(1).ReadByIdAsync(someId); } [Fact] - public void Get_ReadByIdUnhandledException_ReturnsInternalServerError() + public async Task Get_ReadByIdUnhandledException_ReturnsInternalServerError() { // Arrange - var repositoryMock = Substitute.For>(); + var repositoryMock = Substitute.For>(); var controller = new ToDoItemsController(repositoryMock); var someId = 1; - repositoryMock.ReadById(someId).Throws(new Exception()); + repositoryMock.ReadByIdAsync(someId).Throws(new Exception()); // Act - var result = controller.ReadById(someId); + var result =await controller.ReadByIdAsync(someId); var resultResult = result.Result; // Assert Assert.IsType(resultResult); - repositoryMock.Received(1).ReadById(someId); + await repositoryMock.Received(1).ReadByIdAsync(someId); Assert.Equivalent(new StatusCodeResult(StatusCodes.Status500InternalServerError), resultResult); } diff --git a/ToDoList/tests/ToDoList.Test/UnitTests/GetTests.cs b/ToDoList/tests/ToDoList.Test/UnitTests/GetTests.cs index 97c92c1..a904d47 100644 --- a/ToDoList/tests/ToDoList.Test/UnitTests/GetTests.cs +++ b/ToDoList/tests/ToDoList.Test/UnitTests/GetTests.cs @@ -12,55 +12,55 @@ namespace ToDoList.Test.UnitTests; public class GetUnitTests { [Fact] - public void Get_ReadWhenSomeItemAvailable_ReturnsOk() + public async Task Get_ReadWhenSomeItemAvailable_ReturnsOk() { // Arrange - var repositoryMock = Substitute.For>(); + var repositoryMock = Substitute.For>(); var controller = new ToDoItemsController(repositoryMock); - repositoryMock.ReadAll().Returns([new ToDoItem { Name = "testItem", Description = "testDescription", IsCompleted = false }]); + repositoryMock.ReadAllAsync().Returns([new ToDoItem { Name = "testItem", Description = "testDescription", IsCompleted = false }]); // Act - var result = controller.Read(); + var result = await controller.ReadAsync(); var resultResult = result.Result; // Assert Assert.IsType(resultResult); - repositoryMock.Received(1).ReadAll(); + repositoryMock.Received(1).ReadAllAsync(); } [Fact] - public void Get_ReadWhenNoItemAvailable_ReturnsNotFound() + public async Task Get_ReadWhenNoItemAvailable_ReturnsNotFound() { // Arrange - var repositoryMock = Substitute.For>(); + var repositoryMock = Substitute.For>(); var controller = new ToDoItemsController(repositoryMock); - repositoryMock.ReadAll().ReturnsNull(); + repositoryMock.ReadAllAsync().ReturnsNull(); // Act - var result = controller.Read(); + var result = await controller.ReadAsync(); var resultResult = result.Result; // Assert Assert.IsType(resultResult); - repositoryMock.Received(1).ReadAll(); + await repositoryMock.Received(1).ReadAllAsync(); } [Fact] - public void Get_ReadUnhandledException_ReturnsInternalServerError() + public async Task Get_ReadUnhandledException_ReturnsInternalServerError() { // Arrange - var repositoryMock = Substitute.For>(); + var repositoryMock = Substitute.For>(); var controller = new ToDoItemsController(repositoryMock); //repositoryMock.When(r => r.ReadAll()).Do(r => throw new Exception()); - repositoryMock.ReadAll().Throws(new Exception()); + repositoryMock.ReadAllAsync().Throws(new Exception()); // Act - var result = controller.Read(); + var result = await controller.ReadAsync(); var resultResult = result.Result; // Assert Assert.IsType(resultResult); - repositoryMock.Received(1).ReadAll(); + repositoryMock.Received(1).ReadAllAsync(); Assert.Equivalent(new StatusCodeResult(StatusCodes.Status500InternalServerError), resultResult); } diff --git a/ToDoList/tests/ToDoList.Test/UnitTests/PostTests.cs b/ToDoList/tests/ToDoList.Test/UnitTests/PostTests.cs index 94d076c..edf1e8a 100644 --- a/ToDoList/tests/ToDoList.Test/UnitTests/PostTests.cs +++ b/ToDoList/tests/ToDoList.Test/UnitTests/PostTests.cs @@ -11,25 +11,26 @@ namespace ToDoList.Test.UnitTests; public class PostUnitTests { [Fact] - public void Post_CreateValidRequest_ReturnsCreatedAtAction() + public async Task Post_CreateValidRequest_ReturnsCreatedAtAction() { // Arrange - var repositoryMock = Substitute.For>(); + var repositoryMock = Substitute.For>(); var controller = new ToDoItemsController(repositoryMock); var request = new ToDoItemCreateRequestDto( Name: "Jmeno", Description: "Popis", - IsCompleted: false + IsCompleted: false, + Category: null ); // Act - var result = controller.Create(request); + var result = await controller.CreateAsync(request); var resultResult = result.Result; var value = result.GetValue(); // Assert Assert.IsType(resultResult); - repositoryMock.Received(1).Create(Arg.Any()); + await repositoryMock.Received(1).CreateAsync(Arg.Any()); // These asserts are optional Assert.NotNull(value); @@ -40,20 +41,22 @@ public void Post_CreateValidRequest_ReturnsCreatedAtAction() } [Fact] - public void Post_CreateUnhandledException_ReturnsInternalServerError() + public async Task Post_CreateUnhandledException_ReturnsInternalServerError() { // Arrange - var repositoryMock = Substitute.For>(); + var repositoryMock = Substitute.For>(); var controller = new ToDoItemsController(repositoryMock); var request = new ToDoItemCreateRequestDto( Name: "Jmeno", Description: "Popis", - IsCompleted: false + IsCompleted: false, + Category: null + ); - repositoryMock.When(r => r.Create(Arg.Any())).Do(r => throw new Exception()); + repositoryMock.When(r => r.CreateAsync(Arg.Any())).Do(r => throw new Exception()); // Act - var result = controller.Create(request); + var result = await controller.CreateAsync(request); var resultResult = result.Result; // Assert diff --git a/ToDoList/tests/ToDoList.Test/UnitTests/PutTests.cs b/ToDoList/tests/ToDoList.Test/UnitTests/PutTests.cs index 19bc185..7298b98 100644 --- a/ToDoList/tests/ToDoList.Test/UnitTests/PutTests.cs +++ b/ToDoList/tests/ToDoList.Test/UnitTests/PutTests.cs @@ -12,70 +12,73 @@ namespace ToDoList.Test.UnitTests; public class PutUnitTests { [Fact] - public void Put_UpdateByIdWhenItemUpdated_ReturnsNoContent() + public async Task Put_UpdateByIdWhenItemUpdated_ReturnsNoContent() { // Arrange - var repositoryMock = Substitute.For>(); + var repositoryMock = Substitute.For>(); var controller = new ToDoItemsController(repositoryMock); var request = new ToDoItemUpdateRequestDto( Name: "Jmeno", Description: "Popis", - IsCompleted: false + IsCompleted: false, + Category: null ); var someId = 1; var readToDoItem = new ToDoItem { Name = "Jmeno", Description = "Popis", IsCompleted = false, ToDoItemId = someId }; - repositoryMock.ReadById(someId).Returns(readToDoItem); + repositoryMock.ReadByIdAsync(someId).Returns(readToDoItem); // Act - var result = controller.UpdateById(someId, request); + var result = await controller.UpdateByIdAsync(someId, request); // Assert Assert.IsType(result); - repositoryMock.Received(1).ReadById(someId); - repositoryMock.Received(1).Update(Arg.Any()); + repositoryMock.Received(1).ReadByIdAsync(someId); + repositoryMock.Received(1).UpdateAsync(Arg.Any()); } [Fact] - public void Put_UpdateByIdWhenIdNotFound_ReturnsNotFound() + public async Task Put_UpdateByIdWhenIdNotFound_ReturnsNotFound() { // Arrange - var repositoryMock = Substitute.For>(); + var repositoryMock = Substitute.For>(); var controller = new ToDoItemsController(repositoryMock); var request = new ToDoItemUpdateRequestDto( Name: "Jmeno", Description: "Popis", - IsCompleted: false + IsCompleted: false, + Category: null ); - repositoryMock.ReadById(Arg.Any()).ReturnsNull(); + repositoryMock.ReadByIdAsync(Arg.Any()).ReturnsNull(); var someId = 1; // Act - var result = controller.UpdateById(someId, request); + var result = await controller.UpdateByIdAsync(someId, request); // Assert Assert.IsType(result); - repositoryMock.Received(1).ReadById(someId); + repositoryMock.Received(1).ReadByIdAsync(someId); } [Fact] - public void Put_UpdateByIdUnhandledException_ReturnsInternalServerError() + public async Task Put_UpdateByIdUnhandledException_ReturnsInternalServerError() { // Arrange - var repositoryMock = Substitute.For>(); + var repositoryMock = Substitute.For>(); var controller = new ToDoItemsController(repositoryMock); var request = new ToDoItemUpdateRequestDto( Name: "Jmeno", Description: "Popis", - IsCompleted: false + IsCompleted: false, + Category: null ); var someId = 1; var readToDoItem = new ToDoItem { Name = "Jmeno", Description = "Popis", IsCompleted = false, ToDoItemId = someId }; - repositoryMock.ReadById(Arg.Any()).Returns(readToDoItem); - repositoryMock.When(r => r.Update(Arg.Any())).Do(r => throw new Exception()); + repositoryMock.ReadByIdAsync(Arg.Any()).Returns(readToDoItem); + repositoryMock.When(r => r.UpdateAsync(Arg.Any())).Do(r => throw new Exception()); // Act - var result = controller.UpdateById(someId, request); + var result = await controller.UpdateByIdAsync(someId, request); // Assert Assert.IsType(result);