using System; using Xunit; using Newtonsoft.Json.Linq; using FluentAssertions; namespace raven_integration { public class UserCrud { /// /// Test all CRUD routes for a User /// [Fact] public async void CRUD() { //CREATE dynamic d1 = new JObject(); d1.name = Util.Uniquify("First Test User"); d1.ownerId = 1L; d1.active=true; d1.login=Util.Uniquify("LOGIN"); d1.password=Util.Uniquify("PASSWORD"); d1.roles=0;//norole d1.localeId=1;//random locale d1.userType=3;//non scheduleable ApiResponse r1 = await Util.PostAsync("User", await Util.GetTokenAsync("manager", "l3tm3in"), d1.ToString()); Util.ValidateDataReturnResponseOk(r1); long d1Id = r1.ObjectResponse["result"]["id"].Value(); dynamic d2 = new JObject(); d2.name = Util.Uniquify("Second Test User"); d2.ownerId = 1L; d2.active=true; d2.login=Util.Uniquify("LOGIN"); d2.password=Util.Uniquify("PASSWORD"); d2.roles=0;//norole d2.localeId=1;//random locale d2.userType=3;//non scheduleable ApiResponse r2 = await Util.PostAsync("User", await Util.GetTokenAsync("manager", "l3tm3in"), d2.ToString()); Util.ValidateDataReturnResponseOk(r2); long d2Id = r2.ObjectResponse["result"]["id"].Value(); //RETRIEVE //Get one ApiResponse r3 = await Util.GetAsync("User/" + d2Id.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateDataReturnResponseOk(r3); r3.ObjectResponse["result"]["name"].Value().Should().Be(d2.name.ToString()); //UPDATE //PUT //update w2id d2.name = Util.Uniquify("UPDATED VIA PUT SECOND TEST User"); d2.OwnerId = 1; d2.concurrencyToken = r2.ObjectResponse["result"]["concurrencyToken"].Value(); ApiResponse PUTTestResponse = await Util.PutAsync("User/" + d2Id.ToString(), await Util.GetTokenAsync("manager", "l3tm3in"), d2.ToString()); Util.ValidateHTTPStatusCode(PUTTestResponse, 200); //check PUT worked ApiResponse checkPUTWorked = await Util.GetAsync("User/" + d2Id.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateNoErrorInResponse(checkPUTWorked); checkPUTWorked.ObjectResponse["result"]["name"].Value().Should().Be(d2.name.ToString()); uint concurrencyToken = PUTTestResponse.ObjectResponse["result"]["concurrencyToken"].Value(); //PATCH var newName = Util.Uniquify("UPDATED VIA PATCH SECOND TEST User"); string patchJson = "[{\"value\": \"" + newName + "\",\"path\": \"/name\",\"op\": \"replace\"}]"; ApiResponse PATCHTestResponse = await Util.PatchAsync("User/" + d2Id.ToString() + "/" + concurrencyToken.ToString(), await Util.GetTokenAsync("manager", "l3tm3in"), patchJson); Util.ValidateHTTPStatusCode(PATCHTestResponse, 200); //check PATCH worked ApiResponse checkPATCHWorked = await Util.GetAsync("User/" + d2Id.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateNoErrorInResponse(checkPATCHWorked); checkPATCHWorked.ObjectResponse["result"]["name"].Value().Should().Be(newName); //DELETE ApiResponse DELETETestResponse = await Util.DeleteAsync("User/" + d2Id.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateHTTPStatusCode(DELETETestResponse, 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("User/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("User/2q2", await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateBadModelStateResponse(a, "id"); } /// /// /// [Fact] public async void PutConcurrencyViolationShouldFail() { //CREATE dynamic w2 = new JObject(); w2.name = Util.Uniquify("PutConcurrencyViolationShouldFail"); w2.dollarAmount = 2.22m; w2.active = true; w2.roles = 0; ApiResponse r2 = await Util.PostAsync("User", await Util.GetTokenAsync("manager", "l3tm3in"), w2.ToString()); Util.ValidateDataReturnResponseOk(r2); long w2Id = r2.ObjectResponse["result"]["id"].Value(); uint OriginalConcurrencyToken = r2.ObjectResponse["result"]["concurrencyToken"].Value(); //UPDATE //PUT w2.name = Util.Uniquify("PutConcurrencyViolationShouldFail UPDATE VIA PUT "); w2.OwnerId = 1; w2.concurrencyToken = OriginalConcurrencyToken - 1;//bad token ApiResponse PUTTestResponse = await Util.PutAsync("User/" + 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.dollarAmount = 2.22m; w2.active = true; w2.roles = 0; ApiResponse r2 = await Util.PostAsync("User", await Util.GetTokenAsync("manager", "l3tm3in"), w2.ToString()); Util.ValidateDataReturnResponseOk(r2); long w2Id = r2.ObjectResponse["result"]["id"].Value(); uint OriginalConcurrencyToken = r2.ObjectResponse["result"]["concurrencyToken"].Value(); //PATCH var newName = Util.Uniquify("PutConcurrencyViolationShouldFail UPDATED VIA PATCH"); string patchJson = "[{\"value\": \"" + newName + "\",\"path\": \"/name\",\"op\": \"replace\"}]"; ApiResponse PATCHTestResponse = await Util.PatchAsync("User/" + w2Id.ToString() + "/" + (OriginalConcurrencyToken - 1).ToString(), await Util.GetTokenAsync("manager", "l3tm3in"), patchJson); Util.ValidateConcurrencyError(PATCHTestResponse); } //================================================== }//eoc }//eons