api.blog/src/Robware.Data.MongoDB.Tests/BlogRepositoryTests.cs

54 lines
1.9 KiB
C#

using FluentAssertions;
using MongoDB.Driver;
using NSubstitute;
using Robware.Blog;
using Robware.Blog.Data.MongoDB.State;
using System;
using System.Threading.Tasks;
using Xunit;
namespace Robware.Data.MongoDB.Tests {
public class BlogRepositoryTests {
[Fact]
public async Task SavePost_WithNewPost_GetsNewIdAndSetsTimestampAndSavesAsync() {
var collection = Substitute.For<IMongoCollection<BlogPostState>>();
collection.CountDocumentsAsync(Arg.Any<FilterDefinition<BlogPostState>>()).Returns(10);
var database = Substitute.For<IMongoDatabase>();
database.GetCollection<BlogPostState>("blog").Returns(collection);
var repo = new BlogRepository(database);
var post = new BlogPost();
await repo.SavePost(post);
post.Id.Should().Be(11);
post.Timestamp.Should().BeCloseTo(DateTime.Now);
await collection.Received(1).InsertOneAsync(Arg.Any<BlogPostState>());
}
[Fact]
public async Task SavePost_WithExistingPost_DoesNotSetTimestampAndSavesAsync() {
var collection = Substitute.For<IMongoCollection<BlogPostState>>();
var database = Substitute.For<IMongoDatabase>();
database.GetCollection<BlogPostState>("blog").Returns(collection);
var repo = new BlogRepository(database);
var post = new BlogPost() {
Id = 1
};
await repo.SavePost(post);
post.Id.Should().Be(1);
post.Timestamp.Should().Be(new DateTime());
await collection.Received(1).InsertOneAsync(Arg.Any<BlogPostState>());
}
[Fact]
public async Task GetCountAsync_ReturnsCountFromDatabase() {
var collection = Substitute.For<IMongoCollection<BlogPostState>>();
collection.CountDocumentsAsync(Arg.Any<FilterDefinition<BlogPostState>>()).Returns(10);
var database = Substitute.For<IMongoDatabase>();
database.GetCollection<BlogPostState>("blog").Returns(collection);
var repo = new BlogRepository(database);
(await repo.GetCountAsync()).Should().Be(10);
}
}
}