public static void Save(IMongoClient client, Guid nextId, object @event) { var bson = (@event switch { PurchaseOrderCreated e => Map(e), VendorDoesNotExist e => Map(e), ProductAddedToPurchaseOrder e => Map(e), CannotAddProductsToPaidPurchaseOrder e => Map(e), ProductRemovedFromPurchaseOrder e => Map(e), CannotRemoveProductsFromPaidPurchaseOrder e => Map(e), _ => throw new NotImplementedException() });
public void Save_ResultIsProductAddedToPurchaseOrder_PersistsExpectedDocument() { /// Arrange // Get a product added to purchase order event. var @event = new ProductAddedToPurchaseOrder( purchaseOrderId: Guid.NewGuid(), productId: Guid.NewGuid(), measure: "EA", quantity: 14.25M); // Get some next id. var nextId = Guid.NewGuid(); // Get the expected document dictionary. var expected = new BsonDocument() .Add(new BsonElement("_id", BsonString.Create(nextId.ToString()))) .Add(new BsonElement("_type", BsonString.Create(nameof(ProductAddedToPurchaseOrder)))) .Add(new BsonElement(nameof(ProductAddedToPurchaseOrder.PurchaseOrderId), new BsonString(@event.PurchaseOrderId.ToString()))) .Add(new BsonElement(nameof(ProductAddedToPurchaseOrder.ProductId), new BsonString(@event.ProductId.ToString()))) .Add(new BsonElement(nameof(ProductAddedToPurchaseOrder.Measure), BsonString.Create(@event.Measure))) .Add(new BsonElement(nameof(ProductAddedToPurchaseOrder.Quantity), BsonDecimal128.Create(@event.Quantity))); // Mock up a mongo client for the mongo db event store. BsonDocument actual = null; var collection = Mock.Create <IMongoCollection <BsonDocument> >(); Mock.Arrange(() => collection.InsertOne(Arg.IsAny <BsonDocument>(), Arg.IsAny <InsertOneOptions>(), Arg.IsAny <CancellationToken>())) .DoInstead((BsonDocument document) => actual = document); var database = Mock.Create <IMongoDatabase>(); Mock.Arrange(() => database.GetCollection <BsonDocument>(Arg.AnyString, Arg.IsAny <MongoCollectionSettings>())) .Returns(collection); var client = Mock.Create <IMongoClient>(); Mock.Arrange(() => client.GetDatabase(Arg.AnyString, Arg.IsAny <MongoDatabaseSettings>())) .Returns(database); /// Act // Save the event. MongoDBEventStore.Save(client, nextId, @event); /// Assert // Verify that the actual document matches the expected document. Assert.Equal(expected, actual); }
public void AddProductToPurchaseOrder_PurchaseOrderStatusIsUnPaid_ReturnsProductAddedToPurchaseOrderResult() { /// Arrange // Get a command to add a product to a purchase order. var command = new AddProductToPurchaseOrder( purchaseOrderId: Guid.NewGuid(), productId: Guid.NewGuid(), measure: "EA", quantity: 3.56M ); // Get a purchase order aggregate to use // when adding a product to a purchase order, // and give it some other product. var purchaseOrder = new PurchaseOrderForAddProductTask( purchaseOrderId: command.PurchaseOrderId, status: PurchaseOrderStatus.Unpaid, productIds: Enumerable.Empty <Guid>() .Append(Guid.NewGuid()) ); // Get a function that returns the purchase order aggregate // to use when adding a product to a purchase order. Func <Guid, PurchaseOrderForAddProductTask> getPurchaseOrder = _ => purchaseOrder; // Get the event we expect the domain to return. var expected = new ProductAddedToPurchaseOrder( purchaseOrderId: command.PurchaseOrderId, productId: command.ProductId, measure: command.Measure, quantity: command.Quantity); /// Act var actual = JC.AddProductToPurchaseOrder(getPurchaseOrder, command); /// Assert CustomAssert.CoreValuesAreEqual(expected, actual); }
public void loadtest() { // Get a MongoClient. var client = new MongoClient("mongodb://localhost:27017"); Func <Guid, bool> getVendorExists = _ => true; Func <Guid, PurchaseOrderForAddProductTask> getPurchaseOrderForAddProductTask = purchaseOrderId => MongoDBEventStore.GetPurchaseOrderForAddProductTask(client, purchaseOrderId); Func <Guid, PurchaseOrderForRemoveProductTask> getPurchaseOrderForRemoveProductTask = purchaseOrderId => MongoDBEventStore.GetPurchaseOrderForRemoveProductTask(client, purchaseOrderId); Func <Guid> nextId = Guid.NewGuid; var create = new CreatePurchaseOrder( vendorId: nextId(), lines: new List <CreatePurchaseOrderLine> { new CreatePurchaseOrderLine( productId: nextId(), quantity: 14.5M, measure: "FT", pricePerUnit: 2.8M), new CreatePurchaseOrderLine( productId: nextId(), quantity: 1.5M, measure: "YD", pricePerUnit: 235.82M) }); Guid purchaseOrderId = nextId(); var createResult = JC.CreatePurchaseOrder( getVendorExists: getVendorExists, nextId: purchaseOrderId, command: create); MongoDBEventStore.Save(client, nextId(), createResult); var expected = getPurchaseOrderForAddProductTask(purchaseOrderId); var productId = Guid.NewGuid(); // Put 10000 events in the store for this purchase order. for (int i = 0; i < 5000; i++) { var addResult = new ProductAddedToPurchaseOrder( purchaseOrderId: purchaseOrderId, productId: productId, measure: "EA", quantity: i); MongoDBEventStore.Save(client, nextId(), addResult); var removeResult = new ProductRemovedFromPurchaseOrder( purchaseOrderId: purchaseOrderId, productId: productId); MongoDBEventStore.Save(client, nextId(), removeResult); } // Now for the time trial var stopwatch = new Stopwatch(); stopwatch.Start(); var actual = getPurchaseOrderForAddProductTask(purchaseOrderId); stopwatch.Stop(); CustomAssert.CoreValuesAreEqual(expected, actual); Assert.Equal(0, stopwatch.ElapsedMilliseconds); }