Bonjour à tous ! Aujourd’hui on se retrouve pour découvrir Bun !
C’est quoi Bun ?
Bun est un framework de développement qui a pour but de ‘remplacer’ NodeJS pour le développement en TypeScript/JavaScript.
Bun contient plusieurs modules natifs, il va aussi nous permettre de gérer les packages NPM mais aussi de réaliser des tests unitaires très facilement.
Avant de commencer
Avant d’aller dans notre éditeur de code préféré, je tiens à souligner que je n’ai jamais fait de TypeScript, donc ce sera de la découverte pour moi.
L’idée, c’est de créer un projet qui sera une petite API, une base de données SQLite et de créer les tests unitaires.
Le projet
Mais on va coder quoi ?
Pour créer cet article, je profite d’un projet qui m’a été donné à mon école (CESI).
Le projet est assez grand pour le peu de temps accordé donc nous devons prioriser les tâches, je ne vais pas vous expliquer tout le sujet, donc je vais juste vous énoncer quelques user stories que nous avons choisies.
User stories
User storie 1
En tant qu’utilisateur je souhaite m’inscrire pour parier sur un match.
Remarque : L’utilisateur ne peut pas s’incrire s’il a moins de 18 ans. Il faut également connaître le pays de l’utilisateur.
User storie 2
En tant qu’utilisateur je veux pouvoir me connecter à mon compte.
Remarque : Un token JWT de 1H devra être fournis.
User storie 3
En tant qu’utilisateur je peux visualiser les matchs disponibles ainsi que leurs côtes.
Remarque : Pas besoins de compte pour visualiser les matchs.
Remarque : Les matchs seront fictifs dans un JSON.
User storie 4
(optionnel) En tant qu’utilisateur connecté je peux parier sur un match une somme.
Remarque : Le match ne doit pas être en cours de jeu.
Installation de bun
Maintenant que nous avons nos user stories qui déterminent nos tâches, on va pouvoir commencer à coder !
Pour commencer, on va installer bun.
Sous linux et MacOS nous utiliserons cette commande :
Voici la sortie de la commande :
Nous allons donc réaliser la commence exec et tester bun —help.
Screen de bun —help :
Parfait tout va bien !
Je vais créer un nouveau dossier que je vais appeler “bun-trd”
Et je vais aller dans le dossier :
Création du projet
Maintenant nous allons créer le projet avec bun init.
Nous voyons que nous avons un dossier avec tous les fichiers nécessaires pour notre projet. (Pas comme NodeJS, créer ne crée pas le fichier index.js)
Dans le package.json je vais ajouter la partie scripts qui va nous permettre de lancer le fichier index.ts qui contient un console.log.
C’est quoi —hot ? Magie ! C’est une option qui permet de lancer le programme avec hot reload. Pas besoin d’ajouter nodemon ou autres. :)
Il nous reste plus qu’à lancer le projet avec bun run dev
Et voilà notre projet est lancé !
Avant de bien structurer notre projet, nous allons ajouter Hono, u module qui permet la création d’API Rest très facilement.
Ajout de Hono
Normalement nous pouvons faire bun create hono projetname, mais comme nous avons déjà initialisé notre projet, nous allons utiliser bun add hono
On va commencer les choses sérieuse, donc je vais structurer le projet.
Voici ma structure choisis :
Persistance des données
Avant de commencer notre api nous allons explorer la persistance des données, pour cela nous allons utiliser une base de données SQLite.
Maintenant, modifions l’index.ts pour ajouter hono et notre route.
Pour essayer les variables d’environnement, j’ai rajouter un fichier .env à la racine du projet.
Pour l’instant elle contient seulement ceci :
On teste la création de l’utilisateur ?
Voici la requête que je vais utiliser avec mon terminal directement :
Et voilà notre utilisateur est créé ! On va vérifier en base ?
Parfait, maintenant je vais essayer de créer un test unitaire pour notre fonction userCreate.
Test unitaire
L’avantage c’est que bun embarque directement Jest et une cli, donc l’intégration de test est très simple.
https://bun.sh/docs/cli/test
Pour commencer, je vais créer un fichier dans le dossier tests qui sera nommé userCreate.test.ts.
Voici mon fichier userCreate.test.ts :
Encore une fois, j’ai commenté au maximum les différentes parties de mon code pour que vous compreniez mieux l’utilité, et pour moi ici quand je regarderai mon tutoriel plus tard ^^”
Maintenant on va lancer notre test avec la commande bun test
Connexion d’un utilisateur
Je ne vais pas vous détailler tout le projet, mais je trouve ça intéressant d’avoir plusieurs outils à notre disposition directement, comme le hash de mot de passe ou le connecteur de base de données.
Pour continuer sur cette lancé je vais utiliser une autre intégration, la génération de token JWT ! Ce n’est pas vraiment bun qui l’intégre mais Hono embarque directement le module https://hono.dev/docs/helpers/jwt
Dans userController je vais donc ajouter le code suivant :
Dans l’index.ts on va rajouter une route /login
Résultat :
Parfait tout ça ! Mais maintenant, je me demande comment faire les tests de login, sachant qu’on mock la fonction db donc on insère par l’utilisateur dedans.
En demandant à GPTo il m’a indiqué qu’en mode test notre NODE_ENV est égal à test. Donc nous pourrions modifier db.ts pour créer une database de test.
Et spoiler alerte, il a raison !
J’ai testé sans créer la base de données de test, c’est une galère de mock toutes les commandes SQLite.
Donc je vais faire un if à la création de la base de données pour créer une base de données de test si la variable d’environnement NODE_ENV est égale à test.
Test unitaire
Avec le changement de base de données, j’ai du intégré la suppression des données dans la tables, mais j’ai pu rajouter aussi le test d’erreur lorsque l’email existe déjà !
Voici mon fichier complet de test à présent :
On peut voir un résultat satisfaisant !
MatchController
Maintenant que la partie utilisateur est fonctionnelle, on va passer aux matchs.
Pour travailler sur des données fictives, j’ai demandé à GPTo de créer un tableau de matchs.
Je vais partir de cette base, mais en modifiant quelques éléments pour que ce soit plus intéressant.
Je vais créer un fichier matchController.ts dans src/controllers :
Rajouter la route dans l’index :
Un petit curl pour tester curl http://localhost:3000/matchs
Et voici le retour :
Tout va bien ! C’est très simple mais mon but encore une fois est de faire des tests unitaires, donc c’est parti !
test unitaire
J’ai décidé de faire un seul test unitaire, car pour les matchs il faudrait implémenter une forte logique pour une gestion parfaite, mais je pense avoir assez détaillé les tests dans la partie utilisateur, ce qui m’a permis d’acquérir de nouvelles connaissances sur jest et bun.
Voici mon fichier matchController.test.ts :
Ce fichier permet de vérifier que la fonction fonctionViewMatch retourne bien des données et que c’est donnée soit uniquement des matchs du jour.
Conclusion
J’espère que cet article vous a plu et vous donnera envie de tester Bun !
Etant une personne qui n’est jamais fait de TypeScript, je n’ai pas ressenti d’énorme difficulté, je suis même étonné de la facilité d’utilisation. Cela ne change pas énormément de JavaScript, à part l’ajout d’un typage qui permet une sécurité accrue sur l’input/output des données.
Bien sûr, je n’ai pas exploré toutes les possibilités de TypeScript/Bun, mais je pense que c’est une première expérience très intéressante !