Files
chapter-organizer/Tests/Builders/StudentEventRankingBuilder.cs
T

66 lines
2.0 KiB
C#

using Core.Entities;
namespace Tests.Builders;
/// <summary>
/// Fluent builder for creating StudentEventRanking test entities.
/// </summary>
public class StudentEventRankingBuilder
{
private Student? _student = null;
private EventDefinition? _eventDefinition = null;
private int _rank = 1;
public StudentEventRankingBuilder ForStudent(Student student)
{
_student = student;
return this;
}
public StudentEventRankingBuilder ForEvent(EventDefinition eventDef)
{
_eventDefinition = eventDef;
return this;
}
public StudentEventRankingBuilder WithRank(int rank)
{
if (rank < 1 || rank > StudentEventRanking.MaxRank)
throw new ArgumentOutOfRangeException(nameof(rank),
$"Rank must be between 1 and {StudentEventRanking.MaxRank}");
_rank = rank;
return this;
}
public StudentEventRanking Build()
{
if (_student == null)
throw new InvalidOperationException("StudentEventRanking must have a student. Call ForStudent() before Build().");
if (_eventDefinition == null)
throw new InvalidOperationException("StudentEventRanking must have an event. Call ForEvent() before Build().");
var ranking = new StudentEventRanking
{
Student = _student,
EventDefinition = _eventDefinition,
Rank = _rank
};
// Set up bidirectional relationship: add to student's EventRankings if not already there
if (!_student.EventRankings.Any(er => er.EventDefinition == _eventDefinition))
{
_student.EventRankings.Add(ranking);
}
return ranking;
}
// Static factory methods
public static StudentEventRankingBuilder Default() => new StudentEventRankingBuilder();
public static StudentEventRankingBuilder Create(Student student, EventDefinition eventDef) =>
new StudentEventRankingBuilder().ForStudent(student).ForEvent(eventDef);
}