using System; using Xunit; using Newtonsoft.Json.Linq; using FluentAssertions; using System.Collections.Generic; using System.Collections.Concurrent; namespace raven_integration { public class FormCustom { /// /// Test create or update /// [Fact] public async void FormCustomCreateUpdate() { //This is a special case, you can create or PUT a formcustom, but you can't delete one and you can't create one if one already exists //so this test will either create or update depending upon if it's already created one or not dynamic d = new JObject(); d.formkey = "user"; /* As sending from client now with fail: { "formKey":"widget", "concurrencyToken":3798757, "template":[ {"fld":"WidgetName","required":true,"hide":false},{"fld":"WidgetStartDate","required":true,"hide":false},{"fld":"WidgetEndDate","required":true,"hide":false},{"fld":"WidgetNotes","required":true,"hide":false},{"fld":"WidgetCustom1","required":false,"type":"datetime"},{"fld":"WidgetCustom2","required":true,"type":"text"},{"fld":"WidgetCustom3","required":false,"type":"number"},{"fld":"WidgetCustom4","required":false,"type":"bool"},{"fld":"WidgetCustom5","required":false,"type":"currency"},{"fld":"WidgetCustom6","required":false,"type":"date"},{"fld":"WidgetCustom7","required":false,"type":"time"} ] } //As it appears in this unit test to string {{ "formkey": "user", "template": "[\r\n {\r\n \"fld\": \"UserCustom1\",\r\n \"hide\": false,\r\n \"required\": true,\r\n \"type\": \"text\"\r\n },\r\n {\r\n \"fld\": \"UserNotes\",\r\n \"required\": true\r\n },\r\n {\r\n \"fld\": \"UserCustom2\",\r\n \"hide\": true,\r\n \"required\": false,\r\n \"type\": \"bool\"\r\n }\r\n]" }} //As it fetches off the server now { "data": { "id": 1, "concurrencyToken": 3798757, "formKey": "widget", "template": "[{\"fld\":\"WidgetNotes\",\"required\":true},{\"fld\":\"WidgetCustom1\",\"required\":false,\"type\":\"datetime\"},{\"fld\":\"WidgetCustom2\",\"required\":true,\"type\":\"text\"}, {\"fld\":\"WidgetCustom3\",\"required\":false,\"type\":\"number\"},{\"fld\":\"WidgetCustom4\",\"required\":false,\"type\":\"bool\"},{\"fld\":\"WidgetCustom5\",\"required\":false,\"type\":\"currency\"}, {\"fld\":\"WidgetCustom6\",\"required\":false,\"type\":\"date\"},{\"fld\":\"WidgetCustom7\",\"required\":false,\"type\":\"time\"}]" } } */ dynamic dtemplate = new JArray(); dynamic dt = new JObject(); dt.fld = "UserCustom1"; dt.hide = false; dt.required = true; dt.type = "text"; dtemplate.Add(dt); dt = new JObject(); dt.fld = "UserNotes"; dt.required = true; dtemplate.Add(dt); dt = new JObject(); dt.fld = "UserCustom2"; dt.hide = true; dt.required = false; dt.type = "bool"; dtemplate.Add(dt); d.template = dtemplate.ToString();//it expects it to be a json string, not actual json //Is there one already? //RETRIEVE //Get one ApiResponse a = await Util.GetAsync("FormCustom/user", await Util.GetTokenAsync("BizAdminFull")); bool Exists = ((int)a.HttpResponse.StatusCode) == 200; if (Exists) { //Update d.concurrencyToken = a.ObjectResponse["data"]["concurrencyToken"].Value(); a = await Util.PutAsync("FormCustom/user", await Util.GetTokenAsync("BizAdminFull"), d.ToString()); Util.ValidateHTTPStatusCode(a, 200); } else { //Create it a = await Util.PostAsync("FormCustom", await Util.GetTokenAsync("BizAdminFull"), d.ToString()); Util.ValidateDataReturnResponseOk(a); } //check the concurrency token cache scheme uint token = a.ObjectResponse["data"]["concurrencyToken"].Value(); //This should return a 304 not modified a = await Util.GetAsync($"FormCustom/user?concurrencyToken={token}", await Util.GetTokenAsync("BizAdminFull")); Util.ValidateHTTPStatusCode(a, 304); //and this should return the whole object token--;//make the token not match //This should return a 200 and the whole object a = await Util.GetAsync($"FormCustom/user?concurrencyToken={token}", await Util.GetTokenAsync("BizAdminFull")); Util.ValidateDataReturnResponseOk(a); } /// /// /// [Fact] public async void InvalidAvailableFieldsFormKeyShouldFail() { ApiResponse a = await Util.GetAsync("FormCustom/AvailableFields/nonexistent", await Util.GetTokenAsync("BizAdminFull")); Util.ValidateErrorCodeResponse(a, 2010, 404); } /// /// /// [Fact] public async void AvailableFieldsWorks() { ApiResponse a = await Util.GetAsync("FormCustom/AvailableFields/widget", await Util.GetTokenAsync("BizAdminFull")); Util.ValidateDataReturnResponseOk(a); ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(25); } /// /// /// [Fact] public async void AvailableCustomizableFormKeysWorks() { ApiResponse a = await Util.GetAsync("FormCustom/AvailableCustomizableFormKeys", await Util.GetTokenAsync("BizAdminFull")); Util.ValidateDataReturnResponseOk(a); ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(1);//is 2 as of writing (widget,user) } /// /// /// [Fact] public async void AvailableCustomTypesWorks() { ApiResponse a = await Util.GetAsync("FormCustom/AvailableCustomTypes", await Util.GetTokenAsync("BizAdminFull")); Util.ValidateDataReturnResponseOk(a); ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(4); } //================================================== }//eoc }//eons