private DeviceListFilter BuildFilterModelFromEntity(DeviceListFilterTableEntity entity) { if (entity == null) { return(null); } List <Clause> clauses = new List <Clause>(); try { clauses = JsonConvert.DeserializeObject <List <Clause> >(entity.Clauses); } catch (Exception) { Trace.TraceError("Can not deserialize filters to Json object", entity.Clauses); } QuerySortOrder order; if (!Enum.TryParse(entity.SortOrder, true, out order)) { order = QuerySortOrder.Descending; } return(new DeviceListFilter(entity) { Clauses = clauses, SortOrder = order, }); }
public async Task <DeviceListFilter> SaveFilterAsync(DeviceListFilter filter, bool force = false) { var oldFilter = await GetFilterAsync(filter.Id); if (oldFilter == null) { filter.Id = Guid.NewGuid().ToString(); } else { if (!force) { return(oldFilter); } } if (filter.Name != Constants.UnnamedFilterName) { var query = new TableQuery <DeviceListFilterTableEntity>().Where( TableQuery.CombineFilters( TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.NotEqual, filter.Id), TableOperators.And, TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, filter.Name) ) ); var entities = await _filterTableStorageClient.ExecuteQueryAsync(query); if (entities.Any()) { throw new FilterDuplicatedNameException(filter.Id, filter.Name); } } DeviceListFilterTableEntity newEntity = new DeviceListFilterTableEntity(filter) { ETag = "*" }; var result = await _filterTableStorageClient.DoTableInsertOrReplaceAsync(newEntity, BuildFilterModelFromEntity); if (result.Status == TableStorageResponseStatus.Successful) { // Safely delete old filter after the new renamed filter is saved successfully if (oldFilter != null && !oldFilter.Name.Equals(filter.Name, StringComparison.InvariantCulture)) { var oldEntity = new DeviceListFilterTableEntity(oldFilter) { ETag = "*" }; await _filterTableStorageClient.DoDeleteAsync(oldEntity, e => (object)null); } return(await GetFilterAsync(filter.Id)); } throw new FilterSaveException(filter.Id, filter.Name); }
public async void DeleteFilterAsyncTest() { var filter = fixture.Create <DeviceListFilter>(); DeviceListFilterTableEntity tableEntity = new DeviceListFilterTableEntity(filter); var tableEntities = new List <DeviceListFilterTableEntity>(); tableEntities.Add(tableEntity); var resp = new TableStorageResponse <DeviceListFilter> { Entity = filter, Status = TableStorageResponseStatus.Successful }; _filterTableStorageClientMock.Setup(x => x.ExecuteQueryAsync(It.IsNotNull <TableQuery <DeviceListFilterTableEntity> >())) .ReturnsAsync(tableEntities); _filterTableStorageClientMock.Setup( x => x.DoDeleteAsync(It.IsNotNull <DeviceListFilterTableEntity>(), It.IsNotNull <Func <DeviceListFilterTableEntity, DeviceListFilter> >())) .Callback <DeviceListFilterTableEntity, Func <DeviceListFilterTableEntity, DeviceListFilter> >( (entity, func) => tableEntity = entity) .ReturnsAsync(resp); var ret = await deviceListFilterRepository.DeleteFilterAsync(filter.Id); Assert.True(ret); Assert.NotNull(tableEntity); resp = new TableStorageResponse <DeviceListFilter> { Entity = null, Status = TableStorageResponseStatus.NotFound }; _filterTableStorageClientMock.Setup( x => x.DoDeleteAsync(It.IsNotNull <DeviceListFilterTableEntity>(), It.IsNotNull <Func <DeviceListFilterTableEntity, DeviceListFilter> >())) .Callback <DeviceListFilterTableEntity, Func <DeviceListFilterTableEntity, DeviceListFilter> >( (entity, func) => tableEntity = null) .ReturnsAsync(resp); ret = await deviceListFilterRepository.DeleteFilterAsync(filter.Id); Assert.False(ret); Assert.Null(tableEntity); _filterTableStorageClientMock.Setup(x => x.ExecuteQueryAsync(It.IsNotNull <TableQuery <DeviceListFilterTableEntity> >())) .ReturnsAsync(new List <DeviceListFilterTableEntity>()); ret = await deviceListFilterRepository.DeleteFilterAsync(filter.Id); Assert.True(ret); }
public async Task <bool> DeleteFilterAsync(string id) { var filter = await GetFilterAsync(id); // if the filter doesn't exist, return true idempotently just behave as it has been deleted successfully. if (filter == null) { return(true); } DeviceListFilterTableEntity entity = new DeviceListFilterTableEntity(id, filter.Name); entity.ETag = "*"; var result = await _filterTableStorageClient.DoDeleteAsync(entity, BuildFilterModelFromEntity); return(result.Status == TableStorageResponseStatus.Successful); }
public async void GetFilterAsyncTest() { var filter = fixture.Create <DeviceListFilter>(); DeviceListFilterTableEntity tableEntity = new DeviceListFilterTableEntity(filter); var tableEntities = new List <DeviceListFilterTableEntity>(); tableEntities.Add(tableEntity); _filterTableStorageClientMock.Setup(x => x.ExecuteQueryAsync(It.IsNotNull <TableQuery <DeviceListFilterTableEntity> >())) .ReturnsAsync(tableEntities); var ret = await deviceListFilterRepository.GetFilterAsync(tableEntities.First().PartitionKey); Assert.Equal(ret.Id, tableEntities.First().Id); _filterTableStorageClientMock.Setup(x => x.ExecuteQueryAsync(It.IsNotNull <TableQuery <DeviceListFilterTableEntity> >())) .ReturnsAsync(new List <DeviceListFilterTableEntity>()); ret = await deviceListFilterRepository.GetFilterAsync("any"); Assert.Null(ret); }
public async Task <bool> TouchFilterAsync(string id) { if (string.IsNullOrEmpty(id)) { return(false); } var filter = await GetFilterAsync(id); if (filter == null) { return(false); } DeviceListFilterTableEntity entity = new DeviceListFilterTableEntity(id, filter.Name) { ETag = "*" }; var result = await _filterTableStorageClient.DoTouchAsync(entity, BuildFilterModelFromEntity); return(result.Status == TableStorageResponseStatus.Successful); }
public async void SaveFilterAsyncTest() { var newFilter = fixture.Create <DeviceListFilter>(); var oldEntity = fixture.Create <DeviceListFilterTableEntity>(); DeviceListFilterTableEntity tableEntity = null; var tableEntities = new List <DeviceListFilterTableEntity>(); var resp = new TableStorageResponse <DeviceListFilter> { Entity = newFilter, Status = TableStorageResponseStatus.Successful }; _filterTableStorageClientMock.Setup(x => x.ExecuteQueryAsync(It.IsNotNull <TableQuery <DeviceListFilterTableEntity> >())) .ReturnsAsync(tableEntities); _filterTableStorageClientMock.Setup( x => x.DoTableInsertOrReplaceAsync(It.IsNotNull <DeviceListFilterTableEntity>(), It.IsNotNull <Func <DeviceListFilterTableEntity, DeviceListFilter> >())) .Callback <DeviceListFilterTableEntity, Func <DeviceListFilterTableEntity, DeviceListFilter> >( (entity, func) => { tableEntity = entity; tableEntities.Add(tableEntity); }) .ReturnsAsync(resp); var ret = await deviceListFilterRepository.SaveFilterAsync(newFilter, true); Assert.NotNull(ret); Assert.NotNull(tableEntity); _filterTableStorageClientMock.Setup(x => x.ExecuteQueryAsync(It.IsNotNull <TableQuery <DeviceListFilterTableEntity> >())) .ReturnsAsync(tableEntities); ret = await deviceListFilterRepository.SaveFilterAsync(newFilter, false); Assert.Equal(ret.Id, newFilter.Id); Assert.Equal(ret.Name, newFilter.Name); Assert.Equal(ret.Clauses.Count, newFilter.Clauses.Count); tableEntity.Name = "changedName"; _filterTableStorageClientMock.SetupSequence(x => x.ExecuteQueryAsync(It.IsNotNull <TableQuery <DeviceListFilterTableEntity> >())) .ReturnsAsync(tableEntities) .ReturnsAsync(new List <DeviceListFilterTableEntity>()); _filterTableStorageClientMock.Setup(x => x.DoDeleteAsync(It.IsNotNull <DeviceListFilterTableEntity>(), It.IsAny <Func <DeviceListFilterTableEntity, DeviceListFilter> >())); ret = await deviceListFilterRepository.SaveFilterAsync(newFilter, true); resp = new TableStorageResponse <DeviceListFilter> { Entity = newFilter, Status = TableStorageResponseStatus.NotFound }; _filterTableStorageClientMock.Setup( x => x.DoTableInsertOrReplaceAsync(It.IsNotNull <DeviceListFilterTableEntity>(), It.IsNotNull <Func <DeviceListFilterTableEntity, DeviceListFilter> >())) .ReturnsAsync(resp); _filterTableStorageClientMock.SetupSequence(x => x.ExecuteQueryAsync(It.IsNotNull <TableQuery <DeviceListFilterTableEntity> >())) .ReturnsAsync(tableEntities) .ReturnsAsync(new List <DeviceListFilterTableEntity>()); await Assert.ThrowsAnyAsync <FilterSaveException>(async() => await deviceListFilterRepository.SaveFilterAsync(newFilter, true)); }