80 lines
2.8 KiB
C#
80 lines
2.8 KiB
C#
namespace TaxBaik.Application.Tests;
|
|
|
|
using TaxBaik.Application.DTOs;
|
|
using TaxBaik.Application.Services;
|
|
using TaxBaik.Domain.Entities;
|
|
using TaxBaik.Domain.Interfaces;
|
|
using Xunit;
|
|
|
|
public class BlogServiceTests
|
|
{
|
|
[Fact]
|
|
public async Task CreateAsync_WhenPublishedWithoutSeoTitle_ThrowsValidationException()
|
|
{
|
|
var service = new BlogService(new FakeBlogPostRepository());
|
|
|
|
await Assert.ThrowsAsync<ValidationException>(() => service.CreateAsync(new CreateBlogPostDto
|
|
{
|
|
Title = "테스트 포스트",
|
|
Content = "본문",
|
|
SeoDescription = "설명",
|
|
IsPublished = true
|
|
}));
|
|
}
|
|
|
|
[Fact]
|
|
public async Task CreateAsync_WhenTitleDuplicates_GeneratesUniqueSlug()
|
|
{
|
|
var repository = new FakeBlogPostRepository
|
|
{
|
|
Posts =
|
|
[
|
|
new BlogPost { Id = 1, Title = "같은 제목", Content = "본문", Slug = "같은-제목" }
|
|
]
|
|
};
|
|
var service = new BlogService(repository);
|
|
|
|
var post = await service.CreateAsync(new CreateBlogPostDto
|
|
{
|
|
Title = "같은 제목",
|
|
Content = "본문"
|
|
});
|
|
|
|
Assert.Equal("같은-제목-2", post.Slug);
|
|
}
|
|
|
|
private sealed class FakeBlogPostRepository : IBlogPostRepository
|
|
{
|
|
public List<BlogPost> Posts { get; init; } = [];
|
|
|
|
public Task<BlogPost?> GetByIdAsync(int id, CancellationToken cancellationToken = default) =>
|
|
Task.FromResult(Posts.FirstOrDefault(x => x.Id == id));
|
|
|
|
public Task<BlogPost?> GetBySlugAsync(string slug, CancellationToken cancellationToken = default) =>
|
|
Task.FromResult(Posts.FirstOrDefault(x => x.Slug == slug && x.IsPublished));
|
|
|
|
public Task<(IEnumerable<BlogPost> Items, int Total)> GetPublishedPagedAsync(
|
|
int page, int pageSize, int? categoryId = null, CancellationToken cancellationToken = default)
|
|
{
|
|
var items = Posts.Where(x => x.IsPublished).ToList();
|
|
return Task.FromResult<(IEnumerable<BlogPost>, int)>((items, items.Count));
|
|
}
|
|
|
|
public Task<IEnumerable<BlogPost>> GetAllForAdminAsync(CancellationToken cancellationToken = default) =>
|
|
Task.FromResult<IEnumerable<BlogPost>>(Posts);
|
|
|
|
public Task<int> CreateAsync(BlogPost post, CancellationToken cancellationToken = default)
|
|
{
|
|
post.Id = Posts.Count + 1;
|
|
Posts.Add(post);
|
|
return Task.FromResult(post.Id);
|
|
}
|
|
|
|
public Task UpdateAsync(BlogPost post, CancellationToken cancellationToken = default) => Task.CompletedTask;
|
|
|
|
public Task DeleteAsync(int id, CancellationToken cancellationToken = default) => Task.CompletedTask;
|
|
|
|
public Task IncrementViewCountAsync(int id, CancellationToken cancellationToken = default) => Task.CompletedTask;
|
|
}
|
|
}
|