diff --git a/server/AyaNova/biz/FilterSqlOrderByBuilder.cs b/server/AyaNova/biz/FilterSqlOrderByBuilder.cs index acbe4867..23b2f05f 100644 --- a/server/AyaNova/biz/FilterSqlOrderByBuilder.cs +++ b/server/AyaNova/biz/FilterSqlOrderByBuilder.cs @@ -47,7 +47,7 @@ namespace AyaNova.Biz } } - return " ORDER BY " + sb.ToString(); + return " ORDER BY" + sb.ToString(); } diff --git a/test/raven-integration/DataFilter/DataFilterOrderBy.cs b/test/raven-integration/DataFilter/DataFilterOrderBy.cs index a4a18ddd..d6846782 100644 --- a/test/raven-integration/DataFilter/DataFilterOrderBy.cs +++ b/test/raven-integration/DataFilter/DataFilterOrderBy.cs @@ -294,6 +294,146 @@ namespace raven_integration + + + /// + /// + /// + [Fact] + public async void SortByMultipleFieldsWorks() + { + /* + + Created order: + dollaramount, count + 2,1 + 1,2 + 2,2 + 1,1 + + + sorted order: + dollar asc, count desc + 1,2 + 1,1 + 2,2 + 2,1 + + */ + var WidgetNameStart = Util.Uniquify("SortByMultipleFieldsWorks"); + + //CREATE 4 TEST WIDGETS TO TEST ORDER + long FirstInOrderWidgetId = 0; + long SecondInOrderWidgetId = 0; + long ThirdInOrderWidgetId = 0; + long FourthInOrderWidgetId = 0; + + dynamic w = new JObject(); + w.name = Util.Uniquify(WidgetNameStart); + w.dollaramount = 2.22; + w.count = 1; + + ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString()); + Util.ValidateDataReturnResponseOk(a); + FourthInOrderWidgetId = a.ObjectResponse["data"]["id"].Value(); + + w = new JObject(); + w.name = Util.Uniquify(WidgetNameStart); + w.dollaramount = 1.11; + w.count = 2; + a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString()); + Util.ValidateDataReturnResponseOk(a); + FirstInOrderWidgetId = a.ObjectResponse["data"]["id"].Value(); + + w = new JObject(); + w.name = Util.Uniquify(WidgetNameStart); + w.dollaramount = 1.11; + w.count = 1; + a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString()); + Util.ValidateDataReturnResponseOk(a); + SecondInOrderWidgetId = a.ObjectResponse["data"]["id"].Value(); + + w = new JObject(); + w.name = Util.Uniquify(WidgetNameStart); + w.dollaramount = 2.22; + w.count = 2; + a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString()); + Util.ValidateDataReturnResponseOk(a); + ThirdInOrderWidgetId = a.ObjectResponse["data"]["id"].Value(); + + + //CREATE FILTER + dynamic d = new JObject(); + d.name = Util.Uniquify(WidgetNameStart); + d["public"] = true; + d.listKey = "widget"; + + //FILTER IN BY NAME FOR TESTING THIS RUN ONLY + 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); + d.filter = dfilter.ToString(); + + //SORT ORDER ################### + dynamic dsortarray = new JArray(); + + //First column + dynamic dsort1 = new JObject(); + dsort1.fld = "dollaramount"; + dsort1.dir = "+"; + dsortarray.Add(dsort1); + + //Second column + dynamic dsort2 = new JObject(); + dsort2.fld = "count"; + dsort2.dir = "-"; + dsortarray.Add(dsort2); + + + d.sort = dsortarray.ToString(); + + a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("manager", "l3tm3in"), 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 exactly 3 records + ((JArray)a.ObjectResponse["data"]).Count.Should().Be(4); + + //assert the order returned + a.ObjectResponse["data"][0]["id"].Value().Should().Be(FirstInOrderWidgetId); + a.ObjectResponse["data"][1]["id"].Value().Should().Be(SecondInOrderWidgetId); + a.ObjectResponse["data"][2]["id"].Value().Should().Be(ThirdInOrderWidgetId); + a.ObjectResponse["data"][3]["id"].Value().Should().Be(FourthInOrderWidgetId); + + + a = await Util.DeleteAsync("Widget/" + FirstInOrderWidgetId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); + Util.ValidateHTTPStatusCode(a, 204); + + a = await Util.DeleteAsync("Widget/" + SecondInOrderWidgetId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); + Util.ValidateHTTPStatusCode(a, 204); + + a = await Util.DeleteAsync("Widget/" + ThirdInOrderWidgetId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); + Util.ValidateHTTPStatusCode(a, 204); + + a = await Util.DeleteAsync("Widget/" + FourthInOrderWidgetId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); + Util.ValidateHTTPStatusCode(a, 204); + + //DELETE DATAFILTER + a = await Util.DeleteAsync("DataFilter/" + DataFilterId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); + Util.ValidateHTTPStatusCode(a, 204); + + } + //======================================================================== }//eoc