diff --git a/server/AyaNova/biz/FilterSqlCriteriaBuilder.cs b/server/AyaNova/biz/FilterSqlCriteriaBuilder.cs index 3ba0feb8..fbd35bd2 100644 --- a/server/AyaNova/biz/FilterSqlCriteriaBuilder.cs +++ b/server/AyaNova/biz/FilterSqlCriteriaBuilder.cs @@ -781,6 +781,9 @@ namespace AyaNova.Biz } + //This is only used by the token date query code above and that code doesn't convert to UTC time to match the DB so this function will handle that + //The other non tokenized date criteria builders are all working with dates that come from the client in UTC already and they don't use this method + //so nothing required there private static void BuildBetweenTwoDatesFragment(string sColumn, StringBuilder sb, DateTime dtAfter, DateTime dtBefore) { sb.Append(">'"); diff --git a/test/raven-integration/DataFilter/DataFilterFilteringLists.cs b/test/raven-integration/DataFilter/DataFilterFilteringLists.cs index a1de768d..22cee0f8 100644 --- a/test/raven-integration/DataFilter/DataFilterFilteringLists.cs +++ b/test/raven-integration/DataFilter/DataFilterFilteringLists.cs @@ -1470,7 +1470,7 @@ namespace raven_integration - /// + /// /// /// [Fact] @@ -1572,6 +1572,212 @@ namespace raven_integration } + /// + /// + /// + [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.Now.ToUniversalTime(); + w.endDate = DateTime.Now.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); + //8 days ago will be outside the 14 day window + w.startDate = DateTime.Now.AddDays(-8).ToUniversalTime(); + w.endDate = DateTime.Now.AddDays(-8).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 = OpStartsWith; + DataFilterNameStart.value = WidgetNameStart; + dfilter.Add(DataFilterNameStart); + + //## INCLUSIVE FILTER + dynamic FilterItem = new JObject(); + FilterItem.fld = "startdate"; + FilterItem.op = 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.Now.AddMinutes(-5).ToUniversalTime(); + w.endDate = DateTime.Now.AddMinutes(-5).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); + //8 days ago will be outside the 14 day window + w.startDate = DateTime.Now.AddMonths(1).ToUniversalTime(); + w.endDate = DateTime.Now.AddMonths(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 = OpStartsWith; + DataFilterNameStart.value = WidgetNameStart; + dfilter.Add(DataFilterNameStart); + + //## INCLUSIVE FILTER + dynamic FilterItem = new JObject(); + FilterItem.fld = "startdate"; + FilterItem.op = 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); + } + + //======== #endregion date filter tests