using Dotnet.Samples.AspNetCore.WebApi.Models; using Dotnet.Samples.AspNetCore.WebApi.Utilities; namespace Dotnet.Samples.AspNetCore.WebApi.Tests.Utilities; /// /// Test data factory for Player entities. /// Wraps production data from PlayerData with test-specific modifications (e.g., GUID assignment). /// A Fake is a working implementation that's simpler than the real one. /// It usually has some "real" logic but is not suitable for production /// (e.g., an in‑memory database instead of a full SQL Server). Fakes are /// useful when you need behavior that's closer to reality but still want /// to avoid external dependencies. /// /// /// Data-state vocabulary used across controller tests: /// /// existingPlayer is present in the database. /// nonexistentPlayer is absent, valid shape for creation (POST scenarios). /// unknownValid ID format, absent from database (404-by-lookup scenarios). /// /// public static class PlayerFakes { private static string? FormatBirth(DateTime? dateOfBirth) => dateOfBirth.HasValue ? $"{dateOfBirth.Value:MMMM d, yyyy}" : null; /// /// Returns the starting 11 players with generated GUIDs for in-memory testing. /// Reuses production player data from PlayerData.MakeStarting11(). /// public static List MakeStarting11() { var players = PlayerData.MakeStarting11(); // Assign GUIDs for in-memory database testing foreach (var player in players) { player.Id = Guid.NewGuid(); } return players; } /// /// Returns a specific player from the starting 11 by squad number. /// Reuses production player data from PlayerData.MakeStarting11(). /// public static Player MakeFromStarting11(int squadNumber) { var player = PlayerData.MakeStarting11().SingleOrDefault(p => p.SquadNumber == squadNumber) ?? throw new ArgumentNullException( $"Player with Squad Number {squadNumber} not found." ); player.Id = Guid.NewGuid(); return player; } /// /// Returns a new player (substitute) for testing create operations. /// Reuses production player data from PlayerData.GetSubstitutes(). /// public static Player MakeNew() { // Get Giovani Lo Celso (squad number 27) from substitutes var player = PlayerData.GetSubstitutes().SingleOrDefault(player => player.SquadNumber == 27) ?? throw new InvalidOperationException( "Substitute player with squad number 27 not found." ); player.Id = Guid.NewGuid(); return player; } /* ------------------------------------------------------------------------- * Create * ---------------------------------------------------------------------- */ /// /// Creates a PlayerRequestModel for testing create operations. /// Uses data from a substitute player (Giovani Lo Celso). /// public static PlayerRequestModel MakeRequestModelForCreate() { var player = MakeNew(); return new PlayerRequestModel() { FirstName = player.FirstName, MiddleName = player.MiddleName, LastName = player.LastName, DateOfBirth = player.DateOfBirth, SquadNumber = player.SquadNumber, AbbrPosition = player.AbbrPosition, Team = player.Team, League = player.League, }; } /// /// Creates a PlayerResponseModel for testing create operation responses. /// Uses data from a substitute player (Giovani Lo Celso). /// public static PlayerResponseModel MakeResponseModelForCreate() { var player = MakeNew(); return new PlayerResponseModel { FullName = $"{player.FirstName} {(string.IsNullOrWhiteSpace(player.MiddleName) ? "" : player.MiddleName + " ")}{player.LastName}".Trim(), Birth = FormatBirth(player.DateOfBirth), Dorsal = player.SquadNumber, Position = player.Position, Club = player.Team, League = player.League, Starting11 = player.Starting11 ? "Yes" : "No", }; } /* ------------------------------------------------------------------------- * Retrieve * ---------------------------------------------------------------------- */ /// /// Creates a PlayerRequestModel for testing retrieve operations. /// Uses data from the starting 11 based on the specified squad number. /// /// The squad number of the player to retrieve. public static PlayerRequestModel MakeRequestModelForRetrieve(int squadNumber) { var player = PlayerData.MakeStarting11().SingleOrDefault(p => p.SquadNumber == squadNumber) ?? throw new ArgumentNullException( $"Player with Squad Number {squadNumber} not found." ); return new PlayerRequestModel { FirstName = player.FirstName, MiddleName = player.MiddleName, LastName = player.LastName, DateOfBirth = player.DateOfBirth, SquadNumber = player.SquadNumber, AbbrPosition = player.AbbrPosition, Team = player.Team, League = player.League, }; } /// /// Creates a PlayerResponseModel for testing retrieve operation responses. /// Uses data from the starting 11 based on the specified squad number. /// /// The squad number of the player to retrieve. public static PlayerResponseModel MakeResponseModelForRetrieve(int squadNumber) { var player = PlayerData.MakeStarting11().SingleOrDefault(p => p.SquadNumber == squadNumber) ?? throw new ArgumentNullException( $"Player with Squad Number {squadNumber} not found." ); return new PlayerResponseModel { FullName = $"{player.FirstName} {(string.IsNullOrWhiteSpace(player.MiddleName) ? "" : player.MiddleName + " ")}{player.LastName}".Trim(), Birth = FormatBirth(player.DateOfBirth), Dorsal = player.SquadNumber, Position = player.Position, Club = player.Team, League = player.League, Starting11 = player.Starting11 ? "Yes" : "No", }; } /// /// Creates a list of PlayerResponseModel for testing retrieve all operations. /// Uses all players from the starting 11. /// public static List MakeResponseModelsForRetrieve() => [ .. PlayerData .MakeStarting11() .Select(player => { player.Id = Guid.NewGuid(); return new PlayerResponseModel { FullName = $"{player.FirstName} {(string.IsNullOrWhiteSpace(player.MiddleName) ? "" : player.MiddleName + " ")}{player.LastName}".Trim(), Birth = FormatBirth(player.DateOfBirth), Dorsal = player.SquadNumber, Position = player.Position, Club = player.Team, League = player.League, Starting11 = player.Starting11 ? "Yes" : "No", }; }), ]; /* ------------------------------------------------------------------------- * Update * ---------------------------------------------------------------------- */ /// /// Creates a PlayerRequestModel for testing update operations. /// Delegates to MakeRequestModelForRetrieve. /// /// The squad number of the player to update. public static PlayerRequestModel MakeRequestModelForUpdate(int squadNumber) { return MakeRequestModelForRetrieve(squadNumber); } /// /// Creates a PlayerResponseModel for testing update operation responses. /// Delegates to MakeResponseModelForRetrieve. /// /// The squad number of the player to update. public static PlayerResponseModel MakeResponseModelForUpdate(int squadNumber) { return MakeResponseModelForRetrieve(squadNumber); } }