Esempio n. 1
0
 def setUp(self):
     self.api = MediaMosaAPI('http://video.example.com')
     self.tt = TraceTracker()
     mock('self.api.session', tracker=self.tt)
     self.response = Mock('requests.Response')
     self.response.status_code = 200
     self.api.session.get.mock_returns = self.response
    def setUp(self):
        self.api = MediaMosaAPI('http://video.example.com')
        self.tt = TraceTracker()
        mock('self.api.session', tracker=self.tt)
        self.response = Mock('requests.Response')
        self.response.status_code = 200
        self.api.session.get.mock_returns = self.response

        self.partial_dict = {
            u'is_original_file': u'FALSE',
            u'is_streamable': u'FALSE',
            u'is_downloadable': u'FALSE',
            u'app_id': u'2',
            u'transcode_inherits_acl': u'TRUE',
            u'tag': '',
            u'response_metafile_available': u'TRUE',
            u'mediafile_id_source': u'u2ilZNiHdl7iNUdexL7BcFMY',
            u'asset_id': u'g1QkoSmSeHdWfGkMKlOlldLn',
            u'mediafile_id': u'Md2RgaUEVFhfJMeUIbwPOMei',
            u'transcode_profile_id': u'17',
            u'filename': u'Sintel_Trailer1.1080p.DivX_Plus_HD.mp4',
            u'is_protected': u'FALSE',
            u'ega_stream_url': '',
            u'file_extension': u'mp4',
            'metadata': {
                u'is_inserted_md': u'FALSE',
                u'fps': u'24',
                u'bpp': u'0.31',
                u'file_duration': u'00:00:52.20',
                u'colorspace': u'yuv420p',
                u'container_type': u'mov;mp4;m4a;3gp;3g2;mj2',
                u'height': u'478',
                u'channels': u'stereo',
                u'width': u'852',
                u'sample_rate': u'44100',
                u'filesize': u'20543936',
                u'audio_codec': u'aac',
                u'video_codec': u'h264',
                u'is_hinted': u'TRUE',
                u'bitrate': u'3012',
                u'mime_type': u'video/mp4'
            },
            u'ega_download_url': '',
            u'ega_play_url': '',
            u'tool': u'ffmpeg',
            u'response_plain_available': u'TRUE',
            u'owner_id': u'krkeppen',
            u'response_object_available': u'TRUE',
            u'created': u'2012-07-05 11:38:14',
            u'changed': u'2012-07-05 11:38:14',
            u'uri': '',
            u'is_still': u'FALSE',
            u'command':
            u'audiocodec:libfaac;audiobitrate:128000;audiosamplingrate:44100;audiochannels:2;videocodec:libx264;videopreset_quality:slow;videopreset_profile:baseline;2_pass_h264_encoding:2;videobitrate:800000;qmax:17;size:852x480;maintain_aspect_ratio:yes',
            u'group_id': ''
        }
    def setUp(self):
        self.api = MediaMosaAPI('http://video.example.com')
        self.tt = TraceTracker()
        mock('self.api.session', tracker=self.tt)
        self.response = Mock('requests.Response')
        self.response.status_code = 200
        self.api.session.get.mock_returns = self.response

        self.item_dict = {u'is_original_file': u'FALSE',
            u'is_streamable': u'FALSE', u'is_downloadable': u'FALSE',
            u'app_id': u'2', u'transcode_inherits_acl': u'TRUE',
            u'tag': '', u'response_metafile_available': u'TRUE',
            u'mediafile_id_source': u'u2ilZNiHdl7iNUdexL7BcFMY',
            u'asset_id': u'g1QkoSmSeHdWfGkMKlOlldLn',
            u'mediafile_id': u'Md2RgaUEVFhfJMeUIbwPOMei',
            u'transcode_profile_id': u'17',
            u'filename': u'Sintel_Trailer1.1080p.DivX_Plus_HD.mp4',
            u'is_protected': u'FALSE', u'ega_stream_url': '',
            u'file_extension': u'mp4', 'metadata': {
            u'is_inserted_md': u'FALSE', u'fps': u'24', u'bpp': u'0.31',
            u'file_duration': u'00:00:52.20', u'colorspace': u'yuv420p',
            u'container_type': u'mov;mp4;m4a;3gp;3g2;mj2', u'height': u'478',
            u'channels': u'stereo', u'width': u'852', u'sample_rate': u'44100',
            u'filesize': u'20543936', u'audio_codec': u'aac',
            u'video_codec': u'h264', u'is_hinted': u'TRUE',
            u'bitrate': u'3012', u'mime_type': u'video/mp4'},
            u'ega_download_url': '', u'ega_play_url': '', u'tool': u'ffmpeg',
            u'response_plain_available': u'TRUE', u'owner_id': u'krkeppen',
            u'response_object_available': u'TRUE',
            u'created': u'2012-07-05 11:38:14',
            u'changed': u'2012-07-05 11:38:14', u'uri': '',
            u'is_still': u'FALSE', u'command':
            u'audiocodec:libfaac;audiobitrate:128000;audiosamplingrate:44100;audiochannels:2;videocodec:libx264;videopreset_quality:slow;videopreset_profile:baseline;2_pass_h264_encoding:2;videobitrate:800000;qmax:17;size:852x480;maintain_aspect_ratio:yes',
            u'group_id': ''}
 def setUp(self):
     self.api = MediaMosaAPI('http://video.example.com')
     self.tt = TraceTracker()
     mock('self.api.session', tracker=self.tt)
     self.response = Mock('requests.Response')
     self.response.status_code = 200
     self.api.session.get.mock_returns = self.response
    def setUp(self):
        self.url = 'http://video.example.com'
        self.username = '******'
        self.app_id = 5
        self.secret = 'test_secret'

        # mock requests library
        self.tt = TraceTracker()
        self.api = MediaMosaAPI(self.url)
        mock('self.api.session', tracker=self.tt)

        self.response = Mock('requests.Response')
        self.response.status_code = 200
        self.api.session.get.mock_returns = self.response
        self.api.session.post.mock_returns = self.response
class TestAssetResource(unittest.TestCase):
    def setUp(self):
        self.api = MediaMosaAPI('http://video.example.com')
        self.tt = TraceTracker()
        mock('self.api.session', tracker=self.tt)
        self.response = Mock('requests.Response')
        self.response.status_code = 200
        self.api.session.get.mock_returns = self.response

        self.partial_dict = {
            u'is_original_file': u'FALSE',
            u'is_streamable': u'FALSE',
            u'is_downloadable': u'FALSE',
            u'app_id': u'2',
            u'transcode_inherits_acl': u'TRUE',
            u'tag': '',
            u'response_metafile_available': u'TRUE',
            u'mediafile_id_source': u'u2ilZNiHdl7iNUdexL7BcFMY',
            u'asset_id': u'g1QkoSmSeHdWfGkMKlOlldLn',
            u'mediafile_id': u'Md2RgaUEVFhfJMeUIbwPOMei',
            u'transcode_profile_id': u'17',
            u'filename': u'Sintel_Trailer1.1080p.DivX_Plus_HD.mp4',
            u'is_protected': u'FALSE',
            u'ega_stream_url': '',
            u'file_extension': u'mp4',
            'metadata': {
                u'is_inserted_md': u'FALSE',
                u'fps': u'24',
                u'bpp': u'0.31',
                u'file_duration': u'00:00:52.20',
                u'colorspace': u'yuv420p',
                u'container_type': u'mov;mp4;m4a;3gp;3g2;mj2',
                u'height': u'478',
                u'channels': u'stereo',
                u'width': u'852',
                u'sample_rate': u'44100',
                u'filesize': u'20543936',
                u'audio_codec': u'aac',
                u'video_codec': u'h264',
                u'is_hinted': u'TRUE',
                u'bitrate': u'3012',
                u'mime_type': u'video/mp4'
            },
            u'ega_download_url': '',
            u'ega_play_url': '',
            u'tool': u'ffmpeg',
            u'response_plain_available': u'TRUE',
            u'owner_id': u'krkeppen',
            u'response_object_available': u'TRUE',
            u'created': u'2012-07-05 11:38:14',
            u'changed': u'2012-07-05 11:38:14',
            u'uri': '',
            u'is_still': u'FALSE',
            u'command':
            u'audiocodec:libfaac;audiobitrate:128000;audiosamplingrate:44100;audiochannels:2;videocodec:libx264;videopreset_quality:slow;videopreset_profile:baseline;2_pass_h264_encoding:2;videobitrate:800000;qmax:17;size:852x480;maintain_aspect_ratio:yes',
            u'group_id': ''
        }

    def test_getting_full_asset(self):
        """Test fetching a full asset from the api. The asset is fully
        populated and can connect to the api."""
        # setup
        self.response.content = open('tests/data/get_asset_id_response.xml')\
                                    .read()
        # test
        asset = self.api.asset('g1QkoSmSeHdWfGkMKlOlldLn')
        # validate
        self.assertIsInstance(asset, Asset)
        self.assertEqual(asset._mmmeta.state, MediaMosaResource.STATE.FULL)
        self.assertTrue(asset.is_connected())

    def test_getting_mediafiles_from_asset(self):
        """Test getting mediafiles from the asset. Each mediafile is partial
        and can connect to the api."""
        # setup
        self.response.content = open('tests/data/get_asset_id_response.xml')\
                                    .read()
        asset = Asset.fromdict(self.partial_dict, api=self.api, full=False)
        # test
        mediafiles = asset.list_mediafiles()
        self.assertEqual(len(mediafiles), 3)
        for mediafile in mediafiles:
            self.assertIsInstance(mediafile, Mediafile)
            self.assertEqual(mediafile._mmmeta.state,
                             MediaMosaResource.STATE.PARTIAL)
            self.assertTrue(mediafile.is_connected())
Esempio n. 7
0
class TestAssetListResource(unittest.TestCase):
    def setUp(self):
        self.api = MediaMosaAPI('http://video.example.com')
        self.tt = TraceTracker()
        mock('self.api.session', tracker=self.tt)
        self.response = Mock('requests.Response')
        self.response.status_code = 200
        self.api.session.get.mock_returns = self.response

    def _get_asset_list(self, amount, total, offset):
        response = open('tests/data/get_asset_list_response.xml').read()
        asset_item = open('tests/data/asset_item.xml').read()

        asset_items = ''
        for i in xrange(offset, offset + amount):
            asset_items += asset_item.replace('{{item_id}}', str(i))

        return response.replace('{{item_count}}', str(amount))\
                       .replace('{{item_count_total}}', str(total))\
                       .replace('{{item_offset}}', str(offset))\
                       .replace('{{asset_items}}', asset_items)

    def test_getting_paginated_assetlist(self):
        """Test fetching an asset list from the api."""
        # setup
        amount = 10
        total_items = 42
        offset = 0
        self.response.content = self._get_asset_list(amount, total_items,
                                                     offset)
        # test
        asset_list = self.api.asset_list()
        # validate
        self.assertIsInstance(asset_list, AssetList)
        self.assertEqual(len(asset_list), total_items)
        self.assertEqual(asset_list._api, self.api)

    def test_fetch_page(self):
        # setup
        amount = 10
        total_items = 42
        offset = 10  # we have assets 10 to 19
        self.response.content = self._get_asset_list(amount, total_items,
                                                     offset)
        asset_list = self.api.asset_list()

        # test first ten
        self.response.content = self._get_asset_list(10, total_items, 0)
        asset_list._fetch_page(0, 10)
        self.assertEqual(len(asset_list), total_items)
        self.assertEqual(asset_list.page_size(), 10)
        self.assertEqual(asset_list.page_offset(), 0)

        # test last two
        self.response.content = self._get_asset_list(2, total_items, 40)
        asset_list._fetch_page(40, 10)
        self.assertEqual(len(asset_list), total_items)
        self.assertEqual(asset_list.page_size(), 2)
        self.assertEqual(asset_list.page_offset(), 40)

    def test_getting_assets(self):
        """Test whether AssetList will fetch a new page from api if a
        query is done outside the view
        """
        # setup
        amount = 10
        total_items = 42
        offset = 10  # we have assets 10 to 19
        self.response.content = self._get_asset_list(amount, total_items,
                                                     offset)

        asset_list = self.api.asset_list()

        # test INSIDE current page
        asset = asset_list[10]
        self.assertIsInstance(asset, Asset)
        asset = asset_list[19]
        self.assertIsInstance(asset, Asset)

        # test BEFORE current page
        self.response.content = self._get_asset_list(10, total_items, 0)

        asset = asset_list[0]
        self.assertIsInstance(asset, Asset)
        asset = asset_list[9]
        self.assertIsInstance(asset, Asset)

        # test AFTER current page
        self.response.content = self._get_asset_list(10, total_items, 15)

        asset = asset_list[20]
        self.assertIsInstance(asset, Asset)

        # test Out of Bounds
        self.assertRaises(Exception, asset_list.__getitem__, -1)
        self.assertRaises(Exception, asset_list.__getitem__, 42)

    def test_iterating_over_paginated_assetlist(self):
        # setup
        total_items = 42
        self.response.content = self._get_asset_list(total_items, total_items,
                                                     0)
        asset_list = self.api.asset_list()
        # test
        count = 0
        for asset in asset_list:
            count += 1
        # validate
        self.assertEqual(count, total_items)
Esempio n. 8
0
from mediamosa.api import MediaMosaAPI
from django.conf import settings


api = MediaMosaAPI(settings.MEDIAMOSA_URL)

if not (hasattr(settings, 'TESTING') and settings.TESTING):
    api.authenticate(
        settings.MEDIAMOSA_USERNAME,
        settings.MEDIAMOSA_PASSWORD)
Esempio n. 9
0
    def setUp(self):
        self.api = MediaMosaAPI('http://video.example.com')
        self.tt = TraceTracker()
        mock('self.api.session', tracker=self.tt)
        self.response = Mock('requests.Response')
        self.response.status_code = 200
        self.api.session.get.mock_returns = self.response

        self.item_dict = {
            u'provider_id': '',
            u'is_unappropriate': u'FALSE',
            u'videotimestampmodified': u'2012-07-05 11:34:35',
            u'app_id': u'2',
            u'is_favorite': u'FALSE',
            u'has_streamable_mediafiles': u'TRUE',
            u'viewed': u'4',
            u'asset_id': u'g1QkoSmSeHdWfGkMKlOlldLn',
            u'ega_still_url': '',
            u'granted': u'TRUE',
            u'played': u'1',
            u'mediafile_duration': u'00:00:52.20',
            # u'videotimestamp': u'2012-07-05 11:34:01', # cleared it for partial
            u'vpx_still_url':
            u'http://filvideod.ugent.be/media/17/Z/Z14cWALWKmfTRjTUKhhQQLv2.jpeg',
            u'owner_id': u'krkeppen',
            u'is_empty_asset': u'FALSE',
            u'play_restriction_end': '',
            u'asset_property_is_hidden': u'FALSE',
            u'dublin_core': {
                u'publisher': u'Kristof Keppens',
                u'rights': u'Kristof Keppens',
                u'description': u'test',
                u'language': u'nl',
                u'creator': u'Kristof Keppens',
                u'format': u'streaming video',
                u'coverage_spatial': '',
                u'date': '',
                u'relation': '',
                u'source': u'ugent',
                u'contributor': u', ',
                u'title': u'test sintel 2',
                u'identifier': '',
                u'type': u'video',
                u'coverage_temporal': '',
                u'subject': u'test'
            },
            u'reference_id': '',
            u'isprivate': u'TRUE',
            u'qualified_dublin_core': {
                u'isformatof': '',
                u'description_abstract': '',
                u'license': '',
                u'created': '',
                u'issued': '',
                u'rightsholder': '',
                u'hasformat': '',
                u'title_alternative': '',
                u'format_medium': '',
                u'format_extent': '',
                u'isreferencedby': ''
            },
            u'mediafile_container_type': u'matroska;webm',
            u'is_unappropiate': u'FALSE',
            u'is_external': u'FALSE',
            u'is_protected': u'FALSE',
            u'play_restriction_start': '',
            u'group_id': ''
        }
class TestLoginFunctions(unittest.TestCase):

    def setUp(self):
        self.url = 'http://video.example.com'
        self.username = '******'
        self.app_id = 5
        self.secret = 'test_secret'

        # mock requests library
        self.tt = TraceTracker()
        self.api = MediaMosaAPI(self.url)
        mock('self.api.session', tracker=self.tt)

        self.response = Mock('requests.Response')
        self.response.status_code = 200
        self.api.session.get.mock_returns = self.response
        self.api.session.post.mock_returns = self.response

    def test_get_absolute_rui(self):
        uri = '/a/relative/url'
        self.assertEquals(self.api._get_absolute_uri(uri), self.url + uri)

    def test_internal_get_call(self):
        # setup
        uri = '/login'
        self.response.content = open(
            'tests/data/login_challenge_response.xml').read()
        # test
        self.api._get(uri)
        # validate
        self.assertTrue(
            self.tt.check("Called "
                + "self.api.session.get('http://video.example.com/login', params={})"))

    def test_internal_post_call(self):
        # setup
        uri = '/login'
        self.response.content = open(
            'tests/data/login_challenge_response.xml').read()
        # test
        self.api._post(uri)
        # validate
        self.assertTrue(
            self.tt.check("Called "
                + "self.api.session.post('http://video.example.com/login', data={})"))

    def test_login_get_challenge(self):
        # setup
        self.api.username = self.username
        self.response.content = open(
            'tests/data/login_challenge_response.xml').read()
        # test
        challenge = self.api._login_challenge()
        # validate
        self.assertEquals(challenge, "92dc06bbb703f14354fdfbede9b62ff9")

    def test_login_get_failed_challenge(self):
        # setup
        self.api.username = self.username
        self.response.content = open(
            'tests/data/login_challenge_invalid_account_response.xml').read()
        # validate
        self.assertRaises(ApiException, self.api._login_challenge)

    def test_login_send_challenge_response(self):
        # setup
        self.api.username = self.username
        self.api.secret = self.secret
        self.response.content = open(
            'tests/data/login_challenge_response_response.xml').read()
        # test
        success = self.api._login_response("92dc06bbb703f14354fdfbede9b62ff9")
        # validate
        self.assertEquals(success, True)

    def test_login_send_challenge_failed_response(self):
        # setup
        self.api.username = self.username
        self.api.secret = self.secret
        self.response.content = open(
            'tests/data/login_invalid_challenge_response_response.xml').read()
        # validate
        self.assertRaises(ApiException, self.api._login_response, ("92dc06bbb703f14354fdfbede9b62ff9"))

    def test_successful_authentication(self):
        # setup
        mock('self.api._login_challenge', returns='xxx', tracker=self.tt)
        mock('self.api._login_response', returns=True, tracker=self.tt)
        # test
        success = self.api.authenticate(self.username, self.secret)
        # validate
        self.assertEquals(success, True)

    def test_failed_authentication(self):
        # setup
        mock('self.api._login_challenge', returns='xxx', tracker=self.tt)
        mock('self.api._login_response', returns=False, tracker=self.tt)
        # test
        success = self.api.authenticate(self.username, self.secret)
        # validate
        self.assertEquals(success, False)
class TestAssetListResource(unittest.TestCase):

    def setUp(self):
        self.api = MediaMosaAPI('http://video.example.com')
        self.tt = TraceTracker()
        mock('self.api.session', tracker=self.tt)
        self.response = Mock('requests.Response')
        self.response.status_code = 200
        self.api.session.get.mock_returns = self.response

    def _get_asset_list(self, amount, total, offset):
        response = open('tests/data/get_asset_list_response.xml').read()
        asset_item = open('tests/data/asset_item.xml').read()

        asset_items = ''
        for i in xrange(offset, offset + amount):
            asset_items += asset_item.replace('{{item_id}}', str(i))

        return response.replace('{{item_count}}', str(amount))\
                       .replace('{{item_count_total}}', str(total))\
                       .replace('{{item_offset}}', str(offset))\
                       .replace('{{asset_items}}', asset_items)

    def test_getting_paginated_assetlist(self):
        """Test fetching an asset list from the api."""
        # setup
        amount = 10
        total_items = 42
        offset = 0
        self.response.content = self._get_asset_list(
            amount, total_items, offset)
        # test
        asset_list = self.api.asset_list()
        # validate
        self.assertIsInstance(asset_list, AssetList)
        self.assertEqual(len(asset_list), total_items)
        self.assertEqual(asset_list._api, self.api)

    def test_fetch_page(self):
        # setup
        amount = 10
        total_items = 42
        offset = 10  # we have assets 10 to 19
        self.response.content = self._get_asset_list(
            amount, total_items, offset)
        asset_list = self.api.asset_list()

        # test first ten
        self.response.content = self._get_asset_list(
            10, total_items, 0)
        asset_list._fetch_page(0, 10)
        self.assertEqual(len(asset_list), total_items)
        self.assertEqual(asset_list.page_size(), 10)
        self.assertEqual(asset_list.page_offset(), 0)

        # test last two
        self.response.content = self._get_asset_list(
            2, total_items, 40)
        asset_list._fetch_page(40, 10)
        self.assertEqual(len(asset_list), total_items)
        self.assertEqual(asset_list.page_size(), 2)
        self.assertEqual(asset_list.page_offset(), 40)

    def test_getting_assets(self):
        """Test whether AssetList will fetch a new page from api if a
        query is done outside the view
        """
        # setup
        amount = 10
        total_items = 42
        offset = 10  # we have assets 10 to 19
        self.response.content = self._get_asset_list(
            amount, total_items, offset)

        asset_list = self.api.asset_list()

        # test INSIDE current page
        asset = asset_list[10]
        self.assertIsInstance(asset, Asset)
        asset = asset_list[19]
        self.assertIsInstance(asset, Asset)

        # test BEFORE current page
        self.response.content = self._get_asset_list(
            10, total_items, 0)

        asset = asset_list[0]
        self.assertIsInstance(asset, Asset)
        asset = asset_list[9]
        self.assertIsInstance(asset, Asset)

        # test AFTER current page
        self.response.content = self._get_asset_list(
            10, total_items, 15)

        asset = asset_list[20]
        self.assertIsInstance(asset, Asset)

        # test Out of Bounds
        self.assertRaises(Exception, asset_list.__getitem__, -1)
        self.assertRaises(Exception, asset_list.__getitem__, 42)

    def test_iterating_over_paginated_assetlist(self):
        # setup
        total_items = 42
        self.response.content = self._get_asset_list(
            total_items, total_items, 0)
        asset_list = self.api.asset_list()
        # test
        count = 0
        for asset in asset_list:
            count += 1
        # validate
        self.assertEqual(count, total_items)
class TestAssetResource(unittest.TestCase):

    def setUp(self):
        self.api = MediaMosaAPI('http://video.example.com')
        self.tt = TraceTracker()
        mock('self.api.session', tracker=self.tt)
        self.response = Mock('requests.Response')
        self.response.status_code = 200
        self.api.session.get.mock_returns = self.response

        self.partial_dict = {u'is_original_file': u'FALSE',
            u'is_streamable': u'FALSE', u'is_downloadable': u'FALSE',
            u'app_id': u'2', u'transcode_inherits_acl': u'TRUE',
            u'tag': '', u'response_metafile_available': u'TRUE',
            u'mediafile_id_source': u'u2ilZNiHdl7iNUdexL7BcFMY',
            u'asset_id': u'g1QkoSmSeHdWfGkMKlOlldLn',
            u'mediafile_id': u'Md2RgaUEVFhfJMeUIbwPOMei',
            u'transcode_profile_id': u'17',
            u'filename': u'Sintel_Trailer1.1080p.DivX_Plus_HD.mp4',
            u'is_protected': u'FALSE', u'ega_stream_url': '',
            u'file_extension': u'mp4', 'metadata': {
            u'is_inserted_md': u'FALSE', u'fps': u'24', u'bpp': u'0.31',
            u'file_duration': u'00:00:52.20', u'colorspace': u'yuv420p',
            u'container_type': u'mov;mp4;m4a;3gp;3g2;mj2', u'height': u'478',
            u'channels': u'stereo', u'width': u'852', u'sample_rate': u'44100',
            u'filesize': u'20543936', u'audio_codec': u'aac',
            u'video_codec': u'h264', u'is_hinted': u'TRUE',
            u'bitrate': u'3012', u'mime_type': u'video/mp4'},
            u'ega_download_url': '', u'ega_play_url': '', u'tool': u'ffmpeg',
            u'response_plain_available': u'TRUE', u'owner_id': u'krkeppen',
            u'response_object_available': u'TRUE',
            u'created': u'2012-07-05 11:38:14',
            u'changed': u'2012-07-05 11:38:14', u'uri': '',
            u'is_still': u'FALSE', u'command':
            u'audiocodec:libfaac;audiobitrate:128000;audiosamplingrate:44100;audiochannels:2;videocodec:libx264;videopreset_quality:slow;videopreset_profile:baseline;2_pass_h264_encoding:2;videobitrate:800000;qmax:17;size:852x480;maintain_aspect_ratio:yes',
            u'group_id': ''}

    def test_getting_full_asset(self):
        """Test fetching a full asset from the api. The asset is fully
        populated and can connect to the api."""
        # setup
        self.response.content = open('tests/data/get_asset_id_response.xml')\
                                    .read()
        # test
        asset = self.api.asset('g1QkoSmSeHdWfGkMKlOlldLn')
        # validate
        self.assertIsInstance(asset, Asset)
        self.assertEqual(asset._mmmeta.state, MediaMosaResource.STATE.FULL)
        self.assertTrue(asset.is_connected())

    def test_getting_mediafiles_from_asset(self):
        """Test getting mediafiles from the asset. Each mediafile is partial
        and can connect to the api."""
        # setup
        self.response.content = open('tests/data/get_asset_id_response.xml')\
                                    .read()
        asset = Asset.fromdict(self.partial_dict, api=self.api, full=False)
        # test
        mediafiles = asset.list_mediafiles()
        self.assertEqual(len(mediafiles), 3)
        for mediafile in mediafiles:
            self.assertIsInstance(mediafile, Mediafile)
            self.assertEqual(mediafile._mmmeta.state,
                MediaMosaResource.STATE.PARTIAL)
            self.assertTrue(mediafile.is_connected())