internal Task <TriggerResponse> CreateTriggerResponseAsync(Task <CosmosResponseMessage> cosmosResponseMessageTask)
 {
     return(this.ProcessMessageAsync(cosmosResponseMessageTask, (cosmosResponseMessage) =>
     {
         CosmosTriggerProperties settings = this.ToObjectInternal <CosmosTriggerProperties>(cosmosResponseMessage, this.settingsSerializer);
         return new TriggerResponse(
             cosmosResponseMessage.StatusCode,
             cosmosResponseMessage.Headers,
             settings);
     }));
 }
        private static void ValidateTriggerSettings(CosmosTriggerProperties triggerSettings, TriggerResponse cosmosResponse)
        {
            CosmosTriggerProperties settings = cosmosResponse.Resource;

            Assert.AreEqual(triggerSettings.Body, settings.Body,
                            "Trigger function do not match");
            Assert.AreEqual(triggerSettings.Id, settings.Id,
                            "Trigger id do not match");
            Assert.IsTrue(cosmosResponse.RequestCharge > 0);
            Assert.IsNotNull(cosmosResponse.MaxResourceQuota);
            Assert.IsNotNull(cosmosResponse.CurrentResourceQuotaUsage);
        }
        public async Task CRUDTest()
        {
            CosmosTriggerProperties settings = new CosmosTriggerProperties
            {
                Id               = Guid.NewGuid().ToString(),
                Body             = TriggersTests.GetTriggerFunction(".05"),
                TriggerOperation = Scripts.TriggerOperation.Create,
                TriggerType      = Scripts.TriggerType.Pre
            };

            TriggerResponse triggerResponse =
                await this.scripts.CreateTriggerAsync(settings);

            double reqeustCharge = triggerResponse.RequestCharge;

            Assert.IsTrue(reqeustCharge > 0);
            Assert.AreEqual(HttpStatusCode.Created, triggerResponse.StatusCode);
            TriggersTests.ValidateTriggerSettings(settings, triggerResponse);

            triggerResponse = await this.scripts.ReadTriggerAsync(settings.Id);

            reqeustCharge = triggerResponse.RequestCharge;
            Assert.IsTrue(reqeustCharge > 0);
            Assert.AreEqual(HttpStatusCode.OK, triggerResponse.StatusCode);
            TriggersTests.ValidateTriggerSettings(settings, triggerResponse);

            CosmosTriggerProperties updatedSettings = triggerResponse.Resource;

            updatedSettings.Body = TriggersTests.GetTriggerFunction(".42");

            TriggerResponse replaceResponse = await this.scripts.ReplaceTriggerAsync(updatedSettings);

            TriggersTests.ValidateTriggerSettings(updatedSettings, replaceResponse);
            reqeustCharge = replaceResponse.RequestCharge;
            Assert.IsTrue(reqeustCharge > 0);
            Assert.AreEqual(HttpStatusCode.OK, replaceResponse.StatusCode);

            replaceResponse = await this.scripts.DeleteTriggerAsync(updatedSettings.Id);

            reqeustCharge = replaceResponse.RequestCharge;
            Assert.IsTrue(reqeustCharge > 0);
            Assert.AreEqual(HttpStatusCode.NoContent, replaceResponse.StatusCode);
        }
        public async Task TriggersIteratorTest()
        {
            CosmosTriggerProperties cosmosTrigger = await CreateRandomTrigger();

            HashSet <string> settings = new HashSet <string>();
            FeedIterator <CosmosTriggerProperties> iter = this.scripts.GetTriggersIterator();;

            while (iter.HasMoreResults)
            {
                foreach (CosmosTriggerProperties storedProcedureSettingsEntry in await iter.FetchNextSetAsync())
                {
                    settings.Add(storedProcedureSettingsEntry.Id);
                }
            }

            Assert.IsTrue(settings.Contains(cosmosTrigger.Id), "The iterator did not return the user defined function definition.");

            // Delete existing user defined functions.
            await this.scripts.DeleteTriggerAsync(cosmosTrigger.Id);
        }
        public async Task ValidateTriggersTest()
        {
            // Prevent failures if previous test did not clean up correctly
            await this.scripts.DeleteTriggerAsync("addTax");

            ToDoActivity item = new ToDoActivity()
            {
                id          = Guid.NewGuid().ToString(),
                cost        = 9001,
                description = "trigger_test_item",
                status      = "Done",
                taskNum     = 1
            };

            CosmosTriggerProperties cosmosTrigger = await this.scripts.CreateTriggerAsync(
                new CosmosTriggerProperties
            {
                Id               = "addTax",
                Body             = TriggersTests.GetTriggerFunction(".20"),
                TriggerOperation = Scripts.TriggerOperation.All,
                TriggerType      = Scripts.TriggerType.Pre
            });

            ItemRequestOptions options = new ItemRequestOptions()
            {
                PreTriggers = new List <string>()
                {
                    cosmosTrigger.Id
                },
            };

            ItemResponse <dynamic> createdItem = await this.container.CreateItemAsync <dynamic>(item, requestOptions : options);

            double itemTax = createdItem.Resource.tax;

            Assert.AreEqual(item.cost * .20, itemTax);
            // Delete existing user defined functions.
            await this.scripts.DeleteTriggerAsync("addTax");
        }
        private async Task <TriggerResponse> CreateRandomTrigger()
        {
            string id       = Guid.NewGuid().ToString();
            string function = GetTriggerFunction(".05");

            CosmosTriggerProperties settings = new CosmosTriggerProperties
            {
                Id               = id,
                Body             = function,
                TriggerOperation = Scripts.TriggerOperation.Create,
                TriggerType      = Scripts.TriggerType.Pre
            };

            //Create a user defined function
            TriggerResponse createResponse = await this.scripts.CreateTriggerAsync(
                triggerSettings : settings,
                cancellationToken : this.cancellationToken);

            ValidateTriggerSettings(settings, createResponse);

            return(createResponse);
        }
        public async Task ValidateResponseFactoryJsonSerializer()
        {
            CosmosResponseMessage databaseResponse  = this.CreateResponse();
            CosmosResponseMessage containerResponse = this.CreateResponse();
            CosmosResponseMessage storedProcedureExecuteResponse = this.CreateResponse();
            CosmosResponseMessage storedProcedureResponse        = this.CreateResponse();
            CosmosResponseMessage triggerResponse = this.CreateResponse();
            CosmosResponseMessage udfResponse     = this.CreateResponse();
            CosmosResponseMessage itemResponse    = this.CreateResponse();
            CosmosResponseMessage feedResponse    = this.CreateResponse();

            Mock <CosmosJsonSerializer> mockUserJsonSerializer    = new Mock <CosmosJsonSerializer>();
            Mock <CosmosJsonSerializer> mockDefaultJsonSerializer = new Mock <CosmosJsonSerializer>();
            CosmosResponseFactory       cosmosResponseFactory     = new CosmosResponseFactory(
                defaultJsonSerializer: mockDefaultJsonSerializer.Object,
                userJsonSerializer: mockUserJsonSerializer.Object);

            // Test the user specified response
            mockUserJsonSerializer.Setup(x => x.FromStream <ToDoActivity>(itemResponse.Content)).Returns(new ToDoActivity());
            mockUserJsonSerializer.Setup(x => x.FromStream <ToDoActivity>(storedProcedureExecuteResponse.Content)).Returns(new ToDoActivity());
            mockUserJsonSerializer.Setup(x => x.FromStream <CosmosFeedResponseUtil <ToDoActivity> >(feedResponse.Content)).Returns(new CosmosFeedResponseUtil <ToDoActivity>()
            {
                Data = new Collection <ToDoActivity>()
            });

            // Verify all the user types use the user specified version
            await cosmosResponseFactory.CreateItemResponseAsync <ToDoActivity>(Task.FromResult(itemResponse));

            await cosmosResponseFactory.CreateStoredProcedureExecuteResponseAsync <ToDoActivity>(Task.FromResult(storedProcedureExecuteResponse));

            cosmosResponseFactory.CreateResultSetQueryResponse <ToDoActivity>(feedResponse);

            // Throw if the setups were not called
            mockUserJsonSerializer.VerifyAll();

            // Test the system specified response
            CosmosContainerProperties containerSettings = new CosmosContainerProperties("mockId", "/pk");
            CosmosDatabaseProperties  databaseSettings  = new CosmosDatabaseProperties()
            {
                Id = "mock"
            };

            CosmosStoredProcedureProperties cosmosStoredProcedureSettings = new CosmosStoredProcedureProperties()
            {
                Id = "mock"
            };

            CosmosTriggerProperties cosmosTriggerSettings = new CosmosTriggerProperties()
            {
                Id = "mock"
            };

            CosmosUserDefinedFunctionProperties cosmosUserDefinedFunctionSettings = new CosmosUserDefinedFunctionProperties()
            {
                Id = "mock"
            };

            mockDefaultJsonSerializer.Setup(x => x.FromStream <CosmosDatabaseProperties>(databaseResponse.Content)).Returns(databaseSettings);
            mockDefaultJsonSerializer.Setup(x => x.FromStream <CosmosContainerProperties>(containerResponse.Content)).Returns(containerSettings);
            mockDefaultJsonSerializer.Setup(x => x.FromStream <CosmosStoredProcedureProperties>(storedProcedureResponse.Content)).Returns(cosmosStoredProcedureSettings);
            mockDefaultJsonSerializer.Setup(x => x.FromStream <CosmosTriggerProperties>(triggerResponse.Content)).Returns(cosmosTriggerSettings);
            mockDefaultJsonSerializer.Setup(x => x.FromStream <CosmosUserDefinedFunctionProperties>(udfResponse.Content)).Returns(cosmosUserDefinedFunctionSettings);

            Mock <CosmosContainer> mockContainer = new Mock <CosmosContainer>();
            Mock <CosmosDatabase>  mockDatabase  = new Mock <CosmosDatabase>();

            // Verify all the system types that should always use default
            await cosmosResponseFactory.CreateContainerResponseAsync(mockContainer.Object, Task.FromResult(containerResponse));

            await cosmosResponseFactory.CreateDatabaseResponseAsync(mockDatabase.Object, Task.FromResult(databaseResponse));

            await cosmosResponseFactory.CreateStoredProcedureResponseAsync(Task.FromResult(storedProcedureResponse));

            await cosmosResponseFactory.CreateTriggerResponseAsync(Task.FromResult(triggerResponse));

            await cosmosResponseFactory.CreateUserDefinedFunctionResponseAsync(Task.FromResult(udfResponse));

            // Throw if the setups were not called
            mockDefaultJsonSerializer.VerifyAll();
        }