Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Tests

on:
pull_request:
workflow_dispatch:

permissions:
contents: read

concurrency:
group: tests-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
lua-tests:
name: Lua tests
runs-on: ubuntu-latest
timeout-minutes: 5

steps:
- name: Checkout pull request
uses: actions/checkout@v7.0.1

- name: Install stable Neovim
uses: rhysd/action-setup-vim@v1.6.1
with:
neovim: true

- name: Run tests
run: nvim --headless -u NONE -l tests/run.lua
83 changes: 83 additions & 0 deletions specs/2026-08-20-project-directory-regression-tests.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Spec: Tests de non-régression des répertoires projet

## 1. Meta

- Date : 2026-08-20
- Statut : Approved
- Portée : tests Lua du module `scretch`

## 2. Contexte / Problème

La PR #11 corrige une lecture invalide de `config.use_project.dir` en
`config.use_project_dir`. Les tests existants ne couvraient pas les branches où
les répertoires projet sont activés, ce qui a laissé passer la régression.

## 3. Objectifs

- Protéger le choix du répertoire projet pour les scratchs et les templates.
- Protéger le comportement de `auto_create_project_dir`.
- Vérifier le comportement via l'API publique du module.

## 4. Non-objectifs

- Modifier le comportement ou la configuration du plugin.
- Tester les modes temporaires déjà couverts par d'autres tests.
- Ajouter une nouvelle infrastructure de test ou de CI.

## 5. Scope

### In

- Tests unitaires pour `use_project_dir.scretch = true`.
- Tests unitaires pour `use_project_dir.template = true`.
- Cas `auto_create_project_dir = true` et `false`.

### Out

- Modes `auto`, `global` et commandes interactives.
- Accès réel au système de fichiers.

## 6. Risques et Impacts

- Risque faible de couplage aux détails internes, limité en observant les
commandes et appels simulés produits par l'API publique.
- Aucun impact sur les données, la sécurité ou les performances de production.
- Rollback : retrait des seuls cas de test ajoutés.

## 7. Approche proposée

Étendre le harnais existant pour exposer son répertoire de travail et les
dossiers créés, puis appeler `setup` avec les configurations projet. Déclencher
une opération publique qui consomme chaque répertoire et vérifier que le chemin
utilisé est construit à partir du répertoire de travail courant et du chemin
relatif configuré, ainsi que la création conditionnelle du dossier.

## 8. Alternatives considérées

- Tester directement les fonctions internes : rejeté car plus couplé à
l'implémentation.
- Utiliser de vrais dossiers temporaires : rejeté car le harnais simule déjà le
système de fichiers de façon déterministe.

## 9. Plan d'implémentation

1. Exposer le répertoire de travail simulé et `created_dirs` dans le contexte
de test.
2. Ajouter les cas scratch et template avec création activée.
3. Ajouter la vérification que la création reste désactivée par défaut.

## 10. Plan de test

- Exécuter `nvim --headless -u NONE -l tests/run.lua`.
- Vérifier que la suite échouerait si le chemin de configuration fautif était
réintroduit.

## 11. Critères d'acceptation

- AC-1 : un scratch en mode projet utilise, sans erreur, le chemin relatif
`scretch_project_dir` résolu depuis le répertoire de travail courant.
- AC-2 : un template en mode projet utilise, sans erreur, le chemin relatif
`template_project_dir` résolu depuis le répertoire de travail courant.
- AC-3 : avec `auto_create_project_dir = true`, le répertoire choisi est créé.
- AC-4 : avec `auto_create_project_dir = false`, aucun répertoire n'est créé.
- AC-5 : toute la suite de tests existante reste verte.
86 changes: 86 additions & 0 deletions specs/2026-08-20-pull-request-test-workflow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# Spec: Tests automatiques sur les pull requests

## 1. Meta

- Date : 2026-08-20
- Statut : Approved
- Portée : GitHub Actions

## 2. Contexte / Problème

Les pull requests ne lancent actuellement aucun test du plugin. GitGuardian est
le seul check visible et ne détecte pas les régressions fonctionnelles Lua.

## 3. Objectifs

- Exécuter la suite Lua sur chaque pull request.
- Permettre de lancer la même suite manuellement depuis GitHub Actions.
- Rendre le résultat bloquant et visible dans les checks GitHub.
- Garder le workflow rapide, déterministe et à permissions minimales.

## 4. Non-objectifs

- Tester plusieurs systèmes d'exploitation ou versions de Neovim.
- Déployer, publier des artefacts ou modifier le dépôt.
- Exécuter le workflow lors des push directs dans cette première version.

## 5. Scope

### In

- Workflow déclenché par `pull_request`.
- Déclenchement manuel sans paramètre via `workflow_dispatch`.
- Runner Ubuntu et version stable de Neovim.
- Checkout du code puis exécution de `tests/run.lua` en mode headless.
- Annulation d'une exécution obsolète pour la même pull request.

### Out

- Matrice multi-OS/multi-version.
- Couverture de code, cache et artefacts.
- Configuration des branch protection rules sur GitHub.

## 6. Risques et Impacts

- Une évolution incompatible de Neovim stable peut faire échouer le workflow ;
ce risque est accepté pour tester la version courante supportée.
- Le code d'une pull request est exécuté sur un runner GitHub isolé, sans secret
et avec `contents: read` uniquement.
- Rollback : suppression du fichier de workflow.

## 7. Approche proposée

Ajouter un workflow YAML sous `.github/workflows/` avec un job unique. Installer
Neovim stable via une action dédiée épinglée, checkout le dépôt, puis lancer
`nvim --headless -u NONE -l tests/run.lua`.

## 8. Alternatives considérées

- Installer Neovim via APT : rejeté car la version Ubuntu peut être ancienne.
- Ajouter une matrice stable/nightly : différé pour éviter du bruit et un coût
sans besoin de compatibilité explicite à ce stade.
- Exécuter aussi sur `push` vers `main` : différé car la demande vise les PR.

## 9. Plan d'implémentation

1. Ajouter le workflow avec permissions minimales, déclenchement sur PR et
déclenchement manuel.
2. Valider la syntaxe et la commande localement autant que possible.
3. Documenter la limite : le check ne devient obligatoire qu'après activation
dans les règles de protection GitHub.

## 10. Plan de test

- Vérifier la syntaxe YAML et les clés du workflow.
- Réexécuter localement la commande exacte du job.
- Après push, ouvrir ou mettre à jour une PR pour confirmer le check réel.

## 11. Critères d'acceptation

- AC-1 : toute pull request déclenche un job de tests Lua.
- AC-1b : le même job peut être lancé manuellement via GitHub Actions, sans
paramètre obligatoire.
- AC-2 : le job checkout le commit de la PR et utilise Neovim stable.
- AC-3 : le job échoue lorsque `tests/run.lua` échoue et réussit sinon.
- AC-4 : le workflow n'accorde que la permission `contents: read`.
- AC-5 : un nouveau commit sur une PR annule son run précédent encore actif.
57 changes: 57 additions & 0 deletions tests/scretch_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,8 @@ local function with_module(test_fn)
notifications = notifications,
fs = fs,
files = files,
cwd = cwd,
created_dirs = created_dirs,
set_input = function(v) input_value = v end,
set_current_file = function(v) current_file = v end,
}
Expand Down Expand Up @@ -201,6 +203,61 @@ with_module(function(t)
assert_eq(captured.cwd, "/tmp/scretch-tests/.scretch/templates/", "project mode should force project template dir")
end)

with_module(function(t)
local project_dir = ".project-scretches/"
local expected_dir = t.cwd .. "/" .. project_dir
t.module.setup({
use_project_dir = {
auto_create_project_dir = true,
scretch = true,
scretch_project_dir = project_dir,
}
})
t.module.new()
assert_eq(t.cmds[#t.cmds], "vsplit " .. expected_dir .. "scretch_1.txt",
"project scretch dir should be relative to cwd")
assert_truthy(t.created_dirs[expected_dir], "enabled project scretch dir should be created")
end)

with_module(function(t)
local captured = nil
local project_dir = ".project-templates/"
local expected_dir = t.cwd .. "/" .. project_dir
package.loaded["fzf-lua"] = {
files = function(opts)
captured = opts
end
}
t.module.setup({
backend = "fzf-lua",
use_project_dir = {
auto_create_project_dir = true,
template = true,
template_project_dir = project_dir,
}
})
t.module.edit_template()
assert_truthy(captured ~= nil, "edit_template should call configured backend")
assert_eq(captured.cwd, expected_dir, "project template dir should be relative to cwd")
assert_truthy(t.created_dirs[expected_dir], "enabled project template dir should be created")
end)

with_module(function(t)
local project_dir = ".existing-scretches/"
local expected_dir = t.cwd .. "/" .. project_dir
t.module.setup({
use_project_dir = {
auto_create_project_dir = false,
scretch = true,
scretch_project_dir = project_dir,
}
})
t.module.new()
assert_eq(t.cmds[#t.cmds], "vsplit " .. expected_dir .. "scretch_1.txt",
"project scretch dir should still be selected when auto-create is disabled")
assert_eq(t.created_dirs[expected_dir], nil, "disabled auto-create should not create project dir")
end)

with_module(function(t)
t.set_input("")
t.module.new_named()
Expand Down