def test_upload_asset_url_type(self, name, meta, exp_meta, form):
        content = deepcopy(self.LINK_CONTENT)

        if meta is not None:
            content['metadata'] = meta

        self._mock_resource_type(form)

        am = asset_manager.AssetManager()
        am.rollback_logger = {'files': [], 'models': []}

        am.upload_asset(self._user, content)

        self.assertEquals({
            'files': [],
            'models': [self.res_mock]
        }, am.rollback_logger)

        # Check calls
        asset_manager.ResourcePlugin.objects.filter.assert_called_once_with(
            name='service')

        # Check resource creation
        asset_manager.Resource.objects.create.assert_called_once_with(
            provider=self._user.userprofile.current_organization,
            version='',
            download_link=self.LINK,
            resource_path='',
            content_type='application/json',
            resource_type='service',
            state='',
            is_public=False,
            meta_info=exp_meta)
    def test_upload_asset(self, name, data, side_effect=None, override=False, err_type=None, err_msg=None, file_name='example.wgt'):

        if side_effect is not None:
            side_effect(self)

        am = asset_manager.AssetManager()
        am.rollback_logger = {
            'files': [],
            'models': []
        }

        error = None
        try:
            resource = am.upload_asset(self._user, data, file_=self._file)
        except Exception as e:
            error = e

        if err_type is None:
            # Check not error
            self.assertTrue(error is None)

            # Check calls
            self.assertEquals(self.res_mock, resource)
            self.assertEquals("http://locationurl.com/", resource.get_url())
            self.assertEqual("http://uri.com/", resource.get_uri())
            self._check_file_calls(file_name)

            # Check rollback logger
            self.assertEquals({
                'files': ["/home/test/media/assets/test_user/{}".format(file_name)],
                'models': [self.res_mock]
            }, am.rollback_logger)

            # Check file calls
            if self._file is not None:
                self._file.seek.assert_called_once_with(0)
                asset_manager.os.mkdir.assert_called_once_with("/home/test/media/assets/test_user")

            # Check override calls
            if override:
                asset_manager.Resource.objects.get.assert_called_once_with(resource_path='media/assets/test_user/{}'.format(file_name))
                self.res_mock.delete.assert_called_once_with()

            # Check resource creation
            asset_manager.Resource.objects.create.assert_called_once_with(
                provider=self._user.userprofile.current_organization,
                version='',
                download_link='http://testdomain.com/charging/media/assets/test_user/{}'.format(urllib.quote(file_name)),
                resource_path='media/assets/test_user/{}'.format(file_name),
                content_type='application/x-widget',
                resource_type='',
                state='',
                is_public=False,
                meta_info={}
            )
        else:
            self.assertTrue(isinstance(error, err_type))
            self.assertEquals(err_msg, unicode(error))
    def test_resource_retrieving(self, expected_result, pagination=None, err_type=None, err_msg=None):

        # Call the method
        error = None
        result = None
        try:
            am = asset_manager.AssetManager()
            result = am.get_provider_assets_info(self.user, pagination)
        except Exception as e:
            error = e

        self.validate_response(result, expected_result, error, err_type, err_msg)
    def test_assets_from_product(self, name, expected_result, side_effect=None, err_type=None, err_msg=None):
        if side_effect is not None:
            side_effect(self)

        error = None
        result = None
        try:
            am = asset_manager.AssetManager()
            result = am.get_product_assets('123')
        except Exception as e:
            error = e

        asset_manager.Resource.objects.filter.assert_called_once_with(product_id='123')
        self.validate_response(result, expected_result, error, err_type, err_msg)
    def test_single_asset_retrieving(self, name, expected_result, side_effect=None, err_type=None, err_msg=None):

        if side_effect is not None:
            side_effect(self)

        error = None
        result = None
        try:
            am = asset_manager.AssetManager()
            result = am.get_asset_info('111')
        except Exception as e:
            error = e

        self.validate_response(result, expected_result, error, err_type, err_msg)
    def test_upgrade_asset_error(self, name, asset_mock, err_type, err_msg):

        self._mock_timer()
        asset_resp = asset_mock(self)
        asset_manager.Resource.objects.filter.return_value = asset_resp

        error = None
        try:
            am = asset_manager.AssetManager()
            am.upgrade_asset('1', self._user, UPLOAD_CONTENT, file_=None)
        except Exception as e:
            error = e

        self.assertTrue(isinstance(error, err_type))
        self.assertEquals(err_msg, str(error))
    def test_upload_asset_url_type_error(self, name, content, side_effect, meta, form, err_type, err_msg):

        if meta is not None:
            content['metadata'] = meta

        self._mock_resource_type(form)

        if side_effect is not None:
            side_effect(self)

        am = asset_manager.AssetManager()

        error = None
        try:
            am.upload_asset(self._user, content)
        except Exception as e:
            error = e

        self.assertTrue(isinstance(error, err_type))
        self.assertEquals(err_msg, unicode(error))
    def _test_timer(self, state, check_calls):
        asset_pk = '1234'

        lock = MagicMock()
        asset_manager.DocumentLock = MagicMock(return_value=lock)

        asset = MagicMock(pk=asset_pk, state=state)
        asset_manager.Resource.objects.get.return_value = asset
        asset_manager.downgrade_asset = MagicMock()

        am = asset_manager.AssetManager()
        am._to_downgrade = MagicMock(pk=asset_pk)

        am._upgrade_timer()

        asset_manager.DocumentLock.assert_called_once_with('wstore_resource', asset_pk, 'asset')
        lock.wait_document.assert_called_once_with()
        lock.unlock_document.assert_called_once_with()

        asset_manager.Resource.objects.get.assert_called_once_with(pk=asset_pk)

        check_calls(asset)
    def test_upload_asset_pending(self):
        content = deepcopy(self.LINK_CONTENT)
        content['metadata'] = self.BASIC_META

        self._mock_resource_type(self.BASIC_FORM)

        am = asset_manager.AssetManager()
        am.rollback_logger = {
            'files': [],
            'models': []
        }

        assets = [MagicMock(product_id=None), MagicMock(product_id=None)]
        asset_manager.Resource.objects.filter.return_value = assets
        am.upload_asset(self._user, content)

        # Check calls
        asset_manager.Resource.objects.filter.assert_called_once_with(
            download_link=self.LINK, provider=self._user.userprofile.current_organization)

        assets[0].delete.assert_called_once_with()
        assets[1].delete.assert_called_once_with()
    def test_upgrade_asset(self):

        asset_id = '1'
        prev_path = 'media/assets/test_user/example1.wgt'
        prev_link = 'http://testdomain.com/charging/media/assets/test_user/example1.wgt'
        prev_type = 'application/x-widget-old'
        prev_version = '1.0'

        asset = MagicMock(product_id='2',
                          is_public=False,
                          resource_path=prev_path,
                          download_link=prev_link,
                          content_type=prev_type,
                          version=prev_version,
                          state='attached',
                          old_versions=[])

        asset_manager.Resource.objects.filter.return_value = [asset]

        timer = self._mock_timer()

        am = asset_manager.AssetManager()
        am.rollback_logger = {'files': [], 'models': []}

        resource = am.upgrade_asset(asset_id,
                                    self._user,
                                    UPLOAD_CONTENT,
                                    file_=None)

        # Check calls
        asset_manager.Resource.objects.filter.assert_called_once_with(
            pk=asset_id)
        self.assertEquals(asset, resource)
        self._check_file_calls()

        # Check rollback logger
        self.assertEquals(
            {
                'files': ["/home/test/media/assets/test_user/example.wgt"],
                'models': []
            }, am.rollback_logger)

        self.assertEquals(asset, am._to_downgrade)

        # Check resource creation
        self.assertEquals('media/assets/test_user/example.wgt',
                          asset.resource_path)
        self.assertEquals(
            'http://testdomain.com/charging/media/assets/test_user/example.wgt',
            asset.download_link)
        self.assertEquals('application/x-widget', asset.content_type)
        self.assertEquals('upgrading', asset.state)
        self.assertEquals('', asset.version)

        self.assertEquals(1, len(asset.old_versions))

        old_version = asset.old_versions[0]

        self.assertEquals(prev_path, old_version['resource_path'])
        self.assertEquals(prev_link, old_version['download_link'])
        self.assertEquals(prev_type, old_version['content_type'])
        self.assertEquals(prev_version, old_version['version'])

        asset_manager.threading.Timer.assert_called_once_with(
            15, am._upgrade_timer)
        timer.start.assert_called_once_with()