public async Task ShouldSuccesfullyInitializeDatabaseAndCollection()
        {
            // ARRANGE
            var eventOffset    = 0L;
            var projectionId   = CombGuid.Generate();
            var projectionType = "IntegrationTestProjection";

            // Query Model Repository (DocumentDB)
            var queryModelRepository = new DocumentDbQueryModelRepository(_database, _collection, _offerThroughput, _noOfPartitions, _endpoint, _authKey);

            queryModelRepository.Initialize();

            // Projection Metadata Repository (MSSQL);
            var projectionMetadataRepository = new SqlServerProjectionMetadataRepository(_sqlConnectionString);

            projectionMetadataRepository.InitializeProjection(projectionId, projectionType);

            // Dummy Query Model
            var queryModelId   = CombGuid.Generate();
            var testQueryModel = new TestQueryModel(queryModelId, "Hello Integration Test!");

            // Query Model Store
            var queryModelStore = new QueryModelStore(
                queryModelRepository,
                projectionMetadataRepository,
                eventOffset,
                projectionId);

            // ACT
            await queryModelStore.SaveQueryModel(testQueryModel);

            // ASSERT
        }
        private async Task RunDataQueryModels(DocumentDbQueryModelRepository repository, int index)
        {
            try
            {
                var list = _fixture.CreateMany <TestQueryModel>(10);
                foreach (var item in list)
                {
                    await repository.Save(item);
                }

                var pagedQuery = new PagedQuery()
                {
                    MaxItemCount = 100
                };
                var result = await repository.GetPagedListAsync <TestQueryModel>(pagedQuery);

                if (result.Count < 10)
                {
                    throw new Exception("GetPagedListAsync");
                }
            }
            catch (TaskCanceledException ex)
            {
                System.Diagnostics.Debug.WriteLine(ex);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex);
            }
        }
        public void SetUp()
        {
            // ARRANGE
            var repository = new DocumentDbQueryModelRepository(_database, _collection, _offerThroughput, _noOfPartitions, _endpoint, _authKey);

            // ACT
            repository.Initialize();

            // ASSERT
        }
        public void ShouldBeStableInParallelUpdateDataQueryModel()
        {
            var repository = new DocumentDbQueryModelRepository(_database, _collection, _offerThroughput, _noOfPartitions, _endpoint, _authKey);

            Parallel.For(0, 50, (index) =>
            {
                RunDataQueryModel(repository, index).Wait();
            });
            // ASSERT
            Assert.IsTrue(true);
        }
        public async Task ShouldSuccesfullyGetPagedList()
        {
            var repository = new DocumentDbQueryModelRepository(_database, _collection, _offerThroughput, _noOfPartitions, _endpoint, _authKey);

            var pagedQuery = new PagedQuery()
            {
                MaxItemCount = 2
            };
            var pagedResult = await repository.GetPagedListAsync <TestQueryModel>(pagedQuery);

            // ASSERT
            Assert.IsTrue(pagedResult.Data.Count() >= 0 && pagedResult.Data.Count() <= pagedResult.Count);
        }
Example #6
0
        public void Initialize()
        {
            // Configuration Parameters
            var eventDatabaseConnectionString = "Data Source=localhost;Initial Catalog=eventway-sample-db;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
            var projectionMetadataDatabaseConnectionString = eventDatabaseConnectionString;

            var cosmosDbEndpoint     = "https://localhost:8081"; // This is the default endpoint for local emulator-instances of the Cosmos DB
            var cosmosDbAuthKey      = "<REPLACE WITH YOUR COSMOS DB AUTH KEY>";
            var cosmosDbDatabaseId   = "eventway-sample-db";
            var cosmosDbCollectionId = "projections";
            var offerThroughput      = 10000;
            var noOfPartitions       = 1000;

            // Event Repository
            var eventRepository = new SqlServerEventRepository(eventDatabaseConnectionString);

            // Projection Metadata Repository
            var projectionMetadataRepository = new SqlServerProjectionMetadataRepository(projectionMetadataDatabaseConnectionString);

            // Query Model Repository
            var queryModelRepository = new DocumentDbQueryModelRepository(cosmosDbDatabaseId, cosmosDbCollectionId,
                                                                          offerThroughput, noOfPartitions, cosmosDbEndpoint, cosmosDbAuthKey);

            queryModelRepository.Initialize();

            // Event Listener
            var eventListener = new BasicEventListener();

            // Aggregate services
            var aggregateFactory    = new DefaultAggregateFactory();
            var aggregateRepository = new AggregateRepository(eventRepository, aggregateFactory);
            var aggregateStore      = new AggregateStore(aggregateRepository, eventListener);

            // PROJECTIONS
            UserProjection = new UserProjection(
                eventRepository,
                eventListener,
                queryModelRepository,
                projectionMetadataRepository);

            // APPLICATION SERVICES
            UserApplicationService = new UserApplicationService(
                aggregateStore,
                queryModelRepository);

            // Start listening for events
            UserProjection.Listen();
        }
        private async Task RunDataQueryModel(DocumentDbQueryModelRepository repository, int index)
        {
            try
            {
                //var queryModelId = Guid.NewGuid();
                //var testQueryModel = new TestQueryModel(queryModelId, "Hello Integration Test!" + index);
                var testQueryModel = _fixture.Create <TestQueryModel>();
                var queryModelId   = testQueryModel.id;

                await repository.Save(testQueryModel);

                var hydratedQueryModel = await repository.GetById <TestQueryModel>(queryModelId);

                var existing = await repository.DoesItemExist <TestQueryModel>(queryModelId);

                if (!existing)
                {
                    throw new Exception("DoesItemExist");
                }
                var hydratedQueryModel1 = await repository.QueryItemAsync <TestQueryModel>(x => x.id == queryModelId);

                Assert.IsTrue(existing);
                Assert.IsNotNull(hydratedQueryModel);
                Assert.AreEqual(queryModelId, hydratedQueryModel.id);
                Assert.AreEqual(queryModelId, hydratedQueryModel1.id);

                hydratedQueryModel.DummyPayload = "DummyPayload" + queryModelId;

                await repository.Save(hydratedQueryModel);

                await repository.DeleteById <TestQueryModel>(queryModelId);

                existing = await repository.DoesItemExist <TestQueryModel>(queryModelId);

                if (existing)
                {
                    throw new Exception("DoesItemExist");
                }
            }
            catch (TaskCanceledException ex)
            {
                System.Diagnostics.Debug.WriteLine(ex);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex);
            }
        }
        public async Task ShouldSuccesfullyCreateAndHydrateQueryModel()
        {
            // ARRANGE
            var repository = new DocumentDbQueryModelRepository(_database, _collection, _offerThroughput, _noOfPartitions, _endpoint, _authKey);

            var queryModelId   = Guid.NewGuid();
            var testQueryModel = new TestQueryModel(queryModelId, "Hello Integration Test!");

            // ACT
            await repository.Save(testQueryModel);

            var hydratedQueryModel = await repository.GetById <TestQueryModel>(queryModelId);

            var existing = await repository.DoesItemExist <TestQueryModel>(queryModelId);

            // ASSERT
            Assert.IsTrue(existing);
            Assert.IsNotNull(hydratedQueryModel);
            Assert.AreEqual(queryModelId, hydratedQueryModel.id);
            Assert.AreEqual("Hello Integration Test!", testQueryModel.DummyPayload);
            Assert.AreEqual(testQueryModel.DummyPayload, hydratedQueryModel.DummyPayload);
        }