コード例 #1
0
 def setUp(self):
     self.pd_cache.clear()
     self.firefox_desktop = FirefoxDesktop(json_dir=PROD_DETAILS_DIR)
     self.firefox_android = FirefoxAndroid(json_dir=PROD_DETAILS_DIR)
     self.patcher = patch.object(fx_views, 'firefox_desktop',
                                 self.firefox_desktop)
     self.patcher.start()
コード例 #2
0
 def setUp(self):
     self.firefox_desktop = FirefoxDesktop(json_dir=PROD_DETAILS_DIR)
     self.p1 = patch.object(self.firefox_desktop, "firefox_primary_builds", GOOD_BUILDS__THREE_DIGITS)
     self.p2 = patch.object(self.firefox_desktop, "firefox_beta_builds", {})
     self.p3 = patch.object(self.firefox_desktop, "firefox_versions", self.firefox_desktop_versions)
     self.p1.start()
     self.p2.start()
     self.p3.start()
コード例 #3
0
ファイル: test_base.py プロジェクト: mozilla/bedrock
 def test_relnotes_index_firefox(self, render_mock):
     firefox_desktop = FirefoxDesktop(json_dir=DATA_PATH)
     with patch("bedrock.releasenotes.views.firefox_desktop",
                firefox_desktop):
         render_mock().render.return_value = HttpResponse("")
         with self.activate("en-US"):
             self.client.get(reverse("firefox.releases.index"))
         releases = render_mock.call_args[0][2]["releases"]
         assert len(releases) == len(
             firefox_desktop.firefox_history_major_releases)
         assert releases[0][0] == 82.0
         assert releases[0][1]["major"] == "82.0"
         assert releases[0][1]["minor"] == ["82.0.1", "82.0.2", "82.0.3"]
         assert releases[4][0] == 78.0
         assert releases[4][1]["major"] == "78.0"
         assert releases[4][1]["minor"] == [
             "78.0.1", "78.0.2", "78.1.0", "78.2.0", "78.3.0", "78.3.1",
             "78.4.0", "78.4.1"
         ]
         assert releases[49][0] == 33.1
         assert releases[49][1]["major"] == "33.1"
         assert releases[49][1]["minor"] == ["33.1.1"]
         assert releases[50][0] == 33.0
         assert releases[50][1]["major"] == "33.0"
         assert releases[50][1]["minor"] == ["33.0.1", "33.0.2", "33.0.3"]
         assert releases[52][0] == 31.0
         assert releases[52][1]["major"] == "31.0"
         assert releases[52][1]["minor"] == [
             "31.1.0",
             "31.1.1",
             "31.2.0",
             "31.3.0",
             "31.4.0",
             "31.5.0",
             "31.5.2",
             "31.5.3",
             "31.6.0",
             "31.7.0",
             "31.8.0",
         ]
         assert releases[69][1]["major"] == "14.0.1"
         assert releases[69][1]["minor"] == []
         # ensure v5.0 doesn't match v50.0
         assert releases[78][1]["major"] == "5.0"
         assert releases[78][1]["minor"] == ["5.0.1"]
コード例 #4
0
ファイル: test_base.py プロジェクト: vaibhawW/bedrock
 def test_relnotes_index_firefox(self, render_mock):
     firefox_desktop = FirefoxDesktop(json_dir=DATA_PATH)
     with patch('bedrock.releasenotes.views.firefox_desktop',
                firefox_desktop):
         render_mock().render.return_value = HttpResponse('')
         with self.activate('en-US'):
             self.client.get(reverse('firefox.releases.index'))
         releases = render_mock.call_args[0][2]['releases']
         assert len(releases) == len(
             firefox_desktop.firefox_history_major_releases)
         assert releases[0][0] == 36.0
         assert releases[0][1]['major'] == '36.0'
         assert releases[0][1]['minor'] == []
         assert releases[3][0] == 33.1
         assert releases[3][1]['major'] == '33.1'
         assert releases[3][1]['minor'] == ['33.1.1']
         assert releases[4][0] == 33.0
         assert releases[4][1]['major'] == '33.0'
         assert releases[4][1]['minor'] == ['33.0.1', '33.0.2', '33.0.3']
         assert releases[6][0] == 31.0
         assert releases[6][1]['major'] == '31.0'
         assert (releases[6][1]['minor'] == [
             '31.1.0', '31.1.1', '31.2.0', '31.3.0', '31.4.0', '31.5.0'
         ])
コード例 #5
0
ファイル: test_base.py プロジェクト: yathu/bedrock
class TestFirefoxAll(TestCase):
    pd_cache = caches['product-details']

    def setUp(self):
        self.pd_cache.clear()
        self.firefox_desktop = FirefoxDesktop(json_dir=PROD_DETAILS_DIR)
        self.patcher = patch.object(
            fx_views, 'firefox_desktop', self.firefox_desktop)
        self.patcher.start()

    def tearDown(self):
        self.patcher.stop()

    def test_all_builds_results(self):
        """
        The unified page should display builds for all products
        """
        resp = self.client.get(reverse('firefox.all'))
        doc = pq(resp.content)
        assert len(doc('.c-all-downloads-build')) == 9

        desktop_release_builds = len(self.firefox_desktop.get_filtered_full_builds('release'))
        assert len(doc('.c-locale-list[data-product="desktop_release"] > li')) == desktop_release_builds
        assert len(doc('.c-locale-list[data-product="desktop_release"] > li[data-language="en-US"] > ul > li > a')) == 8

        desktop_beta_builds = len(self.firefox_desktop.get_filtered_full_builds('beta'))
        assert len(doc('.c-locale-list[data-product="desktop_beta"] > li')) == desktop_beta_builds
        assert len(doc('.c-locale-list[data-product="desktop_beta"] > li[data-language="en-US"] > ul > li > a')) == 8

        desktop_developer_builds = len(self.firefox_desktop.get_filtered_full_builds('alpha'))
        assert len(doc('.c-locale-list[data-product="desktop_developer"] > li')) == desktop_developer_builds
        assert len(doc('.c-locale-list[data-product="desktop_developer"] > li[data-language="en-US"] > ul > li > a')) == 8

        desktop_nightly_builds = len(self.firefox_desktop.get_filtered_full_builds('nightly'))
        assert len(doc('.c-locale-list[data-product="desktop_nightly"] > li')) == desktop_nightly_builds
        assert len(doc('.c-locale-list[data-product="desktop_nightly"] > li[data-language="en-US"] > ul > li > a')) == 8

        desktop_esr_builds = len(self.firefox_desktop.get_filtered_full_builds('esr'))
        assert len(doc('.c-locale-list[data-product="desktop_esr"] > li')) == desktop_esr_builds
        assert len(doc('.c-locale-list[data-product="desktop_esr"] > li[data-language="en-US"] > ul > li > a')) == 8

        android_release_builds = 1
        assert len(doc('.c-locale-list[data-product="android_release"] > li')) == android_release_builds
        assert len(doc('.c-locale-list[data-product="android_release"] > li[data-language="multi"] > ul > li > a')) == 2

        android_beta_builds = 1
        assert len(doc('.c-locale-list[data-product="android_beta"] > li')) == android_beta_builds
        assert len(doc('.c-locale-list[data-product="android_beta"] > li[data-language="multi"] > ul > li > a')) == 1

        android_nightly_builds = 1
        assert len(doc('.c-locale-list[data-product="android_nightly"] > li')) == android_nightly_builds
        assert len(doc('.c-locale-list[data-product="android_nightly"] > li[data-language="multi"] > ul > li > a')) == 1

        ios_release_builds = 1
        assert len(doc('.c-locale-list[data-product="ios_release"] > li')) == ios_release_builds
        assert len(doc('.c-locale-list[data-product="ios_release"] > li[data-language="multi"] > ul > li > a')) == 2

    def test_no_locale_details(self):
        """
        When a localized build has been added to the Firefox details while the
        locale details are not updated yet, the filtered build list should not
        include the localized build.
        """
        builds = self.firefox_desktop.get_filtered_full_builds('release')
        assert 'uz' in self.firefox_desktop.firefox_primary_builds
        assert 'uz' not in self.firefox_desktop.languages
        assert len([build for build in builds if build['locale'] == 'uz']) == 0
コード例 #6
0
from urlparse import parse_qsl, urlparse

from django.conf import settings
from django.core.cache import get_cache
from django.test.utils import override_settings

from mock import patch, Mock
from nose.tools import eq_, ok_

from bedrock.firefox.firefox_details import FirefoxDesktop, FirefoxAndroid, FirefoxIOS
from bedrock.mozorg.tests import TestCase

TEST_DATA_DIR = os.path.join(os.path.dirname(__file__), 'test_data')
PROD_DETAILS_DIR = os.path.join(TEST_DATA_DIR, 'product_details_json')

firefox_desktop = FirefoxDesktop(json_dir=PROD_DETAILS_DIR)
firefox_android = FirefoxAndroid(json_dir=PROD_DETAILS_DIR)
firefox_ios = FirefoxIOS(json_dir=PROD_DETAILS_DIR)

GOOD_PLATS = {'Windows': {}, 'OS X': {}, 'Linux': {}}
GOOD_BUILDS = {
    'en-US': {
        '25.0': GOOD_PLATS,  # current release
        '26.0b2': GOOD_PLATS,
        '27.0a1': GOOD_PLATS,
    },
    'de': {
        '25.0': GOOD_PLATS,
    },
    'fr': {
        '24.0': GOOD_PLATS,  # prev release
コード例 #7
0
ファイル: test_base.py プロジェクト: secretrobotron/bedrock
from django.test.utils import override_settings

from bedrock.base.urlresolvers import reverse
from mock import patch, Mock
from nose.tools import eq_
from pathlib import Path
from pyquery import PyQuery as pq
from rna.models import Release

from bedrock.firefox.firefox_details import FirefoxDesktop
from bedrock.mozorg.tests import TestCase
from bedrock.releasenotes import views
from bedrock.thunderbird.details import ThunderbirdDesktop

DATA_PATH = str(Path(__file__).parent / 'data')
firefox_desktop = FirefoxDesktop(json_dir=DATA_PATH)
thunderbird_desktop = ThunderbirdDesktop(json_dir=DATA_PATH)


class TestRNAViews(TestCase):
    def setUp(self):
        self.factory = RequestFactory()
        self.request = self.factory.get('/')

        self.render_patch = patch(
            'bedrock.releasenotes.views.l10n_utils.render')
        self.mock_render = self.render_patch.start()
        self.mock_render.return_value.has_header.return_value = False

    def tearDown(self):
        self.render_patch.stop()
コード例 #8
0
ファイル: test_base.py プロジェクト: trojanspike/bedrock
class TestFirefoxAll(TestCase):
    pd_cache = caches['product-details']

    def setUp(self):
        self.pd_cache.clear()
        self.firefox_desktop = FirefoxDesktop(json_dir=PROD_DETAILS_DIR)
        self.firefox_android = FirefoxAndroid(json_dir=PROD_DETAILS_DIR)
        self.patcher = patch.object(fx_views, 'firefox_desktop',
                                    self.firefox_desktop)
        self.patcher.start()

    def tearDown(self):
        self.patcher.stop()

    def _get_url(self, platform='desktop', channel='release'):
        with self.activate('en-US'):
            kwargs = {}

            if platform != 'desktop':
                kwargs['platform'] = platform
            if channel != 'release':
                kwargs['channel'] = channel

            return reverse('firefox.all', kwargs=kwargs)

    @patch.object(fx_views, 'lang_file_is_active', lambda *x: True)
    def test_all_builds_results(self):
        """
        The unified page should display builds for all products
        """
        resp = self.client.get(self._get_url())
        doc = pq(resp.content)
        assert len(doc('.c-all-downloads-build')) == 8

        desktop_release_builds = len(
            self.firefox_desktop.get_filtered_full_builds('release'))
        assert len(doc('.c-locale-list[data-product="desktop_release"] > li')
                   ) == desktop_release_builds
        assert len(
            doc('.c-locale-list[data-product="desktop_release"] > li[data-language="en-US"] > ul > li > a'
                )) == 7

        desktop_beta_builds = len(
            self.firefox_desktop.get_filtered_full_builds('beta'))
        assert len(doc('.c-locale-list[data-product="desktop_beta"] > li')
                   ) == desktop_beta_builds
        assert len(
            doc('.c-locale-list[data-product="desktop_beta"] > li[data-language="en-US"] > ul > li > a'
                )) == 7

        desktop_developer_builds = len(
            self.firefox_desktop.get_filtered_full_builds('alpha'))
        assert len(doc('.c-locale-list[data-product="desktop_developer"] > li')
                   ) == desktop_developer_builds
        assert len(
            doc('.c-locale-list[data-product="desktop_developer"] > li[data-language="en-US"] > ul > li > a'
                )) == 7

        desktop_nightly_builds = len(
            self.firefox_desktop.get_filtered_full_builds('nightly'))
        assert len(doc('.c-locale-list[data-product="desktop_nightly"] > li')
                   ) == desktop_nightly_builds
        assert len(
            doc('.c-locale-list[data-product="desktop_nightly"] > li[data-language="en-US"] > ul > li > a'
                )) == 7

        desktop_esr_builds = len(
            self.firefox_desktop.get_filtered_full_builds('esr'))
        assert len(doc('.c-locale-list[data-product="desktop_esr"] > li')
                   ) == desktop_esr_builds
        assert len(
            doc('.c-locale-list[data-product="desktop_esr"] > li[data-language="en-US"] > ul > li > a'
                )) == 5

        android_release_builds = len(
            self.firefox_android.get_filtered_full_builds('release'))
        assert len(doc('.c-locale-list[data-product="android_release"] > li')
                   ) == android_release_builds
        assert len(
            doc('.c-locale-list[data-product="android_release"] > li[data-language="multi"] > ul > li > a'
                )) == 2

        android_beta_builds = len(
            self.firefox_android.get_filtered_full_builds('beta'))
        assert len(doc('.c-locale-list[data-product="android_beta"] > li')
                   ) == android_beta_builds
        assert len(
            doc('.c-locale-list[data-product="android_beta"] > li[data-language="multi"] > ul > li > a'
                )) == 2

        android_nightly_builds = len(
            self.firefox_android.get_filtered_full_builds('nightly'))
        assert len(doc('.c-locale-list[data-product="android_nightly"] > li')
                   ) == android_nightly_builds
        assert len(
            doc('.c-locale-list[data-product="android_nightly"] > li[data-language="multi"] > ul > li > a'
                )) == 2

    @patch.object(fx_views, 'lang_file_is_active', lambda *x: False)
    def test_no_search_results(self):
        """
        Tables should be gone and not-found message should be shown when there
        are no search results.
        """
        resp = self.client.get(self._get_url() + '?q=DOES_NOT_EXIST')
        doc = pq(resp.content)
        assert not doc('table.build-table')
        assert not doc('.not-found.hide')

    @patch.object(fx_views, 'lang_file_is_active', lambda *x: False)
    def test_no_search_query(self):
        """
        When not searching all builds should show.
        """
        resp = self.client.get(self._get_url())
        doc = pq(resp.content)
        assert len(doc('.build-table')) == 1
        assert len(doc('.not-found.hide')) == 1

        num_builds = len(
            self.firefox_desktop.get_filtered_full_builds('release'))
        num_builds += len(
            self.firefox_desktop.get_filtered_test_builds('release'))
        assert len(doc('tr[data-search]')) == num_builds
        assert len(doc('tr#en-US a')) == 7

    def test_no_locale_details(self):
        """
        When a localized build has been added to the Firefox details while the
        locale details are not updated yet, the filtered build list should not
        include the localized build.
        """
        builds = self.firefox_desktop.get_filtered_full_builds('release')
        assert 'uz' in self.firefox_desktop.firefox_primary_builds
        assert 'uz' not in self.firefox_desktop.languages
        assert len([build for build in builds if build['locale'] == 'uz']) == 0

    def test_android(self):
        """
        The Firefox for Android download table should only show the multi-locale
        builds for ARM and x86.
        """
        resp = self.client.get(self._get_url('android'))
        doc = pq(resp.content)
        assert len(doc('tbody tr')) == 1
        assert len(doc('tbody tr#multi a')) == 2
        assert len(doc('tbody tr#multi .android')) == 1
        assert len(doc('tbody tr#multi .android-x86')) == 1

    def test_404(self):
        """
        Firefox for iOS doesn't have the /all/ page. Also, Firefox for Android
        doesn't have the ESR channel.
        """
        resp = self.client.get(self._get_url('ios'))
        self.assertEqual(resp.status_code, 404)

        resp = self.client.get(self._get_url('android', 'organizations'))
        self.assertEqual(resp.status_code, 404)

    def test_301(self):
        """Android Aurora download page should be redirected to Nightly"""
        resp = self.client.get(self._get_url('android', 'aurora'))
        assert resp.status_code == 301
        assert resp['Location'].endswith('/firefox/android/nightly/all/')
コード例 #9
0
 def setUp(self):
     self.pd_cache.clear()
     self.firefox_desktop = FirefoxDesktop(json_dir=PROD_DETAILS_DIR)
コード例 #10
0
class TestFirefoxDesktopBase(TestCase):
    pd_cache = caches["product-details"]

    def setUp(self):
        self.pd_cache.clear()
        self.firefox_desktop = FirefoxDesktop(json_dir=PROD_DETAILS_DIR)

    def test_get_download_url(self):
        url = self.firefox_desktop.get_download_url("release", "17.0.1", "osx", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-latest-ssl"), ("os", "osx"), ("lang", "pt-BR")],
        )
        # Windows 64-bit
        url = self.firefox_desktop.get_download_url("release", "38.0", "win64", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-stub"), ("os", "win64"), ("lang", "en-US")],
        )
        # Windows 64-bit MSI installer
        url = self.firefox_desktop.get_download_url("release", "38.0", "win64-msi", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-msi-latest-ssl"), ("os", "win64"), ("lang", "en-US")],
        )
        # Linux 64-bit
        url = self.firefox_desktop.get_download_url("release", "17.0.1", "linux64", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-latest-ssl"), ("os", "linux64"), ("lang", "en-US")],
        )
        # Check three-digit version does not break things
        url = self.firefox_desktop.get_download_url("release", "117.0.1", "osx", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-latest-ssl"), ("os", "osx"), ("lang", "pt-BR")],
        )

    def test_get_download_url_esr(self):
        """
        The ESR version should give us a bouncer url. There is no stub for ESR.
        """
        # MSI installer
        url = self.firefox_desktop.get_download_url("esr", "28.0a2", "win-msi", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-esr-msi-latest-ssl"),
                ("os", "win"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("esr", "28.0a2", "win64", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-esr-latest-ssl"), ("os", "win64"), ("lang", "en-US")],
        )
        url = self.firefox_desktop.get_download_url("esr", "28.0a2", "osx", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-esr-latest-ssl"), ("os", "osx"), ("lang", "en-US")],
        )
        url = self.firefox_desktop.get_download_url("esr", "28.0a2", "linux", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-esr-latest-ssl"), ("os", "linux"), ("lang", "en-US")],
        )
        url = self.firefox_desktop.get_download_url("esr", "28.0a2", "linux64", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-esr-latest-ssl"),
                ("os", "linux64"),
                ("lang", "en-US"),
            ],
        )

    def test_get_download_url_esr_next(self):
        """
        The ESR_NEXT version should give us a bouncer url with 'esr-next'. There is no stub for ESR.
        """
        url = self.firefox_desktop.get_download_url("esr_next", "52.4.1esr", "win", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-esr-next-latest-ssl"),
                ("os", "win"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("esr_next", "52.4.1esr", "win64", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-esr-next-latest-ssl"),
                ("os", "win64"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("esr_next", "52.4.1esr", "win64-msi", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-esr-next-msi-latest-ssl"),
                ("os", "win64"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("esr_next", "52.4.1esr", "osx", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-esr-next-latest-ssl"),
                ("os", "osx"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("esr_next", "52.4.1esr", "linux", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-esr-next-latest-ssl"),
                ("os", "linux"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("esr_next", "52.4.1esr", "linux64", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-esr-next-latest-ssl"),
                ("os", "linux64"),
                ("lang", "en-US"),
            ],
        )

    def test_get_download_url_devedition(self):
        """
        The Developer Edition version should give us a bouncer url. For Windows,
        a stub url should be returned.
        """
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "win", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-devedition-stub"), ("os", "win"), ("lang", "en-US")],
        )
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "win64", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-devedition-stub"),
                ("os", "win64"),
                ("lang", "en-US"),
            ],
        )
        # MSI installer
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "win64-msi", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-devedition-msi-latest-ssl"),
                ("os", "win64"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "osx", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-devedition-latest-ssl"),
                ("os", "osx"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "linux", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-devedition-latest-ssl"),
                ("os", "linux"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "linux64", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-devedition-latest-ssl"),
                ("os", "linux64"),
                ("lang", "en-US"),
            ],
        )

    def test_get_download_url_devedition_full(self):
        """
        The Developer Edition version should give us a bouncer url. For Windows,
        a full url should be returned.
        """
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "win", "en-US", True, True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-devedition-latest-ssl"),
                ("os", "win"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "win64", "en-US", True, True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-devedition-latest-ssl"),
                ("os", "win64"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "osx", "en-US", True, True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-devedition-latest-ssl"),
                ("os", "osx"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "linux", "en-US", True, True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-devedition-latest-ssl"),
                ("os", "linux"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "linux64", "en-US", True, True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-devedition-latest-ssl"),
                ("os", "linux64"),
                ("lang", "en-US"),
            ],
        )

    def test_get_download_url_devedition_l10n(self):
        """
        The Developer Edition version should give us a bouncer url. A stub url
        should be returned for win32/64, while other platforms get a full url.
        The product name is the same as en-US.
        """
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "win", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-devedition-stub"), ("os", "win"), ("lang", "pt-BR")],
        )
        # MSI installer
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "win-msi", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-devedition-msi-latest-ssl"),
                ("os", "win"),
                ("lang", "pt-BR"),
            ],
        )
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "win64", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-devedition-stub"),
                ("os", "win64"),
                ("lang", "pt-BR"),
            ],
        )
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "osx", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-devedition-latest-ssl"),
                ("os", "osx"),
                ("lang", "pt-BR"),
            ],
        )
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "linux", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-devedition-latest-ssl"),
                ("os", "linux"),
                ("lang", "pt-BR"),
            ],
        )
        url = self.firefox_desktop.get_download_url("alpha", "28.0a2", "linux64", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-devedition-latest-ssl"),
                ("os", "linux64"),
                ("lang", "pt-BR"),
            ],
        )

    def test_get_download_url_nightly(self):
        """
        The Nightly version should give us a bouncer url. For Windows, a stub url
        should be returned.
        """
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "win", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-nightly-stub"), ("os", "win"), ("lang", "en-US")],
        )
        # MSI installer
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "win64-msi", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-nightly-msi-latest-ssl"),
                ("os", "win64"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "win64", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-nightly-stub"), ("os", "win64"), ("lang", "en-US")],
        )
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "osx", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-nightly-latest-ssl"),
                ("os", "osx"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "linux", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-nightly-latest-ssl"),
                ("os", "linux"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "linux64", "en-US", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-nightly-latest-ssl"),
                ("os", "linux64"),
                ("lang", "en-US"),
            ],
        )

    def test_get_download_url_nightly_full(self):
        """
        The Nightly version should give us a bouncer url. For Windows, a full url
        should be returned.
        """
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "win", "en-US", True, True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-nightly-latest-ssl"),
                ("os", "win"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "win64", "en-US", True, True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-nightly-latest-ssl"),
                ("os", "win64"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "osx", "en-US", True, True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-nightly-latest-ssl"),
                ("os", "osx"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "linux", "en-US", True, True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-nightly-latest-ssl"),
                ("os", "linux"),
                ("lang", "en-US"),
            ],
        )
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "linux64", "en-US", True, True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-nightly-latest-ssl"),
                ("os", "linux64"),
                ("lang", "en-US"),
            ],
        )

    def test_get_download_url_nightly_l10n(self):
        """
        The Nightly version should give us a bouncer url. A stub url should be
        returned for win32/64, while other platforms get a full url. The product
        name is slightly different from en-US.
        """
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "win", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-nightly-stub"), ("os", "win"), ("lang", "pt-BR")],
        )
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "win64", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-nightly-stub"), ("os", "win64"), ("lang", "pt-BR")],
        )
        # MSI installer
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "win64-msi", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-nightly-msi-latest-l10n-ssl"),
                ("os", "win64"),
                ("lang", "pt-BR"),
            ],
        )
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "osx", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-nightly-latest-l10n-ssl"),
                ("os", "osx"),
                ("lang", "pt-BR"),
            ],
        )
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "linux", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-nightly-latest-l10n-ssl"),
                ("os", "linux"),
                ("lang", "pt-BR"),
            ],
        )
        url = self.firefox_desktop.get_download_url("nightly", "50.0a1", "linux64", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "firefox-nightly-latest-l10n-ssl"),
                ("os", "linux64"),
                ("lang", "pt-BR"),
            ],
        )

    def test_get_download_url_scene2_funnelcake(self):
        scene2 = self.firefox_desktop.download_base_url_transition
        url = self.firefox_desktop.get_download_url("release", "45.0", "win", "en-US")
        self.assertEqual(url, scene2)
        url = self.firefox_desktop.get_download_url("release", "45.0", "win", "en-US", funnelcake_id="64")
        self.assertEqual(url, scene2 + "?f=64")

    def test_get_download_url_scene2_with_locale(self):
        scene2 = self.firefox_desktop.download_base_url_transition
        url = self.firefox_desktop.get_download_url("release", "45.0", "win", "de", locale_in_transition=True)
        self.assertEqual(url, "/de" + scene2)

        url = self.firefox_desktop.get_download_url(
            "release",
            "45.0",
            "win",
            "fr",
            locale_in_transition=True,
            funnelcake_id="64",
        )
        self.assertEqual(url, "/fr" + scene2 + "?f=64")

    def get_download_url_ssl(self):
        """
        SSL-enabled links should always be used except Windows stub installers.
        """
        # SSL-enabled links won't be used for Windows builds (but SSL download
        # is enabled by default for stub installers)
        url = self.firefox_desktop.get_download_url("release", "27.0", "win", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-stub"), ("os", "win"), ("lang", "pt-BR")],
        )

        # SSL-enabled links will be used for OS X builds
        url = self.firefox_desktop.get_download_url("release", "27.0", "osx", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-latest-ssl"), ("os", "osx"), ("lang", "pt-BR")],
        )

        # SSL-enabled links will be used for Linux builds
        url = self.firefox_desktop.get_download_url("release", "27.0", "linux", "pt-BR", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "firefox-latest-ssl"), ("os", "linux"), ("lang", "pt-BR")],
        )

    def test_filter_builds_by_locale_name(self):
        # search english
        builds = self.firefox_desktop.get_filtered_full_builds("release", None, "ujara")
        assert len(builds) == 1
        assert builds[0]["name_en"] == "Gujarati"

        # search native
        builds = self.firefox_desktop.get_filtered_full_builds("release", None, "જરા")
        assert len(builds) == 1
        assert builds[0]["name_en"] == "Gujarati"

        # with a space
        builds = self.firefox_desktop.get_filtered_full_builds("release", None, "british english")
        assert len(builds) == 1
        assert builds[0]["name_en"] == "English (British)"

        # with a comma
        builds = self.firefox_desktop.get_filtered_full_builds("release", None, "French, Français")
        assert len(builds) == 1
        assert builds[0]["name_en"] == "French"

    def test_windows64_build(self):
        # Aurora
        builds = self.firefox_desktop.get_filtered_full_builds("alpha")
        url = builds[0]["platforms"]["win64"]["download_url"]
        assert parse_qsl(urlparse(url).query)[1] == ("os", "win64")

        # Beta
        builds = self.firefox_desktop.get_filtered_full_builds("beta")
        url = builds[0]["platforms"]["win64"]["download_url"]
        assert parse_qsl(urlparse(url).query)[1] == ("os", "win64")

        # Release
        builds = self.firefox_desktop.get_filtered_full_builds("release")
        url = builds[0]["platforms"]["win64"]["download_url"]
        assert parse_qsl(urlparse(url).query)[1] == ("os", "win64")

        # ESR
        builds = self.firefox_desktop.get_filtered_full_builds("esr")
        url = builds[0]["platforms"]["win64"]["download_url"]
        assert parse_qsl(urlparse(url).query)[1] == ("os", "win64")

    def test_linux64_build(self):
        builds = self.firefox_desktop.get_filtered_full_builds("release")
        url = builds[0]["platforms"]["linux64"]["download_url"]
        assert parse_qsl(urlparse(url).query)[1] == ("os", "linux64")

    def test_esr_versions(self):
        """ESR versions should be dynamic based on data."""
        with patch.object(
            self.firefox_desktop._storage,
            "data",
            Mock(return_value=dict(FIREFOX_ESR="24.2")),
        ):
            assert self.firefox_desktop.esr_major_versions == [24]
            assert self.firefox_desktop.esr_minor_versions == ["24.2"]

    def test_esr_versions_prev(self):
        """ESR versions should show previous when available."""
        with patch.object(
            self.firefox_desktop._storage,
            "data",
            Mock(return_value=dict(FIREFOX_ESR="24.6.0", FIREFOX_ESR_NEXT="31.0.0")),
        ):
            assert self.firefox_desktop.esr_major_versions == [24, 31]
            assert self.firefox_desktop.esr_minor_versions == ["24.6.0", "31.0.0"]

    def test_esr_versions_no_latest(self):
        """ESR versions should not blow up if current version is broken."""
        with patch.object(
            self.firefox_desktop._storage,
            "data",
            Mock(return_value=dict(LATEST_FIREFOX_VERSION="Phoenix", FIREFOX_ESR="Albuquerque")),
        ):
            assert self.firefox_desktop.esr_major_versions == []
            assert self.firefox_desktop.esr_minor_versions == []

    def test_latest_major_version(self):
        """latest_major_version should return an int of the major version."""
        for case in (
            ("18", 18),
            ("18.0a1", 18),
            ("18.0.1", 18),
            ("100.0.1", 100),
            ("100", 100),
            ("100.0a1", 100),
            ("119.0.1", 119),
            ("119", 119),
            ("119.0a1", 119),
        ):
            with self.subTest(case=case):
                with patch.object(
                    self.firefox_desktop._storage,
                    "data",
                    Mock(return_value=dict(LATEST_FIREFOX_VERSION=case[0])),
                ):
                    assert self.firefox_desktop.latest_major_version("release") == case[1]
コード例 #11
0
ファイル: test_base.py プロジェクト: nikhiljohn10/bedrock
from funfactory.urlresolvers import reverse
from mock import ANY, call, Mock, patch
from nose.tools import eq_, ok_
from pyquery import PyQuery as pq

from bedrock.firefox import views as fx_views
from bedrock.firefox.firefox_details import FirefoxDesktop, FirefoxAndroid
from bedrock.firefox.utils import product_details
from bedrock.mozorg.tests import TestCase

TEST_DATA_DIR = os.path.join(os.path.dirname(__file__), 'test_data')
PROD_DETAILS_DIR = os.path.join(TEST_DATA_DIR, 'product_details_json')
GOOD_PLATS = {'Windows': {}, 'OS X': {}, 'Linux': {}}

with patch.object(settings, 'PROD_DETAILS_DIR', PROD_DETAILS_DIR):
    firefox_desktop = FirefoxDesktop()
    firefox_android = FirefoxAndroid()


class TestInstallerHelp(TestCase):
    def setUp(self):
        self.button_mock = Mock()
        self.patcher = patch.dict('jingo.env.globals',
                                  download_firefox=self.button_mock)
        self.patcher.start()
        self.view_name = 'firefox.installer-help'
        with self.activate('en-US'):
            self.url = reverse(self.view_name)

    def tearDown(self):
        self.patcher.stop()
コード例 #12
0
class TestFirefoxDesktop(TestCase):
    pd_cache = caches['product-details']

    def setUp(self):
        self.pd_cache.clear()
        self.firefox_desktop = FirefoxDesktop(json_dir=PROD_DETAILS_DIR)

    def test_get_download_url(self):
        url = self.firefox_desktop.get_download_url('release', '17.0.1', 'osx',
                                                    'pt-BR', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'firefox-latest-ssl'), ('os', 'osx'),
             ('lang', 'pt-BR')],
        )
        # Windows 64-bit
        url = self.firefox_desktop.get_download_url('release', '38.0', 'win64',
                                                    'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'firefox-stub'), ('os', 'win64'), ('lang', 'en-US')],
        )
        # Windows 64-bit MSI installer
        url = self.firefox_desktop.get_download_url('release', '38.0',
                                                    'win64-msi', 'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'firefox-msi-latest-ssl'), ('os', 'win64'),
             ('lang', 'en-US')],
        )
        # Linux 64-bit
        url = self.firefox_desktop.get_download_url('release', '17.0.1',
                                                    'linux64', 'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'firefox-latest-ssl'), ('os', 'linux64'),
             ('lang', 'en-US')],
        )

    def test_get_download_url_esr(self):
        """
        The ESR version should give us a bouncer url. There is no stub for ESR.
        """
        # MSI installer
        url = self.firefox_desktop.get_download_url('esr', '28.0a2', 'win-msi',
                                                    'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-esr-msi-latest-ssl'),
                ('os', 'win'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('esr', '28.0a2', 'win64',
                                                    'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'firefox-esr-latest-ssl'), ('os', 'win64'),
             ('lang', 'en-US')],
        )
        url = self.firefox_desktop.get_download_url('esr', '28.0a2', 'osx',
                                                    'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'firefox-esr-latest-ssl'), ('os', 'osx'),
             ('lang', 'en-US')],
        )
        url = self.firefox_desktop.get_download_url('esr', '28.0a2', 'linux',
                                                    'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'firefox-esr-latest-ssl'), ('os', 'linux'),
             ('lang', 'en-US')],
        )
        url = self.firefox_desktop.get_download_url('esr', '28.0a2', 'linux64',
                                                    'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-esr-latest-ssl'),
                ('os', 'linux64'),
                ('lang', 'en-US'),
            ],
        )

    def test_get_download_url_esr_next(self):
        """
        The ESR_NEXT version should give us a bouncer url with 'esr-next'. There is no stub for ESR.
        """
        url = self.firefox_desktop.get_download_url('esr_next', '52.4.1esr',
                                                    'win', 'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-esr-next-latest-ssl'),
                ('os', 'win'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('esr_next', '52.4.1esr',
                                                    'win64', 'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-esr-next-latest-ssl'),
                ('os', 'win64'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('esr_next', '52.4.1esr',
                                                    'win64-msi', 'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-esr-next-msi-latest-ssl'),
                ('os', 'win64'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('esr_next', '52.4.1esr',
                                                    'osx', 'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-esr-next-latest-ssl'),
                ('os', 'osx'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('esr_next', '52.4.1esr',
                                                    'linux', 'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-esr-next-latest-ssl'),
                ('os', 'linux'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('esr_next', '52.4.1esr',
                                                    'linux64', 'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-esr-next-latest-ssl'),
                ('os', 'linux64'),
                ('lang', 'en-US'),
            ],
        )

    def test_get_download_url_devedition(self):
        """
        The Developer Edition version should give us a bouncer url. For Windows,
        a stub url should be returned.
        """
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2', 'win',
                                                    'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'firefox-devedition-stub'), ('os', 'win'),
             ('lang', 'en-US')],
        )
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2', 'win64',
                                                    'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-devedition-stub'),
                ('os', 'win64'),
                ('lang', 'en-US'),
            ],
        )
        # MSI installer
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2',
                                                    'win64-msi', 'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-devedition-msi-latest-ssl'),
                ('os', 'win64'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2', 'osx',
                                                    'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-devedition-latest-ssl'),
                ('os', 'osx'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2', 'linux',
                                                    'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-devedition-latest-ssl'),
                ('os', 'linux'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2',
                                                    'linux64', 'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-devedition-latest-ssl'),
                ('os', 'linux64'),
                ('lang', 'en-US'),
            ],
        )

    def test_get_download_url_devedition_full(self):
        """
        The Developer Edition version should give us a bouncer url. For Windows,
        a full url should be returned.
        """
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2', 'win',
                                                    'en-US', True, True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-devedition-latest-ssl'),
                ('os', 'win'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2', 'win64',
                                                    'en-US', True, True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-devedition-latest-ssl'),
                ('os', 'win64'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2', 'osx',
                                                    'en-US', True, True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-devedition-latest-ssl'),
                ('os', 'osx'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2', 'linux',
                                                    'en-US', True, True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-devedition-latest-ssl'),
                ('os', 'linux'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2',
                                                    'linux64', 'en-US', True,
                                                    True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-devedition-latest-ssl'),
                ('os', 'linux64'),
                ('lang', 'en-US'),
            ],
        )

    def test_get_download_url_devedition_l10n(self):
        """
        The Developer Edition version should give us a bouncer url. A stub url
        should be returned for win32/64, while other platforms get a full url.
        The product name is the same as en-US.
        """
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2', 'win',
                                                    'pt-BR', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'firefox-devedition-stub'), ('os', 'win'),
             ('lang', 'pt-BR')],
        )
        # MSI installer
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2',
                                                    'win-msi', 'pt-BR', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-devedition-msi-latest-ssl'),
                ('os', 'win'),
                ('lang', 'pt-BR'),
            ],
        )
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2', 'win64',
                                                    'pt-BR', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-devedition-stub'),
                ('os', 'win64'),
                ('lang', 'pt-BR'),
            ],
        )
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2', 'osx',
                                                    'pt-BR', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-devedition-latest-ssl'),
                ('os', 'osx'),
                ('lang', 'pt-BR'),
            ],
        )
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2', 'linux',
                                                    'pt-BR', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-devedition-latest-ssl'),
                ('os', 'linux'),
                ('lang', 'pt-BR'),
            ],
        )
        url = self.firefox_desktop.get_download_url('alpha', '28.0a2',
                                                    'linux64', 'pt-BR', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-devedition-latest-ssl'),
                ('os', 'linux64'),
                ('lang', 'pt-BR'),
            ],
        )

    def test_get_download_url_nightly(self):
        """
        The Nightly version should give us a bouncer url. For Windows, a stub url
        should be returned.
        """
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1', 'win',
                                                    'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'firefox-nightly-stub'), ('os', 'win'),
             ('lang', 'en-US')],
        )
        # MSI installer
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1',
                                                    'win64-msi', 'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-nightly-msi-latest-ssl'),
                ('os', 'win64'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1',
                                                    'win64', 'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'firefox-nightly-stub'), ('os', 'win64'),
             ('lang', 'en-US')],
        )
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1', 'osx',
                                                    'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-nightly-latest-ssl'),
                ('os', 'osx'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1',
                                                    'linux', 'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-nightly-latest-ssl'),
                ('os', 'linux'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1',
                                                    'linux64', 'en-US', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-nightly-latest-ssl'),
                ('os', 'linux64'),
                ('lang', 'en-US'),
            ],
        )

    def test_get_download_url_nightly_full(self):
        """
        The Nightly version should give us a bouncer url. For Windows, a full url
        should be returned.
        """
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1', 'win',
                                                    'en-US', True, True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-nightly-latest-ssl'),
                ('os', 'win'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1',
                                                    'win64', 'en-US', True,
                                                    True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-nightly-latest-ssl'),
                ('os', 'win64'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1', 'osx',
                                                    'en-US', True, True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-nightly-latest-ssl'),
                ('os', 'osx'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1',
                                                    'linux', 'en-US', True,
                                                    True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-nightly-latest-ssl'),
                ('os', 'linux'),
                ('lang', 'en-US'),
            ],
        )
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1',
                                                    'linux64', 'en-US', True,
                                                    True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-nightly-latest-ssl'),
                ('os', 'linux64'),
                ('lang', 'en-US'),
            ],
        )

    def test_get_download_url_nightly_l10n(self):
        """
        The Nightly version should give us a bouncer url. A stub url should be
        returned for win32/64, while other platforms get a full url. The product
        name is slightly different from en-US.
        """
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1', 'win',
                                                    'pt-BR', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'firefox-nightly-stub'), ('os', 'win'),
             ('lang', 'pt-BR')],
        )
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1',
                                                    'win64', 'pt-BR', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'firefox-nightly-stub'), ('os', 'win64'),
             ('lang', 'pt-BR')],
        )
        # MSI installer
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1',
                                                    'win64-msi', 'pt-BR', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-nightly-msi-latest-l10n-ssl'),
                ('os', 'win64'),
                ('lang', 'pt-BR'),
            ],
        )
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1', 'osx',
                                                    'pt-BR', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-nightly-latest-l10n-ssl'),
                ('os', 'osx'),
                ('lang', 'pt-BR'),
            ],
        )
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1',
                                                    'linux', 'pt-BR', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-nightly-latest-l10n-ssl'),
                ('os', 'linux'),
                ('lang', 'pt-BR'),
            ],
        )
        url = self.firefox_desktop.get_download_url('nightly', '50.0a1',
                                                    'linux64', 'pt-BR', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'firefox-nightly-latest-l10n-ssl'),
                ('os', 'linux64'),
                ('lang', 'pt-BR'),
            ],
        )

    def test_get_download_url_scene2_funnelcake(self):
        scene2 = self.firefox_desktop.download_base_url_transition
        url = self.firefox_desktop.get_download_url('release', '45.0', 'win',
                                                    'en-US')
        self.assertEqual(url, scene2)
        url = self.firefox_desktop.get_download_url('release',
                                                    '45.0',
                                                    'win',
                                                    'en-US',
                                                    funnelcake_id='64')
        self.assertEqual(url, scene2 + '?f=64')

    def test_get_download_url_scene2_with_locale(self):
        scene2 = self.firefox_desktop.download_base_url_transition
        url = self.firefox_desktop.get_download_url('release',
                                                    '45.0',
                                                    'win',
                                                    'de',
                                                    locale_in_transition=True)
        self.assertEqual(url, '/de' + scene2)

        url = self.firefox_desktop.get_download_url(
            'release',
            '45.0',
            'win',
            'fr',
            locale_in_transition=True,
            funnelcake_id='64',
        )
        self.assertEqual(url, '/fr' + scene2 + '?f=64')

    def get_download_url_ssl(self):
        """
        SSL-enabled links should always be used except Windows stub installers.
        """
        # SSL-enabled links won't be used for Windows builds (but SSL download
        # is enabled by default for stub installers)
        url = self.firefox_desktop.get_download_url('release', '27.0', 'win',
                                                    'pt-BR', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'firefox-stub'), ('os', 'win'), ('lang', 'pt-BR')],
        )

        # SSL-enabled links will be used for OS X builds
        url = self.firefox_desktop.get_download_url('release', '27.0', 'osx',
                                                    'pt-BR', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'firefox-latest-ssl'), ('os', 'osx'),
             ('lang', 'pt-BR')],
        )

        # SSL-enabled links will be used for Linux builds
        url = self.firefox_desktop.get_download_url('release', '27.0', 'linux',
                                                    'pt-BR', True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'firefox-latest-ssl'), ('os', 'linux'),
             ('lang', 'pt-BR')],
        )

    def test_filter_builds_by_locale_name(self):
        # search english
        builds = self.firefox_desktop.get_filtered_full_builds(
            'release', None, 'ujara')
        assert len(builds) == 1
        assert builds[0]['name_en'] == 'Gujarati'

        # search native
        builds = self.firefox_desktop.get_filtered_full_builds(
            'release', None, u'જરા')
        assert len(builds) == 1
        assert builds[0]['name_en'] == 'Gujarati'

        # with a space
        builds = self.firefox_desktop.get_filtered_full_builds(
            'release', None, 'british english')
        assert len(builds) == 1
        assert builds[0]['name_en'] == 'English (British)'

        # with a comma
        builds = self.firefox_desktop.get_filtered_full_builds(
            'release', None, u'French, Français')
        assert len(builds) == 1
        assert builds[0]['name_en'] == 'French'

    def test_windows64_build(self):
        # Aurora
        builds = self.firefox_desktop.get_filtered_full_builds('alpha')
        url = builds[0]['platforms']['win64']['download_url']
        assert parse_qsl(urlparse(url).query)[1] == ('os', 'win64')

        # Beta
        builds = self.firefox_desktop.get_filtered_full_builds('beta')
        url = builds[0]['platforms']['win64']['download_url']
        assert parse_qsl(urlparse(url).query)[1] == ('os', 'win64')

        # Release
        builds = self.firefox_desktop.get_filtered_full_builds('release')
        url = builds[0]['platforms']['win64']['download_url']
        assert parse_qsl(urlparse(url).query)[1] == ('os', 'win64')

        # ESR
        builds = self.firefox_desktop.get_filtered_full_builds('esr')
        url = builds[0]['platforms']['win64']['download_url']
        assert parse_qsl(urlparse(url).query)[1] == ('os', 'win64')

    def test_linux64_build(self):
        builds = self.firefox_desktop.get_filtered_full_builds('release')
        url = builds[0]['platforms']['linux64']['download_url']
        assert parse_qsl(urlparse(url).query)[1] == ('os', 'linux64')

    def test_esr_versions(self):
        """ESR versions should be dynamic based on data."""
        with patch.object(
                self.firefox_desktop._storage,
                'data',
                Mock(return_value=dict(FIREFOX_ESR='24.2')),
        ):
            assert self.firefox_desktop.esr_major_versions == [24]
            assert self.firefox_desktop.esr_minor_versions == ['24.2']

    def test_esr_versions_prev(self):
        """ESR versions should show previous when available."""
        with patch.object(
                self.firefox_desktop._storage,
                'data',
                Mock(return_value=dict(FIREFOX_ESR='24.6.0',
                                       FIREFOX_ESR_NEXT='31.0.0')),
        ):
            assert self.firefox_desktop.esr_major_versions == [24, 31]
            assert self.firefox_desktop.esr_minor_versions == [
                '24.6.0', '31.0.0'
            ]

    def test_esr_versions_no_latest(self):
        """ESR versions should not blow up if current version is broken."""
        with patch.object(
                self.firefox_desktop._storage,
                'data',
                Mock(return_value=dict(LATEST_FIREFOX_VERSION='Phoenix',
                                       FIREFOX_ESR='Albuquerque')),
        ):
            assert self.firefox_desktop.esr_major_versions == []
            assert self.firefox_desktop.esr_minor_versions == []

    def test_latest_major_version(self):
        """latest_major_version should return an int of the major version."""
        with patch.object(
                self.firefox_desktop._storage,
                'data',
                Mock(return_value=dict(LATEST_FIREFOX_VERSION='18.0.1')),
        ):
            assert self.firefox_desktop.latest_major_version('release') == 18

    def test_latest_major_version_no_int(self):
        """latest_major_version should return 0 when no int."""
        with patch.object(
                self.firefox_desktop._storage,
                'data',
                Mock(return_value=dict(LATEST_FIREFOX_VERSION='Phoenix')),
        ):
            assert self.firefox_desktop.latest_major_version('release') == 0

    @patch.dict(os.environ,
                FUNNELCAKE_64_LOCALES='en-US',
                FUNNELCAKE_64_PLATFORMS='win')
    def test_funnelcake_direct_links_en_us_win_only(self):
        """
        Ensure funnelcake params are included for Windows en-US builds only.
        """
        url = self.firefox_desktop.get_download_url('release',
                                                    '45.0',
                                                    'win',
                                                    'en-US',
                                                    force_direct=True,
                                                    funnelcake_id='64')
        assert 'product=firefox-stub-f64' in url

        url = self.firefox_desktop.get_download_url('release',
                                                    '45.0',
                                                    'win64',
                                                    'en-US',
                                                    force_direct=True,
                                                    funnelcake_id='64')
        assert 'product=firefox-stub-f64' not in url

        url = self.firefox_desktop.get_download_url('release',
                                                    '45.0',
                                                    'win',
                                                    'de',
                                                    force_direct=True,
                                                    funnelcake_id='64')
        assert 'product=firefox-stub-f64' not in url

        url = self.firefox_desktop.get_download_url('release',
                                                    '45.0',
                                                    'osx',
                                                    'en-US',
                                                    force_direct=True,
                                                    funnelcake_id='64')
        assert 'product=firefox-stub-f64' not in url

    def test_no_funnelcake_direct_links_if_not_configured(self):
        """
        Ensure funnelcake params are included for Linux and OSX en-US builds only.
        """
        url = self.firefox_desktop.get_download_url('release',
                                                    '45.0',
                                                    'win',
                                                    'en-US',
                                                    force_direct=True,
                                                    funnelcake_id='64')
        assert '-f64' not in url

        url = self.firefox_desktop.get_download_url(
            'release',
            '45.0',
            'win',
            'en-US',
            force_direct=True,
            force_full_installer=True,
            funnelcake_id='64',
        )
        assert '-f64' not in url

        url = self.firefox_desktop.get_download_url(
            'release',
            '45.0',
            'win',
            'en-US',
            force_direct=True,
            force_funnelcake=True,
            funnelcake_id='64',
        )
        assert '-f64' not in url

        url = self.firefox_desktop.get_download_url('release',
                                                    '45.0',
                                                    'osx',
                                                    'de',
                                                    force_direct=True,
                                                    funnelcake_id='64')
        assert '-f64' not in url

        url = self.firefox_desktop.get_download_url('release',
                                                    '45.0',
                                                    'osx',
                                                    'en-US',
                                                    force_direct=True,
                                                    funnelcake_id='64')
        assert '-f64' not in url

        url = self.firefox_desktop.get_download_url('release',
                                                    '45.0',
                                                    'osx',
                                                    'fr',
                                                    force_direct=True,
                                                    funnelcake_id='64')
        assert '-f64' not in url

        url = self.firefox_desktop.get_download_url('release',
                                                    '45.0',
                                                    'linux',
                                                    'de',
                                                    force_direct=True,
                                                    funnelcake_id='64')
        assert '-f64' not in url

        url = self.firefox_desktop.get_download_url('release',
                                                    '45.0',
                                                    'linux',
                                                    'en-US',
                                                    force_direct=True,
                                                    funnelcake_id='64')
        assert '-f64' not in url

        url = self.firefox_desktop.get_download_url('release',
                                                    '45.0',
                                                    'linux',
                                                    'fr',
                                                    force_direct=True,
                                                    funnelcake_id='64')
        assert '-f64' not in url

    def test_stub_installer_win_only(self):
        """
        Ensure that builds not in the setting don't get stub.
        """
        url = self.firefox_desktop.get_download_url('release', '19.0', 'osx',
                                                    'en-US')
        assert 'product=firefox-stub&' not in url

        url = self.firefox_desktop.get_download_url('beta', '20.0b4', 'win',
                                                    'fr')
        assert 'product=firefox-beta-stub&' in url

        url = self.firefox_desktop.get_download_url('beta', '20.0b4', 'win64',
                                                    'fr')
        assert 'product=firefox-beta-stub&' in url

        url = self.firefox_desktop.get_download_url('beta', '20.0b4', 'linux',
                                                    'fr')
        assert 'product=firefox-beta-stub&' not in url