QuellCode/CentronERP war nur als Gitlink (Submodul-Referenz auf 79c1142) getrackt, ohne .gitmodules und ohne erreichbares Remote. Der Untersuchungsgegenstand der Versuchsreihe war damit nicht reproduzierbar gesichert: Ein Klon haette ein leeres Verzeichnis erhalten, und die Belege der 3.287 Anforderungen waeren nicht ueberpruefbar gewesen. Umstellung: - Historie nach c:\DEV\CentronERP_git_snapshot_79c1142 ausgelagert (vollstaendig lesbar, enthaelt 79c1142 und Vorgaenger 89ccfd6) - Gitlink aus dem Index entfernt - Dateiinhalt aufgenommen: 24.557 Dateien, rund 333 MB Die verschachtelte .gitignore der Codebasis gilt weiter, Build-Artefakte bleiben ausgeschlossen. Details in Versuche/Versuch_01/_Codebasis-Nachweis.md
125 lines
5.5 KiB
C#
125 lines
5.5 KiB
C#
using System;
|
|
using System.Linq;
|
|
using Centron.BusinessLogic;
|
|
using Centron.BusinessLogic.Sales.Support;
|
|
using Centron.BusinessLogic.TaskManager;
|
|
using Centron.BusinessLogic.WebServices.TaskManager;
|
|
using Centron.Data.Entities.TaskManager;
|
|
using Centron.Data.Entities.TaskManager.Actions;
|
|
using Centron.Data.Entities.TaskManager.Recurrences;
|
|
using Centron.Interfaces.BL;
|
|
using Centron.Tests.EndToEnd.Infrastructure;
|
|
using Xunit;
|
|
using Xunit.Abstractions;
|
|
|
|
namespace Centron.Tests.EndToEnd.Tests.TaskManagement
|
|
{
|
|
/// <summary>
|
|
/// Ticket 168438: the orphan inspector must re-create and re-link the missing ticket for a helpdesk-task
|
|
/// execution that was marked as done but whose ticket was rolled back ("transaction has already ended").
|
|
/// This drives the full backend path: create an active helpdesk task, execute it, strip the ticket link,
|
|
/// then detect + repair.
|
|
/// </summary>
|
|
public class TaskManagementOrphanRepairTests : EndToEndTest
|
|
{
|
|
// An existing helpdesk in the seed data; we reuse its customer/state/priority/type/category so the
|
|
// task's action passes validation regardless of which "field required" settings are active.
|
|
private const int ReferenceHelpdeskI3D = 10491;
|
|
|
|
public TaskManagementOrphanRepairTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper)
|
|
{
|
|
}
|
|
|
|
public override void Execute()
|
|
{
|
|
var user = this.GetLoggedInUser();
|
|
|
|
// Require a clean baseline: the repair is global, so a nonzero baseline would be fixed too and
|
|
// make the post-repair assertions ambiguous.
|
|
using (var session = new BLSession())
|
|
Assert.Equal(0, session.GetBL<TaskManagementTaskWebServiceBL>().CountOrphanedHelpdeskExecutions(user.User).ThrowIfError());
|
|
|
|
int taskI3D;
|
|
int actionI3D;
|
|
using (var session = new BLSession())
|
|
{
|
|
// Load the reference helpdesk in this same session, so its customer/state/... entities stay
|
|
// attached and can be reused on the task's action.
|
|
var refHelpdesk = session.GetBL<HelpdeskBL>().GetHelpdesk(ReferenceHelpdeskI3D);
|
|
Assert.NotNull(refHelpdesk);
|
|
|
|
var yesterday = DateTime.Today.AddDays(-1);
|
|
var task = new TaskManagementTask
|
|
{
|
|
Status = ProjectStatus.Started,
|
|
Name = "Repair E2E Test",
|
|
Description = "Repair E2E Test",
|
|
Action = new TaskManagementHelpdeskAction
|
|
{
|
|
Customer = refHelpdesk.Customer,
|
|
State = refHelpdesk.HelpdeskState,
|
|
Priority = refHelpdesk.HelpdeskPriority,
|
|
Type = refHelpdesk.HelpdeskType,
|
|
Category = refHelpdesk.MainCategory,
|
|
ResponsiblePerson = user.User.Employee,
|
|
},
|
|
Recurrence = new TaskManagementDailyRecurrence
|
|
{
|
|
DayInterval = 1,
|
|
StartTime = yesterday,
|
|
AppointmentStart = yesterday,
|
|
ExecuteDaysBefore = 0,
|
|
},
|
|
};
|
|
|
|
var saved = session.GetBL<TaskManagementTaskBL>().SaveOrUpdateTask(task, user.User).ThrowIfError();
|
|
taskI3D = saved.I3D;
|
|
actionI3D = saved.Action.I3D;
|
|
}
|
|
|
|
// Manual execution creates the ticket and records the execution (linked to the ticket).
|
|
using (var session = new BLSession())
|
|
session.GetBL<TaskManagementTaskWebServiceBL>().ExecuteTaskNow(taskI3D, user.User).ThrowIfError();
|
|
|
|
int executedAtI3D;
|
|
using (var session = new BLSession())
|
|
{
|
|
var exec = session.GetBL<TaskManagementTaskBL>().GetTaskExecutedAtByI3D(actionI3D, onlyLatestEntry: true)
|
|
.ThrowIfError().FirstOrDefault();
|
|
Assert.NotNull(exec);
|
|
Assert.NotNull(exec.TicketI3D);
|
|
executedAtI3D = exec.I3D;
|
|
}
|
|
|
|
// Simulate the rollback orphan: execution stays "done" but the ticket link is gone.
|
|
this.Sql($"UPDATE TaskManagementActionExecutedAt SET TicketI3D = NULL WHERE I3D = {executedAtI3D}");
|
|
|
|
using (var session = new BLSession())
|
|
{
|
|
var count = session.GetBL<TaskManagementTaskWebServiceBL>().CountOrphanedHelpdeskExecutions(user.User).ThrowIfError();
|
|
Assert.Equal(1, count);
|
|
}
|
|
|
|
using (var session = new BLSession())
|
|
{
|
|
var repaired = session.GetBL<TaskManagementTaskWebServiceBL>().RepairMissingHelpdeskTickets(user.User).ThrowIfError();
|
|
Assert.True(repaired >= 1, "Expected at least the seeded orphan to be repaired.");
|
|
}
|
|
|
|
using (var session = new BLSession())
|
|
{
|
|
var exec = session.GetBL<TaskManagementTaskBL>().GetTaskExecutedAtByI3D(actionI3D, onlyLatestEntry: true)
|
|
.ThrowIfError().FirstOrDefault();
|
|
Assert.NotNull(exec);
|
|
Assert.NotNull(exec.TicketI3D);
|
|
|
|
var ticket = session.GetBL<HelpdeskBL>().GetHelpdesk(exec.TicketI3D.Value);
|
|
Assert.NotNull(ticket);
|
|
|
|
var count = session.GetBL<TaskManagementTaskWebServiceBL>().CountOrphanedHelpdeskExecutions(user.User).ThrowIfError();
|
|
Assert.Equal(0, count);
|
|
}
|
|
}
|
|
}
|
|
}
|