public void TestFilterNotStored() { ActODataService(args => { DataObject класс = new КлассСМножествомТипов() { PropertyInt = 15, PropertyDateTime = DateTime.Now }; args.DataService.UpdateObject(ref класс); string requestUrl; requestUrl = $"http://localhost/odata/КлассСМножествомТиповs?$filter=NotStoredProperty eq 15"; // Обращаемся к 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 TestFilterGis() { ActODataService(args => { ExternalLangDef.LanguageDef.DataService = args.DataService; DateTime date = new DateTimeOffset(DateTime.Now).UtcDateTime; КлассСМножествомТипов класс = new КлассСМножествомТипов() { PropertyEnum = Цифра.Семь, PropertyDateTime = date, PropertyGeography = "LINESTRING(0 0,1 1,1 2)".CreateGeography(), PropertyInt = 5 }; var objs = new DataObject[] { класс }; args.DataService.UpdateObjects(ref objs); string requestUrl; requestUrl = "http://localhost/odata/КлассСМножествомТиповs?$filter=PropertyInt eq 5 and geo.intersects(geography1=PropertyGeography, geography2=geography'SRID=4326;LINESTRING(0 0,1 1,1 2)')"; // Обращаемся к 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 TestFilterNullableDateFunctions() { ActODataService(args => { DateTime?date = new DateTime?(DateTime.UtcNow); ExternalLangDef.LanguageDef.DataService = args.DataService; КлассСМножествомТипов класс = new КлассСМножествомТипов() { PropertySystemNullableDateTime = date, PropertyDateTime = date.Value }; var objs = new DataObject[] { класс }; args.DataService.UpdateObjects(ref objs); string requestUrl; // Проверка использования фильтрации для типа System.DateTime?. requestUrl = $"http://localhost/odata/КлассСМножествомТиповs?$filter=day(PropertySystemNullableDateTime) eq {date.Value.Day}"; // Обращаемся к 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 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); } }); }
/// <summary> /// Осуществляет проверку того, что <see cref="FileDescription.FileUrl"/> и <see cref="FileDescription.PreviewUrl"/> /// корректно формируются, если задан избыточный набор свойств /// (все свойства описания: и ключ загрузки с именем файла, и описание объекта данных, с которым связан файл). /// При этом соблюдается приоритет в пользу ключа загрузки и имени файла. /// </summary> //[Test] public void TestUrlsByAllProperties() { string fileBaseUrl = "http://localhost/api/File"; // Свойства достаточные для описания файла, который не привязан к объекту данных (ключ загрузки и имя файла). string fileUploadKey = Guid.NewGuid().ToString("D"); string fileName = "readme.txt"; // Свойства достаточные для описания файла, который привязан к объекту данных // (тип и первичный ключ объекта данных, а так же имя файлового свойства в объекте данных). КлассСМножествомТипов entity = new КлассСМножествомТипов(); string entityTypeName = entity.GetType().AssemblyQualifiedName; string entityPropertyName = nameof(entity.PropertyStormnetFile); string entityPrimaryKey = entity.__PrimaryKey.ToString(); // Описание файла с избыточным набором свойств. FileDescription fileDescription = new FileDescription(fileBaseUrl) { FileUploadKey = fileUploadKey, FileName = fileName, EntityTypeName = entityTypeName, EntityPropertyName = entityPropertyName, EntityPrimaryKey = entityPrimaryKey }; Uri receivedFileUri = new Uri(fileDescription.FileUrl); Uri receivedPreviewUri = new Uri(fileDescription.PreviewUrl); string receivedFileBaseUrl = receivedFileUri.GetLeftPart(UriPartial.Path); string receivedPreviewBaseUrl = receivedPreviewUri.GetLeftPart(UriPartial.Path); NameValueCollection receivedFileQueryParameters = HttpUtility.ParseQueryString(receivedFileUri.Query); NameValueCollection receivedPreviewQueryParameters = HttpUtility.ParseQueryString(receivedPreviewUri.Query); /* * Assert.AreEqual(fileBaseUrl, receivedFileBaseUrl); * Assert.AreEqual(fileBaseUrl, receivedPreviewBaseUrl); * * Assert.AreEqual(2, receivedFileQueryParameters.Count); * Assert.AreEqual(fileUploadKey, receivedFileQueryParameters["fileUploadKey"]); * Assert.AreEqual(fileName, receivedFileQueryParameters["fileName"]); * * Assert.AreEqual(3, receivedPreviewQueryParameters.Count); * Assert.AreEqual(fileUploadKey, receivedPreviewQueryParameters["fileUploadKey"]); * Assert.AreEqual(fileName, receivedPreviewQueryParameters["fileName"]); * Assert.AreEqual(true, bool.Parse(receivedPreviewQueryParameters["getPreview"])); */ }
public void ModifyTest() { ActODataService(args => { // Создаем объект данных. КлассСМножествомТипов класс = new КлассСМножествомТипов() { PropertyEnum = Цифра.Семь, PropertyGeography = "POINT(3 3)".CreateGeography(), PropertyInt = 5, PropertyDateTime = DateTime.Now }; // Преобразуем объект данных в JSON-строку. string[] классСМножествомТиповPropertiesNames = { Information.ExtractPropertyPath <КлассСМножествомТипов>(x => x.__PrimaryKey), Information.ExtractPropertyPath <КлассСМножествомТипов>(x => x.PropertyEnum), Information.ExtractPropertyPath <КлассСМножествомТипов>(x => x.PropertyGeography), Information.ExtractPropertyPath <КлассСМножествомТипов>(x => x.PropertyInt), Information.ExtractPropertyPath <КлассСМножествомТипов>(x => x.PropertyDateTime) }; var dynamicView = new View(new ViewAttribute("dynamicView", классСМножествомТиповPropertiesNames), typeof(КлассСМножествомТипов)); string requestJsonData = класс.ToJson(dynamicView, args.Token.Model); // Формируем URL запроса к OData-сервису. string requestUrl = string.Format("http://localhost/odata/{0}", args.Token.Model.GetEdmEntitySet(typeof(КлассСМножествомТипов)).Name); // Обращаемся к OData-сервису и обрабатываем ответ, в теле запроса передаем создаваемый объект в формате JSON. using (HttpResponseMessage response = args.HttpClient.PostAsJsonStringAsync(requestUrl, requestJsonData).Result) { // Убедимся, что запрос завершился успешно. Assert.Equal(HttpStatusCode.Created, response.StatusCode); } requestUrl = string.Format("http://localhost/odata/{0}({1})", args.Token.Model.GetEdmEntitySet(typeof(КлассСМножествомТипов)).Name, ((KeyGuid)класс.__PrimaryKey).Guid.ToString()); using (HttpResponseMessage response = args.HttpClient.PatchAsJsonStringAsync(requestUrl, requestJsonData).Result) { // Убедимся, что запрос завершился успешно. Assert.Equal(HttpStatusCode.NoContent, response.StatusCode); } }); }
/// <summary> /// Осуществляет проверку того, что <see cref="FileDescription.FileUrl"/> и <see cref="FileDescription.PreviewUrl"/> не формируются /// если не задано свойтсво <see cref="FileDescription.FileBaseUrl"/>. /// </summary> //[Test] public void TestUrlsByEmptyFileBaseUrl() { // Свойства достаточные для описания файла, который не привязан к объекту данных (ключ загрузки и имя файла). string fileUploadKey = Guid.NewGuid().ToString("D"); string fileName = "readme.txt"; // Свойства достаточные для описания файла, который привязан к объекту данных // (тип и первичный ключ объекта данных, а так же имя файлового свойства в объекте данных). КлассСМножествомТипов entity = new КлассСМножествомТипов(); string entityTypeName = entity.GetType().AssemblyQualifiedName; string entityPropertyName = nameof(entity.PropertyStormnetFile); string entityPrimaryKey = entity.__PrimaryKey.ToString(); // Варианты описаний файлов с достаточными наборами свойств. но с пустыми базовыми URL-адресами. List <FileDescription> fileDescriptions = new List <FileDescription> { new FileDescription(null) { FileUploadKey = fileUploadKey, FileName = fileName }, new FileDescription(null) { EntityTypeName = entityTypeName, EntityPropertyName = entityPropertyName, EntityPrimaryKey = entityPrimaryKey }, new FileDescription(string.Empty) { FileUploadKey = fileUploadKey, FileName = fileName }, new FileDescription(string.Empty) { EntityTypeName = entityTypeName, EntityPropertyName = entityPropertyName, EntityPrimaryKey = entityPrimaryKey }, }; foreach (var fileDescription in fileDescriptions) { //Assert.AreEqual(null, fileDescription.FileUrl); //Assert.AreEqual(null, fileDescription.PreviewUrl); } }
/// <summary> /// Осуществляет проверку того, что для файлов, связанных с объектами данных, корректно скачиваются их preview-изображения. /// </summary> //[Test] public void TestPreviewDownloadFromDataObjectSuccess() { string fileBaseUrl = "http://localhost/api/File"; using (DataServiceWrapper dataServiceWrapper = new DataServiceWrapper()) { foreach (IDataService dataService in dataServiceWrapper.AllowedDataServices) { foreach (string srcFilePath in new List <string> { _srcImageFilePath, _srcTextFilePath }) { FileInfo fileInfo = new FileInfo(srcFilePath); string fileUploadKey = Guid.NewGuid().ToString("D"); string fileName = fileInfo.Name; string fileMimeType = MimeMapping.GetMimeMapping(fileName); long fileSize = fileInfo.Length; // Копируем тестовый файл в каталог, предназначенный для загруженных на сервер файлов. // Тем самым имитируем ситуацию как будто файл был ранее загружен на сервер через файловый контроллер. string uploadedFileDirectoryPath = CreateUploadsSubDirectory(fileUploadKey); string uploadedFilePath = string.Concat(uploadedFileDirectoryPath, "\\", fileName); System.IO.File.Copy(srcFilePath, uploadedFilePath, true); // Описание загруженного файла, содержащее URL для скачивания файла с сервера. FileDescription uploadedFileDescription = new FileDescription(fileBaseUrl, uploadedFilePath); // Загруженный файл в виде Base64String. string uploadedFileBase64String = FileController.GetBase64StringFileData(uploadedFilePath); // Свойство объекта данных типа File, связывающее загруженный файл с объектом данных. string entityFilePropertyName = nameof(КлассСМножествомТипов.PropertyStormnetFile); File entityFileProperty = new File { Name = fileName, Size = fileSize }; entityFileProperty.FromNormalToZip(uploadedFilePath); // Свойство объекта данных типа WebFile, связывающее загруженный файл с объектом данных. string entityWebFilePropertyName = nameof(КлассСМножествомТипов.PropertyStormnetWebFile); WebFile entityWebFileProperty = new WebFile { Name = fileName, Size = (int)fileSize, Url = uploadedFileDescription.FileUrl }; // Объект данных, с которым связан загруженный файл. DataObject entity = new КлассСМножествомТипов { // Файловые свойства объекта данных. PropertyStormnetFile = entityFileProperty, PropertyStormnetWebFile = entityWebFileProperty, // DateTime-свойство объекта данных. // На работу с файловыми свойствами никак не влияет, // но если оставить его незаполненным, сервис данных будет ругаться при сохранении. PropertyDateTime = new DateTimeOffset(DateTime.Now).UtcDateTime }; // Свойства необходимые для описания файла, связанного с объектом данных. string entityTypeName = entity.GetType().AssemblyQualifiedName; string entityPrimaryKey = entity.__PrimaryKey.ToString(); List <string> entityPropertiesnames = new List <string> { entityFilePropertyName, entityWebFilePropertyName }; // Сохраняем объект данных в БД (используя подменный сервис данных). dataService.UpdateObject(entity); // Перебираем разнотипные файловые свойства объекта данных. foreach (string entityPropertyName in entityPropertiesnames) { // Описание файла, связанного с объектом данных, которое содержит ссылку на скачивание файла. FileDescription entityRelatedFileDescription = new FileDescription(fileBaseUrl) { FileName = fileName, FileSize = fileSize, FileMimeType = fileMimeType, EntityTypeName = entityTypeName, EntityPrimaryKey = entityPrimaryKey, EntityPropertyName = entityPropertyName }; // Конфигурируем HttpServer, файловый контроллер, и обращаемся к серверу для скачивания файла. using (var config = new HttpConfiguration()) { config.EnableCors(new EnableCorsAttribute("*", "*", "*")); config.MapODataServiceFileRoute("File", "api/File", _uploadsDirectoryPath, dataService); using (var server = new HttpServer(config)) using (var client = new HttpClient(server, false)) using (HttpResponseMessage response = client.GetAsync(entityRelatedFileDescription.PreviewUrl).Result) { //Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); // Получаем Base64String, содержащую preview скачанного файла. string downloadedFileBase64String = response.Content.ReadAsStringAsync().Result; if (fileMimeType.StartsWith("image")) { // Для файлов являющихся изображениями, должна возвращаться Base64String с указанием MIME-типа. //Assert.AreEqual(uploadedFileBase64String, downloadedFileBase64String); //Assert.AreEqual(true, downloadedFileBase64String.ToLower().StartsWith($"data:{fileMimeType}")); } else { // Для файлов не являющихся изображениями, должна возвращаться пустая строка. //Assert.AreEqual(true, downloadedFileBase64String == string.Empty); //Assert.AreEqual(0.ToString(), response.Content.Headers.GetValues("Content-Length").FirstOrDefault()); } } } } } } } }
/// <summary> /// Осуществляет проверку того, что файлы, связанные с объектами данных, корректно скачиваются с сервера. /// </summary> //[Test] public void TestFileDownloadFromDataObjectSuccess() { string fileBaseUrl = "http://localhost/api/File"; using (DataServiceWrapper dataServiceWrapper = new DataServiceWrapper()) { foreach (IDataService dataService in dataServiceWrapper.AllowedDataServices) { foreach (string srcFilePath in new List <string> { _srcImageFilePath, _srcTextFilePath }) { FileInfo fileInfo = new FileInfo(srcFilePath); string fileUploadKey = Guid.NewGuid().ToString("D"); string fileName = fileInfo.Name; string fileMimeType = MimeMapping.GetMimeMapping(fileName); long fileSize = fileInfo.Length; string fileContentDisposition = string.Format("attachment; filename=\"{0}\"; filename*=UTF-8''{1}; size={2}", fileName, Uri.EscapeDataString(fileName), fileSize); // Копируем тестовый файл в каталог, предназначенный для загруженных на сервер файлов. // Тем самым имитируем ситуацию как будто файл был ранее загружен на сервер через файловый контроллер. string uploadedFileDirectoryPath = CreateUploadsSubDirectory(fileUploadKey); string uploadedFilePath = string.Concat(uploadedFileDirectoryPath, "\\", fileName); System.IO.File.Copy(srcFilePath, uploadedFilePath, true); // Описание загруженного файла, содержащее URL для скачивания файла с сервера. FileDescription uploadedFileDescription = new FileDescription(fileBaseUrl, uploadedFilePath); // Свойство объекта данных типа File, связывающее загруженный файл с объектом данных. string entityFilePropertyName = nameof(КлассСМножествомТипов.PropertyStormnetFile); File entityFileProperty = new File { Name = fileName, Size = fileSize }; entityFileProperty.FromNormalToZip(uploadedFilePath); // Свойство объекта данных типа WebFile, связывающее загруженный файл с объектом данных. string entityWebFilePropertyName = nameof(КлассСМножествомТипов.PropertyStormnetWebFile); WebFile entityWebFileProperty = new WebFile { Name = fileName, Size = (int)fileSize, Url = uploadedFileDescription.FileUrl }; // Объект данных, с которым связан загруженный файл. DataObject entity = new КлассСМножествомТипов { // Файловые свойства объекта данных. PropertyStormnetFile = entityFileProperty, PropertyStormnetWebFile = entityWebFileProperty, // DateTime-свойство объекта данных. // На работу с файловыми свойствами никак не влияет, // но если оставить его незаполненным, сервис данных будет ругаться при сохранении. PropertyDateTime = new DateTimeOffset(DateTime.Now).UtcDateTime }; // Свойства необходимые для описания файла, связанного с объектом данных. string entityTypeName = entity.GetType().AssemblyQualifiedName; string entityPrimaryKey = entity.__PrimaryKey.ToString(); List <string> entityPropertiesnames = new List <string> { entityFilePropertyName, entityWebFilePropertyName }; // Сохраняем объект данных в БД (используя подменный сервис данных). dataService.UpdateObject(entity); // Перебираем разнотипные файловые свойства объекта данных. foreach (string entityPropertyName in entityPropertiesnames) { // Описание файла, связанного с объектом данных, которое содержит ссылку на скачивание файла. var entityRelatedFileDescription = new FileDescription(fileBaseUrl) { FileName = fileName, FileSize = fileSize, FileMimeType = fileMimeType, EntityTypeName = entityTypeName, EntityPrimaryKey = entityPrimaryKey, EntityPropertyName = entityPropertyName }; // Конфигурируем HttpServer, файловый контроллер, и обращаемся к серверу для скачивания файла. using (var config = new HttpConfiguration()) { config.EnableCors(new EnableCorsAttribute("*", "*", "*")); config.MapODataServiceFileRoute("File", "api/File", _uploadsDirectoryPath, dataService); using (var server = new HttpServer(config)) using (var client = new HttpClient(server, false)) using (HttpResponseMessage response = client.GetAsync(entityRelatedFileDescription.FileUrl).Result) { //Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); // Проверяем, что в ответе правильно указаны: длина, тип файла, и content-disposition. //Assert.AreEqual(fileSize.ToString(), response.Content.Headers.GetValues("Content-Length").FirstOrDefault()); //Assert.AreEqual(fileMimeType, response.Content.Headers.GetValues("Content-Type").FirstOrDefault()); //Assert.AreEqual(fileContentDisposition, response.Content.Headers.GetValues("Content-Disposition").FirstOrDefault()); // Получаем поток байтов, скачиваемого файла. using (Stream stream = response.Content.ReadAsStreamAsync().Result) { // Вычитываем поток в буфер. byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, (int)stream.Length); // Сохраняем поток в виде файла (в каталог, предназначенный для скачанных с сервера файлов). // Тем самым имитируем ситуацию как будто файл был скачан. string downloadedFileDirectoryPath = CreateDownloadsSubDirectory(fileUploadKey); string downloadedFilePath = $"{downloadedFileDirectoryPath}\\{fileName}"; using (var fileStream = new FileStream(downloadedFilePath, FileMode.Create, FileAccess.Write)) { fileStream.Write(bytes, 0, (int)stream.Length); fileStream.Close(); // Проверяем, что загруженный на сервер, и скачанный с сервера файлы - одинаковы. //Assert.AreEqual(true, FilesComparer.FilesAreEqual(uploadedFilePath, downloadedFilePath)); } } } } } } } } }
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 TestFilterIsOf() { ActODataService(args => { КлассСМножествомТипов класс = new КлассСМножествомТипов() { PropertyString = "parent", PropertyDateTime = new DateTimeOffset(DateTime.Now).UtcDateTime }; ДочернийКласс класс2 = new ДочернийКласс() { ChildProperty = "child01", PropertyString = "child1", PropertyDateTime = new DateTimeOffset(DateTime.Now).UtcDateTime }; ДочернийКласс класс3 = new ДочернийКласс() { ChildProperty = "child02", PropertyString = "child2", PropertyDateTime = new DateTimeOffset(DateTime.Now).UtcDateTime }; // КлассNotStored классNotStored = new КлассNotStored() { StrAttr = "notStored" }; КлассStoredDerived классStoredDerived = new КлассStoredDerived() { StrAttr = "Stored", StrAttr2 = "str2" }; var objs = new DataObject[] { класс, класс2, класс3, классStoredDerived }; args.DataService.UpdateObjects(ref objs); string requestUrl; // Использование $filter с функцией isof. Должны вернуться сущности всех типов, родительские и дочерние. requestUrl = $"http://localhost/odata/КлассСМножествомТиповs?$filter=isof('NewPlatform.Flexberry.ORM.ODataService.Tests.КлассСМножествомТипов') or isof('NewPlatform.Flexberry.ORM.ODataService.Tests.ДочернийКласс')"; // Обращаемся к 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(3, ((ArrayList)receivedDict["value"]).Count); } // Использование $filter с функцией isof. Должны вернуться сущности только дочернего типа. requestUrl = $"http://localhost/odata/КлассСМножествомТиповs?$filter=isof('NewPlatform.Flexberry.ORM.ODataService.Tests.ДочернийКласс')"; // Обращаемся к 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); } // Без использования $filter. Должны вернуться также сущности, имеющие дочерний тип. requestUrl = $"http://localhost/odata/КлассСМножествомТиповs"; // Обращаемся к 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(3, ((ArrayList)receivedDict["value"]).Count); } }); }
/// <summary> /// Осуществляет проверку того, что <see cref="FileDescription"/> с заданными свойствами, описывающими объект данных, /// корректно десериализуется из JSON-строки. /// </summary> //[Test] public void TestDeserializationFromJsonByEntityProperties() { string fileBaseUrl = "http://localhost/api/File"; // Имя, размер и тип файла. string fileName = "readme.txt"; long fileSize = 1024; string fileMimeType = MimeMapping.GetMimeMapping(fileName); // Свойства достаточные для описания файла, который привязан к объекту данных // (тип и первичный ключ объекта данных, а так же имя файлового свойства в объекте данных). КлассСМножествомТипов entity = new КлассСМножествомТипов(); string entityTypeName = entity.GetType().AssemblyQualifiedName; string entityPropertyName = nameof(entity.PropertyStormnetFile); string entityPrimaryKey = entity.__PrimaryKey.ToString(); // Описание файла с избыточным набором свойств. FileDescription fileDescription = new FileDescription(fileBaseUrl) { FileName = fileName, FileSize = fileSize, FileMimeType = fileMimeType, EntityTypeName = entityTypeName, EntityPropertyName = entityPropertyName, EntityPrimaryKey = entityPrimaryKey }; string serializedFileDescription = fileDescription.ToJson(); // Получаем десериализованные описания файла, полученные различными способами. List <FileDescription> deserializedFileDescriptions = new List <FileDescription> { FileDescription.FromJson(serializedFileDescription) }; using (HttpConfiguration config = new HttpConfiguration()) { config.EnableCors(new EnableCorsAttribute("*", "*", "*")); config.Routes.MapHttpRoute("File", "api/File", new { controller = "FileDescriptionTest" }); using (HttpServer server = new HttpServer(config)) { using (HttpClient client = new HttpClient(server, false)) { // Получаем десериализованное описание файла из тела POST-запроса. using (HttpResponseMessage response = client.PostAsJsonStringAsync("http://localhost/api/File", serializedFileDescription).Result) { // Убедимся, что запрос завершился успешно. //Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); deserializedFileDescriptions.Add(FileDescriptionTestController.FileDescriptionPost); } // Получаем десериализованное описание файла из URL PUT-запроса. string putUrl = string.Format( "http://localhost/api/File?{0}={1}&{2}={3}&{4}={5}&{6}={7}&{8}={9}&{10}={11}", nameof(FileDescription.FileName), fileDescription.FileName, nameof(FileDescription.FileSize), fileDescription.FileSize, nameof(FileDescription.FileMimeType), fileDescription.FileMimeType, nameof(FileDescription.EntityTypeName), fileDescription.EntityTypeName, nameof(FileDescription.EntityPropertyName), fileDescription.EntityPropertyName, nameof(FileDescription.EntityPrimaryKey), fileDescription.EntityPrimaryKey); using (HttpResponseMessage response = client.SendAsync(new HttpRequestMessage(HttpMethod.Put, putUrl)).Result) { // Убедимся, что запрос завершился успешно. //Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); deserializedFileDescriptions.Add(FileDescriptionTestController.FileDescriptionPut); } } } } // Проверяем, что результаты десериализации, полученные разными способами - одинаковы и корректны. foreach (FileDescription deserializedFileDescription in deserializedFileDescriptions) { /* * Assert.AreEqual(fileName, deserializedFileDescription.FileName); * Assert.AreEqual(fileSize, deserializedFileDescription.FileSize); * Assert.AreEqual(fileMimeType, deserializedFileDescription.FileMimeType); * Assert.AreEqual(entityTypeName, deserializedFileDescription.EntityTypeName); * Assert.AreEqual(entityPropertyName, deserializedFileDescription.EntityPropertyName); * Assert.AreEqual(entityPrimaryKey, deserializedFileDescription.EntityPrimaryKey); * Assert.AreEqual(fileDescription.FileUrl, deserializedFileDescription.FileUrl); * Assert.AreEqual(fileDescription.PreviewUrl, deserializedFileDescription.PreviewUrl); * Assert.AreEqual(null, deserializedFileDescription.FileUploadKey); */ } }
/// <summary> /// Осуществляет проверку того, что <see cref="FileDescription"/> /// корректно сериализуется в JSON-строку. /// </summary> //[Test] public void TestSerializationToJson() { string fileBaseUrl = "http://localhost/api/File"; // Свойства достаточные для описания файла, который не привязан к объекту данных (ключ загрузки и имя файла). string fileUploadKey = Guid.NewGuid().ToString("D"); string fileName = "readme.txt"; // Размер и тип файла. long fileSize = 1024; string fileMimeType = MimeMapping.GetMimeMapping(fileName); // Свойства достаточные для описания файла, который привязан к объекту данных // (тип и первичный ключ объекта данных, а так же имя файлового свойства в объекте данных). КлассСМножествомТипов entity = new КлассСМножествомТипов(); string entityTypeName = entity.GetType().AssemblyQualifiedName; string entityPropertyName = nameof(entity.PropertyStormnetFile); string entityPrimaryKey = entity.__PrimaryKey.ToString(); // Описание файла с избыточным набором свойств. FileDescription fileDescription = new FileDescription(fileBaseUrl) { FileUploadKey = fileUploadKey, FileName = fileName, FileSize = fileSize, FileMimeType = fileMimeType, EntityTypeName = entityTypeName, EntityPropertyName = entityPropertyName, EntityPrimaryKey = entityPrimaryKey }; FileDescriptionTestController.FileDescriptionGet = fileDescription; // Получаем сериализованные описания файлов несколькими способами (вручную, и из ответа, получаемого от сервера). List <string> serializedFileDescriptions = new List <string> { fileDescription.ToJson() }; using (HttpConfiguration config = new HttpConfiguration()) { config.EnableCors(new EnableCorsAttribute("*", "*", "*")); config.Routes.MapHttpRoute("File", "api/File", new { controller = "FileDescriptionTest" }); using (HttpServer server = new HttpServer(config)) { using (HttpClient client = new HttpClient(server, false)) { using (HttpResponseMessage response = client.GetAsync("http://localhost/api/File").Result) { // Убедимся, что запрос завершился успешно. //Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); serializedFileDescriptions.Add(response.Content.ReadAsStringAsync().Result); } } } } // Проверяем, что результаты сериализации, полученные разными способами - одинаковы и корректны. foreach (string serializedFileDescription in serializedFileDescriptions) { // Преобразуем сериализованное описание файла в словарь. Dictionary <string, object> deserializedFileDescription = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(serializedFileDescription); /* * Assert.AreEqual(5, deserializedFileDescription.Keys.Count); * Assert.AreEqual(fileName, deserializedFileDescription["fileName"]); * Assert.AreEqual((int)fileSize, (int)deserializedFileDescription["fileSize"]); * Assert.AreEqual(fileMimeType, deserializedFileDescription["fileMimeType"]); * Assert.AreEqual(fileDescription.FileUrl, deserializedFileDescription["fileUrl"]); * Assert.AreEqual(fileDescription.PreviewUrl, deserializedFileDescription["previewUrl"]); */ } }
/// <summary> /// Осуществляет проверку того, что <see cref="FileDescription.FileUrl"/> и <see cref="FileDescription.PreviewUrl"/> не формируются, /// если заданный набор свойств недостаточен для описания файла. /// </summary> //[Test] public void TestUrlsByIncompleteProperties() { string fileBaseUrl = "http://localhost/api/File"; // Свойства достаточные для описания файла, который не привязан к объекту данных (ключ загрузки и имя файла). string fileUploadKey = Guid.NewGuid().ToString("D"); string fileName = "readme.txt"; // Свойства достаточные для описания файла, который привязан к объекту данных // (тип и первичный ключ объекта данных, а так же имя файлового свойства в объекте данных). КлассСМножествомТипов entity = new КлассСМножествомТипов(); string entityTypeName = entity.GetType().AssemblyQualifiedName; string entityPropertyName = nameof(entity.PropertyStormnetFile); string entityPrimaryKey = entity.__PrimaryKey.ToString(); // Описания файлов с недостаточными наборами свойств. List <FileDescription> incompleteFileDescriptions = new List <FileDescription> { // Свойства не заданы вообще. new FileDescription(fileBaseUrl) { }, // Заданы либо ключ, либо имя файла, но не оба свойства вместе. new FileDescription(fileBaseUrl) { FileUploadKey = fileUploadKey }, new FileDescription(fileBaseUrl) { FileName = fileName }, // Заданы либо имя типа объекта данных, либо имя файлового свойства в объекте данных, либо первичный ключ объекта данных, // либо любые парные комбинации этих свойств, но не все свойства вместе. new FileDescription(fileBaseUrl) { EntityTypeName = entityTypeName }, new FileDescription(fileBaseUrl) { EntityPropertyName = entityPropertyName }, new FileDescription(fileBaseUrl) { EntityPrimaryKey = entityPrimaryKey }, new FileDescription(fileBaseUrl) { EntityTypeName = entityTypeName, EntityPropertyName = entityPropertyName }, new FileDescription(fileBaseUrl) { EntityTypeName = entityTypeName, EntityPropertyName = entityPrimaryKey }, new FileDescription(fileBaseUrl) { EntityPropertyName = entityPropertyName, EntityPrimaryKey = entityPrimaryKey }, // Комбинации предыдущих неполностью заданных наборов свойств. new FileDescription(fileBaseUrl) { FileUploadKey = fileUploadKey, EntityTypeName = entityTypeName }, new FileDescription(fileBaseUrl) { FileUploadKey = fileUploadKey, EntityPropertyName = entityPropertyName }, new FileDescription(fileBaseUrl) { FileUploadKey = fileUploadKey, EntityPrimaryKey = entityPrimaryKey }, new FileDescription(fileBaseUrl) { FileUploadKey = fileUploadKey, EntityTypeName = entityTypeName, EntityPropertyName = entityPropertyName }, new FileDescription(fileBaseUrl) { FileUploadKey = fileUploadKey, EntityTypeName = entityTypeName, EntityPropertyName = entityPrimaryKey }, new FileDescription(fileBaseUrl) { FileUploadKey = fileUploadKey, EntityPropertyName = entityPropertyName, EntityPrimaryKey = entityPrimaryKey }, new FileDescription(fileBaseUrl) { FileName = fileName, EntityTypeName = entityTypeName }, new FileDescription(fileBaseUrl) { FileName = fileName, EntityPropertyName = entityPropertyName }, new FileDescription(fileBaseUrl) { FileName = fileName, EntityPrimaryKey = entityPrimaryKey }, new FileDescription(fileBaseUrl) { FileName = fileName, EntityTypeName = entityTypeName, EntityPropertyName = entityPropertyName }, new FileDescription(fileBaseUrl) { FileName = fileName, EntityTypeName = entityTypeName, EntityPropertyName = entityPrimaryKey }, new FileDescription(fileBaseUrl) { FileName = fileName, EntityPropertyName = entityPropertyName, EntityPrimaryKey = entityPrimaryKey } }; foreach (FileDescription fileDescription in incompleteFileDescriptions) { //Assert.AreEqual(null, fileDescription.FileUrl); //Assert.AreEqual(null, fileDescription.PreviewUrl); } }
public void TestFilterNullable() { ActODataService(args => { NullableDateTime date = new NullableDateTime(); date.Value = new DateTimeOffset(DateTime.Now).UtcDateTime; NullableInt i = new NullableInt(); i.Value = 7; NullableDecimal d = new NullableDecimal(); d.Value = new decimal(777.777); string prevDecimal = (d.Value - 1).ToString().Replace(",", "."); string nextDecimal = (d.Value + 1).ToString().Replace(",", "."); string prevDate = $"{date.Value.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:ss.fff")}%2B05:00"; string nextDate = $"{date.Value.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ss.fff")}%2B05:00"; КлассСМножествомТипов класс = new КлассСМножествомТипов() { PropertyStormnetNullableInt = i, PropertyStormnetNullableDecimal = d, PropertyStormnetNullableDateTime = date, PropertyDateTime = date.Value }; var objs = new DataObject[] { класс }; args.DataService.UpdateObjects(ref objs); string requestUrl; /* * // Проверка использования фильтрации для типа ICSSoft.STORMNET.UserDataTypes.NullableDateTime. * requestUrl = $"http://localhost/odata/КлассСМножествомТиповs?$filter=(PropertyStormnetNullableDateTime gt {prevDate}) and (PropertyStormnetNullableDateTime 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); * } * * // Проверка использования фильтрации для типа ICSSoft.STORMNET.UserDataTypes.NullableDecimal. * requestUrl = $"http://localhost/odata/КлассСМножествомТиповs?$filter=(PropertyStormnetNullableDecimal gt {prevDecimal}M) and (PropertyStormnetNullableDecimal lt {nextDecimal})"; * * // Обращаемся к 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); * } */ // Проверка использования фильтрации для типа ICSSoft.STORMNET.UserDataTypes.NullableInt. requestUrl = $"http://localhost/odata/КлассСМножествомТиповs?$filter=PropertyStormnetNullableInt eq {i.Value.ToString()}"; // Обращаемся к 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 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); } }); }