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());
}