protected async Task <RepositoryQueryResult <TAggregateRoot> > FindByAttributeValueAsync( FindByAttributeValueStateQuery query, CancellationToken cancellationToken) { Require.NotNull(query, nameof(query)); var queryResult = await _stateStorage.FindByAttributeValueAsync <TAggregateState>(query, cancellationToken); var items = new List <TAggregateRoot>(queryResult.States.Count); foreach (var restoredState in queryResult.States) { var id = (TEntityId)Activator.CreateInstance(typeof(TEntityId), restoredState.Key); var(version, state) = restoredState.Value; items.Add(CreateAggregateInstance(id, version, state)); } return(new RepositoryQueryResult <TAggregateRoot>(items, queryResult.PaginationToken)); }
public async Task FindByAttributeValueAsync_ReturnsAllStatesByProjectId( [Frozen] ProjectId projectId, IFixture fixture, TodoTaskId[] ids) { // arrange const string attributeName = "TaskProjectId"; var states = new Dictionary <TodoTaskId, (AggregateVersion, TodoTask.AggregateState)>(); foreach (var id in ids) { var state = fixture.Create <TodoTask.AggregateState>(); state.Mutate(new TodoTaskCreated(projectId, id)); var version = AggregateVersion.Emtpy; states[id] = (version, state); await _stateStorage.PersistAsync( id, state, version, new Dictionary <string, object> { { attributeName, projectId } }, CancellationToken.None); } // act var query = new FindByAttributeValueStateQuery(attributeName, projectId, ids.Length); var queryResult = await _stateStorage.FindByAttributeValueAsync <TodoTask.AggregateState>(query, CancellationToken.None); // assert foreach (var id in ids) { var(actualVersion, actualState) = states[id]; var(restoredVersion, restoredState) = queryResult.States[id]; Assert.Equal(AggregateVersion.Emtpy.Increment(), restoredVersion); Assert.Equal(actualState.ProjectId, restoredState.ProjectId); Assert.Equal(actualState.TaskState, restoredState.TaskState); } }
public async Task FindByAttributeValueAsync_ReturnsAllStatesInPages( [Frozen] ProjectId projectId, IFixture fixture, TodoTaskId[] ids) { // arrange const string attributeName = "TaskProjectId"; var states = new Dictionary <TodoTaskId, (AggregateVersion, TodoTask.AggregateState)>(); foreach (var id in ids) { var state = fixture.Create <TodoTask.AggregateState>(); var version = AggregateVersion.Emtpy; states[id] = (version, state); await _stateStorage.PersistAsync( id, state, version, new Dictionary <string, object> { { attributeName, projectId } }, CancellationToken.None); } // act var results = new Dictionary <IEntityIdentity, (AggregateVersion, TodoTask.AggregateState)>(EntityIdentity .DefaultComparer); FindByAttributeValueStateQueryResult <TodoTask.AggregateState> queryResult = null; do { FindByAttributeValueStateQuery query; if (queryResult != null) { query = new FindByAttributeValueStateQuery(attributeName, projectId, 2, queryResult.PaginationToken); } else { query = new FindByAttributeValueStateQuery(attributeName, projectId, 2); } queryResult = await _stateStorage.FindByAttributeValueAsync <TodoTask.AggregateState>(query, CancellationToken.None); foreach (var pair in queryResult.States) { results[pair.Key] = pair.Value; } } while (queryResult.PaginationToken != null); // assert foreach (var id in ids) { var(actualVersion, actualState) = states[id]; var(restoredVersion, restoredState) = results[id]; Assert.Equal(actualVersion, restoredVersion); Assert.Equal(actualState.ProjectId, restoredState.ProjectId); Assert.Equal(actualState.TaskState, restoredState.TaskState); } }