4-6 Exécuter un scénario de test authentifié (Blazor)
Imaginons que vous deviez accéder à une page qui nécessaire d'être connecté. Dans notre projet Blazor, le jeton est stocké dans le localstorage avec la clé authToken.
Nous ferons donc une requête à l'API afin d'obtenir un jeton et nous insèrerons ce dernier dans le localstorage par la suite.
Imaginons un test simple qui afficherait la page d'accueil (nécéssitant d'être authentifié).
namespace Snowfall.Tests.Web.Api.TestsE2E;
public class AccueilTest : WebApiE2ETestBase
{
    public AccueilTest(
        SnowfallApiKestrelApplicationFactory factory,
        TestDatabaseFixture db)
        : base(factory, db)
    {
    }
    [Fact]
    public async Task Obtenir_PageAccueil()
    {
        // Act
        await Page.GotoAsync($"{BaseUrl}");
        
        await Page.Locator("h1").WaitForAsync();
        
        // Assert
        Assert.Contains("Gestion Snowfall", await Page.ContentAsync());
    }
}
Ce dernier ne fonctionnera pas puisque vous serez redirigé vers la page de connexion.
Il est possible de faire un appel d'API et d'utiliser Page.Context pour exécuter un script JavaScript d'initialisation! Ce dernier ajoute le jeton reçu au localstorage:
[Fact]
public async Task Obtenir_PageAccueil()
{
    // Arrange
    // Effectuer un appel de connexion à l'API pour obtenir un jeton
    var connextionDto = new ConnexionDto {
        Email = "a@dmin.com",
        Password = "!User122432"
    };
    var httpClient = new HttpClient { BaseAddress = new Uri(BaseUrl) };
    var response   = await httpClient.PostAsJsonAsync("/api/auth", connextionDto);
    response.EnsureSuccessStatusCode();
    // Extraire le jeton de la réponse
    var resultat = await response.Content.ReadFromJsonAsync<ResultatConnexionDto>(); 
    string token = resultat!.Token;
    // Ajouter le jeton au localStorage de la page
    await Page.Context.AddInitScriptAsync($@"
        window.localStorage.setItem('authToken', '{token}')
    ");
    
    // Act
    await Page.GotoAsync($"{BaseUrl}");
    
    await Page.Locator("h1").WaitForAsync();
    
    // Assert
    Assert.Contains("Gestion Snowfall", await Page.ContentAsync());
}
Fonction utilitaire pour authentifier l'utilisateur
Évidemment, on peut extraire dans une fonction utilitaire la logique d'authentification et de stockage.
//...
protected async Task AuthentifierUtilisateur(string email, string password)
{
    // Effectuer un appel de connexion à l'API pour obtenir un jeton
    var connextionDto = new ConnexionDto {
        Email = email,
        Password = password
    };
    var httpClient = new HttpClient { BaseAddress = new Uri(BaseUrl) };
    var response   = await httpClient.PostAsJsonAsync("/api/auth", connextionDto);
    response.EnsureSuccessStatusCode();
    // Extraire le jeton de la réponse
    var resultat = await response.Content.ReadFromJsonAsync<ResultatConnexionDto>(); 
    string token = resultat!.Token;
    // Ajouter le jeton au localStorage de la page
    await Page.Context.AddInitScriptAsync($@"
        window.localStorage.setItem('authToken', '{token}')
    ");
}
//...
Et ensuite simplement utiliser cette fonction dans le test.
[Fact]
public async Task Obtenir_PageAccueil()
{
    // Arrange
    await AuthentifierUtilisateur("a@dmin.com", "!User122432");
    
    // Act
    await Page.GotoAsync($"{BaseUrl}");
    
    await Page.Locator("h1").WaitForAsync();
    
    // Assert
    Assert.Contains("Gestion Snowfall", await Page.ContentAsync());
}