diff --git a/Global/GlobalAll.cs b/Global/GlobalAll.cs
new file mode 100644
index 0000000..458b2f1
--- /dev/null
+++ b/Global/GlobalAll.cs
@@ -0,0 +1,218 @@
+using System;
+using Xunit;
+using Newtonsoft.Json.Linq;
+using FluentAssertions;
+using System.Collections.Generic;
+using System.Collections.Concurrent;
+
+namespace raven_integration
+{
+ public class GlobalAll
+ {
+
+
+ ///
+ /// Test Global routes
+ ///
+ [Fact]
+ public async void GlobalOps()
+ {
+
+TODO: this...
+
+ //NOTE: Due to there being only one possible template per type, this test will need to test ALL potential tests in one function
+ //and only for the User picklist in order to not step over other potential tests running in parallel
+
+ //REPLACE USER TEMPLATE
+ dynamic d = new JObject();
+ d.Id = 3;//User type
+
+ //custom template, only one field employee number
+ dynamic dTemplateArray = new JArray();
+ dynamic df = new JObject();
+ df.fld = "useremployeenumber";
+ dTemplateArray.Add(df);
+ d.Template = dTemplateArray.ToString(Newtonsoft.Json.Formatting.None);
+
+ //replace the User template at the server
+ ApiResponse a = await Util.PostAsync("PickList/Template", await Util.GetTokenAsync("BizAdminFull"), d.ToString(Newtonsoft.Json.Formatting.None));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //RETRIEVE
+ //Get one
+ a = await Util.GetAsync("PickList/Template/3/", await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateDataReturnResponseOk(a);
+ //assert contains ONE record ONLY and it's the one we set
+ var templateArray = JArray.Parse(a.ObjectResponse["data"]["template"].Value());
+ templateArray.Count.Should().Be(1);
+ templateArray[0]["fld"].Value().Should().Be("useremployeenumber");
+
+
+ //CONFIRM THE CUSTOM PICKLIST TEMPLATE WORKS PROPERLY
+ //MAKE THE TEST USERS
+ //First make a unique string for this iteration of this test only
+ var UniquePhrase = Util.Uniquify("pick").Replace(" ", "");
+ d = new JObject();
+ d.name = Util.Uniquify("UserPickListTemplatesOps") + UniquePhrase;
+ d.active = true;
+ d.login = Util.Uniquify("LOGIN");
+ d.password = Util.Uniquify("PASSWORD");
+ d.roles = 0;//norole
+
+ d.userType = 3;//non scheduleable
+ //Required by form custom rules
+ d.notes = "notes";
+ d.customFields = Util.UserRequiredCustomFieldsJsonString();
+
+ a = await Util.PostAsync("User", await Util.GetTokenAsync("manager", "l3tm3in"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ long InNameId = a.ObjectResponse["data"]["id"].Value();
+
+ d = new JObject();
+ d.name = Util.Uniquify("UserPickListTemplatesOps");
+ d.employeeNumber = UniquePhrase;
+ d.login = Util.Uniquify("LOGIN");
+ d.password = Util.Uniquify("PASSWORD");
+ d.roles = 0;//norole
+ d.userType = 3;//non scheduleable
+ d.active = true;
+ //Required by form custom rules
+ d.notes = "notes";
+ d.customFields = Util.UserRequiredCustomFieldsJsonString();
+
+ a = await Util.PostAsync("User", await Util.GetTokenAsync("manager", "l3tm3in"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ long InEmployeeNumberId = a.ObjectResponse["data"]["id"].Value();
+
+
+ //GET PICKLIST FOR unique phrase query sb only employee number due to custom template
+ a = await Util.GetAsync("PickList/List?ayaType=3&query=" + UniquePhrase, await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateDataReturnResponseOk(a);
+ var pickList = ((JArray)a.ObjectResponse["data"]);
+ pickList.Count.Should().Be(1);
+ pickList[0]["id"].Value().Should().Be(InEmployeeNumberId);
+
+ //custom template, only one field user name
+ d = new JObject();
+ d.Id = 3;//User type
+ dTemplateArray = new JArray();
+ df = new JObject();
+ df.fld = "username";
+ dTemplateArray.Add(df);
+ d.Template = dTemplateArray.ToString(Newtonsoft.Json.Formatting.None);
+
+ //replace the User template at the server
+ a = await Util.PostAsync("PickList/Template", await Util.GetTokenAsync("BizAdminFull"), d.ToString(Newtonsoft.Json.Formatting.None));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ //GET PICKLIST FOR unique phrase query sb only user name field due to custom template
+ a = await Util.GetAsync("PickList/List?ayaType=3&query=" + UniquePhrase, await Util.GetTokenAsync("BizAdminFull"));
+ //"select auser.id as plId, auser.active as plActive, concat_ws(' ', auser.name) as plname from auser where auser.active = true and ((auser.name like '%pick1584556347748%')) order by auser.name limit 100"
+ Util.ValidateDataReturnResponseOk(a);
+ pickList = ((JArray)a.ObjectResponse["data"]);
+ pickList.Count.Should().Be(1);
+ pickList[0]["id"].Value().Should().Be(InNameId);
+
+ //DELETE TEST USERS NO LONGER NEEDED
+ a = await Util.DeleteAsync("User/" + InNameId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("User/" + InEmployeeNumberId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ // RESET TEMPLATE TO DEFAULT
+ a = await Util.DeleteAsync("PickList/Template/3/", await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ //RETRIEVE (Confirm it's back to default)
+ //Get one
+ a = await Util.GetAsync("PickList/Template/3/", await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateDataReturnResponseOk(a);
+ //assert contains default template record ONLY and it's the one we set
+ templateArray = JArray.Parse(a.ObjectResponse["data"]["template"].Value());
+ templateArray.Count.Should().Be(3);
+ templateArray[0]["fld"].Value().Should().Be("username");
+
+
+ //Now test error conditions....
+ //BAD FIELD NAME VALIDATION ERROR
+ d = new JObject();
+ d.Id = 3;//User type
+ //template, simple test, nothing fancy
+ dTemplateArray = new JArray();
+ df = new JObject();
+ df.fld = "DOES_NOT_EXIST";//<-- ERROR BAD FIELD NAME
+ dTemplateArray.Add(df);
+ d.Template = dTemplateArray.ToString(Newtonsoft.Json.Formatting.None);
+ a = await Util.PostAsync("PickList/Template", await Util.GetTokenAsync("BizAdminFull"), d.ToString(Newtonsoft.Json.Formatting.None));
+ //"{\"error\":{\"code\":\"2200\",\"details\":[{\"message\":\"Template array item 0, fld property value \\\"DOES_NOT_EXIST\\\" is not a valid value for AyaType specified\",\"target\":\"Template\",\"error\":\"2203\"}],\"message\":\"Object did not pass validation\"}}"
+ Util.ValidateErrorCodeResponse(a, 2200, 400);
+ Util.ShouldContainValidationError(a, "Template", "2203");
+
+ //BAD AYATYPE ERROR
+ d = new JObject();
+ d.Id = 0;//<==ERROR NO_TYPE, INVALID
+ //template, simple test, nothing fancy
+ dTemplateArray = new JArray();
+ df = new JObject();
+ df.fld = "useremployeenumber";
+ dTemplateArray.Add(df);
+ d.Template = dTemplateArray.ToString(Newtonsoft.Json.Formatting.None);
+ //replace the User template at the server
+ a = await Util.PostAsync("PickList/Template", await Util.GetTokenAsync("BizAdminFull"), d.ToString(Newtonsoft.Json.Formatting.None));
+ //"{\"error\":{\"code\":\"2200\",\"details\":[{\"message\":\"Template array item 0, fld property value \\\"DOES_NOT_EXIST\\\" is not a valid value for AyaType specified\",\"target\":\"Template\",\"error\":\"2203\"}],\"message\":\"Object did not pass validation\"}}"
+ Util.ValidateErrorCodeResponse(a, 2200, 400);
+ Util.ShouldContainValidationError(a, "ayaType", "2203");
+
+ //RIGHTS ISSUE,
+ //currently only bizadminfull can change a picklist template
+ d = new JObject();
+ d.Id = 3;//User
+ //template, simple test, nothing fancy
+ dTemplateArray = new JArray();
+ df = new JObject();
+ df.fld = "useremployeenumber";
+ dTemplateArray.Add(df);
+ d.Template = dTemplateArray.ToString(Newtonsoft.Json.Formatting.None);
+ //ERROR NO RIGHTS USER
+ a = await Util.PostAsync("PickList/Template", await Util.GetTokenAsync("CustomerLimited"), d.ToString(Newtonsoft.Json.Formatting.None));
+ //"{\"error\":{\"code\":\"2004\",\"message\":\"User not authorized for this resource operation (insufficient rights)\"}}"
+ Util.ValidateErrorCodeResponse(a, 2004, 403);
+
+ //EMPTY TEMPLATE VALIDATION ERROR
+ d = new JObject();
+ d.Id = 3;//User
+ d.Template = "";//<-- ERROR no template
+ a = await Util.PostAsync("PickList/Template", await Util.GetTokenAsync("BizAdminFull"), d.ToString(Newtonsoft.Json.Formatting.None));
+ Util.ValidateErrorCodeResponse(a, 2200, 400);
+ Util.ShouldContainValidationError(a, "Template", "2201");
+
+
+ //MALFORMED TEMPLATE JSON ERROR
+ d = new JObject();
+ d.Id = 3;//User type
+ dTemplateArray = new JArray();
+ df = new JObject();
+ df.fld = "useremployeenumber";
+ dTemplateArray.Add(df);
+ string sTemplate = dTemplateArray.ToString(Newtonsoft.Json.Formatting.None);
+ d.Template = sTemplate.Substring(2);//<-- ERROR missing first two characters of json template array
+ a = await Util.PostAsync("PickList/Template", await Util.GetTokenAsync("BizAdminFull"), d.ToString(Newtonsoft.Json.Formatting.None));
+ //"{\"error\":{\"code\":\"2200\",\"details\":[{\"message\":\"Template is not valid JSON string: Error reading JArray from JsonReader. Current JsonReader item is not an array: String. Path '', line 1, position 5.\",\"target\":\"Template\",\"error\":\"2203\"}],\"message\":\"Object did not pass validation\"}}"
+ Util.ValidateErrorCodeResponse(a, 2200, 400);
+ Util.ShouldContainValidationError(a, "Template", "2203");
+
+ }
+
+
+
+
+
+
+
+ //==================================================
+
+ }//eoc
+}//eons