#!/usr/bin/env python3
# © 2021-2026 TechnoLibre (http://www.technolibre.ca)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
"""Le trou dans un manifeste, et ce qui le distingue d'une absence normale.
Beaucoup de dépôts n'ont pas de branche pour toutes les versions d'Odoo.
Les signaler tous ferait 46 % de bruit — mesuré : 35 trous, 19 vraies
omissions. L'outil ne vaut que par ce tri, et c'est donc lui qu'on teste.
Aucun test ne touche au réseau : `judge` reçoit son lecteur d'amont, et
les tests lui en donnent un qui répond de mémoire. Un test qui appelle
GitHub échoue dans un train, et l'on finit par ne plus le lancer.
"""
import io
import os
import sys
import tempfile
import unittest
from contextlib import redirect_stdout
REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, REPO)
from script.analyse import check_manifest_gaps as gaps # noqa: E402
MANIFESTE = """
%s
"""
PROJET = """ """
def projet(nom, version, remote="OCA"):
court = nom.replace(".git", "")
return PROJET % (nom, version, court, remote, version, version)
class Base(unittest.TestCase):
def setUp(self):
self.dossier = tempfile.mkdtemp()
self.addCleanup(__import__("shutil").rmtree, self.dossier)
def ecrire(self, version, noms, remote="OCA"):
corps = "\n".join(projet(n, version, remote) for n in noms)
chemin = os.path.join(
self.dossier, "git_manifest_odoo%s.xml" % version
)
with io.open(chemin, "w", encoding="utf-8") as handle:
handle.write(MANIFESTE % corps)
return chemin
def trous(self):
ordre = [v for v, _ in gaps.versions(self.dossier)]
return gaps.gaps(gaps.declarations(self.dossier), ordre)
class TestReadingTheManifests(Base):
def test_the_versions_come_from_the_files_not_a_list(self):
# Une version ajoutée au dépôt doit entrer dans l'analyse sans
# qu'on pense à toucher le code.
for v in ("12.0", "14.0", "18.0"):
self.ecrire(v, ["a.git"])
self.assertEqual(
["12.0", "14.0", "18.0"],
[v for v, _ in gaps.versions(self.dossier)],
)
def test_ten_comes_after_nine_not_before(self):
# Trier des versions comme du texte met « 10.0 » avant « 9.0 ».
self.assertLess(gaps.rang("9.0"), gaps.rang("10.0"))
def test_the_dev_manifests_are_left_out(self):
# Ils COMPLÈTENT le principal : un dépôt qui n'est que là n'a
# aucune raison d'être partout, et le compter créerait des trous
# imaginaires dans toutes les versions.
self.ecrire("14.0", ["a.git"])
with io.open(
os.path.join(self.dossier, "git_manifest_odoo14.0_dev.xml"),
"w",
encoding="utf-8",
) as handle:
handle.write(MANIFESTE % projet("b.git", "14.0"))
self.assertEqual(["14.0"], [v for v, _ in gaps.versions(self.dossier)])
def test_the_url_is_rebuilt_from_its_remote(self):
self.ecrire("14.0", ["donation.git"])
dct = gaps.declarations(self.dossier)
self.assertEqual(
"https://github.com/OCA/donation.git",
dct["donation.git"]["14.0"],
)
def test_an_unparsable_manifest_does_not_stop_the_others(self):
self.ecrire("14.0", ["a.git"])
with io.open(
os.path.join(self.dossier, "git_manifest_odoo16.0.xml"),
"w",
encoding="utf-8",
) as handle:
handle.write("