Ejemplo n.º 1
0
 def setUp(self):
     super(TestAppVersionUpgradeMiddleware, self).setUp()
     self.middleware = AppVersionUpgrade()
     self.set_app_version_config()
Ejemplo n.º 2
0
 def setUp(self):
     super(TestAppVersionUpgradeMiddleware, self).setUp()
     self.middleware = AppVersionUpgrade()
     self.set_app_version_config()
Ejemplo n.º 3
0
class TestAppVersionUpgradeMiddleware(CacheIsolationTestCase):
    """
    Tests for version based app upgrade middleware
    """

    ENABLED_CACHES = ['default']

    def setUp(self):
        super(TestAppVersionUpgradeMiddleware, self).setUp()
        self.middleware = AppVersionUpgrade()
        self.set_app_version_config()

    def set_app_version_config(self):
        """ Creates configuration data for platform versions """
        AppVersionConfig(platform="iOS",
                         version="1.1.1",
                         expire_at=None,
                         enabled=True).save()
        AppVersionConfig(platform="iOS",
                         version="2.2.2",
                         expire_at=datetime(2014, 1, 1, tzinfo=UTC),
                         enabled=True).save()
        AppVersionConfig(platform="iOS",
                         version="4.4.4",
                         expire_at=datetime(9000, 1, 1, tzinfo=UTC),
                         enabled=True).save()
        AppVersionConfig(platform="iOS",
                         version="6.6.6",
                         expire_at=None,
                         enabled=True).save()

        AppVersionConfig(platform="Android",
                         version="1.1.1",
                         expire_at=None,
                         enabled=True).save()
        AppVersionConfig(platform="Android",
                         version="2.2.2",
                         expire_at=datetime(2014, 1, 1, tzinfo=UTC),
                         enabled=True).save()
        AppVersionConfig(platform="Android",
                         version="4.4.4",
                         expire_at=datetime(5000, 1, 1, tzinfo=UTC),
                         enabled=True).save()
        AppVersionConfig(platform="Android",
                         version="8.8.8",
                         expire_at=None,
                         enabled=True).save()

    def process_middleware(self,
                           user_agent,
                           cache_get_many_calls_for_request=1):
        """ Helper function that makes calls to middle process_request and process_response """
        fake_request = HttpRequest()
        fake_request.META['HTTP_USER_AGENT'] = user_agent
        with mock.patch.object(
                caches['default'], 'get_many',
                wraps=caches['default'].get_many) as mocked_code:
            request_response = self.middleware.process_request(fake_request)
            self.assertEqual(cache_get_many_calls_for_request,
                             mocked_code.call_count)
        with mock.patch.object(
                caches['default'], 'get_many',
                wraps=caches['default'].get_many) as mocked_code:
            processed_response = self.middleware.process_response(
                fake_request, request_response or HttpResponse())
            self.assertEqual(0, mocked_code.call_count)
        return request_response, processed_response

    @ddt.data(
        ("Mozilla/5.0 (Linux; Android 5.1; Nexus 5 Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) "
         "Version/4.0 Chrome/47.0.2526.100 Mobile Safari/537.36 edX/org.edx.mobile/2.0.0"
         ),
        ("Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) "
         "Mobile/13C75 edX/org.edx.mobile/2.2.1"),
        ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 "
         "Safari/537.36"),
    )
    def test_non_mobile_app_requests(self, user_agent):
        with self.assertNumQueries(0):
            request_response, processed_response = self.process_middleware(
                user_agent, 0)
        self.assertIsNone(request_response)
        self.assertEquals(200, processed_response.status_code)
        self.assertNotIn(AppVersionUpgrade.LATEST_VERSION_HEADER,
                         processed_response)
        self.assertNotIn(AppVersionUpgrade.LAST_SUPPORTED_DATE_HEADER,
                         processed_response)

    @ddt.data(
        "edX/org.edx.mobile (6.6.6; OS Version 9.2 (Build 13C75))",
        "edX/org.edx.mobile (7.7.7; OS Version 9.2 (Build 13C75))",
        "Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/8.8.8",
        "Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/9.9.9",
    )
    def test_no_update(self, user_agent):
        with self.assertNumQueries(2):
            request_response, processed_response = self.process_middleware(
                user_agent)
        self.assertIsNone(request_response)
        self.assertEquals(200, processed_response.status_code)
        self.assertNotIn(AppVersionUpgrade.LATEST_VERSION_HEADER,
                         processed_response)
        self.assertNotIn(AppVersionUpgrade.LAST_SUPPORTED_DATE_HEADER,
                         processed_response)
        with self.assertNumQueries(0):
            self.process_middleware(user_agent)

    @ddt.data(
        ("edX/org.edx.mobile (5.1.1; OS Version 9.2 (Build 13C75))", "6.6.6"),
        ("edX/org.edx.mobile (5.1.1.RC; OS Version 9.2 (Build 13C75))",
         "6.6.6"),
        ("Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/5.1.1",
         "8.8.8"),
        ("Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/5.1.1.RC",
         "8.8.8"),
    )
    @ddt.unpack
    def test_new_version_available(self, user_agent, latest_version):
        with self.assertNumQueries(2):
            request_response, processed_response = self.process_middleware(
                user_agent)
        self.assertIsNone(request_response)
        self.assertEquals(200, processed_response.status_code)
        self.assertEqual(
            latest_version,
            processed_response[AppVersionUpgrade.LATEST_VERSION_HEADER])
        self.assertNotIn(AppVersionUpgrade.LAST_SUPPORTED_DATE_HEADER,
                         processed_response)
        with self.assertNumQueries(0):
            self.process_middleware(user_agent)

    @ddt.data(
        ("edX/org.edx.mobile (1.0.1; OS Version 9.2 (Build 13C75))", "6.6.6"),
        ("edX/org.edx.mobile (1.1.1; OS Version 9.2 (Build 13C75))", "6.6.6"),
        ("edX/org.edx.mobile (2.0.5.RC; OS Version 9.2 (Build 13C75))",
         "6.6.6"),
        ("edX/org.edx.mobile (2.2.2; OS Version 9.2 (Build 13C75))", "6.6.6"),
        ("Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/1.0.1",
         "8.8.8"),
        ("Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/1.1.1",
         "8.8.8"),
        ("Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/2.0.5.RC",
         "8.8.8"),
        ("Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/2.2.2",
         "8.8.8"),
    )
    @ddt.unpack
    def test_version_update_required(self, user_agent, latest_version):
        with self.assertNumQueries(2):
            request_response, processed_response = self.process_middleware(
                user_agent)
        self.assertIsNotNone(request_response)
        self.assertEquals(426, processed_response.status_code)
        self.assertEqual(
            latest_version,
            processed_response[AppVersionUpgrade.LATEST_VERSION_HEADER])
        with self.assertNumQueries(0):
            self.process_middleware(user_agent)

    @ddt.data(
        ("edX/org.edx.mobile (4.4.4; OS Version 9.2 (Build 13C75))", "6.6.6",
         '9000-01-01T00:00:00+00:00'),
        (
            "Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/4.4.4",
            "8.8.8",
            '5000-01-01T00:00:00+00:00',
        ),
    )
    @ddt.unpack
    def test_version_update_available_with_deadline(self, user_agent,
                                                    latest_version,
                                                    upgrade_date):
        with self.assertNumQueries(2):
            request_response, processed_response = self.process_middleware(
                user_agent)
        self.assertIsNone(request_response)
        self.assertEquals(200, processed_response.status_code)
        self.assertEqual(
            latest_version,
            processed_response[AppVersionUpgrade.LATEST_VERSION_HEADER])
        self.assertEqual(
            upgrade_date,
            processed_response[AppVersionUpgrade.LAST_SUPPORTED_DATE_HEADER])
        with self.assertNumQueries(0):
            self.process_middleware(user_agent)
Ejemplo n.º 4
0
class TestAppVersionUpgradeMiddleware(CacheIsolationTestCase):
    """
    Tests for version based app upgrade middleware
    """

    ENABLED_CACHES = ['default']

    def setUp(self):
        super(TestAppVersionUpgradeMiddleware, self).setUp()
        self.middleware = AppVersionUpgrade()
        self.set_app_version_config()

    def set_app_version_config(self):
        """ Creates configuration data for platform versions """
        AppVersionConfig(platform="iOS", version="1.1.1", expire_at=None, enabled=True).save()
        AppVersionConfig(
            platform="iOS",
            version="2.2.2",
            expire_at=datetime(2014, 1, 1, tzinfo=UTC),
            enabled=True
        ).save()
        AppVersionConfig(
            platform="iOS",
            version="4.4.4",
            expire_at=datetime(9000, 1, 1, tzinfo=UTC),
            enabled=True
        ).save()
        AppVersionConfig(platform="iOS", version="6.6.6", expire_at=None, enabled=True).save()

        AppVersionConfig(platform="Android", version="1.1.1", expire_at=None, enabled=True).save()
        AppVersionConfig(
            platform="Android",
            version="2.2.2",
            expire_at=datetime(2014, 1, 1, tzinfo=UTC),
            enabled=True
        ).save()
        AppVersionConfig(
            platform="Android",
            version="4.4.4",
            expire_at=datetime(5000, 1, 1, tzinfo=UTC),
            enabled=True
        ).save()
        AppVersionConfig(platform="Android", version="8.8.8", expire_at=None, enabled=True).save()

    def process_middleware(self, user_agent, cache_get_many_calls_for_request=1):
        """ Helper function that makes calls to middle process_request and process_response """
        fake_request = HttpRequest()
        fake_request.META['HTTP_USER_AGENT'] = user_agent
        with mock.patch.object(caches['default'], 'get_many', wraps=caches['default'].get_many) as mocked_code:
            request_response = self.middleware.process_request(fake_request)
            self.assertEqual(cache_get_many_calls_for_request, mocked_code.call_count)
        with mock.patch.object(caches['default'], 'get_many', wraps=caches['default'].get_many) as mocked_code:
            processed_response = self.middleware.process_response(fake_request, request_response or HttpResponse())
            self.assertEqual(0, mocked_code.call_count)
        return request_response, processed_response

    @ddt.data(
        ("Mozilla/5.0 (Linux; Android 5.1; Nexus 5 Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) "
         "Version/4.0 Chrome/47.0.2526.100 Mobile Safari/537.36 edX/org.edx.mobile/2.0.0"),
        ("Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) "
         "Mobile/13C75 edX/org.edx.mobile/2.2.1"),
        ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 "
         "Safari/537.36"),
    )
    def test_non_mobile_app_requests(self, user_agent):
        with self.assertNumQueries(0):
            request_response, processed_response = self.process_middleware(user_agent, 0)
        self.assertIsNone(request_response)
        self.assertEquals(200, processed_response.status_code)
        self.assertNotIn(AppVersionUpgrade.LATEST_VERSION_HEADER, processed_response)
        self.assertNotIn(AppVersionUpgrade.LAST_SUPPORTED_DATE_HEADER, processed_response)

    @ddt.data(
        "edX/org.edx.mobile (6.6.6; OS Version 9.2 (Build 13C75))",
        "edX/org.edx.mobile (7.7.7; OS Version 9.2 (Build 13C75))",
        "Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/8.8.8",
        "Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/9.9.9",
    )
    def test_no_update(self, user_agent):
        with self.assertNumQueries(2):
            request_response, processed_response = self.process_middleware(user_agent)
        self.assertIsNone(request_response)
        self.assertEquals(200, processed_response.status_code)
        self.assertNotIn(AppVersionUpgrade.LATEST_VERSION_HEADER, processed_response)
        self.assertNotIn(AppVersionUpgrade.LAST_SUPPORTED_DATE_HEADER, processed_response)
        with self.assertNumQueries(0):
            self.process_middleware(user_agent)

    @ddt.data(
        ("edX/org.edx.mobile (5.1.1; OS Version 9.2 (Build 13C75))", "6.6.6"),
        ("edX/org.edx.mobile (5.1.1.RC; OS Version 9.2 (Build 13C75))", "6.6.6"),
        ("Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/5.1.1", "8.8.8"),
        ("Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/5.1.1.RC", "8.8.8"),
    )
    @ddt.unpack
    def test_new_version_available(self, user_agent, latest_version):
        with self.assertNumQueries(2):
            request_response, processed_response = self.process_middleware(user_agent)
        self.assertIsNone(request_response)
        self.assertEquals(200, processed_response.status_code)
        self.assertEqual(latest_version, processed_response[AppVersionUpgrade.LATEST_VERSION_HEADER])
        self.assertNotIn(AppVersionUpgrade.LAST_SUPPORTED_DATE_HEADER, processed_response)
        with self.assertNumQueries(0):
            self.process_middleware(user_agent)

    @ddt.data(
        ("edX/org.edx.mobile (1.0.1; OS Version 9.2 (Build 13C75))", "6.6.6"),
        ("edX/org.edx.mobile (1.1.1; OS Version 9.2 (Build 13C75))", "6.6.6"),
        ("edX/org.edx.mobile (2.0.5.RC; OS Version 9.2 (Build 13C75))", "6.6.6"),
        ("edX/org.edx.mobile (2.2.2; OS Version 9.2 (Build 13C75))", "6.6.6"),
        ("Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/1.0.1", "8.8.8"),
        ("Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/1.1.1", "8.8.8"),
        ("Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/2.0.5.RC", "8.8.8"),
        ("Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/2.2.2", "8.8.8"),
    )
    @ddt.unpack
    def test_version_update_required(self, user_agent, latest_version):
        with self.assertNumQueries(2):
            request_response, processed_response = self.process_middleware(user_agent)
        self.assertIsNotNone(request_response)
        self.assertEquals(426, processed_response.status_code)
        self.assertEqual(latest_version, processed_response[AppVersionUpgrade.LATEST_VERSION_HEADER])
        with self.assertNumQueries(0):
            self.process_middleware(user_agent)

    @ddt.data(
        ("edX/org.edx.mobile (4.4.4; OS Version 9.2 (Build 13C75))", "6.6.6", '9000-01-01T00:00:00+00:00'),
        (
            "Dalvik/2.1.0 (Linux; U; Android 5.1; Nexus 5 Build/LMY47I) edX/org.edx.mobile/4.4.4",
            "8.8.8",
            '5000-01-01T00:00:00+00:00',
        ),
    )
    @ddt.unpack
    def test_version_update_available_with_deadline(self, user_agent, latest_version, upgrade_date):
        with self.assertNumQueries(2):
            request_response, processed_response = self.process_middleware(user_agent)
        self.assertIsNone(request_response)
        self.assertEquals(200, processed_response.status_code)
        self.assertEqual(latest_version, processed_response[AppVersionUpgrade.LATEST_VERSION_HEADER])
        self.assertEqual(upgrade_date, processed_response[AppVersionUpgrade.LAST_SUPPORTED_DATE_HEADER])
        with self.assertNumQueries(0):
            self.process_middleware(user_agent)