229 lines
8.7 KiB
C#
229 lines
8.7 KiB
C#
using Dotnet.Samples.AspNetCore.WebApi.Models;
|
||
using Dotnet.Samples.AspNetCore.WebApi.Utilities;
|
||
|
||
namespace Dotnet.Samples.AspNetCore.WebApi.Tests.Utilities;
|
||
|
||
/// <summary>
|
||
/// 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.
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// Data-state vocabulary used across controller tests:
|
||
/// <list type="bullet">
|
||
/// <item><term>existing</term><description>Player is present in the database.</description></item>
|
||
/// <item><term>nonexistent</term><description>Player is absent, valid shape for creation (POST scenarios).</description></item>
|
||
/// <item><term>unknown</term><description>Valid ID format, absent from database (404-by-lookup scenarios).</description></item>
|
||
/// </list>
|
||
/// </remarks>
|
||
public static class PlayerFakes
|
||
{
|
||
private static string? FormatBirth(DateTime? dateOfBirth) =>
|
||
dateOfBirth.HasValue ? $"{dateOfBirth.Value:MMMM d, yyyy}" : null;
|
||
|
||
/// <summary>
|
||
/// Returns the starting 11 players with generated GUIDs for in-memory testing.
|
||
/// Reuses production player data from PlayerData.MakeStarting11().
|
||
/// </summary>
|
||
public static List<Player> MakeStarting11()
|
||
{
|
||
var players = PlayerData.MakeStarting11();
|
||
|
||
// Assign GUIDs for in-memory database testing
|
||
foreach (var player in players)
|
||
{
|
||
player.Id = Guid.NewGuid();
|
||
}
|
||
|
||
return players;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns a specific player from the starting 11 by squad number.
|
||
/// Reuses production player data from PlayerData.MakeStarting11().
|
||
/// </summary>
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns a new player (substitute) for testing create operations.
|
||
/// Reuses production player data from PlayerData.GetSubstitutes().
|
||
/// </summary>
|
||
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
|
||
* ---------------------------------------------------------------------- */
|
||
|
||
/// <summary>
|
||
/// Creates a PlayerRequestModel for testing create operations.
|
||
/// Uses data from a substitute player (Giovani Lo Celso).
|
||
/// </summary>
|
||
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,
|
||
};
|
||
}
|
||
|
||
/// <summary>
|
||
/// Creates a PlayerResponseModel for testing create operation responses.
|
||
/// Uses data from a substitute player (Giovani Lo Celso).
|
||
/// </summary>
|
||
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
|
||
* ---------------------------------------------------------------------- */
|
||
|
||
/// <summary>
|
||
/// Creates a PlayerRequestModel for testing retrieve operations.
|
||
/// Uses data from the starting 11 based on the specified squad number.
|
||
/// </summary>
|
||
/// <param name="squadNumber">The squad number of the player to retrieve.</param>
|
||
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,
|
||
};
|
||
}
|
||
|
||
/// <summary>
|
||
/// Creates a PlayerResponseModel for testing retrieve operation responses.
|
||
/// Uses data from the starting 11 based on the specified squad number.
|
||
/// </summary>
|
||
/// <param name="squadNumber">The squad number of the player to retrieve.</param>
|
||
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",
|
||
};
|
||
}
|
||
|
||
/// <summary>
|
||
/// Creates a list of PlayerResponseModel for testing retrieve all operations.
|
||
/// Uses all players from the starting 11.
|
||
/// </summary>
|
||
public static List<PlayerResponseModel> 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
|
||
* ---------------------------------------------------------------------- */
|
||
|
||
/// <summary>
|
||
/// Creates a PlayerRequestModel for testing update operations.
|
||
/// Delegates to MakeRequestModelForRetrieve.
|
||
/// </summary>
|
||
/// <param name="squadNumber">The squad number of the player to update.</param>
|
||
public static PlayerRequestModel MakeRequestModelForUpdate(int squadNumber)
|
||
{
|
||
return MakeRequestModelForRetrieve(squadNumber);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Creates a PlayerResponseModel for testing update operation responses.
|
||
/// Delegates to MakeResponseModelForRetrieve.
|
||
/// </summary>
|
||
/// <param name="squadNumber">The squad number of the player to update.</param>
|
||
public static PlayerResponseModel MakeResponseModelForUpdate(int squadNumber)
|
||
{
|
||
return MakeResponseModelForRetrieve(squadNumber);
|
||
}
|
||
}
|