Aller au contenu principal

2-6-5 Faire une requête authentifiée

Nous avons vu comment faire un test pour charger la page d'accueil en tant qu'utilisateur anonyme (non connecté), et si on voulait tester que charger la page d'accueil en tant qu'utilisateur connecté affichait dans l'en-tête le nom de l'utilisateur ("Bonjour, [nom de l'utilisateur]")?

Test d'accès à la page d'accueil connecté

Créons une coquille pour tester l'accès à la page d'accueil, mais connecté.

Ce qu'on cherche à tester, c'est que le texte Bonjour, {nom de l'utilisateur} est affiché.

Snowfall.Tests/Web.Mvc/TestsIntegration/AccueilTests.cs
//...

[Fact]
public async Task Obtenir_AccueilUtilisateurConnecte_PageAfficheNomUtilisateur()
{
// Arrange
string url = "/";

// Act
HttpResponseMessage reponse = await Client.GetAsync(url);

// Assert
reponse.EnsureSuccessStatusCode();
string contenu = await reponse.Content.ReadAsStringAsync();
Assert.Contains("Bonjour,", contenu);
}

Si vous exécutez le test, évidemment le tout ne fonctionnera pas puisque le texte n'est pas contenu dans la page:

Assert.Contains() Failure: Sub-string not found
String: "\n<!DOCTYPE html>\n<html lang="en" data-bs-"···
Not found: "Bonjour,"

Créer le contexte d'un utilisateur connecté

Il est possible de simuler un cookie d'authentification, mais afin de tester le vrai processus comme on le désire dans un test d'intégration, on procédera à l'authentification d'un utilisateur, en passant par le formulaire de connexion.

Pour ce faire, on peut extraire toute la logique créée pour la connexion dans les étapes précédentes et en faire une fonction utilitaire dans la classe WebMvcIntegrationTestBase.

Snowfall.Tests/Web.Mvc/TestsIntegration/WebMvcIntegrationTestBase.cs
//...

public async Task<HttpClient> CreerClientUtilisateur(string email, string password)
{
var client = this.Application.CreateClient(new WebApplicationFactoryClientOptions
{
AllowAutoRedirect = false
});

HttpResponseMessage reponse = await client.GetAsync("Auth/Connexion");
IHtmlDocument pageConnexion = await HtmlHelpers.GetDocumentAsync(reponse);

reponse = await client.SendAsync(
(pageConnexion.QuerySelector("main form") as IHtmlFormElement)!,
(pageConnexion.QuerySelector("main form button.btn-primary") as IHtmlButtonElement)!,
new Dictionary<string, string>
{
{ "Email", email },
{ "Password", password },
});

return client;
}

//...
info

Dans les fonctions de test nécessitant une connexion, plutôt que d'appeler Client, on pourra ainsi appeler CreerClientUtilisateur(email, password) afin de créer une instance personnalisée.

Cela retournera un client connecté et donc avec le cookie de session.

Tester l'accès à la page d'accueil connecté

Il ne reste qu'à modifier une ligne dans la coquille de test pour utiliser la nouvelle fonction.

Snowfall.Tests/TestsMvc/TestsIntegration/AccueilTests.cs
//...

[Fact]
public async Task Obtenir_AccueilUtilisateurConnecte_PageAfficheNomUtilisateur()
{
// Arrange
string url = "/";
HttpClient client = await CreerClientUtilisateur(
"u@ser.com",
"!User122432");

// Act
HttpResponseMessage reponse = await client.GetAsync(url);

// Assert
reponse.EnsureSuccessStatusCode();
string contenu = await reponse.Content.ReadAsStringAsync();
Assert.Contains("Bonjour,", contenu);
}