Ejemplo n.º 1
0
        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,
            });
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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));
        }