Ejemplo n.º 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()
Ejemplo n.º 2
0
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
    }
Ejemplo n.º 3
0
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 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')) == 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'
                )) == 7

        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

    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
Ejemplo n.º 4
0
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/')
Ejemplo n.º 5
0
 def setUp(self):
     self.firefox_android = FirefoxAndroid(json_dir=PROD_DETAILS_DIR)
Ejemplo n.º 6
0
class TestFirefoxAndroid(TestCase):
    google_play_url_base = "https://play.google.com/store/apps/details?id=org.mozilla."

    def setUp(self):
        self.firefox_android = FirefoxAndroid(json_dir=PROD_DETAILS_DIR)

    def test_latest_release_version(self):
        """latest_version should return the latest release version."""
        for version in ["22.0.1", "100.0.1", "122.0.1"]:
            with self.subTest(version=version):
                with patch.object(
                    self.firefox_android._storage,
                    "data",
                    Mock(return_value=dict(version=version)),
                ):
                    assert self.firefox_android.latest_version("release") == version

    def test_latest_beta_version(self):
        """latest_version should return the latest beta version."""
        for version in ["23.0.1", "101.0.1", "123.0.1"]:
            with self.subTest(version=version):
                with patch.object(
                    self.firefox_android._storage,
                    "data",
                    Mock(return_value=dict(beta_version=version)),
                ):
                    assert self.firefox_android.latest_version("beta") == version

    def test_get_download_url_nightly(self):
        """
        get_download_url should return the same Google Play link of the
        'org.mozilla.fennec_aurora' product regardless of the architecture type,
        if the force_direct option is unspecified.
        """
        assert self.firefox_android.get_download_url("nightly", "arm").startswith(self.google_play_url_base + "fenix")
        assert self.firefox_android.get_download_url("nightly", "x86").startswith(self.google_play_url_base + "fenix")

    def test_get_download_url_nightly_direct(self):
        """
        get_download_url should return a bouncer link depending on the
        architecture type, if the force_direct option is True.
        """
        url = self.firefox_android.get_download_url("nightly", "arm", "multi", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "fennec-nightly-latest"),
                ("os", "android"),
                ("lang", "multi"),
            ],
        )
        url = self.firefox_android.get_download_url("nightly", "x86", "multi", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "fennec-nightly-latest"),
                ("os", "android-x86"),
                ("lang", "multi"),
            ],
        )

    def test_get_download_url_beta(self):
        """
        get_download_url should return the same Google Play link of the
        'org.mozilla.firefox_beta' product regardless of the architecture type,
        if the force_direct option is unspecified.
        """
        assert self.firefox_android.get_download_url("beta", "arm").startswith(self.google_play_url_base + "firefox_beta")
        assert self.firefox_android.get_download_url("beta", "x86").startswith(self.google_play_url_base + "firefox_beta")

    def test_get_download_url_beta_direct(self):
        """
        get_download_url should return a bouncer link depending on the
        architecture type, if the force_direct option is True.
        """
        url = self.firefox_android.get_download_url("beta", "arm", "multi", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "fennec-beta-latest"), ("os", "android"), ("lang", "multi")],
        )
        url = self.firefox_android.get_download_url("beta", "x86", "multi", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ("product", "fennec-beta-latest"),
                ("os", "android-x86"),
                ("lang", "multi"),
            ],
        )

    def test_get_download_url_release(self):
        """
        get_download_url should return the same Google Play link of the
        'org.mozilla.firefox' product regardless of the architecture type,
        if the force_direct option is unspecified.
        """
        assert self.firefox_android.get_download_url("release", "arm").startswith(self.google_play_url_base + "firefox")
        assert self.firefox_android.get_download_url("release", "x86").startswith(self.google_play_url_base + "firefox")

    def test_get_download_url_release_direct(self):
        """
        get_download_url should return a bouncer link depending on the
        architecture type, if the force_direct option is True.
        """
        url = self.firefox_android.get_download_url("release", "arm", "multi", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "fennec-latest"), ("os", "android"), ("lang", "multi")],
        )
        url = self.firefox_android.get_download_url("release", "x86", "multi", True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [("product", "fennec-latest"), ("os", "android-x86"), ("lang", "multi")],
        )
Ejemplo n.º 7
0
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()
Ejemplo n.º 8
0
class TestFirefoxAndroid(TestCase):
    google_play_url_base = ('https://play.google.com/store/apps/details'
                            '?id=org.mozilla.')

    def setUp(self):
        self.firefox_android = FirefoxAndroid(json_dir=PROD_DETAILS_DIR)

    def test_latest_release_version(self):
        """latest_version should return the latest release version."""
        with patch.object(
                self.firefox_android._storage,
                'data',
                Mock(return_value=dict(version='22.0.1')),
        ):
            assert self.firefox_android.latest_version('release') == '22.0.1'

    def test_latest_beta_version(self):
        """latest_version should return the latest beta version."""
        with patch.object(
                self.firefox_android._storage,
                'data',
                Mock(return_value=dict(beta_version='23.0')),
        ):
            assert self.firefox_android.latest_version('beta') == '23.0'

    def test_get_download_url_nightly(self):
        """
        get_download_url should return the same Google Play link of the
        'org.mozilla.fennec_aurora' product regardless of the architecture type,
        if the force_direct option is unspecified.
        """
        assert self.firefox_android.get_download_url(
            'nightly', 'arm').startswith(self.google_play_url_base + 'fenix')
        assert self.firefox_android.get_download_url(
            'nightly', 'x86').startswith(self.google_play_url_base + 'fenix')

    def test_get_download_url_nightly_direct(self):
        """
        get_download_url should return a bouncer link depending on the
        architecture type, if the force_direct option is True.
        """
        url = self.firefox_android.get_download_url('nightly', 'arm', 'multi',
                                                    True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'fennec-nightly-latest'),
                ('os', 'android'),
                ('lang', 'multi'),
            ],
        )
        url = self.firefox_android.get_download_url('nightly', 'x86', 'multi',
                                                    True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'fennec-nightly-latest'),
                ('os', 'android-x86'),
                ('lang', 'multi'),
            ],
        )

    def test_get_download_url_beta(self):
        """
        get_download_url should return the same Google Play link of the
        'org.mozilla.firefox_beta' product regardless of the architecture type,
        if the force_direct option is unspecified.
        """
        assert self.firefox_android.get_download_url(
            'beta',
            'arm').startswith(self.google_play_url_base + 'firefox_beta')
        assert self.firefox_android.get_download_url(
            'beta',
            'x86').startswith(self.google_play_url_base + 'firefox_beta')

    def test_get_download_url_beta_direct(self):
        """
        get_download_url should return a bouncer link depending on the
        architecture type, if the force_direct option is True.
        """
        url = self.firefox_android.get_download_url('beta', 'arm', 'multi',
                                                    True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'fennec-beta-latest'), ('os', 'android'),
             ('lang', 'multi')],
        )
        url = self.firefox_android.get_download_url('beta', 'x86', 'multi',
                                                    True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [
                ('product', 'fennec-beta-latest'),
                ('os', 'android-x86'),
                ('lang', 'multi'),
            ],
        )

    def test_get_download_url_release(self):
        """
        get_download_url should return the same Google Play link of the
        'org.mozilla.firefox' product regardless of the architecture type,
        if the force_direct option is unspecified.
        """
        assert self.firefox_android.get_download_url(
            'release', 'arm').startswith(self.google_play_url_base + 'firefox')
        assert self.firefox_android.get_download_url(
            'release', 'x86').startswith(self.google_play_url_base + 'firefox')

    def test_get_download_url_release_direct(self):
        """
        get_download_url should return a bouncer link depending on the
        architecture type, if the force_direct option is True.
        """
        url = self.firefox_android.get_download_url('release', 'arm', 'multi',
                                                    True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'fennec-latest'), ('os', 'android'),
             ('lang', 'multi')],
        )
        url = self.firefox_android.get_download_url('release', 'x86', 'multi',
                                                    True)
        self.assertListEqual(
            parse_qsl(urlparse(url).query),
            [('product', 'fennec-latest'), ('os', 'android-x86'),
             ('lang', 'multi')],
        )