From b4281bea628fdbb62ad070c6f6fbaed10a5e94ed Mon Sep 17 00:00:00 2001 From: Robert Marshall Date: Fri, 10 Apr 2020 10:27:55 +0100 Subject: [PATCH] Get latest posts --- .../BlogControllerTests.cs | 50 +++++++++++++++++++ .../Controllers/BlogController.cs | 22 ++++++-- 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/src/Robware.Api.Blog.Tests/BlogControllerTests.cs b/src/Robware.Api.Blog.Tests/BlogControllerTests.cs index 7e034d1..40f4c67 100644 --- a/src/Robware.Api.Blog.Tests/BlogControllerTests.cs +++ b/src/Robware.Api.Blog.Tests/BlogControllerTests.cs @@ -58,5 +58,55 @@ namespace Robware.Api.Blog.Tests { var controller = new BlogController(logger, repo); (await controller.Get("1")).Result.Should().BeOfType(); } + + [Fact] + public async Task GetLatestPosts_WithCountOfZero_ReturnsCollectionOfTenBlogPosts() { + var logger = Substitute.For>(); + var repo = Substitute.For(); + + repo.GetLatestPostsAsync(10).Returns(new BlogPost[10]); + + var expectation = new BlogPost[10]; + + var controller = new BlogController(logger, repo); + (await controller.GetLatestPosts()).Value.Should().BeEquivalentTo(expectation); + } + + [Fact] + public async Task GetLatestPosts_WithCountOf1_ReturnsCollectionOf1BlogPosts() { + var logger = Substitute.For>(); + var repo = Substitute.For(); + + repo.GetLatestPostsAsync(1).Returns(new BlogPost[1]); + + var expectation = new BlogPost[1]; + + var controller = new BlogController(logger, repo); + (await controller.GetLatestPosts(1)).Value.Should().BeEquivalentTo(expectation); + } + + [Fact] + public async Task GetLatestPosts_WithCountOf1AndOffsetOf1_ReturnsCollectionOf1BlogPosts() { + var logger = Substitute.For>(); + var repo = Substitute.For(); + + repo.GetLatestPostsAsync(1, 1).Returns(new BlogPost[1]); + + var expectation = new BlogPost[1]; + + var controller = new BlogController(logger, repo); + (await controller.GetLatestPosts(1, 1)).Value.Should().BeEquivalentTo(expectation); + } + + [Fact] + public async Task GetLatestPosts_WithCountOf1AndOffsetOfOutOfRange_ReturnsCollectionOf1BlogPosts() { + var logger = Substitute.For>(); + var repo = Substitute.For(); + + repo.GetLatestPostsAsync(1, 1000).Throws(new ItemNotFoundException("", null)); + + var controller = new BlogController(logger, repo); + (await controller.GetLatestPosts(1, 1000)).Result.Should().BeOfType(); + } } } diff --git a/src/Robware.Api.Blog/Controllers/BlogController.cs b/src/Robware.Api.Blog/Controllers/BlogController.cs index fe7b521..f8dafc7 100644 --- a/src/Robware.Api.Blog/Controllers/BlogController.cs +++ b/src/Robware.Api.Blog/Controllers/BlogController.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; @@ -8,6 +9,8 @@ using Robware.Data; namespace Robware.Api.Blog.Controllers { [ApiController] public class BlogController : ControllerBase { + private const int DefaultPostLimit = 10; + private readonly ILogger _logger; private readonly IBlogRepository _blogRepository; @@ -33,8 +36,21 @@ namespace Robware.Api.Blog.Controllers { } } - //[HttpGet] - //Task> GetLatestPosts(int limit, int offset = 0); + [HttpGet(nameof(GetLatestPosts))] + public async Task> GetLatestPosts(int count = 0, int offset = 0) { + _logger.Log(LogLevel.Information, $"{nameof(GetLatestPosts)}: {nameof(count)}={count}, {nameof(offset)}={offset}"); + + if (count <= 0) + count = DefaultPostLimit; + + try { + return (await _blogRepository.GetLatestPostsAsync(count, offset)).ToArray(); + } + catch (ItemNotFoundException e) { + _logger.Log(LogLevel.Error, e.Message); + return NotFound("Could not get latest posts with given parameters"); + } + } //[HttpGet] //Task GetLatestPost();