Files
novelly/tests/Novelly.Api.Tests/ChapterServiceTests.cs
T
James Wampler 4313c8f206 Rename Project concept to Novel across the stack
Renames the domain concept from Project to Novel throughout the backend
(entities, DTOs, services, endpoints, ProjectAccessService/Permission,
ProjectId foreign keys), MCP server (tool names and routes), and the
React/Vite frontend (types, hooks, routes, components). Adds a new EF
Core migration (RenameProjectToNovel) using RenameTable/RenameColumn to
preserve existing data instead of dropping/recreating tables. Updates
CLAUDE.md's structure section to reference Novels/ instead of Projects/.
2026-08-17 23:03:09 -07:00

82 lines
2.9 KiB
C#

using Microsoft.EntityFrameworkCore;
using Novelly.Api.Beats;
using Novelly.Api.Chapters;
using Novelly.Api.Common;
using Novelly.Api.Novels;
namespace Novelly.Api.Tests;
[TestFixture]
public class ChapterServiceTests : ServiceTestFixture
{
private Guid _novelId;
protected override void OnSetUp()
{
_novelId = Novels.CreateAsync(new CreateNovelRequest("The Salt Road")).Result.Id;
}
[Test]
public async Task Setting_a_number_that_already_exists_is_still_stored_as_given()
{
var first = await Chapters.CreateAsync(_novelId, new CreateChapterRequest("Landfall", Number: 5));
var second = await Chapters.CreateAsync(_novelId, new CreateChapterRequest("The Harbour", Number: 5));
Assert.Multiple(() =>
{
Assert.That(first.Number, Is.EqualTo(5));
Assert.That(second.Number, Is.EqualTo(5));
});
}
[Test]
public async Task Updating_leaves_omitted_fields_alone_and_clears_notes_on_empty_string()
{
var chapter = await Chapters.CreateAsync(_novelId, new CreateChapterRequest(
"Landfall", Summary: "The ship makes shore.", Notes: "Check the tide tables."));
var renamed = (await Chapters.UpdateAsync(chapter.Id, new UpdateChapterRequest(Title: "First Landfall")))!;
Assert.Multiple(() =>
{
Assert.That(renamed.Title, Is.EqualTo("First Landfall"));
Assert.That(renamed.Summary, Is.EqualTo("The ship makes shore."));
Assert.That(renamed.Notes, Is.EqualTo("Check the tide tables."));
});
var cleared = (await Chapters.UpdateAsync(chapter.Id, new UpdateChapterRequest(Notes: "")))!;
Assert.Multiple(() =>
{
Assert.That(cleared.Notes, Is.Null);
Assert.That(cleared.Summary, Is.EqualTo("The ship makes shore."));
});
}
[Test]
public async Task Deleting_a_chapter_takes_its_beats_with_it()
{
var chapter = await Chapters.CreateAsync(_novelId, new CreateChapterRequest("Landfall"));
await Beats.CreateAsync(chapter.Id, new CreateBeatRequest("She finds the map"));
await Chapters.DeleteAsync(chapter.Id);
using var verification = Db.CreateContext();
Assert.That(await verification.Beats.CountAsync(), Is.EqualTo(0));
}
[Test]
public async Task Creating_a_chapter_under_a_missing_novel_returns_null_rather_than_throwing() =>
Assert.That(
await Chapters.CreateAsync(Guid.NewGuid(), new CreateChapterRequest("Landfall")),
Is.Null);
[Test]
public async Task Reading_a_missing_chapter_returns_null_rather_than_throwing() =>
Assert.That(await Chapters.GetAsync(Guid.NewGuid()), Is.Null);
[Test]
public async Task Deleting_a_missing_chapter_returns_false_rather_than_throwing() =>
Assert.That(await Chapters.DeleteAsync(Guid.NewGuid()), Is.False);
}