using System; using Xunit; using Newtonsoft.Json.Linq; using FluentAssertions; namespace raven_integration { public class WorkOrderCrud { /// /// Test all CRUD routes for a WorkOrder /// [Fact] public async void CRUD() { //CREATE HEADER dynamic d = new JObject(); d.active = true; d.notes = "WOHEADER The quick brown fox jumped over the six lazy dogs!"; d.wiki = "# WOHEADER test wiki"; //Tags dynamic dTagsArray = new JArray(); dTagsArray.Add("wo-Red"); dTagsArray.Add("wo-green"); dTagsArray.Add("wo-blue"); d.tags = dTagsArray; ApiResponse a = await Util.PostAsync("workorders", await Util.GetTokenAsync("manager", "l3tm3in"), d.ToString()); Util.ValidateDataReturnResponseOk(a); long WorkOrderId = a.ObjectResponse["data"]["id"].Value(); //CREATE WOITEM d = new JObject(); d.active = true; d.notes = "woitem The quick brown fox jumped over the six lazy dogs!"; d.wiki = "# woitem test wiki"; d.workOrderId = WorkOrderId; //Tags dTagsArray = new JArray(); dTagsArray.Add("woitem-Red"); dTagsArray.Add("woitem-green"); dTagsArray.Add("woitem-blue"); d.tags = dTagsArray; a = await Util.PostAsync("workorders/items", await Util.GetTokenAsync("manager", "l3tm3in"), d.ToString()); Util.ValidateDataReturnResponseOk(a); long WorkOrderItemId = a.ObjectResponse["data"]["id"].Value(); //CREATE WOITEMPART d = new JObject(); d.active = true; d.notes = "woitempart The quick brown fox jumped over the six lazy dogs!"; d.wiki = "# woitempart test wiki"; d.workOrderId = WorkOrderId; //Tags dTagsArray = new JArray(); dTagsArray.Add("woitempart-Red"); dTagsArray.Add("woitempart-green"); dTagsArray.Add("woitempart-blue"); d.tags = dTagsArray; a = await Util.PostAsync("workorders/items/parts", await Util.GetTokenAsync("manager", "l3tm3in"), d.ToString()); Util.ValidateDataReturnResponseOk(a); long WorkOrderItemPartId = a.ObjectResponse["data"]["id"].Value(); //RETRIEVE //Get one a = await Util.GetAsync("WorkOrder/" + WorkOrderId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateDataReturnResponseOk(a); a.ObjectResponse["data"]["name"].Value().Should().Be(d.name.ToString()); a.ObjectResponse["data"]["notes"].Value().Should().Be(d.notes.ToString()); var returnedTags = ((JArray)a.ObjectResponse["data"]["tags"]); returnedTags.Count.Should().Be(7); returnedTags[0].Value().Should().Be("red-tag"); returnedTags[1].Value().Should().Be("orange-is-the-new-black"); returnedTags[2].Value().Should().Be("yellow"); returnedTags[3].Value().Should().Be("green"); returnedTags[4].Value().Should().Be("blue"); returnedTags[5].Value().Should().Be("indigo"); returnedTags[6].Value().Should().Be("violet-tag"); //UPDATE d.name = Util.Uniquify("UPDATED VIA PUT TEST WorkOrder"); d.concurrencyToken = a.ObjectResponse["data"]["concurrencyToken"].Value(); a = await Util.PutAsync("WorkOrder/" + WorkOrderId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in"), d.ToString()); Util.ValidateHTTPStatusCode(a, 200); //check PUT worked a = await Util.GetAsync("WorkOrder/" + WorkOrderId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateNoErrorInResponse(a); a.ObjectResponse["data"]["name"].Value().Should().Be(d.name.ToString()); uint concurrencyToken = a.ObjectResponse["data"]["concurrencyToken"].Value(); //DELETE a = await Util.DeleteAsync("WorkOrder/" + WorkOrderId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateHTTPStatusCode(a, 204); } /// /// Test not found /// [Fact] public async void GetNonExistentItemShouldError() { //Get non existant //Should return status code 404, api error code 2010 ApiResponse a = await Util.GetAsync("WorkOrder/999999", await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateResponseNotFound(a); } /// /// Test bad modelstate /// [Fact] public async void GetBadModelStateShouldError() { //Get non existant //Should return status code 400, api error code 2200 and a first target in details of "id" ApiResponse a = await Util.GetAsync("WorkOrder/2q2", await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateBadModelStateResponse(a, "id"); } /// /// Test server exception /// [Fact] public async void ServerExceptionShouldErrorPropertly() { //Get non existant //Should return status code 400, api error code 2200 and a first target in details of "id" ApiResponse a = await Util.GetAsync("WorkOrder/exception", await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateServerExceptionResponse(a); } /// /// Test server alt exception /// [Fact] public async void ServerAltExceptionShouldErrorPropertly() { //Get non existant //Should return status code 400, api error code 2200 and a first target in details of "id" ApiResponse a = await Util.GetAsync("WorkOrder/altexception", await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateServerExceptionResponse(a); } /// /// /// [Fact] public async void PutConcurrencyViolationShouldFail() { //CREATE dynamic w2 = new JObject(); w2.name = Util.Uniquify("PutConcurrencyViolationShouldFail"); w2.dollarAmount = 2.22m; w2.active = true; w2.usertype = 1; w2.notes = "blah"; w2.customFields = Util.WorkOrderRequiredCustomFieldsJsonString(); ApiResponse r2 = await Util.PostAsync("WorkOrder", await Util.GetTokenAsync("manager", "l3tm3in"), w2.ToString()); Util.ValidateDataReturnResponseOk(r2); long w2Id = r2.ObjectResponse["data"]["id"].Value(); uint OriginalConcurrencyToken = r2.ObjectResponse["data"]["concurrencyToken"].Value(); //UPDATE //PUT w2.name = Util.Uniquify("PutConcurrencyViolationShouldFail UPDATE VIA PUT "); w2.concurrencyToken = OriginalConcurrencyToken - 1;//bad token ApiResponse PUTTestResponse = await Util.PutAsync("WorkOrder/" + w2Id.ToString(), await Util.GetTokenAsync("manager", "l3tm3in"), w2.ToString()); Util.ValidateConcurrencyError(PUTTestResponse); } /// /// /// [Fact] public async void PatchConcurrencyViolationShouldFail() { //CREATE dynamic w2 = new JObject(); w2.name = Util.Uniquify("PatchConcurrencyViolationShouldFail"); w2.notes = "blah"; w2.customFields = Util.WorkOrderRequiredCustomFieldsJsonString(); w2.dollarAmount = 2.22m; w2.active = true; w2.usertype = 1; w2.customFields = Util.WorkOrderRequiredCustomFieldsJsonString(); ApiResponse r2 = await Util.PostAsync("WorkOrder", await Util.GetTokenAsync("manager", "l3tm3in"), w2.ToString()); Util.ValidateDataReturnResponseOk(r2); long w2Id = r2.ObjectResponse["data"]["id"].Value(); uint OriginalConcurrencyToken = r2.ObjectResponse["data"]["concurrencyToken"].Value(); //PATCH var newName = Util.Uniquify("PutConcurrencyViolationShouldFail UPDATED VIA PATCH"); string patchJson = "[{\"value\": \"" + newName + "\",\"path\": \"/name\",\"op\": \"replace\"}]"; ApiResponse PATCHTestResponse = await Util.PatchAsync("WorkOrder/" + w2Id.ToString() + "/" + (OriginalConcurrencyToken - 1).ToString(), await Util.GetTokenAsync("manager", "l3tm3in"), patchJson); Util.ValidateConcurrencyError(PATCHTestResponse); } //================================================== }//eoc }//eons