/// <summary>
 /// Creates new property.
 /// </summary>
 /// <param name='operations'>
 /// Reference to the
 /// Microsoft.Azure.Management.ApiManagement.IPropertiesOperations.
 /// </param>
 /// <param name='resourceGroupName'>
 /// Required. The name of the resource group.
 /// </param>
 /// <param name='serviceName'>
 /// Required. The name of the Api Management service.
 /// </param>
 /// <param name='propId'>
 /// Required. Identifier of the property.
 /// </param>
 /// <param name='parameters'>
 /// Required. Create parameters.
 /// </param>
 /// <returns>
 /// A standard service response including an HTTP status code and
 /// request ID.
 /// </returns>
 public static AzureOperationResponse Create(this IPropertiesOperations operations, string resourceGroupName, string serviceName, string propId, PropertyCreateParameters parameters)
 {
     return Task.Factory.StartNew((object s) => 
     {
         return ((IPropertiesOperations)s).CreateAsync(resourceGroupName, serviceName, propId, parameters);
     }
     , operations, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default).Unwrap().GetAwaiter().GetResult();
 }
        public void PropertyCreateListUpdateDelete()
        {
            TestUtilities.StartTest("SmapiFunctionalTests", "PropertyCreateListUpdateDelete");

            try
            {
                // create non Secret property
                string propertyId = TestUtilities.GenerateName("propertyId");
                string propertyName = TestUtilities.GenerateName("propertyName");
                string propertyValue = TestUtilities.GenerateName("propertyValue");
                var propertyCreateParameters = new PropertyCreateParameters(propertyName, propertyValue);
                
                var createResponse = ApiManagementClient.Property.Create(
                    ResourceGroupName,
                    ApiManagementServiceName,
                    propertyId,
                    propertyCreateParameters);

                Assert.NotNull(createResponse);
                Assert.Equal(HttpStatusCode.Created, createResponse.StatusCode);

                // get to check it was created
                var getResponse = ApiManagementClient.Property.Get(ResourceGroupName, ApiManagementServiceName, propertyId);

                Assert.NotNull(getResponse);
                Assert.NotNull(getResponse.Value);

                Assert.Equal(propertyName, getResponse.Value.Name);
                Assert.Equal(propertyValue, getResponse.Value.Value);
                Assert.NotNull(getResponse.Value.Tags);
                Assert.Equal(propertyId, getResponse.Value.Id);
                Assert.Equal(false, getResponse.Value.Secret);

                // create a Secret property
                string secretPropertyId = TestUtilities.GenerateName("secretPropertyId");
                string secretPropertyName = TestUtilities.GenerateName("secretPropertyName");
                string secretPropertyValue = TestUtilities.GenerateName("secretPropertyValue");
                var secretPropertyCreateParameters = new PropertyCreateParameters(secretPropertyName, secretPropertyValue);
                secretPropertyCreateParameters.Secret = true;

                var createSecretResponse = ApiManagementClient.Property.Create(
                    ResourceGroupName,
                    ApiManagementServiceName,
                    secretPropertyId,
                    secretPropertyCreateParameters);

                Assert.NotNull(createSecretResponse);
                Assert.Equal(HttpStatusCode.Created, createSecretResponse.StatusCode);

                // get to check it was created
                var getSecretResponse = ApiManagementClient.Property.Get(ResourceGroupName, ApiManagementServiceName, secretPropertyId);

                Assert.NotNull(getSecretResponse);
                Assert.NotNull(getSecretResponse.Value);

                Assert.Equal(secretPropertyName, getSecretResponse.Value.Name);
                Assert.Equal(secretPropertyValue, getSecretResponse.Value.Value);
                Assert.NotNull(getSecretResponse.Value.Tags);
                Assert.Equal(secretPropertyId, getSecretResponse.Value.Id);
                Assert.Equal(true, getSecretResponse.Value.Secret);

                // list the properties
                var listResponse = ApiManagementClient.Property.List(ResourceGroupName, ApiManagementServiceName, null);

                Assert.NotNull(listResponse);
                Assert.NotNull(listResponse.Result);

                // there should be atleast 2 properties.
                Assert.True(listResponse.Result.TotalCount >= 2);
                Assert.True(listResponse.Result.Values.Count >= 2);

                // list paged
                listResponse = ApiManagementClient.Property.List(
                    ResourceGroupName,
                    ApiManagementServiceName,
                    new QueryParameters { Top = 1 });

                Assert.NotNull(listResponse);
                Assert.NotNull(listResponse.Result);
                Assert.True(listResponse.Result.TotalCount >= 2);
                Assert.Equal(1, listResponse.Result.Values.Count);

                // delete a property
                var deleteResponse = ApiManagementClient.Property.Delete(ResourceGroupName, ApiManagementServiceName, propertyId, getResponse.ETag);
                Assert.NotNull(deleteResponse);
                Assert.Equal(HttpStatusCode.NoContent, deleteResponse.StatusCode);

                // get the deleted property to make sure it was deleted
                try
                {
                    ApiManagementClient.Property.Get(ResourceGroupName, ApiManagementServiceName, propertyId);
                    throw new Exception("This code should not have been executed.");
                }
                catch (CloudException ex)
                {
                    Assert.Equal(HttpStatusCode.NotFound, ex.Response.StatusCode);
                }

                // patch the secret Property
                string patchedSecretValue = TestUtilities.GenerateName("patchedSecret");
                var patchResponse = ApiManagementClient.Property.Update(
                    ResourceGroupName,
                    ApiManagementServiceName,
                    secretPropertyId,
                    new PropertyUpdateParameters
                    { 
                        Value = patchedSecretValue,
                        Tags = new List<string> { "secret" }
                    },
                    getSecretResponse.ETag);

                Assert.NotNull(patchResponse);

                // get to check it was patched
                getSecretResponse = ApiManagementClient.Property.Get(ResourceGroupName, ApiManagementServiceName, secretPropertyId);

                Assert.NotNull(getSecretResponse);
                Assert.NotNull(getSecretResponse.Value);

                Assert.Equal(secretPropertyName, getSecretResponse.Value.Name);
                Assert.Equal(patchedSecretValue, getSecretResponse.Value.Value);
                Assert.Equal(true, getSecretResponse.Value.Secret);
                Assert.NotNull(getSecretResponse.Value.Tags);
                Assert.Equal(1, getSecretResponse.Value.Tags.Count);

                // delete the property 
                deleteResponse = ApiManagementClient.Property.Delete(
                    ResourceGroupName,
                    ApiManagementServiceName,
                    secretPropertyId,
                    getSecretResponse.ETag);

                Assert.NotNull(deleteResponse);
                Assert.Equal(HttpStatusCode.NoContent, deleteResponse.StatusCode);

                // get the deleted property to make sure it was deleted
                try
                {
                    ApiManagementClient.Property.Get(ResourceGroupName, ApiManagementServiceName, secretPropertyId);
                    throw new Exception("This code should not have been executed.");
                }
                catch (CloudException ex)
                {
                    Assert.Equal(HttpStatusCode.NotFound, ex.Response.StatusCode);
                }
            }
            finally
            {
                TestUtilities.EndTest();
            }
        }
 /// <summary>
 /// Creates new property.
 /// </summary>
 /// <param name='operations'>
 /// Reference to the
 /// Microsoft.Azure.Management.ApiManagement.IPropertiesOperations.
 /// </param>
 /// <param name='resourceGroupName'>
 /// Required. The name of the resource group.
 /// </param>
 /// <param name='serviceName'>
 /// Required. The name of the Api Management service.
 /// </param>
 /// <param name='propId'>
 /// Required. Identifier of the property.
 /// </param>
 /// <param name='parameters'>
 /// Required. Create parameters.
 /// </param>
 /// <returns>
 /// A standard service response including an HTTP status code and
 /// request ID.
 /// </returns>
 public static Task<AzureOperationResponse> CreateAsync(this IPropertiesOperations operations, string resourceGroupName, string serviceName, string propId, PropertyCreateParameters parameters)
 {
     return operations.CreateAsync(resourceGroupName, serviceName, propId, parameters, CancellationToken.None);
 }