public void TestFilterStringKey() { ActODataService(args => { var класс = new КлассСоСтроковымКлючом(); Медведь медв = new Медведь { Вес = 48, Пол = tПол.Мужской }; var objs = new DataObject[] { класс, медв }; args.DataService.UpdateObjects(ref objs); string requestUrl; requestUrl = $"http://localhost/odata/КлассСоСтроковымКлючомs?$filter=__PrimaryKey eq '{класс.__PrimaryKey}'"; // Обращаемся к 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 UpdateOtherAgregatorInstanceTest() { foreach (IDataService dataService in DataServices) { // Шаг 1. Создание экземпляра класса А хотя бы с одним детейлом класса В. var берлога = new Берлога { Наименование = "У потапыча" }; var потапыч = new Медведь { ПорядковыйНомер = 5 }; потапыч.Берлога.Add(берлога); dataService.UpdateObject(потапыч); // Шаг 2. Создание другого экземпляра класса А с установкой первичного ключа первого экземпляра. var pk = (KeyGuid)потапыч.__PrimaryKey; var берёзыч = new Медведь { ПорядковыйНомер = 6 }; берёзыч.SetExistObjectPrimaryKey(pk); // Шаг 3. Допустимо пропустить. // Шаг 4. Создание экземпляра класса С с установкой в качестве мастера второго экземпляра класса А. var блоха = new Блоха { Кличка = "Попрыгушка", МедведьОбитания = берёзыч }; // Шаг 5. Обновление экземпляра класса С в базу данных. dataService.UpdateObject(блоха); Assert.Equal(1, потапыч.Берлога.Count); } }
public void GetObjectIndexesWithPksTest() { foreach (IDataService dataService in DataServices) { // Arrange. SQLDataService ds = dataService as SQLDataService; var createdBear1 = new Медведь(); createdBear1.ЦветГлаз = "Косолапый Мишка 1"; ds.UpdateObject(createdBear1); LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), Медведь.Views.МедведьL); SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef; Function findFunction = langDef.GetFunction(langDef.funcLike, new VariableDef(langDef.StringType, Information.ExtractPropertyPath <Медведь>(m => m.ЦветГлаз)), createdBear1.ЦветГлаз); // Act. IDictionary <int, string> result = ds.GetObjectIndexesWithPks(lcs, findFunction, 101); // Assert. Assert.Equal(1, result.Count); Assert.True(result[1].IndexOf("{") > -1); Console.WriteLine(result[1]); } }
public void LoadingObjectLoadObjectsTest() { // TODO: Обработать после выполнения задачи 4009 var dataService = new MSSQLDataService(); dataService.CustomizationString = ConfigurationManager.ConnectionStrings["TestAppNormal"] .ConnectionString; // Создание тестовой записи. var тестовыйМедведь = new Медведь() { ПорядковыйНомер = 15, Вес = 39 }; dataService.UpdateObject(тестовыйМедведь); var view = new View { DefineClassType = typeof(Медведь) }; view.AddProperties( new string[1] { "ВычислимоеПоле" }); // Загрузка объектов. IQueryable <Медведь> dataМедведи = dataService.Query <Медведь>(view).Where(w => w.__PrimaryKey == тестовыйМедведь.__PrimaryKey); var lcs = LinqToLcs.GetLcs(dataМедведи.Expression, view); lcs.View = view; lcs.LoadingTypes = new[] { typeof(Медведь) }; lcs.ReturnType = LcsReturnType.Objects; // Загрузка данных без создания объктов. var медведи = dataService.LoadObjects(lcs); Assert.True(1 == медведи.Length, "Запись должна быть одна."); foreach (var stringDataView in медведи) { int fieldSum = ((Медведь)stringDataView).ВычислимоеПоле; Assert.True(54 == fieldSum, "ВычислимоеПоле"); } Assert.True(1 == dataМедведи.Count(), "Запись должна быть одна."); foreach (var медведь in dataМедведи) { Assert.True(1 == медведь.ВычислимоеПоле, "ВычислимоеПоле"); } // Удаление тестовой записи. тестовыйМедведь.SetStatus(ObjectStatus.Deleted); dataService.UpdateObject(тестовыйМедведь); }
public void LoadingObjectLoadStringedObjectViewTest() { // TODO: Обработать после выполнения задачи 4009 var dataService = new MSSQLDataService(); dataService.CustomizationString = "SERVER=rtc-storm;Trusted_connection=yes;DATABASE=dochitka_test;"; // Cоздание тестовой записи. var тестовыйМедведь = new Медведь() { ПорядковыйНомер = 15, Вес = 39 }; dataService.UpdateObject(тестовыйМедведь); var view = new View { DefineClassType = typeof(Медведь) }; view.AddProperties( new string[1] { "ВычислимоеПоле" }); // Загрузка объектов. IQueryable <Медведь> dataМедведи = dataService.Query <Медведь>(view).Where(w => w.__PrimaryKey == тестовыйМедведь.__PrimaryKey); var lcs = LinqToLcs.GetLcs(dataМедведи.Expression, view); lcs.View = view; lcs.LoadingTypes = new[] { typeof(Медведь) }; lcs.ReturnType = LcsReturnType.Objects; // Загрузка данных без создания объктов. var медведи = dataService.LoadStringedObjectView('\t', lcs); Assert.True(1 == медведи.Length, "Запись должна быть одна."); foreach (var stringDataView in медведи) { int fieldSum = Int32.Parse(stringDataView.ObjectedData[0].ToString()); Assert.True(54 == fieldSum, "ВычислимоеПоле"); } Assert.True(1 == dataМедведи.Count(), "Запись должна быть одна."); foreach (var медведь in dataМедведи) { Assert.True(54 == медведь.ВычислимоеПоле, "ВычислимоеПоле"); } // Удаление тестовой записи. тестовыйМедведь.SetStatus(ObjectStatus.Deleted); dataService.UpdateObject(тестовыйМедведь); }
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 LoadTest3() { foreach (IDataService dataService in DataServices) { var ds = (SQLDataService)dataService; var view = Медведь.Views.LoadTestView; LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), view); lcs.ColumnsSort = new[] { new ColumnsSortDef(Information.ExtractPropertyPath <Медведь>(x => x.__PrimaryKey), _random.Next(10) > 5 ? SortOrder.Asc : SortOrder.Desc) }; lcs.InitDataCopy = true; // Чтобы медведь в БД точно был, создадим его. var createdBear = new Медведь(); ds.UpdateObject(createdBear); var dataObjects = ds.LoadObjects(lcs); Assert.True(dataObjects.Length > 0); var медведь = (Медведь)dataObjects[0]; if (медведь.Берлога.Count == 0) { медведь.Берлога.Add(new Берлога { Наименование = "Некий лес" }); ds.UpdateObject(медведь); } var alteredPropertyNames = медведь.GetAlteredPropertyNames(); var loadedProperties = медведь.GetLoadedProperties(); Assert.NotNull(alteredPropertyNames); Assert.Equal(0, alteredPropertyNames.Length); Assert.NotNull(loadedProperties); Assert.Equal(4, loadedProperties.Length); string s = "Подосиновая"; медведь.Берлога[0].Наименование = s; ds.LoadObject(медведь, false, false); Assert.Equal(s, медведь.Берлога[0].Наименование); Assert.Equal(1, медведь.Берлога[0].GetAlteredPropertyNames(true).Length); } #endregion }
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 DeleteAgregatorWithoutDetailsThroughUpdateObjectsOrderedMethodTest() { foreach (IDataService dataService in DataServices) { SQLDataService ds = dataService as SQLDataService; // Создаем агрегатор без детейлов (медведя без берлог), но с бизнес-сервером привязанным к детейлам (к берлогам привязан бизнес-сервер). Медведь bear = new Медведь { ЦветГлаз = "Карие", Вес = 50 }; DataObject[] dataObjectsForUpdate = new DataObject[] { bear }; // Сохраняем созданный агрегатор без детейлов. ds.UpdateObjects(ref dataObjectsForUpdate); // Помечаем сохраненный агрегатор на удаление. bear.SetStatus(ObjectStatus.Deleted); Exception updateException = null; try { // Пытаемся удалить агрегатор через метод UpdateObjectsOrdered. ds.UpdateObjectsOrdered(ref dataObjectsForUpdate); } catch (Exception ex) { updateException = ex; } // Проверяем, что при удалении не возникло исключений. Assert.True(updateException == null, "При удалении через UpdateObjectsOrdered не возникло исключений"); // Пытаемся загрузить удаленный объект из БД. Exception loadException = null; try { Медведь loadedBear = new Медведь(); loadedBear.SetExistObjectPrimaryKey(bear.__PrimaryKey); ds.LoadObject(loadedBear); } catch (Exception ex) { loadException = ex; } // Проверяем, что удаленный объект действительно удалился. Assert.True(loadException is CantFindDataObjectException, "Объект удаленный через UpdateObjectsOrdered действительно больше не существует"); } }
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(названиеЛеса, медведь.ЛесОбитания.Название); } }
public void InsertSelectUpdateDeleteSpeedTest() { foreach (IDataService dataService in DataServices) { var ds = (SQLDataService)dataService; var createdBear1 = new Медведь(); createdBear1.ЦветГлаз = "Косолапый Мишка 1"; ds.UpdateObject(createdBear1); Random random = new Random(); Stopwatch stopwatch = new Stopwatch(); int i = 0; stopwatch.Start(); do { // Чтобы медведь в БД точно был, создадим его. var createdBear = new Медведь(); createdBear.ЦветГлаз = "Косолапый Мишка " + random.Next(101); ds.UpdateObject(createdBear); // Теперь грузим его из БД. var медведь = new Медведь(); медведь.SetExistObjectPrimaryKey(createdBear.__PrimaryKey); ds.LoadObject(медведь, false, false); медведь.ЦветГлаз = "Топтыгин " + random.Next(101); ds.UpdateObject(медведь); медведь.SetStatus(ObjectStatus.Deleted); ds.UpdateObject(медведь); i++; } while (stopwatch.ElapsedMilliseconds < 1000); stopwatch.Stop(); Console.WriteLine(i + " instances."); } }
public void LoadTest1() { foreach (IDataService dataService in DataServices) { var ds = (SQLDataService)dataService; // Чтобы медведь в БД точно был, создадим его. var createdBear = new Медведь(); ds.UpdateObject(createdBear); // Теперь грузим его из БД. var медведь = new Медведь(); медведь.SetExistObjectPrimaryKey(createdBear.__PrimaryKey); ds.LoadObject(медведь, false, false); Assert.NotNull(медведь.Берлога); Assert.Equal(0, медведь.Берлога.Count); } }
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(); } }
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); } }); }
static void Main(string[] args) { try { Console.Title = "ТАРАКАНИЩЕ"; Console.WriteLine(" ТАРАКАНИЩЕ\r\n"); Console.WriteLine("Created by Koleso\nStory by Chykovskiy"); Console.WriteLine(); Медведь bears = new Медведь(); Console.WriteLine(bears); bears.Move(); Console.WriteLine(); Кот cat = new Кот(); Console.WriteLine(cat); cat.Move(); Console.WriteLine(); Комар mosquito = new Комар(); Console.WriteLine(mosquito); mosquito.Move(); Console.WriteLine(); ак crayfish = new ак(); Console.WriteLine(crayfish); crayfish.Speak(); crayfish.Move(); Console.WriteLine(); Волк wolf = new Волк(); Console.WriteLine(wolf); wolf.Move(); Console.WriteLine(); Лев lion = new Лев(); Console.WriteLine(lion); lion.Move(); Console.WriteLine(); Заяц hare = new Заяц(); Console.WriteLine(hare); hare.Move(); Console.WriteLine(); Жаба frog = new Жаба(); Console.WriteLine(frog); frog.Move(); Console.WriteLine(); Герои.Smile(); Герои.Eat(); Таракан roach = Таракан.Instance; Console.WriteLine(roach.Places); Console.WriteLine(roach.Types); Console.WriteLine(roach); roach.Growl(); roach.Shout(); roach.Stir(); roach.Speak(); Console.WriteLine(); Герои.frighten(); Console.WriteLine(frog); frog.FrightSpeak(); Console.WriteLine(); Console.WriteLine(wolf); wolf.FrightSpeak(); Console.WriteLine(); Console.WriteLine(crayfish); crayfish.FrightSpeak(); Console.WriteLine(); Sparrow obj10 = new Sparrow(); Console.WriteLine(); Console.WriteLine(); obj10.Speak(); obj10.Kill(); Console.ReadLine(); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
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.ПолеБС); } }); }
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 TestSettingAuditFieldsForTypeWithEnabledAudit() { foreach (var dataService in DataServices) { var d1 = new Медведь(); // Audit fields are empty after creating object. Assert.Null(d1.CreateTime); Assert.Null(d1.Creator); Assert.Null(d1.Editor); Assert.Null(d1.EditTime); var createTime = DateTime.Now.AddDays(new Random().Next(42)); var creator = "Bruce the Hunter"; d1.CreateTime = createTime; d1.Creator = creator; dataService.UpdateObject(d1); // Audit fields are empty after persisting. Assert.Equal(creator, d1.Creator); Assert.Equal(createTime, d1.CreateTime); Assert.Null(d1.Editor); Assert.Null(d1.EditTime); var d2 = new Медведь(); d2.SetExistObjectPrimaryKey(d1.__PrimaryKey); dataService.LoadObject(d2); // Audit fields are persisted. Assert.Equal(creator, d2.Creator); Assert.NotNull(d2.CreateTime); Assert.Equal(0, (int)(createTime - d2.CreateTime.Value).TotalSeconds); Assert.Null(d2.Editor); Assert.Null(d2.EditTime); d2.ПорядковыйНомер = 42; var editTime = createTime.AddDays(new Random().Next(42)); var editor = "Mike the Hunter"; d2.EditTime = editTime; d2.Editor = editor; dataService.UpdateObject(d2); // Audit fields are empty after persisting. Assert.Equal(creator, d2.Creator); Assert.NotNull(d2.CreateTime); Assert.Equal(0, (int)(createTime - d2.CreateTime.Value).TotalSeconds); Assert.Equal(editor, d2.Editor); Assert.Equal(editTime, d2.EditTime); var d3 = new Медведь(); d3.SetExistObjectPrimaryKey(d2.__PrimaryKey); dataService.LoadObject(d3); // Audit fields are persisted. Assert.Equal(creator, d3.Creator); Assert.NotNull(d3.CreateTime); Assert.Equal(0, (int)(createTime - d3.CreateTime.Value).TotalSeconds); Assert.Equal(editor, d3.Editor); Assert.NotNull(d3.EditTime); Assert.Equal(0, (int)(editTime - d3.EditTime.Value).TotalSeconds); } }
public void GetObjectIndexesWithPksOrderingTest() { foreach (IDataService dataService in DataServices) { //TODO: Fix OracleDataService error. if (dataService is OracleDataService) { continue; } // Arrange. SQLDataService ds = dataService as SQLDataService; SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef; List <DataObject> dataObjects = new List <DataObject>(); bool isMssql = dataService.GetType() == typeof(MSSQLDataService) || dataService.GetType().IsSubclassOf(typeof(MSSQLDataService)); // MSSQL в отличие от других хранилищ имеет свой формат сортировки гуидов. Для его поддержки приходится пользоваться специальным типом SqlGuid. List <SqlGuid> keysMssqlList = new List <SqlGuid>(); List <Guid> keysPostgresList = new List <Guid>(); // Создадим 1000 медведей. int objectsCount = 1000; for (int i = 0; i < objectsCount; i++) { // Для простоты анализа проблем с данными, если они возникнут, выдадим ненастоящие последовательные гуиды. byte[] bytes = new byte[16]; BitConverter.GetBytes(i).CopyTo(bytes, 0); var pk = new Guid(bytes); if (isMssql) { keysMssqlList.Add(pk); } else { keysPostgresList.Add(pk); } var createdBear = new Медведь { __PrimaryKey = pk, ЦветГлаз = "Косолапый Мишка " + i, Вес = i }; dataObjects.Add(createdBear); } DataObject[] dataObjectsForUpdate = dataObjects.ToArray(); ds.UpdateObjects(ref dataObjectsForUpdate); LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), Медведь.Views.МедведьL); Function findFunction = langDef.GetFunction(langDef.funcL, new VariableDef(langDef.StringType, Information.ExtractPropertyPath <Медведь>(m => m.Вес)), objectsCount); if (isMssql) { keysMssqlList.Sort(); } else { keysPostgresList.Sort(); } // Act. IDictionary <int, string> result = ds.GetObjectIndexesWithPks(lcs, findFunction, null); // Assert. var values = result.Values.GetEnumerator(); var keys = result.Keys.GetEnumerator(); for (int i = 0; i < objectsCount; i++) { Assert.Equal(objectsCount, result.Count); values.MoveNext(); keys.MoveNext(); string key = isMssql ? ((Guid)keysMssqlList[i]).ToString("B") : keysPostgresList[i].ToString("B"); Assert.Equal(key, values.Current); Assert.Equal(i + 1, keys.Current); } } }
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 NullableDateTimeOrderByMaster() { 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 }; Медведь медведь1 = new Медведь { Пол = tПол.Мужской, ЛесОбитания = лес1 }; Медведь медведь2 = new Медведь { Пол = tПол.Женский, ЛесОбитания = лес2 }; Медведь медведь3 = new Медведь { Пол = tПол.Мужской, ЛесОбитания = лес3 }; Медведь медведь4 = new Медведь { Пол = tПол.Женский, ЛесОбитания = лес4 }; var objs = new DataObject[] { медведь1, медведь2, медведь3, медведь4 }; args.DataService.UpdateObjects(ref objs); string requestUrl; // Проверка использования в фильтрации перечислений. requestUrl = "http://localhost/odata/Медведьs?$expand=ЛесОбитания($select=ДатаПоследнегоОсмотра)&$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]; var лес = ((Dictionary <string, object>)медведь)["ЛесОбитания"]; Assert.Equal(expectedValues[i], (NullableDateTime) new DateTimeOffset(DateTime.Parse((string)((Dictionary <string, object>)лес)["ДатаПоследнегоОсмотра"])).UtcDateTime); } } }); }
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); } }
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 BeforeSaveDeleteObjectTest() { ActODataService(args => { args.Token.Events.CallbackBeforeCreate = BeforeCreate; args.Token.Events.CallbackBeforeUpdate = BeforeUpdate; args.Token.Events.CallbackBeforeDelete = BeforeDelete; // ------------------ Удаление простого объекта ----------------------------- // Создаем объект данных, который потом будем удалять, и добавляем в базу обычным сервисом данных. Медведь медв = new Медведь { Пол = tПол.Мужской, Вес = 80, ПорядковыйНомер = 1 }; args.DataService.UpdateObject(медв); // Формируем 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-сервису и обрабатываем ответ. using (HttpResponseMessage response = args.HttpClient.DeleteAsync(requestUrl).Result) { Assert.NotNull(ParamObj); // Убедимся, что запрос завершился успешно (тело ответа д.б. пустым при отсутствии ошибок удаления). Assert.Equal(HttpStatusCode.NoContent, response.StatusCode); // Проверяем что объект данных был удален из базы. bool exists = true; Медведь deletedМедв = new Медведь { __PrimaryKey = медв.__PrimaryKey }; try { args.DataService.LoadObject(deletedМедв); } catch (Exception ex) { if (ex is CantFindDataObjectException) { exists = false; } } Assert.False(exists); } // ------------------ Удаление детейла и объекта с детейлами ----------------------------- // Создаем объект данных, который потом будем удалять, и добавляем в базу обычным сервисом данных. медв = new Медведь { Пол = tПол.Мужской, Вес = 80, ПорядковыйНомер = 1 }; медв.Берлога.Add(new Берлога { Наименование = "Берлога для хорошего настроения" }); медв.Берлога.Add(new Берлога { Наименование = "Берлога для плохого настроения" }); Берлога delБерлога = new Берлога { Наименование = "Отдельно удаляемая берлога" }; медв.Берлога.Add(delБерлога); args.DataService.UpdateObject(медв); // Проверяем что до вызова удалений в базе есть все детейлы. var ldef = ICSSoft.STORMNET.FunctionalLanguage.SQLWhere.SQLWhereLanguageDef.LanguageDef; LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Берлога), Берлога.Views.БерлогаE); lcs.LoadingTypes = new[] { typeof(Берлога) }; ICSSoft.STORMNET.DataObject[] dobjs = args.DataService.LoadObjects(lcs); Assert.Equal(3, dobjs.Length); // Формируем URL запроса к OData-сервису для удаления объекта-детейла (с идентификатором удаляемой сущности). requestUrl = string.Format("http://localhost/odata/{0}({1})", args.Token.Model.GetEdmEntitySet(typeof(Берлога)).Name, ((ICSSoft.STORMNET.KeyGen.KeyGuid)delБерлога.__PrimaryKey).Guid.ToString()); // Обращаемся к OData-сервису и обрабатываем ответ. using (HttpResponseMessage response = args.HttpClient.DeleteAsync(requestUrl).Result) { // Убедимся, что запрос завершился успешно (тело ответа д.б. пустым при отсутствии ошибок удаления). Assert.Equal(HttpStatusCode.NoContent, response.StatusCode); // Проверяем что объект-детейл был удален из базы. bool exists = true; Берлога deletedБерлога = new Берлога { __PrimaryKey = delБерлога.__PrimaryKey }; try { args.DataService.LoadObject(deletedБерлога); } catch (Exception ex) { if (ex is CantFindDataObjectException) { exists = false; } } Assert.False(exists); // Проверяем что объект-агрегатор остался в базе. exists = true; Медведь deletedМедв = new Медведь { __PrimaryKey = медв.__PrimaryKey }; try { args.DataService.LoadObject(deletedМедв); } catch (Exception ex) { if (ex is CantFindDataObjectException) { exists = false; } } Assert.True(exists); // Проверяем что детейлов объекта в базе осталось на 1 меньше, чем создавали. dobjs = args.DataService.LoadObjects(lcs); Assert.Equal(2, dobjs.Length); } // Формируем URL запроса к OData-сервису (с идентификатором удаляемой сущности). requestUrl = string.Format("http://localhost/odata/{0}({1})", args.Token.Model.GetEdmEntitySet(typeof(Медведь)).Name, ((ICSSoft.STORMNET.KeyGen.KeyGuid)медв.__PrimaryKey).Guid.ToString()); // Обращаемся к OData-сервису для удаления объекта с детейлами и обрабатываем ответ. using (HttpResponseMessage response = args.HttpClient.DeleteAsync(requestUrl).Result) { // Убедимся, что запрос завершился успешно (тело ответа д.б. пустым при отсутствии ошибок удаления). Assert.Equal(HttpStatusCode.NoContent, response.StatusCode); // Проверяем что объект данных был удален из базы. bool exists = true; Медведь deletedМедв = new Медведь { __PrimaryKey = медв.__PrimaryKey }; try { args.DataService.LoadObject(deletedМедв); } catch (Exception ex) { if (ex is CantFindDataObjectException) { exists = false; } } Assert.False(exists); // Проверяем что детейлов объекта в базе не осталось. dobjs = args.DataService.LoadObjects(lcs); Assert.Equal(0, dobjs.Length); } }); }
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); }); }
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); } }); }