예제 #1
0
        public void TestUpdateLockedObjectBySameUserWithFlag()
        {
            ActODataService(args =>
            {
                var userMock = new Mock <CurrentUserService.IUser>();
                userMock.Setup(u => u.Login).Returns("user1");

                var lockService    = new LockService(args.DataService);
                var offlineManager = new DefaultOfflineManager(lockService, userMock.Object);
                args.UnityContainer.RegisterInstance <BaseOfflineManager>(offlineManager);

                var лес = new Лес();
                args.DataService.UpdateObject(лес);
                AssertLock.IsNotAcquired(lockService, лес);

                // Select data with locking.
                var result1 = args.HttpClient.GetAsync(args.Token.Model, typeof(Лес), "user1").Result;
                Assert.True(result1.IsSuccessStatusCode);
                AssertLock.IsAcquired(lockService, лес, "user1");

                // Update locked data.
                var result2 = args.HttpClient.PatchAsJsonStringAsync(args.Token.Model, лес, Лес.Views.ЛесE, "user1").Result;
                Assert.True(result2.IsSuccessStatusCode);
                AssertLock.IsNotAcquired(lockService, лес);
            });
        }
        public void TestMethod1()
        {
            // TODO: в чём состоит проблема: в классе Лес в конструкторе стоит "страна.SetExistObjectPrimaryKey("C254B561-B867-4888-837F-D8B68211E497")", но это не отрабатывает.
            foreach (IDataService dataService in DataServices)
            {
                string[] props = new[]
                { "Название", "Площадь", "Страна" /*,"Страна.__PrimaryKey"*/, /*"Страна.Название",*/ "Заповедник" };
                SQLDataService ds = (SQLDataService)dataService;

                Assert.NotNull(ds);
                View view = new View();
                view.DefineClassType = typeof(Лес);
                foreach (string prop in props)
                {
                    view.AddProperty(prop);
                }

                LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Лес), view);

                var dataObjects = ds.LoadObjects(lcs);
                Лес лес         = (Лес)dataObjects[0];
                Assert.NotEqual("{C254B561-B867-4888-837F-D8B68211E497}",
                                лес.Страна.__PrimaryKey.ToString().ToUpper());
            }
        }
        public void LoadObjectsWithTop()
        {
            foreach (IDataService dataService in DataServices)
            {
                SQLDataService ds = (SQLDataService)dataService;

                try
                {
                    // Arrange.
                    // Сначала создаём структуру данных, требуемую для теста.
                    int top    = 2;
                    var forest = new Лес();
                    var bear1  = new Медведь()
                    {
                        ЛесОбитания = forest, ПорядковыйНомер = 2
                    };
                    var bear2 = new Медведь()
                    {
                        ЛесОбитания = forest, ПорядковыйНомер = 5
                    };
                    var bear3 = new Медведь()
                    {
                        ЛесОбитания = forest, ПорядковыйНомер = 8
                    };
                    var updateObjectsArray = new DataObject[] { forest, bear3, bear1, bear2 };

                    ds.UpdateObjects(ref updateObjectsArray);

                    var view = Медведь.Views.МедведьL;
                    var lcs  = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), view);
                    lcs.ReturnTop = top;

                    // Выведем в консоль запрос, который генерируется данной операцией.
                    ds.AfterGenerateSQLSelectQuery -= ds_AfterGenerateSQLSelectQuery;
                    ds.AfterGenerateSQLSelectQuery += ds_AfterGenerateSQLSelectQuery;

                    // Act.
                    var dataObjects = ds.LoadObjects(lcs);

                    // Assert.
                    Assert.Equal(top, dataObjects.Length);
                }
                catch (Exception)
                {
                    Debug.WriteLine("Тест запущен");
                    Debug.WriteLine(dataService.GetType().Name);
                    Debug.WriteLine(dataService.CustomizationString);
                    throw;
                }
                finally
                {
                    ds.AfterGenerateSQLSelectQuery -= ds_AfterGenerateSQLSelectQuery;
                }
            }
        }
        public void TestSelectExpandFunctionEntity()
        {
            ActODataService(args =>
            {
                RegisterODataUserFunctions(args.Token.Functions, args.DataService);

                Медведь медв = new Медведь {
                    Вес = 48
                };
                Лес лес1 = new Лес {
                    Название = "Бор"
                };
                Лес лес2 = new Лес {
                    Название = "Березовая роща"
                };
                медв.ЛесОбитания = лес1;
                var берлога1     = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                var берлога2 = new Берлога {
                    Наименование = "Для плохого настроения", ЛесРасположения = лес2
                };
                медв.Берлога.Add(берлога1);
                медв.Берлога.Add(берлога2);
                var objs = new DataObject[] { медв, берлога2, берлога1, лес1, лес2 };
                args.DataService.UpdateObjects(ref objs);
                var expectedResult = (args.DataService as SQLDataService).Query <Медведь>(Медведь.Views.МедведьE).ToArray();
                int intParam       = 0;

                // Формируем URL запроса к OData-сервису.
                string requestUrl = $"http://localhost/odata/FunctionSelectExpandEntity(intParam={intParam})?$expand=Берлога($select=Наименование)";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(expectedResult[intParam].Вес, receivedDict["Вес"]);

                    for (int i = 0; i < expectedResult[intParam].Берлога.Count; i++)
                    {
                        Assert.Equal(expectedResult[intParam].Берлога[i].Наименование, ((receivedDict["Берлога"] as ArrayList)[i] as Dictionary <string, object>)["Наименование"] as string);
                        Assert.Equal(1, ((receivedDict["Берлога"] as ArrayList)[i] as Dictionary <string, object>).Count);
                    }
                }
            });
        }
        public void NullableDateTimeOrderBy()
        {
            ActODataService(args =>
            {
                ExternalLangDef.LanguageDef.DataService = args.DataService;
                NullableDateTime dt1 = (NullableDateTime) new DateTime(2017, 11, 21);
                NullableDateTime dt2 = (NullableDateTime) new DateTime(2017, 10, 21);
                NullableDateTime dt3 = (NullableDateTime) new DateTime(2017, 09, 21);
                NullableDateTime dt4 = (NullableDateTime) new DateTime(2017, 08, 21);
                Лес лес1             = new Лес {
                    Название = "Еловый", ДатаПоследнегоОсмотра = dt1
                };
                Лес лес2 = new Лес {
                    Название = "Сосновый", ДатаПоследнегоОсмотра = dt2
                };
                Лес лес3 = new Лес {
                    Название = "Смешанный", ДатаПоследнегоОсмотра = dt3
                };
                Лес лес4 = new Лес {
                    Название = "Березовый", ДатаПоследнегоОсмотра = dt4
                };

                var objs = new DataObject[] { лес1, лес2, лес3, лес4 };
                args.DataService.UpdateObjects(ref objs);

                string requestUrl;

                // Проверка использования в фильтрации перечислений.
                requestUrl = "http://localhost/odata/Лесs?$orderby=ДатаПоследнегоОсмотра desc";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(4, ((ArrayList)receivedDict["value"]).Count);

                    NullableDateTime[] expectedValues = { dt1, dt2, dt3, dt4 };

                    for (int i = 0; i < expectedValues.Length; i++)
                    {
                        var лес = ((ArrayList)receivedDict["value"])[i];
                        Assert.Equal(expectedValues[i], (NullableDateTime) new DateTimeOffset(DateTime.Parse((string)((Dictionary <string, object>)лес)["ДатаПоследнегоОсмотра"])).UtcDateTime);
                    }
                }
            });
        }
        public void BeforeSavePatchSimpleObjectTest()
        {
            ActODataService(args =>
            {
                args.Token.Events.CallbackBeforeCreate = BeforeCreate;
                args.Token.Events.CallbackBeforeUpdate = BeforeUpdate;
                args.Token.Events.CallbackBeforeDelete = BeforeDelete;

                // Создаем объект данных, который потом будем обновлять, и добавляем в базу обычным сервисом данных.
                Лес лес = new Лес {
                    Название = "Чаща", Площадь = 100
                };
                args.DataService.UpdateObject(лес);

                // Обновляем часть атрибутов.
                лес.Площадь = 150;

                // Представление, по которому будем обновлять.
                string[] медвPropertiesNames =
                {
                    Information.ExtractPropertyPath <Лес>(x => x.__PrimaryKey),
                    Information.ExtractPropertyPath <Лес>(x => x.Площадь)
                };
                var лесDynamicView = new View(new ViewAttribute("лесDynamicView", медвPropertiesNames), typeof(Лес));

                // Преобразуем объект данных в JSON-строку.
                string requestJsonData = лес.ToJson(лесDynamicView, args.Token.Model);

                // Формируем URL запроса к OData-сервису (с идентификатором изменяемой сущности).
                string requestUrl = string.Format("http://localhost/odata/{0}({1})", args.Token.Model.GetEdmEntitySet(typeof(Лес)).Name, ((ICSSoft.STORMNET.KeyGen.KeyGuid)лес.__PrimaryKey).Guid.ToString());

                ParamObj = null;

                // Обращаемся к OData-сервису и обрабатываем ответ, в теле запроса передаем обновляемый объект в формате JSON.
                using (HttpResponseMessage response = args.HttpClient.PatchAsJsonStringAsync(requestUrl, requestJsonData).Result)
                {
                    Assert.NotNull(ParamObj);

                    // Убедимся, что запрос завершился успешно (тело ответа д.б. пустым при отсутствии ошибок обновления).
                    Assert.Equal(HttpStatusCode.NoContent, response.StatusCode);

                    // Проверяем что объект данных был обновлен в базе, причем только по переданным атрибутам.
                    Лес updatedЛес = new Лес {
                        __PrimaryKey = лес.__PrimaryKey
                    };
                    args.DataService.LoadObject(updatedЛес);

                    Assert.Equal(150, updatedЛес.Площадь);
                    Assert.Equal("Чаща", updatedЛес.Название);
                }
            });
        }
예제 #7
0
        public void TestBeforeGet()
        {
            ActODataService(args =>
            {
                args.Token.Events.CallbackBeforeGet = BeforeGet;

                DateTime date               = new DateTimeOffset(DateTime.Now).UtcDateTime;
                string prevDate             = $"{date.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:ss")}%2B05:00";
                string nextDate             = $"{date.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ss")}%2B05:00";
                КлассСМножествомТипов класс = new КлассСМножествомТипов()
                {
                    PropertyEnum = Цифра.Семь, PropertyDateTime = date
                };
                Медведь медв = new Медведь {
                    Вес = 48, Пол = tПол.Мужской
                };
                Медведь медв2 = new Медведь {
                    Вес = 148, Пол = tПол.Мужской
                };
                Лес лес1 = new Лес {
                    Название = "Бор"
                };
                Лес лес2 = new Лес {
                    Название = "Березовая роща"
                };
                медв.ЛесОбитания = лес1;
                var берлога1     = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                var берлога2 = new Берлога {
                    Наименование = "Для плохого настроения", ЛесРасположения = лес2
                };
                var берлога3 = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                медв.Берлога.Add(берлога1);
                медв.Берлога.Add(берлога2);
                медв2.Берлога.Add(берлога3);
                var objs = new DataObject[] { класс, медв, медв2, берлога2, берлога1, берлога3, лес1, лес2 };
                args.DataService.UpdateObjects(ref objs);
                this.lcs       = null;
                var requestUrl = "http://localhost/odata/Медведьs";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);
                    Assert.NotNull(this.lcs);
                }
            });
        }
        public void UpdateMasterPropertyTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                // Arrange.
                string названиеЛеса      = "Шишкин лес";
                string новоеНазваниеЛеса = "Лисицын лес";
                var    лес = new Лес {
                    Название = названиеЛеса
                };
                var потапыч = new Медведь {
                    ПорядковыйНомер = 5, ЛесОбитания = лес
                };
                dataService.UpdateObject(потапыч);

                View view = new View
                {
                    DefineClassType = typeof(Медведь),
                    Properties      = new[]
                    {
                        new PropertyInView(nameof(Медведь.ЛесОбитания), string.Empty, true, string.Empty)
                    }
                };

                LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), view);
                var dataObjects = dataService.LoadObjects(lcs);

                Assert.Equal(1, dataObjects.Length);

                Медведь медведь = (Медведь)dataObjects[0];

                // Assert.AreEqual(названиеЛеса, медведь.ЛесОбитания.Название);

                // Act.
                медведь.ЛесОбитания.Название = новоеНазваниеЛеса;
                dataService.UpdateObject(медведь.ЛесОбитания);

                // Assert.
                view.AddProperty(Information.ExtractPropertyPath <Медведь>(м => м.ЛесОбитания.Название));
                dataObjects = dataService.LoadObjects(lcs);

                Assert.Equal(1, dataObjects.Length);

                медведь = (Медведь)dataObjects[0];
                Assert.Equal(названиеЛеса, медведь.ЛесОбитания.Название);
            }
        }
예제 #9
0
        public void TestAcquiringWithoutLock()
        {
            ActODataService(args =>
            {
                var lockService    = new LockService(args.DataService);
                var currentUser    = new Mock <CurrentUserService.IUser>().Object;
                var offlineManager = new DefaultOfflineManager(lockService, currentUser);
                args.UnityContainer.RegisterInstance <BaseOfflineManager>(offlineManager);

                var лес = new Лес();
                args.DataService.UpdateObject(лес);
                AssertLock.IsNotAcquired(lockService, лес);

                var result = args.HttpClient.GetAsync(args.Token.Model, typeof(Лес)).Result;
                Assert.True(result.IsSuccessStatusCode);
                AssertLock.IsNotAcquired(lockService, лес);
            });
        }
예제 #10
0
        public void TestODataAny()
        {
            foreach (IDataService dataService in DataServices)
            {
                ICSSoft.STORMNET.Windows.Forms.ExternalLangDef.LanguageDef.DataService = dataService;
                //if (dataService is MSSQLDataService)
                //    continue;
                Медведь медв = new Медведь {
                    Вес = 48, Пол = Пол.Мужской
                };
                Медведь медв2 = new Медведь {
                    Вес = 148, Пол = Пол.Мужской
                };
                Лес лес1 = new Лес {
                    Название = "Бор"
                };
                Лес лес2 = new Лес {
                    Название = "Березовая роща"
                };
                медв.ЛесОбитания = лес1;
                var берлога1 = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                var берлога2 = new Берлога {
                    Наименование = "Для плохого настроения", ЛесРасположения = лес2
                };
                var берлога3 = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                медв.Берлога.Add(берлога1);
                медв.Берлога.Add(берлога2);
                медв2.Берлога.Add(берлога3);
                var objs = new ICSSoft.STORMNET.DataObject[] { медв, медв2, берлога2, берлога1, берлога3, лес1, лес2 };
                var ds   = (SQLDataService)dataService;
                ds.UpdateObjects(ref objs);

                var v  = new View(new ViewAttribute("AllProps", new string[] { "*" }), typeof(Кошка));
                var ob = ds.LoadObjects(v);

                var l = ds.Query <Медведь>(Медведь.Views.МедведьE).Where(
                    x => x.Берлога.Cast <Берлога>().Any(o => o.Наименование == "Для хорошего настроения")).ToList();
            }
        }
예제 #11
0
        public void TestAfterGet()
        {
            ActODataService(args =>
            {
                args.Token.Events.CallbackAfterGet = AfterGet;

                Медведь медв = new Медведь {
                    Вес = 48, Пол = tПол.Мужской
                };
                Медведь медв2 = new Медведь {
                    Вес = 148, Пол = tПол.Мужской
                };
                Лес лес = new Лес {
                    Название = "Бор"
                };
                Лес лес2 = new Лес {
                    Название = "Березовая роща"
                };
                медв.ЛесОбитания  = лес;
                медв2.ЛесОбитания = лес2;
                var берлога       = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес
                };
                var берлога2 = new Берлога {
                    Наименование = "Для плохого настроения", ЛесРасположения = лес2
                };
                медв.Берлога.Add(берлога);
                медв2.Берлога.Add(берлога2);
                var objs = new DataObject[] { медв, медв2, берлога2, берлога, лес, лес2 };
                args.DataService.UpdateObjects(ref objs);
                Objs = null;
                string requestUrl = string.Format("http://localhost/odata/{0}", args.Token.Model.GetEdmEntitySet(typeof(Медведь)).Name);

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);
                    Assert.NotNull(Objs);
                }
            });
        }
        public void TestMethod2()
        {
            foreach (IDataService dataService in DataServices)
            {
                SQLDataService ds = (SQLDataService)dataService;

                string[] props = new[]
                {
                    Information.ExtractPropertyPath <Лес>(x => x.Название),
                    Information.ExtractPropertyPath <Лес>(x => x.Площадь),
                    Information.ExtractPropertyPath <Лес>(x => x.Страна),
                    Information.ExtractPropertyPath <Лес>(x => x.Заповедник)
                };

                var view = new View();
                view.DefineClassType = typeof(Лес);
                foreach (string prop in props)
                {
                    view.AddProperty(prop);
                }

                // Чтобы в базе был подходящий лес, делаем его сами.
                var country = new Страна()
                {
                    Название = "РФ"
                };
                var forest = new Лес()
                {
                    Название = "Черняевский", Страна = country
                };
                var updateArray = new DataObject[] { country, forest };
                ds.UpdateObjects(ref updateArray);

                var лес = new Лес();
                лес.SetExistObjectPrimaryKey(forest.__PrimaryKey);

                ds.LoadObject(view, лес, false, false);

                Assert.Equal(country.__PrimaryKey, лес.Страна.__PrimaryKey);
            }
        }
예제 #13
0
        public void BSTest()
        {
            // Объекты для тестирования создания.
            Медведь медв = new Медведь {
                Вес = 48
            };
            Лес лес1 = new Лес {
                Название = "Бор"
            };
            Лес лес2 = new Лес {
                Название = "Березовая роща"
            };

            медв.ЛесОбитания = лес1;
            var берлога1 = new Берлога {
                Наименование = "Для хорошего настроения", ЛесРасположения = лес1
            };
            var берлога2 = new Берлога {
                Наименование = "Для плохого настроения", ЛесРасположения = лес2
            };

            медв.Берлога.Add(берлога1);
            медв.Берлога.Add(берлога2);

            // Объекты для тестирования создания с обновлением.
            Медведь медвежонок = new Медведь {
                Вес = 12
            };
            var берлога3 = new Берлога {
                Наименование = "Для хорошего настроения", ЛесРасположения = лес1
            };

            медвежонок.Берлога.Add(берлога3);

            ActODataService(args =>
            {
                // ------------------ Только создания объектов ------------------
                // Подготовка тестовых данных в формате OData.
                var controller = new Controllers.DataObjectController(args.DataService, args.Token.Model, args.Token.Events, args.Token.Functions);
                System.Web.OData.EdmEntityObject edmObj = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Медведь)), медв, 1, null);
                var edmЛес1 = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Лес)), лес1, 1, null);
                var edmЛес2 = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Лес)), лес2, 1, null);
                edmObj.TrySetPropertyValue("ЛесОбитания", edmЛес1);
                var coll = controller.GetEdmCollection(медв.Берлога, typeof(Берлога), 1, null);
                edmObj.TrySetPropertyValue("Берлога", coll);
                System.Web.OData.EdmEntityObject edmБерлога1 = (System.Web.OData.EdmEntityObject)coll[0];
                System.Web.OData.EdmEntityObject edmБерлога2 = (System.Web.OData.EdmEntityObject)coll[1];
                edmБерлога1.TrySetPropertyValue("ЛесРасположения", edmЛес1);
                edmБерлога2.TrySetPropertyValue("ЛесРасположения", edmЛес2);

                // Формируем URL запроса к OData-сервису.
                string requestUrl = string.Format("http://localhost/odata/{0}", args.Token.Model.GetEdmEntitySet(typeof(Медведь)).Name);

                // Обращаемся к OData-сервису и обрабатываем ответ, в теле запроса передаем создаваемый объект в формате JSON.
                HttpResponseMessage response = args.HttpClient.PostAsJsonAsync(requestUrl, edmObj).Result;

                // Убедимся, что запрос завершился успешно.
                Assert.Equal(HttpStatusCode.Created, response.StatusCode);

                // Получим строку с ответом.
                string receivedJsonObjs = response.Content.ReadAsStringAsync().Result.Beautify();

                // В ответе приходит объект с созданной сущностью.
                // Преобразуем полученный объект в словарь.
                Dictionary <string, object> receivedObjs = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedJsonObjs);
                Assert.Equal("Object created.", receivedObjs["ПолеБС"]);

                // Проверяем что созданы зависимые объекты, вычитав с помощью args.DataService
                var lcs          = LoadingCustomizationStruct.GetSimpleStruct(typeof(Берлога), "БерлогаE");
                lcs.LoadingTypes = new[] { typeof(Берлога) };

                var dobjs = args.DataService.LoadObjects(lcs);
                Assert.Equal(2, dobjs.Length);

                foreach (var obj in dobjs)
                {
                    var berloga = (Берлога)obj;
                    Assert.Equal("Object created.", berloga.ПолеБС);
                }
            });
        }
예제 #14
0
        public void TestODataMasterFieldOrderby()
        {
            foreach (IDataService dataService in DataServices)
            {
                //ICSSoft.STORMNET.Windows.Forms.ExternalLangDef.LanguageDef.DataService = dataService;
                if (dataService is MSSQLDataService)
                {
                    continue;
                }
                Лес лес1 = new Лес {
                    Название = "Бор"
                };
                Лес лес2 = new Лес {
                    Название = "Березовая роща"
                };
                Медведь медв = new Медведь {
                    Вес = 48, Пол = Пол.Мужской, ЛесОбитания = лес1
                };
                Медведь медв2 = new Медведь {
                    Вес = 148, Пол = Пол.Мужской, ЛесОбитания = лес1
                };
                Медведь медв3 = new Медведь {
                    Вес = 148, Пол = Пол.Мужской, ЛесОбитания = лес2
                };
                медв.ЛесОбитания = лес1;
                var берлога1 = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                var берлога2 = new Берлога {
                    Наименование = "Для плохого настроения", ЛесРасположения = лес2
                };
                var берлога3 = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                медв.Берлога.Add(берлога1);
                медв.Берлога.Add(берлога2);
                медв2.Берлога.Add(берлога3);
                var objs = new ICSSoft.STORMNET.DataObject[] { медв, медв2, медв3, берлога2, берлога1, берлога3, лес1, лес2 };
                var ds   = (SQLDataService)dataService;
                ds.UpdateObjects(ref objs);
                var expr0 = ds.Query <Медведь>(Медведь.Views.МедведьE).Where(
                    x => x.ЛесОбитания.Название == "Бор");

                var expr1 = ds.Query <Медведь>(Медведь.Views.МедведьE).OrderBy(x => x.ЛесОбитания.Название);
                var lcs1  = LinqToLcs.GetLcs(expr1.Expression, Медведь.Views.МедведьE);
                lcs1.View         = Медведь.Views.МедведьE;
                lcs1.LoadingTypes = new Type[] { typeof(Медведь) };
                var l1    = dataService.LoadObjects(lcs1);
                var expr2 = ds.Query <Медведь>(Медведь.Views.МедведьE).OrderByDescending(x => x.ЛесОбитания.Название);
                var lcs2  = LinqToLcs.GetLcs(expr2.Expression, Медведь.Views.МедведьE);
                lcs2.View         = Медведь.Views.МедведьE;
                lcs2.LoadingTypes = new Type[] { typeof(Медведь) };
                var l2 = dataService.LoadObjects(lcs2);

                var lcs3 = new LoadingCustomizationStruct(null);
                lcs3.View         = Медведь.Views.МедведьE;
                lcs3.LoadingTypes = new Type[] { typeof(Медведь) };
                lcs3.ColumnsSort  = new[] { new ColumnsSortDef(Information.ExtractPropertyPath <Медведь>(c => c.ЛесОбитания.Название) /*new ColumnsSortDef("ЛесОбитания.Название"*/, ICSSoft.STORMNET.Business.SortOrder.Asc) };
                var l3 = dataService.LoadObjects(lcs3);


                var lcs4 = new LoadingCustomizationStruct(null);
                lcs4.View         = Медведь.Views.МедведьE;
                lcs4.LoadingTypes = new Type[] { typeof(Медведь) };
                lcs4.ColumnsSort  = new[] { new ColumnsSortDef(Information.ExtractPropertyPath <Медведь>(c => c.ЛесОбитания.Название) /*new ColumnsSortDef("ЛесОбитания.Название"*/, ICSSoft.STORMNET.Business.SortOrder.Desc) };
                var l4 = dataService.LoadObjects(lcs4);
            }
        }
예제 #15
0
        public void DeleteAggregatorWithDetailAndHierarhiTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                // Arrange.
                SQLDataService ds = dataService as SQLDataService;

                //TODO: Fix OracleDataService error.
                if (dataService is OracleDataService)
                {
                    continue;
                }

                var masterForest = new Лес {
                    Название = "лес1"
                };
                var detailDen = new Берлога {
                    Наименование = "берлога1", ЛесРасположения = masterForest
                };
                var aggregatorBear = new Медведь {
                    ПорядковыйНомер = 2, ЛесОбитания = masterForest
                };
                aggregatorBear.Берлога.Add(detailDen);

                ds.UpdateObject(aggregatorBear);

                var aggregatorBearMother = new Медведь {
                    ПорядковыйНомер = 2
                };
                aggregatorBear.Мама = aggregatorBearMother;

                ds.UpdateObject(aggregatorBear);

                // Act & Assert.
                LoadingCustomizationStruct lcsBear   = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), Медведь.Views.МедведьE);
                LoadingCustomizationStruct lcsForest = LoadingCustomizationStruct.GetSimpleStruct(typeof(Лес), Лес.Views.ЛесE);

                DataObject[] dataObjectsBear   = ds.LoadObjects(lcsBear);
                DataObject[] dataObjectsForest = ds.LoadObjects(lcsForest);

                // Act
                int countBearBefore   = ds.GetObjectsCount(lcsBear);
                int countForestBefore = ds.GetObjectsCount(lcsForest);

                List <DataObject> objectsForUpdateList = new List <DataObject>();

                foreach (Медведь медведь in dataObjectsBear)
                {
                    медведь.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(медведь);
                }

                foreach (Лес лес in dataObjectsForest)
                {
                    лес.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(лес);
                }

                DataObject[] objectsForUpdate = objectsForUpdateList.ToArray();

                ds.UpdateObjects(ref objectsForUpdate);

                int countBearAfter   = ds.GetObjectsCount(lcsBear);
                int countForestAfter = ds.GetObjectsCount(lcsForest);

                // Assert
                Assert.Equal(2, countBearBefore);
                Assert.Equal(1, countForestBefore);

                Assert.Equal(0, countBearAfter);
                Assert.Equal(0, countForestAfter);
            }
        }
        public void TestLoadingObjectIndexesWithMaxResultsCount()
        {
            foreach (IDataService dataService in DataServices)
            {
                var ds   = (SQLDataService)dataService;
                var ldef = SQLWhereLanguageDef.LanguageDef;

                // Сначала создаём структуру данных, требуемую для теста.
                var forest = new Лес();
                var bear1  = new Медведь()
                {
                    ЛесОбитания = forest, ПорядковыйНомер = 2
                };
                var bear2 = new Медведь()
                {
                    ЛесОбитания = forest, ПорядковыйНомер = 5
                };
                var bear3 = new Медведь()
                {
                    ЛесОбитания = forest, ПорядковыйНомер = 8
                };
                var updateObjectsArray = new DataObject[] { forest, bear3, bear1, bear2 };

                ds.UpdateObjects(ref updateObjectsArray);

                var    view = Медведь.Views.OrderNumberTest;
                string numberPropertyName = Information.ExtractPropertyPath <Медведь>(x => x.ПорядковыйНомер);
                var    lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), view);
                lcs.ColumnsSort = new[] { new ColumnsSortDef(numberPropertyName, SortOrder.Asc) };

                var      variable = new VariableDef(ldef.NumericType, numberPropertyName);
                Function func     = ldef.GetFunction(
                    ldef.funcAND,
                    ldef.GetFunction(
                        ldef.funcEQ,
                        new VariableDef(ldef.GuidType, Information.ExtractPropertyPath <Медведь>(x => x.ЛесОбитания)),
                        forest.__PrimaryKey),
                    ldef.GetFunction(ldef.funcG, variable, 3));

                // Меньше чем всего результатов.
                IDictionary <int, string> indexes1 = ds.GetObjectIndexesWithPks(lcs, func, 1);

                // Столько же, сколько всего результатов.
                IDictionary <int, string> indexes2 = ds.GetObjectIndexesWithPks(lcs, func, 2);

                // Больше чем число результатов.
                IDictionary <int, string> indexes3 = ds.GetObjectIndexesWithPks(lcs, func, 3);

                Assert.NotNull(indexes1);
                Assert.Equal(1, indexes1.Count);
                Assert.Equal(bear2.__PrimaryKey.ToString(), indexes1[2]);

                Assert.NotNull(indexes2);
                Assert.Equal(2, indexes2.Count);
                Assert.Equal(bear2.__PrimaryKey.ToString(), indexes2[2]);
                Assert.Equal(bear3.__PrimaryKey.ToString(), indexes2[3]);

                Assert.NotNull(indexes3);
                Assert.Equal(2, indexes3.Count);
                Assert.Equal(bear2.__PrimaryKey.ToString(), indexes3[2]);
                Assert.Equal(bear3.__PrimaryKey.ToString(), indexes3[3]);
            }
        }
        public void TestLoadingObjectIndex()
        {
            foreach (IDataService dataService in DataServices)
            {
                var ds   = (SQLDataService)dataService;
                var ldef = SQLWhereLanguageDef.LanguageDef;

                // Сначала создаём структуру данных, требуемую для теста.
                var forest = new Лес();
                var bear1  = new Медведь()
                {
                    ЛесОбитания = forest, ПорядковыйНомер = 2
                };
                var bear2 = new Медведь()
                {
                    ЛесОбитания = forest, ПорядковыйНомер = 5
                };
                var bear3 = new Медведь()
                {
                    ЛесОбитания = forest, ПорядковыйНомер = 8
                };
                var updateObjectsArray = new DataObject[] { forest, bear3, bear1, bear2 };
                ds.UpdateObjects(ref updateObjectsArray);

                // Формируем функцию ограничения, что нас интересуют только медведи из текущего леса.
                Function functionCurrentForest = ldef.GetFunction(
                    ldef.funcEQ,
                    new VariableDef(ldef.GuidType, Information.ExtractPropertyPath <Медведь>(x => x.ЛесОбитания)),
                    forest.__PrimaryKey);

                var    view = Медведь.Views.OrderNumberTest;
                string numberPropertyName = Information.ExtractPropertyPath <Медведь>(x => x.ПорядковыйНомер);

                // Проверка индекса первого элемента.
                var lcs1 = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), view);
                lcs1.ColumnsSort = new[] { new ColumnsSortDef(numberPropertyName, SortOrder.Asc) };

                Function func1 = ldef.GetFunction(
                    ldef.funcAND,
                    functionCurrentForest,
                    ldef.GetFunction(ldef.funcEQ, new VariableDef(ldef.GuidType, SQLWhereLanguageDef.StormMainObjectKey),
                                     bear2.__PrimaryKey));

                int index1 = ds.GetObjectIndex(lcs1, func1);
                Assert.Equal(2, index1);

                // Проверка индекса первого элемента c учетом ограничения на номер записи.
                var lcs2 = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), view);
                lcs2.ColumnsSort = new[] { new ColumnsSortDef(numberPropertyName, SortOrder.Asc) };
                lcs2.RowNumber   = new RowNumberDef(2, 3);

                Function func2 = ldef.GetFunction(
                    ldef.funcAND,
                    functionCurrentForest,
                    ldef.GetFunction(ldef.funcEQ, new VariableDef(ldef.GuidType, SQLWhereLanguageDef.StormMainObjectKey),
                                     bear2.__PrimaryKey));

                int index2 = ds.GetObjectIndex(lcs2, func2);
                Assert.Equal(1, index2);

                // Проверка индекса нескольких элементов.
                var lcs3 = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), view);
                lcs3.ColumnsSort = new[] { new ColumnsSortDef(numberPropertyName, SortOrder.Asc) };

                var variableDef3 = new VariableDef(ldef.NumericType, numberPropertyName);
                var func3        = ldef.GetFunction(ldef.funcG, variableDef3, 3);

                int[] indexes3 = ds.GetObjectIndexes(lcs3, func3);
                Assert.NotNull(indexes3);
                Assert.Equal(indexes3.Length, 2);
                Assert.Equal(indexes3[0], 2);
                Assert.Equal(indexes3[1], 3);

                // Проверка индексов с первичными ключами элементов.
                IDictionary <int, string> indexesWithPk3 = ds.GetObjectIndexesWithPks(lcs3, func3);
                Assert.NotNull(indexesWithPk3);
                Assert.Equal(indexesWithPk3.Count, 2);
                Assert.Equal(indexesWithPk3[2], bear2.__PrimaryKey.ToString());
                Assert.Equal(indexesWithPk3[3], bear3.__PrimaryKey.ToString());
            }
        }
        public void MasterFieldsOrderBy()
        {
            ActODataService(args =>
            {
                ExternalLangDef.LanguageDef.DataService = args.DataService;
                Страна страна1 = new Страна {
                    Название = "Россия"
                };
                Страна страна2 = new Страна {
                    Название = "Белоруссия"
                };
                Лес лес1 = new Лес {
                    Название = "Бор"
                };
                Лес лес2 = new Лес {
                    Название = "Березовая роща"
                };
                Медведь медвПапа1 = new Медведь {
                    СтранаРождения = страна1, ЛесОбитания = лес1, ПорядковыйНомер = 1, Вес = 200, Пол = tПол.Мужской
                };
                медвПапа1.СтранаРождения = страна1;
                Медведь медвПапа2        = new Медведь {
                    СтранаРождения = страна1, ЛесОбитания = лес1, ПорядковыйНомер = 2, Вес = 150, Пол = tПол.Мужской
                };
                Медведь медвМама1 = new Медведь {
                    СтранаРождения = страна1, ЛесОбитания = лес2, ПорядковыйНомер = 3, Вес = 120, Пол = tПол.Женский
                };
                Медведь медвМама2 = new Медведь {
                    СтранаРождения = страна1, ЛесОбитания = лес2, ПорядковыйНомер = 3, Вес = 110, Пол = tПол.Женский
                };
                Медведь медвежонок1 = new Медведь {
                    СтранаРождения = страна2, ЛесОбитания = лес2, Папа = медвПапа1, Мама = медвМама1, Вес = 48, Пол = tПол.Мужской
                };
                Медведь медвежонок2 = new Медведь {
                    СтранаРождения = страна2, ЛесОбитания = лес2, Папа = медвПапа2, Мама = медвМама1, Вес = 22, Пол = tПол.Мужской
                };
                Медведь медвежонок3 = new Медведь {
                    СтранаРождения = страна2, ЛесОбитания = лес2, Папа = медвПапа1, Мама = медвМама2, Вес = 58, Пол = tПол.Мужской
                };
                Медведь медвежонок4 = new Медведь {
                    СтранаРождения = страна2, ЛесОбитания = лес2, Папа = медвПапа2, Мама = медвМама2, Вес = 62, Пол = tПол.Мужской
                };
                var objs = new DataObject[] { страна1, страна2, медвМама1, медвМама2, медвПапа1, медвПапа2, лес1, лес2 };
                args.DataService.UpdateObjects(ref objs);
                objs = new DataObject[] { медвежонок1, медвежонок2, медвежонок3, медвежонок4 };
                args.DataService.UpdateObjects(ref objs);

                string requestUrl;
                // Проверка использования в фильтрации перечислений.
                requestUrl = "http://localhost/odata/Медведьs?$filter=Папа ne null&$expand=Папа,Мама&$orderby=Мама/Вес desc,Папа/Вес desc";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(4, ((ArrayList)receivedDict["value"]).Count);

                    int[] expectedValues = { 48, 22, 58, 62 };

                    for (int i = 0; i < expectedValues.Length; i++)
                    {
                        var медведь = ((ArrayList)receivedDict["value"])[i];
                        Assert.Equal(expectedValues[i], (int)((Dictionary <string, object>)медведь)["Вес"]);
                    }
                }

                requestUrl = "http://localhost/odata/Медведьs?$filter=Папа ne null&$expand=Папа,Мама&$orderby=Мама/Вес desc,Папа/Вес";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(4, ((ArrayList)receivedDict["value"]).Count);

                    int[] expectedValues = { 22, 48, 62, 58 };

                    for (int i = 0; i < expectedValues.Length; i++)
                    {
                        var медведь = ((ArrayList)receivedDict["value"])[i];
                        Assert.Equal(expectedValues[i], (int)((Dictionary <string, object>)медведь)["Вес"]);
                    }
                }
            });
        }
        public void TestFilterAnyAll()
        {
            ActODataService(args =>
            {
                ExternalLangDef.LanguageDef.DataService = args.DataService;

                DateTime date = new DateTimeOffset(DateTime.Now).UtcDateTime;
                КлассСМножествомТипов класс = new КлассСМножествомТипов()
                {
                    PropertyEnum = Цифра.Семь, PropertyDateTime = date
                };
                Медведь медв = new Медведь {
                    Вес = 48, Пол = tПол.Мужской
                };
                Медведь медв2 = new Медведь {
                    Вес = 148, Пол = tПол.Мужской
                };
                Лес лес1 = new Лес {
                    Название = "Бор"
                };
                Лес лес2 = new Лес {
                    Название = "Березовая роща"
                };
                медв.ЛесОбитания = лес1;
                var берлога1     = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                var берлога2 = new Берлога {
                    Наименование = "Для плохого настроения", ЛесРасположения = лес2
                };
                var берлога3 = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                медв.Берлога.Add(берлога1);
                медв.Берлога.Add(берлога2);
                медв2.Берлога.Add(берлога3);
                Блоха блоха = new Блоха()
                {
                    Кличка = "1", МедведьОбитания = медв
                };
                var objs = new DataObject[] { класс, медв, медв2, берлога2, берлога1, берлога3, лес1, лес2, блоха };
                args.DataService.UpdateObjects(ref objs);
                string requestUrl;

                // Проверка использования в фильтрации функции any.
                requestUrl = "http://localhost/odata/Медведьs?$expand=Берлога&$filter=Берлога/any(f:f/Наименование eq 'Для хорошего настроения')";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(2, ((ArrayList)receivedDict["value"]).Count);
                }

                // Проверка использования в фильтрации функции all.
                requestUrl = $"http://localhost/odata/Медведьs?$filter=Берлога/all(f:f/Наименование eq 'Для хорошего настроения')";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(1, ((ArrayList)receivedDict["value"]).Count);
                }
            });
        }
        public void BeforeSavePostComplexObjectTest()
        {
            // TODO: переписать тест с корректным формированием параметра - передаваемой сущности - для Post.
            // Объекты для тестирования создания.
            Медведь медв = new Медведь {
                Вес = 48
            };
            Лес лес1 = new Лес {
                Название = "Бор"
            };
            Лес лес2 = new Лес {
                Название = "Березовая роща"
            };

            медв.ЛесОбитания = лес1;
            var берлога1 = new Берлога {
                Наименование = "Для хорошего настроения", ЛесРасположения = лес1
            };
            var берлога2 = new Берлога {
                Наименование = "Для плохого настроения", ЛесРасположения = лес2
            };

            медв.Берлога.Add(берлога1);
            медв.Берлога.Add(берлога2);

            // Объекты для тестирования создания с обновлением.
            Медведь медвежонок = new Медведь {
                Вес = 12
            };
            var берлога3 = new Берлога {
                Наименование = "Для хорошего настроения", ЛесРасположения = лес1
            };

            медвежонок.Берлога.Add(берлога3);

            ActODataService(args =>
            {
                args.Token.Events.CallbackBeforeCreate = BeforeCreate;
                args.Token.Events.CallbackBeforeUpdate = BeforeUpdate;
                args.Token.Events.CallbackBeforeDelete = BeforeDelete;

                // ------------------ Только создания объектов ------------------
                // Подготовка тестовых данных в формате OData.
                var controller = new Controllers.DataObjectController(args.DataService, args.Token.Model, args.Token.Events, args.Token.Functions);
                System.Web.OData.EdmEntityObject edmObj = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Медведь)), медв, 1, null);
                var edmЛес1 = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Лес)), лес1, 1, null);
                var edmЛес2 = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Лес)), лес2, 1, null);
                edmObj.TrySetPropertyValue("ЛесОбитания", edmЛес1);
                var coll = controller.GetEdmCollection(медв.Берлога, typeof(Берлога), 1, null);
                edmObj.TrySetPropertyValue("Берлога", coll);
                System.Web.OData.EdmEntityObject edmБерлога1 = (System.Web.OData.EdmEntityObject)coll[0]; // controller.GetEdmObject(args.ODataService.Model.GetEdmEntityType(typeof(Берлога)), берлога1, 1, null);
                System.Web.OData.EdmEntityObject edmБерлога2 = (System.Web.OData.EdmEntityObject)coll[1]; // controller.GetEdmObject(args.ODataService.Model.GetEdmEntityType(typeof(Берлога)), берлога2, 1, null);
                edmБерлога1.TrySetPropertyValue("ЛесРасположения", edmЛес1);
                edmБерлога2.TrySetPropertyValue("ЛесРасположения", edmЛес2);

                // Формируем URL запроса к OData-сервису.
                string requestUrl = string.Format("http://localhost/odata/{0}", args.Token.Model.GetEdmEntitySet(typeof(Медведь)).Name);

                ParamObj = null;

                // Обращаемся к OData-сервису и обрабатываем ответ, в теле запроса передаем создаваемый объект в формате JSON.
                HttpResponseMessage response = args.HttpClient.PostAsJsonAsync(requestUrl, edmObj).Result;
                Assert.NotNull(ParamObj);

                // Убедимся, что запрос завершился успешно.
                Assert.Equal(HttpStatusCode.Created, response.StatusCode);

                // Получим строку с ответом.
                string receivedJsonObjs = response.Content.ReadAsStringAsync().Result.Beautify();

                // В ответе приходит объект с созданной сущностью.
                // Преобразуем полученный объект в словарь.
                Dictionary <string, object> receivedObjs = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedJsonObjs);

                // Проверяем созданный объект, вычитав с помощью DataService
                DataObject createdObj = new Медведь {
                    __PrimaryKey = медв.__PrimaryKey
                };
                args.DataService.LoadObject(createdObj);

                Assert.Equal(ObjectStatus.UnAltered, createdObj.GetStatus());
                Assert.Equal(((Медведь)createdObj).Вес, receivedObjs["Вес"]);

                // Проверяем что созданы все зависимые объекты, вычитав с помощью DataService
                var ldef         = ICSSoft.STORMNET.FunctionalLanguage.SQLWhere.SQLWhereLanguageDef.LanguageDef;
                var lcs          = LoadingCustomizationStruct.GetSimpleStruct(typeof(Лес), "ЛесE");
                lcs.LoadingTypes = new[] { typeof(Лес) };
                var dobjs        = args.DataService.LoadObjects(lcs);

                Assert.Equal(2, dobjs.Length);

                lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Берлога), "БерлогаE");
                lcs.LoadingTypes = new[] { typeof(Берлога) };

                // lcs.LimitFunction = ldef.GetFunction(ldef.funcEQ, new VariableDef(ldef.GuidType, SQLWhereLanguageDef.StormMainObjectKey), keyValue);
                dobjs = args.DataService.LoadObjects(lcs);
                Assert.Equal(2, dobjs.Length);

                // ------------------ Создание объекта и обновление связанных ------------------
                // Создаем нового медведя: в его мастере ЛесОбитания - лес1, но в нём изменим Название; в детейлы заберем от первого медведя  детейл2, изменив Название в мастере детейла.
                // Подготовка тестовых данных в формате OData.
                edmObj = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Медведь)), медвежонок, 1, null);
                edmObj.TrySetPropertyValue("ЛесОбитания", edmЛес1);
                edmЛес1.TrySetPropertyValue("Название", лес1.Название + "(обновл)");
                edmЛес2.TrySetPropertyValue("Название", лес2.Название + "(обновл)");
                медв.Берлога.Remove(берлога2);
                медвежонок.Берлога.Add(берлога2);
                coll = controller.GetEdmCollection(медвежонок.Берлога, typeof(Берлога), 1, null);
                edmObj.TrySetPropertyValue("Берлога", coll);
                edmБерлога1 = (System.Web.OData.EdmEntityObject)coll[0];
                edmБерлога2 = (System.Web.OData.EdmEntityObject)coll[1];
                edmБерлога1.TrySetPropertyValue("ЛесРасположения", edmЛес2);
                edmБерлога2.TrySetPropertyValue("ЛесРасположения", edmЛес1);

                ParamObj = null;

                // Обращаемся к OData-сервису и обрабатываем ответ, в теле запроса передаем создаваемый объект в формате JSON.
                response = args.HttpClient.PostAsJsonAsync(requestUrl, edmObj).Result;
                Assert.NotNull(ParamObj);

                // Убедимся, что запрос завершился успешно.
                Assert.Equal(HttpStatusCode.Created, response.StatusCode);

                // Проверяем созданный объект, вычитав с помощью DataService
                createdObj = new Медведь {
                    __PrimaryKey = медвежонок.__PrimaryKey
                };
                args.DataService.LoadObject(createdObj);

                Assert.Equal(ObjectStatus.UnAltered, createdObj.GetStatus());
                Assert.Equal(12, ((Медведь)createdObj).Вес);

                // Проверяем что созданы все зависимые объекты, вычитав с помощью DataService
                ldef              = ICSSoft.STORMNET.FunctionalLanguage.SQLWhere.SQLWhereLanguageDef.LanguageDef;
                lcs               = LoadingCustomizationStruct.GetSimpleStruct(typeof(Лес), "ЛесE");
                lcs.LoadingTypes  = new[] { typeof(Лес) };
                lcs.LimitFunction = ldef.GetFunction(
                    ldef.funcEQ,
                    new ICSSoft.STORMNET.FunctionalLanguage.VariableDef(ldef.GuidType, ICSSoft.STORMNET.FunctionalLanguage.SQLWhere.SQLWhereLanguageDef.StormMainObjectKey),
                    лес1.__PrimaryKey);
                dobjs = args.DataService.LoadObjects(lcs);

                Assert.Equal(1, dobjs.Length);
                Assert.True(((Лес)dobjs[0]).Название.EndsWith("(обновл)"));

                lcs.LimitFunction = ldef.GetFunction(
                    ldef.funcEQ,
                    new ICSSoft.STORMNET.FunctionalLanguage.VariableDef(ldef.GuidType, ICSSoft.STORMNET.FunctionalLanguage.SQLWhere.SQLWhereLanguageDef.StormMainObjectKey),
                    лес2.__PrimaryKey);
                dobjs = args.DataService.LoadObjects(lcs);

                Assert.Equal(1, dobjs.Length);
                Assert.True(((Лес)dobjs[0]).Название.EndsWith("(обновл)"));

                lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Берлога), "БерлогаE");
                lcs.LoadingTypes  = new[] { typeof(Берлога) };
                lcs.LimitFunction = ldef.GetFunction(
                    ldef.funcEQ,
                    new ICSSoft.STORMNET.FunctionalLanguage.VariableDef(ldef.GuidType, "Медведь"),
                    медв.__PrimaryKey);
                dobjs = args.DataService.LoadObjects(lcs);

                Assert.Equal(1, dobjs.Length);

                lcs.LimitFunction = ldef.GetFunction(
                    ldef.funcEQ,
                    new ICSSoft.STORMNET.FunctionalLanguage.VariableDef(ldef.GuidType, "Медведь"),
                    медвежонок.__PrimaryKey);
                dobjs = args.DataService.LoadObjects(lcs);

                Assert.Equal(2, dobjs.Length);

                // Вернем детейл для того, чтобы тест работал со следующими СУБД.
                медвежонок.Берлога.Remove(берлога2);
                медв.Берлога.Add(берлога2);
            });
        }
예제 #21
0
        public void TestFilter()
        {
            ActODataService(args =>
            {
                DateTime date               = new DateTimeOffset(DateTime.Now).UtcDateTime;
                string prevDate             = $"{date.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:ss")}%2B05:00";
                string nextDate             = $"{date.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ss")}%2B05:00";
                КлассСМножествомТипов класс = new КлассСМножествомТипов()
                {
                    PropertyEnum = Цифра.Семь, PropertyDateTime = date
                };
                Медведь медв = new Медведь {
                    Вес = 48, Пол = tПол.Мужской
                };
                Медведь медв2 = new Медведь {
                    Вес = 148, Пол = tПол.Мужской
                };
                Лес лес1 = new Лес {
                    Название = "Бор"
                };
                Лес лес2 = new Лес {
                    Название = "Березовая роща"
                };
                медв.ЛесОбитания = лес1;
                var берлога1     = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                var берлога2 = new Берлога {
                    Наименование = "Для плохого настроения", ЛесРасположения = лес2
                };
                var берлога3 = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                медв.Берлога.Add(берлога1);
                медв.Берлога.Add(берлога2);
                медв2.Берлога.Add(берлога3);
                var objs = new DataObject[] { класс, медв, медв2, берлога2, берлога1, берлога3, лес1, лес2 };
                args.DataService.UpdateObjects(ref objs);
                string requestUrl;

                // Проверка использования в фильтрации перечислений.
                requestUrl = "http://localhost/odata/Медведьs?$filter=Пол eq NewPlatform.Flexberry.ORM.ODataService.Tests.tПол'Мужской'";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(2, ((ArrayList)receivedDict["value"]).Count);
                }

                // Проверка использования в фильтрации DateTime.
                requestUrl = $"http://localhost/odata/КлассСМножествомТиповs?$filter=(PropertyDateTime gt {prevDate}) and (PropertyDateTime lt {nextDate})";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(1, ((ArrayList)receivedDict["value"]).Count);
                }

                // Проверка использования в фильтрации поля __PrimaryKey.
                string strGuid = ((ICSSoft.STORMNET.KeyGen.KeyGuid)медв.__PrimaryKey).Guid.ToString("D");
                requestUrl     = $"http://localhost/odata/Медведьs?$filter=__PrimaryKey eq {strGuid}";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(1, ((ArrayList)receivedDict["value"]).Count);
                }
            });
        }