73 lines
3.6 KiB
C#
73 lines
3.6 KiB
C#
using System.Net.Http.Json;
|
|
using ItWorx.KnowledgeHub.Contracts.Knowledge;
|
|
using ItWorx.KnowledgeHub.IntegrationTests.Infrastructure;
|
|
|
|
namespace ItWorx.KnowledgeHub.IntegrationTests.Knowledge;
|
|
|
|
/// <summary>Backlinks ("what links here") update correctly after link, title, slug and
|
|
/// tree changes (docs/27-acceptance-matrix.md, M3-A03).</summary>
|
|
[Collection(PostgresTestGroup.Name)]
|
|
public sealed class BacklinksTests(PostgresContainerFixture postgres) : OwnerSetupTestBase(postgres)
|
|
{
|
|
[Fact]
|
|
public async Task A_page_appears_in_another_pages_backlinks_once_it_links_there_and_disappears_once_the_link_is_removed()
|
|
{
|
|
using var client = Factory.CreateClient();
|
|
await SetupHelper.LoginAsync(client, OwnerEmail, OwnerPassword);
|
|
|
|
var targetResponse = await SetupHelper.PostWithCsrfAsync(
|
|
client, "/api/v1/pages", new CreatePageRequest(null, "Doelpagina", "WikiPage", "De doelpagina.", null));
|
|
var target = await targetResponse.Content.ReadFromJsonAsync<PageDetail>();
|
|
Assert.NotNull(target);
|
|
|
|
var sourceResponse = await SetupHelper.PostWithCsrfAsync(
|
|
client, "/api/v1/pages", new CreatePageRequest(null, "Bronpagina", "WikiPage", "Zie [[Doelpagina]].", null));
|
|
var source = await sourceResponse.Content.ReadFromJsonAsync<PageDetail>();
|
|
Assert.NotNull(source);
|
|
|
|
var backlinks = await client.GetFromJsonAsync<BacklinksResponse>($"/api/v1/pages/{target.Id}/backlinks");
|
|
Assert.NotNull(backlinks);
|
|
Assert.Contains(backlinks.Items, entry => entry.Id == source.Id);
|
|
|
|
// Renaming the target must not break the already-resolved backlink relationship.
|
|
var renamedTargetResponse = await SetupHelper.PutWithCsrfAsync(
|
|
client,
|
|
$"/api/v1/pages/{target.Id}",
|
|
new UpdatePageRequest("Doelpagina (hernoemd)", "De doelpagina.", "WikiPage", "Active", null),
|
|
target.ETag);
|
|
Assert.True(renamedTargetResponse.IsSuccessStatusCode);
|
|
|
|
var backlinksAfterRename = await client.GetFromJsonAsync<BacklinksResponse>($"/api/v1/pages/{target.Id}/backlinks");
|
|
Assert.NotNull(backlinksAfterRename);
|
|
Assert.Contains(backlinksAfterRename.Items, entry => entry.Id == source.Id);
|
|
|
|
// Removing the link from the source page removes the backlink.
|
|
var unlinkedSourceResponse = await SetupHelper.PutWithCsrfAsync(
|
|
client,
|
|
$"/api/v1/pages/{source.Id}",
|
|
new UpdatePageRequest("Bronpagina", "Geen verwijzing meer.", "WikiPage", "Active", null),
|
|
source.ETag);
|
|
Assert.True(unlinkedSourceResponse.IsSuccessStatusCode);
|
|
|
|
var backlinksAfterUnlink = await client.GetFromJsonAsync<BacklinksResponse>($"/api/v1/pages/{target.Id}/backlinks");
|
|
Assert.NotNull(backlinksAfterUnlink);
|
|
Assert.DoesNotContain(backlinksAfterUnlink.Items, entry => entry.Id == source.Id);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task A_page_with_no_incoming_links_has_an_empty_backlinks_list()
|
|
{
|
|
using var client = Factory.CreateClient();
|
|
await SetupHelper.LoginAsync(client, OwnerEmail, OwnerPassword);
|
|
|
|
var response = await SetupHelper.PostWithCsrfAsync(
|
|
client, "/api/v1/pages", new CreatePageRequest(null, "Eenzame pagina", "WikiPage", "Niemand linkt hierheen.", null));
|
|
var page = await response.Content.ReadFromJsonAsync<PageDetail>();
|
|
Assert.NotNull(page);
|
|
|
|
var backlinks = await client.GetFromJsonAsync<BacklinksResponse>($"/api/v1/pages/{page.Id}/backlinks");
|
|
Assert.NotNull(backlinks);
|
|
Assert.Empty(backlinks.Items);
|
|
}
|
|
}
|