227 lines
7.1 KiB
C#
227 lines
7.1 KiB
C#
using System.Threading.Tasks;
|
|
using FluentAssertions;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.Extensions.Logging;
|
|
using NSubstitute;
|
|
using NSubstitute.ExceptionExtensions;
|
|
using Robware.Api.Blog.Controllers;
|
|
using Robware.Api.Blog.Models;
|
|
using Robware.Blog;
|
|
using Robware.Data;
|
|
using Xunit;
|
|
|
|
namespace Robware.Api.Blog.Tests {
|
|
public class BlogControllerTests {
|
|
private bool ShouldBeEquivalentTo<T>(T post, T expected) {
|
|
post.Should().BeEquivalentTo(expected);
|
|
return true;
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Get_WithUrl_ReturnsBlogPost() {
|
|
var logger = Substitute.For<ILogger<BlogController>>();
|
|
var repo = Substitute.For<IBlogRepository>();
|
|
|
|
repo.GetPostByUrlAsync("url").Returns(new BlogPost());
|
|
|
|
var expectation = new BlogPost();
|
|
|
|
var controller = new BlogController(logger, repo);
|
|
(await controller.Get("url")).Value.Should().BeEquivalentTo(expectation);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Get_WithId_ReturnsBlogPost() {
|
|
var logger = Substitute.For<ILogger<BlogController>>();
|
|
var repo = Substitute.For<IBlogRepository>();
|
|
|
|
repo.GetPostByIdAsync(1).Returns(new BlogPost());
|
|
|
|
var expectation = new BlogPost();
|
|
|
|
var controller = new BlogController(logger, repo);
|
|
(await controller.Get("1")).Value.Should().BeEquivalentTo(expectation);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Get_WithInvalidUrl_Returns404() {
|
|
var logger = Substitute.For<ILogger<BlogController>>();
|
|
var repo = Substitute.For<IBlogRepository>();
|
|
|
|
repo.GetPostByUrlAsync("url").Throws(new ItemNotFoundException("", null));
|
|
|
|
var controller = new BlogController(logger, repo);
|
|
(await controller.Get("url")).Result.Should().BeOfType<NotFoundObjectResult>();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Get_WithInvalidId_Returns404() {
|
|
var logger = Substitute.For<ILogger<BlogController>>();
|
|
var repo = Substitute.For<IBlogRepository>();
|
|
|
|
repo.GetPostByIdAsync(1).Throws(new ItemNotFoundException("", null));
|
|
|
|
var controller = new BlogController(logger, repo);
|
|
(await controller.Get("1")).Result.Should().BeOfType<NotFoundObjectResult>();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GetLatestPosts_WithCountOfZero_ReturnsCollectionOfTenBlogPosts() {
|
|
var logger = Substitute.For<ILogger<BlogController>>();
|
|
var repo = Substitute.For<IBlogRepository>();
|
|
|
|
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<ILogger<BlogController>>();
|
|
var repo = Substitute.For<IBlogRepository>();
|
|
|
|
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<ILogger<BlogController>>();
|
|
var repo = Substitute.For<IBlogRepository>();
|
|
|
|
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_Returns404() {
|
|
var logger = Substitute.For<ILogger<BlogController>>();
|
|
var repo = Substitute.For<IBlogRepository>();
|
|
|
|
repo.GetLatestPostsAsync(1, 1000).Throws(new ItemNotFoundException("", null));
|
|
|
|
var controller = new BlogController(logger, repo);
|
|
(await controller.GetLatestPosts(1, 1000)).Result.Should().BeOfType<NotFoundObjectResult>();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GetLatestPost_ReturnsBlogPosts() {
|
|
var logger = Substitute.For<ILogger<BlogController>>();
|
|
var repo = Substitute.For<IBlogRepository>();
|
|
|
|
repo.GetLatestPostAsync().Returns(new BlogPost());
|
|
|
|
var expectation = new BlogPost();
|
|
|
|
var controller = new BlogController(logger, repo);
|
|
(await controller.GetLatestPost()).Value.Should().BeEquivalentTo(expectation);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GetLatestPost_WhenNoPostExists_Returns404() {
|
|
var logger = Substitute.For<ILogger<BlogController>>();
|
|
var repo = Substitute.For<IBlogRepository>();
|
|
|
|
repo.GetLatestPostAsync().Throws(new ItemNotFoundException("", null));
|
|
|
|
var controller = new BlogController(logger, repo);
|
|
(await controller.GetLatestPost()).Result.Should().BeOfType<NotFoundObjectResult>();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GetCount_ReturnsBlogPostCount() {
|
|
var logger = Substitute.For<ILogger<BlogController>>();
|
|
var repo = Substitute.For<IBlogRepository>();
|
|
|
|
repo.GetCountAsync().Returns(1);
|
|
|
|
var controller = new BlogController(logger, repo);
|
|
(await controller.GetCount()).Value.Should().Be(1);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GetCount_WhenNoPostsExist_ReturnsZero() {
|
|
var logger = Substitute.For<ILogger<BlogController>>();
|
|
var repo = Substitute.For<IBlogRepository>();
|
|
|
|
repo.GetCountAsync().Throws(new ItemNotFoundException("", null));
|
|
|
|
var controller = new BlogController(logger, repo);
|
|
(await controller.GetCount()).Value.Should().Be(0);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Save_WithNewSubmission_Returns200() {
|
|
var logger = Substitute.For<ILogger<BlogController>>();
|
|
var repo = Substitute.For<IBlogRepository>();
|
|
|
|
var submission = new BlogPostSubmission {
|
|
Content = "content",
|
|
Title = "title"
|
|
};
|
|
|
|
var controller = new BlogController(logger, repo);
|
|
(await controller.SavePost(submission)).Should().BeOfType<OkResult>();
|
|
|
|
var expected = new BlogPost {
|
|
Title = "title",
|
|
Draft = "content",
|
|
Url = "title"
|
|
};
|
|
|
|
await repo.Received(1).SavePost(Arg.Is<BlogPost>(post => ShouldBeEquivalentTo(post, expected)));
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Save_WithExistingSubmission_Returns200() {
|
|
var logger = Substitute.For<ILogger<BlogController>>();
|
|
var repo = Substitute.For<IBlogRepository>();
|
|
repo.GetPostByIdAsync(1).Returns(new BlogPost {Content = "old content"});
|
|
|
|
var submission = new BlogPostSubmission {
|
|
Id = 1,
|
|
Content = "new content",
|
|
Title = "title"
|
|
};
|
|
|
|
var controller = new BlogController(logger, repo);
|
|
(await controller.SavePost(submission)).Should().BeOfType<OkResult>();
|
|
|
|
var expected = new BlogPost {
|
|
Title = "title",
|
|
Content = "old content",
|
|
Draft = "new content",
|
|
Url = "title"
|
|
};
|
|
|
|
await repo.Received(1).SavePost(Arg.Is<BlogPost>(post => ShouldBeEquivalentTo(post, expected)));
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Save_WithExistingSubmission_WherePostDoesntExist_Returns400() {
|
|
var logger = Substitute.For<ILogger<BlogController>>();
|
|
var repo = Substitute.For<IBlogRepository>();
|
|
repo.GetPostByIdAsync(1).Throws(new ItemNotFoundException("", null));
|
|
|
|
var submission = new BlogPostSubmission {
|
|
Id = 1,
|
|
Content = "new content",
|
|
Title = "title"
|
|
};
|
|
|
|
var controller = new BlogController(logger, repo);
|
|
(await controller.SavePost(submission)).Should().BeOfType<BadRequestObjectResult>();
|
|
}
|
|
}
|
|
}
|