diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..8a3f0fd
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,28 @@
+{
+ // Use IntelliSense to find out which attributes exist for C# debugging
+ // Use hover for the description of the existing attributes
+ // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": ".NET Core Launch (console)",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "build",
+ // If you have changed target frameworks, make sure to update the program path.
+ "program": "${workspaceFolder}/bin/Debug/netcoreapp2.0/raven-integration.dll",
+ "args": [],
+ "cwd": "${workspaceFolder}",
+ // For more information about the 'console' field, see https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#console-terminal-window
+ "console": "internalConsole",
+ "stopAtEntry": false,
+ "internalConsoleOptions": "openOnSessionStart"
+ },
+ {
+ "name": ".NET Core Attach",
+ "type": "coreclr",
+ "request": "attach",
+ "processId": "${command:pickProcess}"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..c2aabc7
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "editor.codeLens": true
+}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..51afd6a
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,15 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "taskName": "build",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "build",
+ "${workspaceFolder}/raven-integration.csproj"
+ ],
+ "problemMatcher": "$msCompile"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/ApiResponse.cs b/ApiResponse.cs
new file mode 100644
index 0000000..b626901
--- /dev/null
+++ b/ApiResponse.cs
@@ -0,0 +1,13 @@
+using System.Net.Http;
+using Newtonsoft.Json.Linq;
+
+namespace raven_integration
+{
+ public class ApiResponse
+ {
+ public HttpResponseMessage HttpResponse {get;set;}
+ public JObject ObjectResponse {get;set;}
+
+
+ }//eoc
+}//eons
\ No newline at end of file
diff --git a/ApiTextResponse.cs b/ApiTextResponse.cs
new file mode 100644
index 0000000..6cad35a
--- /dev/null
+++ b/ApiTextResponse.cs
@@ -0,0 +1,13 @@
+using System.Net.Http;
+using Newtonsoft.Json.Linq;
+
+namespace raven_integration
+{
+ public class ApiTextResponse
+ {
+ public HttpResponseMessage HttpResponse {get;set;}
+ public string TextResponse {get;set;}
+
+
+ }//eoc
+}//eons
\ No newline at end of file
diff --git a/Attachments/AttachmentTest.cs b/Attachments/AttachmentTest.cs
new file mode 100644
index 0000000..bc77b88
--- /dev/null
+++ b/Attachments/AttachmentTest.cs
@@ -0,0 +1,182 @@
+using System;
+using Xunit;
+using Newtonsoft.Json.Linq;
+using FluentAssertions;
+using System.Collections.Generic;
+using System.Collections.Concurrent;
+using System.Net.Http;
+using System.Net.Http.Headers;
+using System.IO;
+
+namespace raven_integration
+{
+ //https://stackoverflow.com/questions/17725882/testing-asp-net-web-api-multipart-form-data-file-upload
+ public class AttachmentTest
+ {
+ ///
+ /// test attach CRUD
+ ///
+ [Fact]
+ public async void AttachmentUploadDownloadDeleteShouldWork()
+ {
+
+ //////////////////////////////////////////
+ //// Upload the files
+ MultipartFormDataContent formDataContent = new MultipartFormDataContent();
+
+ //Form data like the bizobject type and id
+ formDataContent.Add(new StringContent("2"), name: "AttachToObjectType");
+ formDataContent.Add(new StringContent("1"), name: "AttachToObjectId");
+ //or if testing non-existant this is probably safe: long.MaxValue
+
+
+ StreamContent file1 = new StreamContent(File.OpenRead($"{Util.TEST_DATA_FOLDER}\\test.png"));
+ file1.Headers.ContentType = new MediaTypeHeaderValue("image/png");
+ file1.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data");
+ file1.Headers.ContentDisposition.FileName = "test.png";
+ formDataContent.Add(file1);
+ StreamContent file2 = new StreamContent(File.OpenRead($"{Util.TEST_DATA_FOLDER}\\test.zip"));
+ file2.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
+ file2.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data");
+ file2.Headers.ContentDisposition.FileName = "test.zip";
+ formDataContent.Add(file2);
+
+ //create via inventory full test user as attachments use the role of the object attaching to
+ ApiResponse a = await Util.PostFormDataAsync("Attachment", formDataContent, await Util.GetTokenAsync("InventoryFull"));
+
+
+ Util.ValidateDataReturnResponseOk(a);
+
+
+ long lTestPngAttachmentId = a.ObjectResponse["data"][0]["id"].Value();
+ long lTestZipAttachmentId = a.ObjectResponse["data"][1]["id"].Value();
+
+ //saw negative values on a db issue that I corrected (I think)
+ //Keeping these in case it arises again, if it does, see log, it's a db error with async issue of some kind
+ lTestPngAttachmentId.Should().BePositive();
+ lTestZipAttachmentId.Should().BePositive();
+
+ //////////////////////////////////////////
+ //// DOWNLOAD: Get the file attachment
+
+ //Get the inventoryfull account download token
+ // {
+ // "data": {
+ // "dlkey": "w7iE1cXF8kOxo8eomd1r8A",
+ // "expires": "2018-04-25T23:45:39.05665"
+ // }
+ // }
+ a = await Util.GetAsync("Attachment/DownloadToken", await Util.GetTokenAsync("InventoryFull"));
+ Util.ValidateDataReturnResponseOk(a);
+ string downloadToken = a.ObjectResponse["data"]["dlkey"].Value();
+
+ //now get the file https://rockfish.ayanova.com/api/rfcaseblob/download/248?dlkey=9O2eDAAlZ0Wknj19SBK2iA
+ var dlresponse = await Util.DownloadFileAsync("Attachment/Download/" + lTestZipAttachmentId.ToString() + "?dlkey=" + downloadToken, await Util.GetTokenAsync("InventoryFull"));
+
+ //ensure it's the zip file we expected
+ dlresponse.Content.Headers.ContentDisposition.FileName.Should().Be("test.zip");
+ dlresponse.Content.Headers.ContentLength.Should().BeGreaterThan(2000);
+
+
+ //////////////////////////////////////////
+ //// DELETE: Delete the file attachments
+ ApiResponse d = await Util.DeleteAsync("Attachment/" + lTestPngAttachmentId.ToString(), await Util.GetTokenAsync("InventoryFull"));
+ Util.ValidateHTTPStatusCode(d, 204);
+
+ d = await Util.DeleteAsync("Attachment/" + lTestZipAttachmentId.ToString(), await Util.GetTokenAsync("InventoryFull"));
+ Util.ValidateHTTPStatusCode(d, 204);
+
+
+ }
+
+
+
+ ///
+ /// test no rights
+ ///
+ [Fact]
+ public async void NoRightsTest()
+ {
+
+ MultipartFormDataContent formDataContent = new MultipartFormDataContent();
+
+ formDataContent.Add(new StringContent("2"), name: "AttachToObjectType");
+ formDataContent.Add(new StringContent("1"), name: "AttachToObjectId");
+
+ StreamContent file1 = new StreamContent(File.OpenRead($"{Util.TEST_DATA_FOLDER}\\test.png"));
+ file1.Headers.ContentType = new MediaTypeHeaderValue("image/png");
+ file1.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data");
+ file1.Headers.ContentDisposition.FileName = "test.png";
+ formDataContent.Add(file1);
+
+ //ERROR CONDITION: BizAdminLimited user should not be able to attach a file to a widget
+ ApiResponse a = await Util.PostFormDataAsync("Attachment", formDataContent, await Util.GetTokenAsync("BizAdminLimited"));
+
+ //2004 unauthorized
+ Util.ValidateErrorCodeResponse(a, 2004, 401);
+
+ }
+
+
+ ///
+ /// test not attachable
+ ///
+ [Fact]
+ public async void UnattachableTest()
+ {
+ MultipartFormDataContent formDataContent = new MultipartFormDataContent();
+
+ //Form data bizobject type and id
+
+ //HERE IS THE ERROR CONDITION: LICENSE TYPE OBJECT WHICH IS UNATTACHABLE
+ formDataContent.Add(new StringContent("5"), name: "AttachToObjectType");
+ formDataContent.Add(new StringContent("1"), name: "AttachToObjectId");
+
+ StreamContent file1 = new StreamContent(File.OpenRead($"{Util.TEST_DATA_FOLDER}\\test.png"));
+ file1.Headers.ContentType = new MediaTypeHeaderValue("image/png");
+ file1.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data");
+ file1.Headers.ContentDisposition.FileName = "test.png";
+ formDataContent.Add(file1);
+ ApiResponse a = await Util.PostFormDataAsync("Attachment", formDataContent, await Util.GetTokenAsync("InventoryFull"));
+
+ //2203 unattachable object
+ Util.ValidateErrorCodeResponse(a, 2203, 400);
+
+ }
+
+
+ ///
+ /// test bad object values
+ ///
+ [Fact]
+ public async void BadObject()
+ {
+ MultipartFormDataContent formDataContent = new MultipartFormDataContent();
+
+ //Form data like the bizobject type and id
+ formDataContent.Add(new StringContent("2"), name: "AttachToObjectType");
+
+ //HERE IS THE ERROR CONDITION, A NON EXISTENT ID VALUE FOR THE WIDGET
+ formDataContent.Add(new StringContent(long.MaxValue.ToString()), name: "AttachToObjectId");//non-existent widget
+
+ StreamContent file1 = new StreamContent(File.OpenRead($"{Util.TEST_DATA_FOLDER}\\test.png"));
+ file1.Headers.ContentType = new MediaTypeHeaderValue("image/png");
+ file1.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data");
+ file1.Headers.ContentDisposition.FileName = "test.png";
+ formDataContent.Add(file1);
+ ApiResponse a = await Util.PostFormDataAsync("Attachment", formDataContent, await Util.GetTokenAsync("InventoryFull"));
+
+ //2203 invalid attachment object
+ Util.ValidateErrorCodeResponse(a, 2203, 400);
+
+ }
+
+
+
+
+
+
+ //==================================================
+
+ }//eoc
+}//eons
diff --git a/Authentication/Auth.cs b/Authentication/Auth.cs
new file mode 100644
index 0000000..9e9233f
--- /dev/null
+++ b/Authentication/Auth.cs
@@ -0,0 +1,36 @@
+using System;
+using Xunit;
+using Newtonsoft.Json.Linq;
+using FluentAssertions;
+
+namespace raven_integration
+{
+
+ public class Auth
+ {
+ ///
+ ///
+ ///
+ [Fact]
+ public async void BadLoginShouldNotWork()
+ {
+ //Expect status code 401 and result:
+ // {{
+ // "error": {
+ // "code": "2003",
+ // "message": "Authentication failed"
+ // }
+ // }}
+
+ dynamic d = new JObject();
+ d.login = "BOGUS";
+ d.password = "ACCOUNT";
+ ApiResponse a = await Util.PostAsync("Auth", null, d.ToString());
+ Util.ValidateErrorCodeResponse(a,2003,401);
+ }
+
+ //==================================================
+
+ }//eoc
+}//eons
+
diff --git a/AutoId.cs b/AutoId.cs
new file mode 100644
index 0000000..676fef9
--- /dev/null
+++ b/AutoId.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Threading.Tasks;
+namespace raven_integration
+{
+ public class AutoId
+ {
+ private readonly object valueLock = new object();
+ private uint currentValue; //postgre bigint
+
+ public AutoId(uint initialValue)
+ {
+ currentValue = initialValue;
+ }
+
+ public uint GetNext()
+ {
+ lock (valueLock)
+ {
+ currentValue += 1;
+ if (currentValue == 0)
+ currentValue += 1;
+ return currentValue;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AyaType/AyaType.cs b/AyaType/AyaType.cs
new file mode 100644
index 0000000..17a2d86
--- /dev/null
+++ b/AyaType/AyaType.cs
@@ -0,0 +1,36 @@
+using System;
+using Xunit;
+using Newtonsoft.Json.Linq;
+using FluentAssertions;
+using System.Collections.Generic;
+using System.Collections.Concurrent;
+
+namespace raven_integration
+{
+
+ public class AyaType
+ {
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void AyaTypeListShouldWork()
+ {
+ ApiResponse a = await Util.GetAsync("AyaType");
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+ //there should be at least 8 of them (at time of writing late March 2018)
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterOrEqualTo(8);
+
+ //Number 2 is widget and list is zero based so confirm:
+ a.ObjectResponse["data"][2]["id"].Value().Should().Be(2);
+ a.ObjectResponse["data"][2]["name"].Value().Should().Be("Widget [Attachable]");
+
+ }
+
+
+ //==================================================
+
+ }//eoc
+}//eons
diff --git a/DataFilter/DataFilterCrud.cs b/DataFilter/DataFilterCrud.cs
new file mode 100644
index 0000000..d337fd1
--- /dev/null
+++ b/DataFilter/DataFilterCrud.cs
@@ -0,0 +1,176 @@
+using System;
+using Xunit;
+using Newtonsoft.Json.Linq;
+using FluentAssertions;
+using System.Collections.Generic;
+using System.Collections.Concurrent;
+
+namespace raven_integration
+{
+
+ public class DataFilterCrud
+ {
+
+ ///
+ /// Test all CRUD routes
+ ///
+ [Fact]
+ public async void CRUD()
+ {
+ //CREATE
+ dynamic d = new JObject();
+ d.name = Util.Uniquify("Test DataFilter");
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ //"[{fld:"name",op:"!=",value:"Notequaltothis"},{fld:"tags",op:"Eq",value:"[23,456,54]"}]
+ dynamic dfilter = new JArray();
+ dynamic df = new JObject();
+ df.fld = "name";
+ df.op = "%-";
+ df.value = "Generic";//lots of seed widgets start with Generic
+ dfilter.Add(df);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ ApiResponse a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long Id = a.ObjectResponse["data"]["id"].Value();
+
+
+ //RETRIEVE
+ //Get one
+ a = await Util.GetAsync("DataFilter/" + Id.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateDataReturnResponseOk(a);
+ a.ObjectResponse["data"]["name"].Value().Should().StartWith("Test DataFilter");
+
+ //Get as alternate user should work for public filter
+ a = await Util.GetAsync("DataFilter/" + Id.ToString(), await Util.GetTokenAsync("SubContractorLimited"));
+ Util.ValidateDataReturnResponseOk(a);
+ a.ObjectResponse["data"]["name"].Value().Should().StartWith("Test DataFilter");
+
+
+ //UPDATE
+
+ //PUT, make private
+ d["public"] = false;
+ d.name = Util.Uniquify("Put - Test DataFilter (privatized)");
+ d.concurrencyToken = a.ObjectResponse["data"]["concurrencyToken"].Value();
+ a = await Util.PutAsync("DataFilter/" + Id.ToString(), await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //check PUT worked
+ a = await Util.GetAsync("DataFilter/" + Id.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateNoErrorInResponse(a);
+ a.ObjectResponse["data"]["name"].Value().Should().Be(d.name.ToString());
+
+
+ //FETCH DISALLOWED
+ //Get as alternate user should fail for private filter
+ a = await Util.GetAsync("DataFilter/" + Id.ToString(), await Util.GetTokenAsync("SubContractorLimited"));
+ Util.ValidateResponseNotFound(a);
+
+ // //DELETE
+ ApiResponse DELETETestResponse = await Util.DeleteAsync("DataFilter/" + Id.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(DELETETestResponse, 204);
+
+ }
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void InvalidListKeyShouldFail()
+ {
+ //CREATE
+ dynamic d = new JObject();
+ d.name = Util.Uniquify("Test DataFilter");
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "nonexistant";
+
+ //"[{fld:"name",op:"!=",value:"Notequaltothis"},{fld:"tags",op:"Eq",value:"[23,456,54]"}]
+ dynamic dfilter = new JArray();
+ dynamic df = new JObject();
+ df.fld = "name";
+ df.op = "%-";
+ df.value = "Generic";//lots of seed widgets start with Generic
+ dfilter.Add(df);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ ApiResponse a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateErrorCodeResponse(a, 2200, 400);
+ Util.ShouldContainValidationError(a, "ListKey", "InvalidValue");
+
+ }
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void InvalidFieldNameShouldFail()
+ {
+ //CREATE
+ dynamic d = new JObject();
+ d.name = Util.Uniquify("Test DataFilter");
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ //"[{fld:"name",op:"!=",value:"Notequaltothis"},{fld:"tags",op:"Eq",value:"[23,456,54]"}]
+ dynamic dfilter = new JArray();
+ dynamic df = new JObject();
+ df.fld = "doesntexist";
+ df.op = "%-";
+ df.value = "Generic";//lots of seed widgets start with Generic
+ dfilter.Add(df);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ ApiResponse a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateErrorCodeResponse(a, 2200, 400);
+ Util.ShouldContainValidationError(a, "Filter", "InvalidValue");
+
+ }
+
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void InvalidOperatorShouldFail()
+ {
+ //CREATE
+ dynamic d = new JObject();
+ d.name = Util.Uniquify("Test DataFilter");
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ //"[{fld:"name",op:"!=",value:"Notequaltothis"},{fld:"tags",op:"Eq",value:"[23,456,54]"}]
+ dynamic dfilter = new JArray();
+ dynamic df = new JObject();
+ df.fld = "name";
+ df.op = "wtf";
+ df.value = "Generic";//lots of seed widgets start with Generic
+ dfilter.Add(df);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ ApiResponse a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateErrorCodeResponse(a, 2200, 400);
+ Util.ShouldContainValidationError(a, "Filter", "InvalidValue");
+
+ }
+
+
+
+ //==================================================
+
+ }//eoc
+}//eons
diff --git a/DataFilter/DataFilterFilteringLists.cs b/DataFilter/DataFilterFilteringLists.cs
new file mode 100644
index 0000000..cb0c267
--- /dev/null
+++ b/DataFilter/DataFilterFilteringLists.cs
@@ -0,0 +1,6237 @@
+using System;
+using Xunit;
+using Newtonsoft.Json.Linq;
+using FluentAssertions;
+using System.Collections.Generic;
+using System.Collections.Concurrent;
+
+namespace raven_integration
+{
+
+
+ /*
+
+ EVERY TYPE, EVERY OP
+
+ Using the widget object test all filtering options
+ for all data types, all operation types
+
+ This is the supertest to always confirm the filtering code is working as expected.
+
+
+ */
+
+ public class DataFilterFilteringLists
+ {
+
+
+
+
+
+
+ ///////////////////////////////////////////////////////////////////////////////
+ //DATE
+ //
+
+ #region DATE FILTER TESTS
+
+ public const string TokenYesterday = "{[yesterday]}";
+ public const string TokenToday = "{[today]}";
+ public const string TokenTomorrow = "{[tomorrow]}";
+ public const string TokenLastWeek = "{[lastweek]}";
+ public const string TokenThisWeek = "{[thisweek]}";
+ public const string TokenNextWeek = "{[nextweek]}";
+ public const string TokenLastMonth = "{[lastmonth]}";
+ public const string TokenThisMonth = "{[thismonth]}";
+ public const string TokenNextMonth = "{[nextmonth]}";
+ public const string TokenFourteenDayWindow = "{[14daywindow]}";
+ public const string TokenPast = "{[past]}";
+ public const string TokenFuture = "{[future]}";
+ public const string TokenLastYear = "{[lastyear]}";
+ public const string TokenThisYear = "{[thisyear]}";
+ public const string TokenInTheLast3Months = "{[last3months]}";
+ public const string TokenInTheLast6Months = "{[last6months]}";
+ public const string TokenInTheLastYear = "{[lastcalendaryear]}";
+
+ //More business time frames
+
+ public const string TokenYearToDate = "{[yeartodate]}";
+
+ public const string TokenPast90Days = "{[past90days]}";
+ public const string TokenPast30Days = "{[past30days]}";
+ public const string TokenPast24Hours = "{[past24hours]}";
+
+
+
+
+ #region DATE REGULAR FILTERS
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateOpEqualityFilterWorks()
+ {
+
+ var WidgetNameStart = "DateOpEqualityFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = new DateTime(1968, 3, 12, 10, 0, 0).ToUniversalTime();
+ w.endDate = new DateTime(1968, 3, 12, 11, 0, 0).ToUniversalTime();
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = new DateTime(1968, 3, 10, 10, 0, 0).ToUniversalTime();
+ w.endDate = new DateTime(1968, 3, 10, 11, 0, 0).ToUniversalTime();
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = new DateTime(1968, 3, 12, 10, 0, 0).ToUniversalTime();
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ }
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateOpGreaterThanFilterWorks()
+ {
+
+ var WidgetNameStart = "DateOpGreaterThanFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = new DateTime(1970, 3, 12, 10, 0, 0).ToUniversalTime();
+ w.endDate = new DateTime(1970, 3, 12, 11, 0, 0).ToUniversalTime();
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = new DateTime(1968, 3, 10, 10, 0, 0).ToUniversalTime();
+ w.endDate = new DateTime(1968, 3, 10, 11, 0, 0).ToUniversalTime();
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpGreaterThan;
+ FilterItem.value = new DateTime(1970, 3, 12, 9, 0, 0).ToUniversalTime();
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateOpGreaterThanOrEqualToFilterWorks()
+ {
+
+ var WidgetNameStart = "DateOpGreaterThanOrEqualToFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = new DateTime(1970, 3, 12, 10, 0, 0).ToUniversalTime();
+ w.endDate = new DateTime(1970, 3, 12, 11, 0, 0).ToUniversalTime();
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = new DateTime(1968, 3, 10, 10, 0, 0).ToUniversalTime();
+ w.endDate = new DateTime(1968, 3, 10, 11, 0, 0).ToUniversalTime();
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpGreaterThanOrEqualTo;
+ FilterItem.value = new DateTime(1970, 3, 12, 10, 0, 0).ToUniversalTime();
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateOpLessThanFilterWorks()
+ {
+
+ var WidgetNameStart = "DateOpLessThanFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = new DateTime(1970, 3, 12, 10, 0, 0).ToUniversalTime();
+ w.endDate = new DateTime(1970, 3, 12, 11, 0, 0).ToUniversalTime();
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = new DateTime(1970, 4, 10, 10, 0, 0).ToUniversalTime();
+ w.endDate = new DateTime(1970, 4, 10, 11, 0, 0).ToUniversalTime();
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpLessThan;
+ FilterItem.value = new DateTime(1970, 3, 12, 11, 0, 0).ToUniversalTime();
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateOpLessThanOrEqualToFilterWorks()
+ {
+
+ var WidgetNameStart = "DateOpLessThanOrEqualToFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = new DateTime(1970, 3, 12, 10, 0, 0).ToUniversalTime();
+ w.endDate = new DateTime(1970, 3, 12, 11, 0, 0).ToUniversalTime();
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = new DateTime(1970, 4, 10, 10, 0, 0).ToUniversalTime();
+ w.endDate = new DateTime(1970, 4, 10, 11, 0, 0).ToUniversalTime();
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpLessThanOrEqualTo;
+ FilterItem.value = new DateTime(1970, 3, 12, 10, 0, 0).ToUniversalTime();
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateOpNotEqualToFilterWorks()
+ {
+
+ var WidgetNameStart = "DateOpNotEqualToFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = new DateTime(1970, 3, 12, 10, 0, 0).ToUniversalTime();
+ w.endDate = new DateTime(1970, 3, 12, 11, 0, 0).ToUniversalTime();
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = new DateTime(1970, 4, 10, 10, 0, 0).ToUniversalTime();
+ w.endDate = new DateTime(1970, 4, 10, 11, 0, 0).ToUniversalTime();
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpNotEqual;
+ FilterItem.value = new DateTime(1970, 4, 10, 10, 0, 0).ToUniversalTime();
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenYesterdayFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenYesterdayFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = DateTime.UtcNow.AddDays(-1);
+ w.endDate = DateTime.UtcNow.AddHours(1).AddDays(-1);
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = DateTime.UtcNow;
+ w.endDate = DateTime.UtcNow.AddHours(1);
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenYesterday;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenTodayFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenTodayFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = DateTime.UtcNow;
+ w.endDate = DateTime.UtcNow.AddHours(1);
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = DateTime.UtcNow.AddDays(-1);
+ w.endDate = DateTime.UtcNow.AddHours(1).AddDays(-1);
+
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenToday;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenTomorrowFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenTomorrowFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = DateTime.UtcNow.AddDays(1);
+ w.endDate = DateTime.UtcNow.AddDays(1).AddHours(1);
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = DateTime.UtcNow;
+ w.endDate = DateTime.UtcNow.AddHours(1);
+
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenTomorrow;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenLastWeekFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenLastWeekFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ //My theory is any date - 7 days is last week if you go sunday to sunday
+ w.startDate = DateTime.UtcNow.AddDays(-7);
+ w.endDate = DateTime.UtcNow.AddHours(1).AddDays(-7);
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = DateTime.UtcNow;
+ w.endDate = DateTime.UtcNow.AddHours(1);
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenLastWeek;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenThisWeekFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenThisWeekFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = DateTime.UtcNow;
+ w.endDate = DateTime.UtcNow.AddHours(1);
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ //My theory is any date - 7 days is last week if you go sunday to sunday
+ w.startDate = DateTime.UtcNow.AddDays(-7);
+ w.endDate = DateTime.UtcNow.AddHours(1).AddDays(-7);
+
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenThisWeek;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenNextWeekFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenNextWeekFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ //My theory is any date + 7 days is next week if you go sunday to sunday
+ w.startDate = DateTime.UtcNow.AddDays(7);
+ w.endDate = DateTime.UtcNow.AddHours(1).AddDays(7);
+
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = DateTime.UtcNow;
+ w.endDate = DateTime.UtcNow.AddHours(1);
+
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenNextWeek;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenLastMonthFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenLastMonthFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ //First day of this month minus 2 days equals second to last day of last month
+ w.startDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1, 00, 00, 00).AddDays(-2).ToUniversalTime();
+ w.endDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1, 00, 00, 00).AddDays(-2).AddHours(1).ToUniversalTime();
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ //Put it right at midnight this month to ensure boundaries are respected
+ w.startDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1, 00, 00, 00).ToUniversalTime();
+ w.endDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1, 00, 00, 00).AddHours(1).ToUniversalTime();
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenLastMonth;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenThisMonthFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenThisMonthFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ //Put it right at midnight this month to ensure boundaries are respected
+ w.startDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1, 00, 00, 00).ToUniversalTime();
+ w.endDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1, 00, 00, 00).AddHours(1).ToUniversalTime();
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ //First day of this month minus 2 days equals second to last day of last month
+ w.startDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1, 00, 00, 00).AddDays(-2).ToUniversalTime();
+ w.endDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1, 00, 00, 00).AddDays(-2).AddHours(1).ToUniversalTime();
+
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenThisMonth;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenNextMonthFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenNextMonthFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ //Put it right at midnight next month to ensure boundaries are respected
+ w.startDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1, 00, 00, 00).AddMonths(1).ToUniversalTime();
+ w.endDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1, 00, 00, 00).AddMonths(1).AddHours(1).ToUniversalTime();
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ //First day of next month minus 1 second
+ w.startDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1, 00, 00, 00).AddMonths(1).AddSeconds(-1).ToUniversalTime();
+ w.endDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1, 00, 00, 00).AddMonths(1).AddSeconds(-1).AddHours(1).ToUniversalTime();
+
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenNextMonth;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ //SELECT *, xmin FROM AWIDGET where name Like 'DateTokenNextMonthFilterWorks%' AND startdate >'2019-01-01T15:59:59.0000000Z' AND startdate <'2019-02-01T16:00:00.0000000Z'
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateToken14DayWindowFilterWorks()
+ {
+
+ var WidgetNameStart = "DateToken14DayWindowFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+
+ w.startDate = DateTime.UtcNow;
+ w.endDate = DateTime.UtcNow.AddHours(1);
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ //9 days ago will be outside the 14 day window
+ w.startDate = DateTime.UtcNow.AddDays(-9);
+ w.endDate = DateTime.UtcNow.AddDays(-9).AddHours(1);
+
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenFourteenDayWindow;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenPastFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenPastFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ //Test if for the past, definitely going to be in the past when the list is fetched after saving, but will it work with the server on another machine??
+ //Best to pad in 5 minutes to be on the safe side, these days no two computers on earth should be out by more than 5 minutes to UTC from each other
+ w.startDate = DateTime.UtcNow.AddMinutes(-5);
+ w.endDate = DateTime.UtcNow.AddMinutes(-5).AddHours(1);
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ //8 days ago will be outside the 14 day window
+ w.startDate = DateTime.UtcNow.AddMonths(1);
+ w.endDate = DateTime.UtcNow.AddMonths(1).AddHours(1);
+
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenPast;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenFutureFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenFutureFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ //####
+ w.startDate = DateTime.UtcNow.AddMinutes(5);
+ w.endDate = DateTime.UtcNow.AddMinutes(5).AddHours(1);
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ //####
+ w.startDate = DateTime.UtcNow;
+ w.endDate = DateTime.UtcNow.AddHours(1);
+
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenFuture;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenLastYearFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenLastYearFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ //####
+ w.startDate = DateTime.UtcNow.AddYears(-1).AddMinutes(-5);
+ w.endDate = DateTime.UtcNow.AddYears(-1).AddMinutes(-5).AddHours(1);
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ //####
+ w.startDate = DateTime.UtcNow;
+ w.endDate = DateTime.UtcNow.AddHours(1);
+
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenLastYear;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenThisYearFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenThisYearFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ //####
+ w.startDate = DateTime.UtcNow;
+ w.endDate = DateTime.UtcNow.AddHours(1);
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ //####
+ w.startDate = DateTime.UtcNow.AddYears(-1).AddMinutes(-5);
+ w.endDate = DateTime.UtcNow.AddYears(-1).AddMinutes(-5).AddHours(1);
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenThisYear;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenInTheLast3MonthsFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenInTheLast3MonthsFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ //####
+ w.startDate = DateTime.UtcNow.AddMonths(-3).AddMinutes(5);
+ w.endDate = DateTime.UtcNow.AddMonths(-3).AddMinutes(5).AddHours(1);
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ //####
+ w.startDate = DateTime.UtcNow.AddMonths(-3).AddMinutes(-5);
+ w.endDate = DateTime.UtcNow.AddMonths(-3).AddMinutes(-5).AddHours(1);
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenInTheLast3Months;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenInTheLast6MonthsFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenInTheLast6MonthsFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ //####
+ w.startDate = DateTime.UtcNow.AddMonths(-6).AddMinutes(5);
+ w.endDate = DateTime.UtcNow.AddMonths(-6).AddMinutes(5).AddHours(1);
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ //####
+ w.startDate = DateTime.UtcNow.AddMonths(-6).AddMinutes(-5);
+ w.endDate = DateTime.UtcNow.AddMonths(-6).AddMinutes(-5).AddHours(1);
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenInTheLast6Months;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenInTheLastYearFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenInTheLastYearFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //CREATE TEST WIDGETS
+
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ //####
+ w.startDate = DateTime.UtcNow.AddDays(-365).AddMinutes(5);
+ w.endDate = DateTime.UtcNow.AddDays(-365).AddMinutes(5).AddHours(1);
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ //####
+ w.startDate = DateTime.UtcNow.AddDays(-365).AddMinutes(-5);
+ w.endDate = DateTime.UtcNow.AddDays(-365).AddMinutes(-5).AddHours(1);
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = TokenInTheLastYear;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+ #endregion DATE REGULAR FILTERS
+
+ #region DATE TOKEN FILTERS
+
+
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenYearToDateFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenYearToDateFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //BUILD DATES FOR THIS TEST
+
+ DateTime InclusiveStartDate;
+ DateTime ExclusiveStartDate;
+
+ //##################################################################################
+ var FilterToken = TokenYearToDate;
+ InclusiveStartDate = new DateTime(DateTime.Now.Year, 1, 1, 00, 5, 00).ToUniversalTime();
+ ExclusiveStartDate = new DateTime(DateTime.Now.Year - 1, 4, 1, 00, 5, 00).ToUniversalTime();
+ //##################################################################################
+
+
+ DateTime InclusiveEndDate = InclusiveStartDate.AddHours(1);
+ DateTime ExclusiveEndDate = ExclusiveStartDate.AddHours(1);
+
+ //CREATE TEST WIDGETS
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = InclusiveStartDate;
+ w.endDate = InclusiveEndDate;
+
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = ExclusiveStartDate;
+ w.endDate = ExclusiveEndDate;
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = FilterToken;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenPast90DaysFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenPast90DaysFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //BUILD DATES FOR THIS TEST
+
+ DateTime InclusiveStartDate;
+ DateTime ExclusiveStartDate;
+
+ //##################################################################################
+ var FilterToken = TokenPast90Days;
+ InclusiveStartDate = DateTime.UtcNow.AddDays(-90).AddMinutes(5).ToUniversalTime();
+ ExclusiveStartDate = DateTime.UtcNow.AddDays(-90).AddMinutes(-5).ToUniversalTime();
+ //##################################################################################
+
+
+ DateTime InclusiveEndDate = InclusiveStartDate.AddHours(1);
+ DateTime ExclusiveEndDate = ExclusiveStartDate.AddHours(1);
+
+ //CREATE TEST WIDGETS
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = InclusiveStartDate;
+ w.endDate = InclusiveEndDate;
+
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = ExclusiveStartDate;
+ w.endDate = ExclusiveEndDate;
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = FilterToken;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenPast30DaysFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenPast30DaysFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //BUILD DATES FOR THIS TEST
+
+ DateTime InclusiveStartDate;
+ DateTime ExclusiveStartDate;
+
+ //##################################################################################
+ var FilterToken = TokenPast30Days;
+ InclusiveStartDate = DateTime.UtcNow.AddDays(-30).AddMinutes(5).ToUniversalTime();
+ ExclusiveStartDate = DateTime.UtcNow.AddDays(-30).AddMinutes(-5).ToUniversalTime();
+ //##################################################################################
+
+
+ DateTime InclusiveEndDate = InclusiveStartDate.AddHours(1);
+ DateTime ExclusiveEndDate = ExclusiveStartDate.AddHours(1);
+
+ //CREATE TEST WIDGETS
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = InclusiveStartDate;
+ w.endDate = InclusiveEndDate;
+
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = ExclusiveStartDate;
+ w.endDate = ExclusiveEndDate;
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = FilterToken;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void DateTokenPast24HoursFilterWorks()
+ {
+
+ var WidgetNameStart = "DateTokenPast24HoursFilterWorks";
+
+ long IncludedWidgetId = 0;
+ long ExcludedWidgetId = 0;
+
+ //BUILD DATES FOR THIS TEST
+
+ DateTime InclusiveStartDate;
+ DateTime ExclusiveStartDate;
+
+ //##################################################################################
+ var FilterToken = TokenPast24Hours;
+ InclusiveStartDate = DateTime.UtcNow.AddHours(-24).AddMinutes(5).ToUniversalTime();
+ ExclusiveStartDate = DateTime.UtcNow.AddHours(-24).AddMinutes(-5).ToUniversalTime();
+ //##################################################################################
+
+
+ DateTime InclusiveEndDate = InclusiveStartDate.AddHours(1);
+ DateTime ExclusiveEndDate = ExclusiveStartDate.AddHours(1);
+
+ //CREATE TEST WIDGETS
+ //included widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = InclusiveStartDate;
+ w.endDate = InclusiveEndDate;
+
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ IncludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //Excluded widget
+ w.name = Util.Uniquify(WidgetNameStart);
+ w.startDate = ExclusiveStartDate;
+ w.endDate = ExclusiveEndDate;
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExcludedWidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //## INCLUSIVE FILTER
+ dynamic FilterItem = new JObject();
+ FilterItem.fld = "startdate";
+ FilterItem.op = Util.OpEquality;
+ FilterItem.value = FilterToken;
+ dfilter.Add(FilterItem);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least this test record
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(0);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (IncludedWidgetId == o["id"].Value())
+ InclusiveMatchCount++;
+ if (ExcludedWidgetId == o["id"].Value())//whups
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().BeGreaterOrEqualTo(1);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ a = await Util.DeleteAsync("Widget/" + IncludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+ a = await Util.DeleteAsync("Widget/" + ExcludedWidgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+ #endregion date token filters
+ //========
+
+ #endregion date filter tests
+
+
+
+ ///////////////////////////////////////////////////////////////////////////////
+ //TEXT
+ //
+
+ #region STRING FILTER TESTS
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void TextOpEqualityFilterWorks()
+ {
+
+ var TestName = "TextOpEqualityFilterWorks";
+ var WidgetRunNameStart = Util.Uniquify(TestName);
+
+ List InclusiveWidgetIdList = new List();
+ List ExclusiveWidgetIdList = new List();
+
+ //CREATE 4 TEST WIDGETS
+ //two inclusive and two not inclusive
+
+ //first inclusive widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetRunNameStart);
+ w.notes = "aardvark";
+ w.roles = 0;
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ InclusiveWidgetIdList.Add(a.ObjectResponse["data"]["id"].Value());
+
+ //second inclusive widget
+ w.name = Util.Uniquify(WidgetRunNameStart);
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ InclusiveWidgetIdList.Add(a.ObjectResponse["data"]["id"].Value());
+
+ //first exclusive widget
+ w.name = Util.Uniquify(WidgetRunNameStart);
+ w.notes = "zebra";
+ w.active = false;
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExclusiveWidgetIdList.Add(a.ObjectResponse["data"]["id"].Value());
+
+ //second exclusive widget
+ w.name = Util.Uniquify(WidgetRunNameStart);
+ w.active = false;
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExclusiveWidgetIdList.Add(a.ObjectResponse["data"]["id"].Value());
+
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetRunNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetRunNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //active bool test filter
+ dynamic DataFilterActive = new JObject();
+ DataFilterActive.fld = "notes";
+ DataFilterActive.op = Util.OpEquality;
+ DataFilterActive.value = "aardvark";
+ dfilter.Add(DataFilterActive);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least two records
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(1);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (InclusiveWidgetIdList.Contains(o["id"].Value()))
+ InclusiveMatchCount++;
+ if (ExclusiveWidgetIdList.Contains(o["id"].Value()))
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().Be(InclusiveWidgetIdList.Count);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ foreach (long l in InclusiveWidgetIdList)
+ {
+ a = await Util.DeleteAsync("Widget/" + l.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+ foreach (long l in ExclusiveWidgetIdList)
+ {
+ a = await Util.DeleteAsync("Widget/" + l.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+
+
+ ///
+ /// Specifically test a string with an apostrophe in it (for inclusive)
+ ///
+ [Fact]
+ public async void TextApostropheOpEqualityFilterWorks()
+ {
+
+ var TestName = "TextApostropheOpEqualityFilterWorks";
+ var WidgetRunNameStart = Util.Uniquify(TestName);
+
+ List InclusiveWidgetIdList = new List();
+ List ExclusiveWidgetIdList = new List();
+
+ //CREATE 4 TEST WIDGETS
+ //two inclusive and two not inclusive
+
+ //first inclusive widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetRunNameStart);
+ w.notes = "O'Flaherty's pub";
+ w.roles = 0;
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ InclusiveWidgetIdList.Add(a.ObjectResponse["data"]["id"].Value());
+
+ //second inclusive widget
+ w.name = Util.Uniquify(WidgetRunNameStart);
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ InclusiveWidgetIdList.Add(a.ObjectResponse["data"]["id"].Value());
+
+ //first exclusive widget
+ w.name = Util.Uniquify(WidgetRunNameStart);
+ w.notes = "Outback steak house";
+ w.active = false;
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExclusiveWidgetIdList.Add(a.ObjectResponse["data"]["id"].Value());
+
+ //second exclusive widget
+ w.name = Util.Uniquify(WidgetRunNameStart);
+ w.active = false;
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExclusiveWidgetIdList.Add(a.ObjectResponse["data"]["id"].Value());
+
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetRunNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetRunNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //active bool test filter
+ dynamic DataFilterActive = new JObject();
+ DataFilterActive.fld = "notes";
+ DataFilterActive.op = Util.OpEquality;
+ DataFilterActive.value = "O'Flaherty's pub";
+ dfilter.Add(DataFilterActive);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least two records
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(1);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (InclusiveWidgetIdList.Contains(o["id"].Value()))
+ InclusiveMatchCount++;
+ if (ExclusiveWidgetIdList.Contains(o["id"].Value()))
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().Be(InclusiveWidgetIdList.Count);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ foreach (long l in InclusiveWidgetIdList)
+ {
+ a = await Util.DeleteAsync("Widget/" + l.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+ foreach (long l in ExclusiveWidgetIdList)
+ {
+ a = await Util.DeleteAsync("Widget/" + l.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+ ///
+ /// specifically test a string with an ampersand character in it for inclusive (finding it)
+ ///
+ [Fact]
+ public async void TextAmpersandOpEqualityFilterWorks()
+ {
+
+ var TestName = "TextAmpersandOpEqualityFilterWorks";
+ var WidgetRunNameStart = Util.Uniquify(TestName);
+
+ List InclusiveWidgetIdList = new List();
+ List ExclusiveWidgetIdList = new List();
+
+ //CREATE 4 TEST WIDGETS
+ //two inclusive and two not inclusive
+
+ //first inclusive widget
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetRunNameStart);
+ w.notes = "Bill & Ted's excellent adventure";
+ w.roles = 0;
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ InclusiveWidgetIdList.Add(a.ObjectResponse["data"]["id"].Value());
+
+ //second inclusive widget
+ w.name = Util.Uniquify(WidgetRunNameStart);
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ InclusiveWidgetIdList.Add(a.ObjectResponse["data"]["id"].Value());
+
+ //first exclusive widget
+ w.name = Util.Uniquify(WidgetRunNameStart);
+ w.notes = "Strange things are afoot at the Circle-K";
+ w.active = false;
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExclusiveWidgetIdList.Add(a.ObjectResponse["data"]["id"].Value());
+
+ //second exclusive widget
+ w.name = Util.Uniquify(WidgetRunNameStart);
+ w.active = false;
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExclusiveWidgetIdList.Add(a.ObjectResponse["data"]["id"].Value());
+
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetRunNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetRunNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //active bool test filter
+ dynamic DataFilterActive = new JObject();
+ DataFilterActive.fld = "notes";
+ DataFilterActive.op = Util.OpEquality;
+ DataFilterActive.value = "Bill & Ted's excellent adventure";
+ dfilter.Add(DataFilterActive);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least two records
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(1);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (InclusiveWidgetIdList.Contains(o["id"].Value()))
+ InclusiveMatchCount++;
+ if (ExclusiveWidgetIdList.Contains(o["id"].Value()))
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().Be(InclusiveWidgetIdList.Count);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ foreach (long l in InclusiveWidgetIdList)
+ {
+ a = await Util.DeleteAsync("Widget/" + l.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+ foreach (long l in ExclusiveWidgetIdList)
+ {
+ a = await Util.DeleteAsync("Widget/" + l.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+ ///
+ /// specifically test a non english unicode string
+ ///
+ [Fact]
+ public async void TextUnicodeOpEqualityFilterWorks()
+ {
+
+ var TestName = "TextUnicodeOpEqualityFilterWorks";
+ var WidgetRunNameStart = Util.Uniquify(TestName);
+
+ List InclusiveWidgetIdList = new List();
+ List ExclusiveWidgetIdList = new List();
+
+ //CREATE 4 TEST WIDGETS
+ //two inclusive and two not inclusive
+
+ //first inclusive widget
+ var InclusiveTestString = "Ādam Iñtërnâtiônà ližætiøn";
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetRunNameStart);
+ w.notes = InclusiveTestString;
+ w.roles = 0;
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ InclusiveWidgetIdList.Add(a.ObjectResponse["data"]["id"].Value());
+
+ //second inclusive widget
+ w.name = Util.Uniquify(WidgetRunNameStart);
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ InclusiveWidgetIdList.Add(a.ObjectResponse["data"]["id"].Value());
+
+ //first exclusive widget
+ w.name = Util.Uniquify(WidgetRunNameStart);
+ w.notes = "Adam Internationalization";
+ w.active = false;
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExclusiveWidgetIdList.Add(a.ObjectResponse["data"]["id"].Value());
+
+ //second exclusive widget
+ w.name = Util.Uniquify(WidgetRunNameStart);
+ w.active = false;
+
+ a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ ExclusiveWidgetIdList.Add(a.ObjectResponse["data"]["id"].Value());
+
+
+ //CREATE FILTER
+ dynamic d = new JObject();
+ d.name = Util.Uniquify(WidgetRunNameStart);
+ // d.ownerId = 1L;
+ d["public"] = true;
+ d.listKey = "widget";
+
+ dynamic dfilter = new JArray();
+
+ //name starts with filter to constrict to widgets that this test block created only
+ dynamic DataFilterNameStart = new JObject();
+ DataFilterNameStart.fld = "name";
+ DataFilterNameStart.op = Util.OpStartsWith;
+ DataFilterNameStart.value = WidgetRunNameStart;
+ dfilter.Add(DataFilterNameStart);
+
+ //active bool test filter
+ dynamic DataFilterActive = new JObject();
+ DataFilterActive.fld = "notes";
+ DataFilterActive.op = Util.OpEquality;
+ DataFilterActive.value = InclusiveTestString;
+ dfilter.Add(DataFilterActive);
+
+ d.filter = dfilter.ToString();//it expects it to be a json string, not actual json
+
+ a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("BizAdminFull"), d.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+
+ long DataFilterId = a.ObjectResponse["data"]["id"].Value();
+
+ //NOW FETCH WIDGET LIST WITH FILTER
+ a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in"));
+ Util.ValidateDataReturnResponseOk(a);
+ Util.ValidateHTTPStatusCode(a, 200);
+
+ //assert contains at least two records
+ ((JArray)a.ObjectResponse["data"]).Count.Should().BeGreaterThan(1);
+ var v = ((JArray)a.ObjectResponse["data"]);
+ List IDInResultList = new List();
+ int InclusiveMatchCount = 0;
+ int ExclusiveMatchCount = 0;
+ foreach (JObject o in v)
+ {
+ if (InclusiveWidgetIdList.Contains(o["id"].Value()))
+ InclusiveMatchCount++;
+ if (ExclusiveWidgetIdList.Contains(o["id"].Value()))
+ ExclusiveMatchCount++;
+ }
+
+ InclusiveMatchCount.Should().Be(InclusiveWidgetIdList.Count);
+ ExclusiveMatchCount.Should().Be(0);
+
+ //DELETE WIDGETS
+ foreach (long l in InclusiveWidgetIdList)
+ {
+ a = await Util.DeleteAsync("Widget/" + l.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+ foreach (long l in ExclusiveWidgetIdList)
+ {
+ a = await Util.DeleteAsync("Widget/" + l.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+ //DELETE DATAFILTER
+ a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(a, 204);
+ }
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void TextOpGreaterThanFilterWorks()
+ {
+
+ var TestName = "TextOpGreaterThanFilterWorks";
+ var WidgetRunNameStart = Util.Uniquify(TestName);
+
+ List InclusiveWidgetIdList = new List();
+ List ExclusiveWidgetIdList = new List