protected override async Task<Entity> UpdateAsync(IDictionary<string, object> propertyUpdates, IDictionary<string, string> attributeUpdates, IEnumerable<string> addedTags, IEnumerable<string> removedTags, int specificRevision) { var request = new UpdateArticleRequest {Id = this.Id, Type = this.Type}; if (propertyUpdates != null && propertyUpdates.Count > 0) propertyUpdates.For(x => request.PropertyUpdates[x.Key] = x.Value); if (attributeUpdates != null && attributeUpdates.Count > 0) attributeUpdates.For(x => request.AttributeUpdates[x.Key] = x.Value); if (addedTags != null) request.AddedTags.AddRange(addedTags); if (removedTags != null) request.RemovedTags.AddRange(removedTags); // Check if an update is needed. if (request.PropertyUpdates.Count == 0 && request.AttributeUpdates.Count == 0 && request.AddedTags.Count == 0 && request.RemovedTags.Count == 0) return null; var response = await request.ExecuteAsync(); if (response.Status.IsSuccessful == false) throw response.Status.ToFault(); // 3. Update the last known state based on the differences Debug.Assert(response.Article != null, "If status is successful, then updated article should not be null."); return response.Article; }
public async Task BugId14Test() { // Ref: https://github.com/appacitive/Gossamer/issues/14 // Updating a null property with a null value fails // Create an article var now = DateTime.Now; dynamic obj = new Article("object"); obj.intfield = 1; obj.decimalfield = 10.0m; obj.stringfield = null; var createdResponse = await (new CreateArticleRequest() { Article = obj }).ExecuteAsync(); Assert.IsNotNull(createdResponse, "Article creation failed."); Assert.IsNotNull(createdResponse.Status, "Status is null."); Assert.IsTrue(createdResponse.Status.IsSuccessful, createdResponse.Status.Message ?? "Create article failed."); var created = createdResponse.Article; // Update the article twice for (int i = 0; i < 2; i++) { var updateRequest = new UpdateArticleRequest() { Id = created.Id, Type = created.Type }; updateRequest.PropertyUpdates["stringfield"] = null; var updatedResponse = await updateRequest.ExecuteAsync(); Assert.IsNotNull(updatedResponse, "Update article response is null."); Assert.IsNotNull(updatedResponse.Status, "Update article response status is null."); Assert.IsTrue(updatedResponse.Status.IsSuccessful, updatedResponse.Status.Message ?? "NULL"); Assert.IsNotNull(updatedResponse.Article, "Updated article is null."); var updated = updatedResponse.Article; Assert.IsTrue(updated["stringfield"] is NullValue); } }
public async Task UpdateArticleAsyncTest() { // Create an article var now = DateTime.Now; dynamic obj = new Article("object"); obj.intfield = 1; obj.decimalfield = 10.0m; obj.datefield = "2012-12-20"; obj.stringfield = "initial"; obj.Tags.Add("initial"); var createdResponse = await (new CreateArticleRequest() { Article = obj }).ExecuteAsync(); Assert.IsNotNull(createdResponse, "Article creation failed."); Assert.IsNotNull(createdResponse.Status, "Status is null."); Assert.IsTrue(createdResponse.Status.IsSuccessful, createdResponse.Status.Message ?? "Create article failed."); var created = createdResponse.Article; // Update the article var updateRequest = new UpdateArticleRequest() { Id = created.Id, Type = created.Type }; updateRequest.PropertyUpdates["intfield"] = "2"; updateRequest.PropertyUpdates["decimalfield"] = 20.0m.ToString(); updateRequest.PropertyUpdates["stringfield"] = null; updateRequest.PropertyUpdates["datefield"] = "2013-11-20"; updateRequest.AddedTags.AddRange(new[] {"tag1", "tag2"}); updateRequest.RemovedTags.AddRange(new[] {"initial"}); var updatedResponse = await updateRequest.ExecuteAsync(); Assert.IsNotNull(updatedResponse, "Update article response is null."); Assert.IsNotNull(updatedResponse.Status, "Update article response status is null."); Assert.IsNotNull(updatedResponse.Article, "Updated article is null."); var updated = updatedResponse.Article; Assert.IsTrue(updated.Get<string>("intfield") == "2"); Assert.IsTrue(updated.Get<string>("decimalfield") == "20.0"); Assert.IsTrue(updated.Get<string>("stringfield") == null); Assert.IsTrue(updated.Get<string>("datefield") == "2013-11-20"); Assert.IsTrue(updated.Tags.Count() == 2); Assert.IsTrue(updated.Tags.Intersect(new[] {"tag1", "tag2"}).Count() == 2); }