public async Task CtorWhenContainersDoesntExistsAndAccessTypeIsAnyStringCreatesWithAccessTypeBlob(string accessType)
        {
            // ARRANGE
            var client    = CloudStorageAccount.Parse(DefaultConnectionString).CreateCloudBlobClient();
            var container = client.GetContainerReference(DefaultContainerName);

            await container.DeleteIfExistsAsync();

            var configuration = new MediaStorageConfiguration
            {
                ConnectionString = DefaultConnectionString,
                Container        = DefaultContainerName,
                Permission       = accessType,
            };

            // ACT
            _ = new AzureBlob(configuration);

            // ASSERT
            container = client.GetContainerReference(DefaultContainerName);

            Assert.True(await container.ExistsAsync());

            var blobContainerPermissions = await container.GetPermissionsAsync();

            Assert.Equal(BlobContainerPublicAccessType.Blob, blobContainerPermissions.PublicAccess);
        }
        public async Task CtorWhenPermissionIsOutOfRangeNumberThenPermissionIsBlob()
        {
            // ARRANGE
            var client    = CloudStorageAccount.Parse(DefaultConnectionString).CreateCloudBlobClient();
            var container = client.GetContainerReference(DefaultContainerName);

            await container.DeleteIfExistsAsync();

            var configuration = new MediaStorageConfiguration
            {
                ConnectionString = DefaultConnectionString,
                Container        = DefaultContainerName,
                Permission       = "100",
            };

            // ACT
            _ = new AzureBlob(configuration);

            // ASSERT
            container = client.GetContainerReference(DefaultContainerName);

            Assert.True(await container.ExistsAsync());

            var blobContainerPermissions = await container.GetPermissionsAsync();

            Assert.Equal(BlobContainerPublicAccessType.Blob, blobContainerPermissions.PublicAccess);
        }
        public async Task CtorWhenContainersDoesntExistsAndAccessTypeIsUnknownThrows()
        {
            // ARRANGE
            var client    = CloudStorageAccount.Parse(DefaultConnectionString).CreateCloudBlobClient();
            var container = client.GetContainerReference(DefaultContainerName);

            await container.DeleteIfExistsAsync();

            var configuration = new MediaStorageConfiguration
            {
                ConnectionString = DefaultConnectionString,
                Container        = DefaultContainerName,
                Permission       = BlobContainerPublicAccessType.Unknown.ToString(),
            };

            // ACT & ASSERT
            Assert.ThrowsAny <Exception>(() => new AzureBlob(configuration));
        }
        /**
         * This function extracts a list of assets from a magento product and returns them as a list of EA assets
         * If the magento product has a mapping, it will cross reference existing assets to prevent assets from being uploaded
         * multiple times
         * Note that this WILL NOT delete assets that were removed
         *
         * @param   magentoProduct          Magento product to parse
         *
         * @return  List<AssetResource>     Assets
         */
        public List <AssetResource> ParseAssetsFromProduct(ProductResource magentoProduct, MediaStorageConfiguration configuration)
        {
            var assets = new List <AssetResource>();

            //Get existing magento assets
            var magentoAssets = magentoProduct.media_gallery_entries;

            //Path to magento assets
            var magentoPath = new UrlFormatter().MagentoCatalogAssetPath(ConfigReader.MagentoServerPath);

            if (ProductHasMapping(magentoProduct))
            {
                //Get master product Id from the mapping slug
                var catalogItemId =
                    GetAttributeByCode(magentoProduct.custom_attributes, ConfigReader.MappingCode).ToString();

                var slug = _eaCatalogsController.GetCatalogItem(catalogItemId).Slug;

                var eaAssets = _eaProductController.GetProductBySlug(slug).Assets.ToList();

                //Loop through magento product assets. This update can only ADD assets, not remove or change
                foreach (var magentoAsset in magentoAssets)
                {
                    bool  hasChanged   = true;
                    Image magentoImage = null;

                    switch (configuration)
                    {
                    case MediaStorageConfiguration.FileSystem:
                        magentoImage = Image.FromFile(magentoPath + magentoAsset.file);
                        break;

                    case MediaStorageConfiguration.Database:
                        magentoImage = ImageUtility.ImageFromBytes(DatabaseConnection.Instance.GetMediaGalleryEntryFile(magentoAsset));
                        break;
                    }

                    //Is there a matching asset in the EA product? Only compare name
                    foreach (var eaAsset in eaAssets)
                    {
                        if (eaAsset.Name == magentoAsset.file.Substring(magentoAsset.file.LastIndexOf('/') + 1) && ImageUtility.AreEqual(magentoImage, ImageUtility.ImageFromUri(eaAsset.Uri)))
                        {
                            //Add asset, no further processing
                            assets.Add(new AssetResource
                            {
                                Id       = eaAsset.Id,
                                Name     = eaAsset.Name,
                                IsHidden = eaAsset.IsHidden,
                                MimeType = _eaAssetsController.GetAsset(eaAsset.Id.ToString()).MimeType
                            });

                            hasChanged = false;
                        }
                    }

                    //new asset! upload + add it to the product
                    if (hasChanged)
                    {
                        assets.Add(_eaAssetsController.CreateAsset(magentoPath + magentoAsset.file));
                    }
                }
            }
            else if (magentoAssets != null)
            {
                assets.AddRange(magentoAssets.Select(magentoAsset => _eaAssetsController.CreateAsset(magentoPath + magentoAsset.file)));
            }

            return(assets);
        }