class TestGetGuessedPOFile(TestCaseWithFactory):
    """Test matching of PO files with respective templates and languages."""

    layer = LaunchpadZopelessLayer

    def setUp(self):
        """Set up context to test in."""
        super(TestGetGuessedPOFile, self).setUp()
        self.queue = getUtility(ITranslationImportQueue)
        self.factory = LaunchpadObjectFactory()
        self.distribution = self.factory.makeDistribution('boohoo')
        self.distroseries = self.factory.makeDistroSeries(self.distribution)
        self.uploaderperson = self.factory.makePerson()

    def createSourcePackageAndPOTemplate(self, sourcepackagename, template):
        """Create and return a source package and a POTemplate.

        Creates a source package in the self.distroseries with the passed-in
        sourcepackagename, and a template in that sourcepackage named
        template with the identical translation domain.
        """
        target_sourcepackage = self.factory.makeSourcePackage(
            distroseries=self.distroseries)
        pot = self.factory.makePOTemplate(
            sourcepackagename=target_sourcepackage.sourcepackagename,
            distroseries=target_sourcepackage.distroseries,
            name=template,
            translation_domain=template)
        spn = self.factory.makeSourcePackageName(sourcepackagename)
        l10n_sourcepackage = self.factory.makeSourcePackage(
            sourcepackagename=spn, distroseries=self.distroseries)
        return (l10n_sourcepackage, pot)

    def _getGuessedPOFile(self, source_name, template_path):
        """Return new POTemplate and matched POFile for package and template.
        """
        template_name = os.path.basename(template_path)
        package, pot = self.createSourcePackageAndPOTemplate(
            source_name, template_name)
        queue_entry = self.queue.addOrUpdateEntry(
            '%s.po' % template_path,
            template_name,
            True,
            self.uploaderperson,
            distroseries=package.distroseries,
            sourcepackagename=package.sourcepackagename)
        pofile = queue_entry.getGuessedPOFile()
        return (pot, pofile)

    def test_KDE4_language(self):
        # PO files 'something.po' in a package named like 'kde-l10n-sr'
        # belong in the 'something' translation domain as Serbian (sr)
        # translations.
        potemplate, pofile = self._getGuessedPOFile('kde-l10n-sr', 'template')
        serbian = getUtility(ILanguageSet).getLanguageByCode('sr')
        self.assertEqual(potemplate, pofile.potemplate)
        self.assertEqual(serbian, pofile.language)

    def test_KDE4_language_country(self):
        # If package name is kde-l10n-engb, it needs to be mapped
        # to British English (en_GB).
        potemplate, pofile = self._getGuessedPOFile('kde-l10n-engb',
                                                    'template')
        real_english = getUtility(ILanguageSet).getLanguageByCode('en_GB')
        self.assertEqual(potemplate, pofile.potemplate)
        self.assertEqual(real_english, pofile.language)

    def test_KDE4_language_variant(self):
        # If package name is kde-l10n-ca-valencia, it needs to be mapped
        # to Valencian variant of Catalan (ca@valencia).
        catalan_valencia = self.factory.makeLanguage('ca@valencia',
                                                     'Catalan Valencia')
        potemplate, pofile = self._getGuessedPOFile('kde-l10n-ca-valencia',
                                                    'template')
        self.assertEqual(potemplate, pofile.potemplate)
        self.assertEqual(catalan_valencia, pofile.language)

    def test_KDE4_language_subvariant(self):
        # PO file 'sr@test/something.po' in a package named like
        # 'kde-l10n-sr' belong in the 'something' translation domain
        # for "sr@test" language translations.
        serbian_test = self.factory.makeLanguage('sr@test')
        potemplate, pofile = self._getGuessedPOFile('kde-l10n-sr',
                                                    'sr@test/template')
        self.assertEqual(potemplate, pofile.potemplate)
        self.assertEqual(serbian_test, pofile.language)

    def test_KDE4_language_at_sign(self):
        # PO file 'blah@test/something.po' in a package named like
        # 'kde-l10n-sr' belong in the 'something' translation domain
        # for "sr" language translations.
        serbian = getUtility(ILanguageSet).getLanguageByCode('sr')
        potemplate, pofile = self._getGuessedPOFile(
            'kde-l10n-sr', 'source/blah@test/template')
        self.assertEqual(potemplate, pofile.potemplate)
        self.assertEqual(serbian, pofile.language)
class TestGetGuessedPOFile(TestCaseWithFactory):
    """Test matching of PO files with respective templates and languages."""

    layer = LaunchpadZopelessLayer

    def setUp(self):
        """Set up context to test in."""
        super(TestGetGuessedPOFile, self).setUp()
        self.queue = getUtility(ITranslationImportQueue)
        self.factory = LaunchpadObjectFactory()
        self.distribution = self.factory.makeDistribution('boohoo')
        self.distroseries = self.factory.makeDistroSeries(self.distribution)
        self.uploaderperson = self.factory.makePerson()

    def createSourcePackageAndPOTemplate(self, sourcepackagename, template):
        """Create and return a source package and a POTemplate.

        Creates a source package in the self.distroseries with the passed-in
        sourcepackagename, and a template in that sourcepackage named
        template with the identical translation domain.
        """
        target_sourcepackage = self.factory.makeSourcePackage(
            distroseries=self.distroseries)
        pot = self.factory.makePOTemplate(
            sourcepackagename=target_sourcepackage.sourcepackagename,
            distroseries=target_sourcepackage.distroseries,
            name=template, translation_domain=template)
        spn = self.factory.makeSourcePackageName(sourcepackagename)
        l10n_sourcepackage = self.factory.makeSourcePackage(
            sourcepackagename=spn,
            distroseries=self.distroseries)
        return (l10n_sourcepackage, pot)

    def _getGuessedPOFile(self, source_name, template_path):
        """Return new POTemplate and matched POFile for package and template.
        """
        template_name = os.path.basename(template_path)
        package, pot = self.createSourcePackageAndPOTemplate(
            source_name, template_name)
        queue_entry = self.queue.addOrUpdateEntry(
            '%s.po' % template_path, template_name, True, self.uploaderperson,
            distroseries=package.distroseries,
            sourcepackagename=package.sourcepackagename)
        pofile = queue_entry.getGuessedPOFile()
        return (pot, pofile)

    def test_KDE4_language(self):
        # PO files 'something.po' in a package named like 'kde-l10n-sr'
        # belong in the 'something' translation domain as Serbian (sr)
        # translations.
        potemplate, pofile = self._getGuessedPOFile(
            'kde-l10n-sr', 'template')
        serbian = getUtility(ILanguageSet).getLanguageByCode('sr')
        self.assertEquals(potemplate, pofile.potemplate)
        self.assertEquals(serbian, pofile.language)

    def test_KDE4_language_country(self):
        # If package name is kde-l10n-engb, it needs to be mapped
        # to British English (en_GB).
        potemplate, pofile = self._getGuessedPOFile(
            'kde-l10n-engb', 'template')
        real_english = getUtility(ILanguageSet).getLanguageByCode('en_GB')
        self.assertEquals(potemplate, pofile.potemplate)
        self.assertEquals(real_english, pofile.language)

    def test_KDE4_language_variant(self):
        # If package name is kde-l10n-ca-valencia, it needs to be mapped
        # to Valencian variant of Catalan (ca@valencia).
        catalan_valencia = self.factory.makeLanguage(
            'ca@valencia', 'Catalan Valencia')
        potemplate, pofile = self._getGuessedPOFile(
            'kde-l10n-ca-valencia', 'template')
        self.assertEquals(potemplate, pofile.potemplate)
        self.assertEquals(catalan_valencia, pofile.language)

    def test_KDE4_language_subvariant(self):
        # PO file 'sr@test/something.po' in a package named like
        # 'kde-l10n-sr' belong in the 'something' translation domain
        # for "sr@test" language translations.
        serbian_test = self.factory.makeLanguage('sr@test')
        potemplate, pofile = self._getGuessedPOFile(
            'kde-l10n-sr', 'sr@test/template')
        self.assertEquals(potemplate, pofile.potemplate)
        self.assertEquals(serbian_test, pofile.language)

    def test_KDE4_language_at_sign(self):
        # PO file 'blah@test/something.po' in a package named like
        # 'kde-l10n-sr' belong in the 'something' translation domain
        # for "sr" language translations.
        serbian = getUtility(ILanguageSet).getLanguageByCode('sr')
        potemplate, pofile = self._getGuessedPOFile(
            'kde-l10n-sr', 'source/blah@test/template')
        self.assertEquals(potemplate, pofile.potemplate)
        self.assertEquals(serbian, pofile.language)