import os
import unittest

import yaml

from lib.db import DB
from lib.db_revision import DBRevision
from lib.tree_builder import TreeBuilder


class TestTreeMethods(unittest.TestCase):
    def setUp(self):
        self.db = DB(section="test")

    def verify_package(self, package):
        path = os.path.join(os.path.dirname(__file__), f"fixtures/{package}-data.yaml")
        with open(path, "r") as f:
            data = yaml.safe_load(f)
        for rev in data["revisions"]:
            DBRevision.import_fixture_dict(self.db, rev)

        revisions = TreeBuilder(self.db).build("openSUSE:Factory", package)
        path = os.path.join(
            os.path.dirname(__file__), f"fixtures/{package}-expected-tree.yaml"
        )
        # REGENERATE_DATA=1 PYTHONPATH=$PWD python3 ./tests/tree_test.py
        if os.getenv("REGENERATE_DATA"):
            with open(path, "w") as f:
                yaml.dump(revisions.as_list(), f)

        with open(path, "r") as f:
            data = yaml.safe_load(f)
        self.assertEqual(data, revisions.as_list())

        # verify flat lists
        path = os.path.join(
            os.path.dirname(__file__), f"fixtures/{package}-expected-list.yaml"
        )
        flat_list = [str(x) for x in revisions.as_flat_list()]
        if os.getenv("REGENERATE_DATA"):
            with open(path, "w") as f:
                yaml.dump(flat_list, f)

        with open(path, "r") as f:
            data = yaml.safe_load(f)
        self.assertEqual(data, flat_list)

        self.db.conn.rollback()

    def test_zsh_tree(self):
        self.verify_package("zsh")

    def test_clapper_tree(self):
        self.verify_package("clapper")

    def test_llvm13_tree(self):
        self.verify_package("llvm13")

    def test_2048_cli_tree(self):
        self.verify_package("2048-cli")

    def test_corefreq_tree(self):
        self.verify_package("CoreFreq")

    def test_000update_repos_tree(self):
        self.verify_package("000update-repos")

    def test_breeze_tree(self):
        self.verify_package("breeze")

    def test_firewalld_tree(self):
        self.verify_package("firewalld")

    def test_FastCGI_tree(self):
        self.verify_package("FastCGI")


if __name__ == "__main__":
    unittest.main()