# Copyright 2014 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unittests for trybot_patch_pool."""

from chromite.cbuildbot import trybot_patch_pool
from chromite.lib import config_lib
from chromite.lib import constants
from chromite.lib import patch as cros_patch
from chromite.lib import patch_unittest


class FilterTests(patch_unittest.GitRepoPatchTestCase):
    """Tests for all the various filters."""

    patch_kls = cros_patch.LocalPatch

    def testChromiteFilter(self) -> None:
        """Make sure the chromite filter works"""
        _, _, patch = self._CommonGitSetup()
        patch.project = constants.CHROMITE_PROJECT
        self.assertTrue(trybot_patch_pool.ChromiteFilter(patch))
        patch.project = "foooo"
        self.assertFalse(trybot_patch_pool.ChromiteFilter(patch))

    def testManifestFilters(self) -> None:
        """Make sure the manifest filters work"""
        site_params = config_lib.GetSiteParams()
        _, _, patch = self._CommonGitSetup()

        patch.project = constants.CHROMITE_PROJECT
        self.assertFalse(trybot_patch_pool.ExtManifestFilter(patch))
        self.assertFalse(trybot_patch_pool.IntManifestFilter(patch))
        self.assertFalse(trybot_patch_pool.ManifestFilter(patch))

        patch.project = site_params.MANIFEST_PROJECT
        self.assertTrue(trybot_patch_pool.ExtManifestFilter(patch))
        self.assertFalse(trybot_patch_pool.IntManifestFilter(patch))
        self.assertTrue(trybot_patch_pool.ManifestFilter(patch))

        patch.project = site_params.MANIFEST_INT_PROJECT
        self.assertFalse(trybot_patch_pool.ExtManifestFilter(patch))
        self.assertTrue(trybot_patch_pool.IntManifestFilter(patch))
        self.assertTrue(trybot_patch_pool.ManifestFilter(patch))

    def testBranchFilter(self) -> None:
        """Make sure the branch filter works"""
        _, _, patch = self._CommonGitSetup()

        self.assertFalse(trybot_patch_pool.BranchFilter("/,/asdf", patch))
        self.assertTrue(
            trybot_patch_pool.BranchFilter(patch.tracking_branch, patch)
        )
