public async Task InsertClassifier_DuplicateCode_ReturnError() { // arrange var cancellationToken = new CancellationToken(); var unitOfWorkFactory = new TransactionScopeUnitOfWorkFactory(); var dbContextFactory = new DefaultDbContextFactory(); var generator = new MasterDataDbGenerator(unitOfWorkFactory, dbContextFactory); var classifierRepositoryFactory = CreateClassifierRepositoryFactory(dbContextFactory); var handler = new InsertClassifierHandler(unitOfWorkFactory, classifierRepositoryFactory); using (var _ = unitOfWorkFactory.Create()) { // arrange - 1st item await generator.InsertType(HierarchyType.None, cancellationToken); var command = new InsertClassifier { UserUid = generator.UserUid, Item = new Classifier { Type = generator.TypeCode, Code = "001", Name = "Test Classifier" } }; // act var result = await handler.Handle(command, cancellationToken); // assert Assert.IsNotNull(result); Assert.IsTrue(result.Success); Assert.IsNotNull(result.Uid); Assert.AreNotEqual(Guid.Empty, result.Uid); // arrange - 2nd item command.Item.Uid = Guid.NewGuid(); // act result = await handler.Handle(command, cancellationToken); // assert Assert.IsNotNull(result); Assert.IsFalse(result.Success); Assert.IsNull(result.Uid); Assert.AreEqual(1, result.Errors.Count); Assert.AreEqual("code", result.Errors[0].Key); // todo: use error codes? Assert.AreEqual("Code «001» is already used in item \"Test Classifier\"", result.Errors[0].Messages[0]); } }
public MasterDataDbGenerator(IUnitOfWorkFactory unitOfWorkFactory, IDbContextFactory dbContextFactory) { _dbContextFactory = dbContextFactory; var dateTimeProvider = new DefaultDateTimeProvider(); var jsonSerializer = new NewtonsoftJsonSerializer(); var classifierTreeRepository = new DbClassifierTreeRepository(dbContextFactory); var classifierTypeRepository = new DbClassifierTypeRepository(dbContextFactory); var fieldProviderRegistry = new DefaultFieldProviderRegistry(); fieldProviderRegistry.AddFieldType(typeof(TextField)); fieldProviderRegistry.AddFieldType(typeof(TextAreaField)); var dbFieldMetadataRepository = new DbFieldMetadataRepository(dbContextFactory, fieldProviderRegistry, jsonSerializer); var dbFieldDataRepository = new DbFieldDataRepository(dbContextFactory, fieldProviderRegistry); var dbFieldMetadataService = new DbFieldMetadataService(dbContextFactory, dateTimeProvider, jsonSerializer); _classifierTypeService = new DbClassifierTypeService(dbContextFactory, classifierTypeRepository); _getClassifierTreeListHandler = new GetClassifierTreeListHandler(classifierTreeRepository); _insertClassifierTreeTypeHandler = new InsertClassifierTreeHandler(unitOfWorkFactory, dbContextFactory, _classifierTypeService); _insertClassifierTypeHandler = new InsertClassifierTypeHandler(unitOfWorkFactory, _classifierTypeService, dbFieldMetadataService); _insertClassifierGroupHandler = new InsertClassifierGroupHandler(unitOfWorkFactory, dbContextFactory, _classifierTypeService); _classifierTypeRegistrator = new DefaultClassifierTypeRegistrator(new NullLogger <DefaultClassifierTypeRegistrator>(), unitOfWorkFactory, _classifierTypeService, dbFieldMetadataService); var classifierTypeMetadataService = new ClassifierTypeMetadataService(dbFieldMetadataRepository); var classifierTreeService = new DefaultClassifierTreeService(classifierTreeRepository); var dbNumberGenerator = new DbNumberGenerator(dbContextFactory, null, dateTimeProvider, null); var classifierRepositoryFactory = new ClassifierRepositoryFactory(new DbClassifierRepository <Classifier>( dbContextFactory, _classifierTypeService, classifierTreeService, classifierTypeMetadataService, dbFieldDataRepository, dbNumberGenerator)); _insertClassifierHandler = new InsertClassifierHandler(unitOfWorkFactory, classifierRepositoryFactory); _updateClassifierGroupHandler = new UpdateClassifierGroupHandler(unitOfWorkFactory, dbContextFactory, _classifierTypeService); _deleteClassifierGroupHandler = new DeleteClassifierGroupHandler(unitOfWorkFactory, dbContextFactory, _classifierTypeService); _insertClassifierLinkHandler = new InsertClassifierLinkHandler(unitOfWorkFactory, dbContextFactory, _classifierTypeService); _getClassifierLinkListHandler = new GetClassifierLinkListHandler(dbContextFactory, _classifierTypeService); }
public async Task ManageRole_NormalValues_ManageItems() { // arrange var cancellationToken = new CancellationToken(); var unitOfWorkFactory = new TransactionScopeUnitOfWorkFactory(); var dbContextFactory = new DefaultDbContextFactory(); var generator = new MasterDataDbGenerator(unitOfWorkFactory, dbContextFactory); var classifierRepositoryFactoryBuilder = new ClassifierRepositoryFactoryBuilder(dbContextFactory); var classifierRepositoryFactory = classifierRepositoryFactoryBuilder.Build(); var insertHandler = new InsertClassifierHandler(unitOfWorkFactory, classifierRepositoryFactory); var updateHandler = new UpdateClassifierHandler(unitOfWorkFactory, classifierRepositoryFactory); var deleteHandler = new DeleteClassifierHandler(unitOfWorkFactory, classifierRepositoryFactory); using (var _ = unitOfWorkFactory.Create()) { // arrange generator.TypeCode = classifierRepositoryFactoryBuilder.RoleTypeCode; await generator.InsertType(HierarchyType.None, cancellationToken); // act - insert var insertedIds = new List <Guid>(); for (var i = 0; i < 3; i++) { var insertResult = await insertHandler.Handle(new InsertClassifier { UserUid = generator.UserUid, Item = new Role { Type = generator.TypeCode, Code = "00" + i, Name = "00" + i + " - Test Role" } }, cancellationToken); Assert.IsNotNull(insertResult); Assert.IsTrue(insertResult.Success, string.Join(",", insertResult.Errors.SelectMany(x => x.Messages))); // ReSharper disable once PossibleInvalidOperationException insertedIds.Add(insertResult.Uid.Value); } var searchResult = await classifierRepositoryFactory.GetNamedOrDefaultService(generator.TypeCode) .Search(new ClassifierSearchRequest { TypeCode = generator.TypeCode }, cancellationToken); // assert Assert.IsNotNull(searchResult); Assert.AreEqual(insertedIds.Count, searchResult.Rows.Count); // act - update foreach (var item in searchResult.Rows.Cast <Role>()) { item.Name = item.Name.Replace("Test", "Updated"); var updateCommand = new UpdateClassifier { UserUid = generator.UserUid, Item = item }; var updateResult = await updateHandler.Handle(updateCommand, cancellationToken); Assert.IsNotNull(updateResult); Assert.IsTrue(updateResult.Success, string.Join(",", updateResult.Errors.SelectMany(x => x.Messages))); } searchResult = await classifierRepositoryFactory.GetNamedOrDefaultService(generator.TypeCode) .Search(new ClassifierSearchRequest { TypeCode = generator.TypeCode }, cancellationToken); // assert Assert.IsNotNull(searchResult); Assert.AreEqual(insertedIds.Count, searchResult.Rows.Count); Assert.AreEqual(0, searchResult.Rows.Count(x => x.Name.Contains("Test"))); Assert.AreEqual(insertedIds.Count, searchResult.Rows.Count(x => x.Name.Contains("Updated"))); // act - delete var command = new DeleteClassifier { UserUid = generator.UserUid, TypeCode = generator.TypeCode, Uids = insertedIds.ToArray() }; var deleteResult = await deleteHandler.Handle(command, cancellationToken); // assert Assert.IsNotNull(deleteResult); Assert.IsTrue(deleteResult.Success, string.Join(",", deleteResult.Errors?.SelectMany(x => x.Messages) ?? Array.Empty <string>())); Assert.AreEqual(insertedIds.Count, deleteResult.AffectedRows); searchResult = await classifierRepositoryFactory.GetNamedOrDefaultService(generator.TypeCode) .Search(new ClassifierSearchRequest { TypeCode = generator.TypeCode }, cancellationToken); // assert Assert.IsNotNull(searchResult); Assert.AreEqual(0, searchResult.Rows.Count); } }
public async Task InsertClassifier_NormalValues_InsertItems() { // arrange var cancellationToken = new CancellationToken(); var unitOfWorkFactory = new TransactionScopeUnitOfWorkFactory(); var dbContextFactory = new DefaultDbContextFactory(); var generator = new MasterDataDbGenerator(unitOfWorkFactory, dbContextFactory); var classifierRepositoryFactory = CreateClassifierRepositoryFactory(dbContextFactory); var handler = new InsertClassifierHandler(unitOfWorkFactory, classifierRepositoryFactory); using (var _ = unitOfWorkFactory.Create()) { // arrange await generator.InsertType(HierarchyType.None, cancellationToken); // act var command = new InsertClassifier { UserUid = generator.UserUid, Item = new Classifier { Type = generator.TypeCode, Code = "001", Name = "Test Classifier", Fields = new FieldData { { "test1", "value1" }, { "test2", "value2" }, { "test3", "value3" } } } }; var result = await handler.Handle(command, cancellationToken); // assert Assert.IsNotNull(result); Assert.IsTrue(result.Success); Assert.IsNotNull(result.Uid); Assert.AreNotEqual(Guid.Empty, result.Uid); var classifierResult = await classifierRepositoryFactory.GetNamedOrDefaultService(generator.TypeCode) .Search(new ClassifierSearchRequest { TypeCode = generator.TypeCode, Uid = result.Uid, IncludeFields = true }, cancellationToken); Assert.AreEqual(1, classifierResult.Rows.Count); var inserted = classifierResult.Rows[0]; // todo: figure out why insert.Fields is null Assert.AreEqual(command.Item.Code, inserted.Code); Assert.AreEqual(command.Item.Name, inserted.Name); // assert field data inserted IList <DbFieldData> fieldData; using (var db = dbContextFactory.Create()) { fieldData = await db.GetTable <DbFieldData>() .Where(x => x.EntityTypeCode == Classifier.TypeCode && x.EntityUid == result.Uid) .ToListAsync(cancellationToken); } Assert.AreEqual(command.Item.Fields.Count, fieldData.Count); Assert.AreEqual(command.Item.Fields["test1"], fieldData.Single(x => x.Key == "test1").Value); Assert.AreEqual(command.Item.Fields["test2"], fieldData.Single(x => x.Key == "test2").Value); Assert.AreEqual(command.Item.Fields["test3"], fieldData.Single(x => x.Key == "test3").Value); } }
public async Task ManageNumerator_NormalValues_ManageItems() { // arrange var cancellationToken = new CancellationToken(); var unitOfWorkFactory = new TransactionScopeUnitOfWorkFactory(); var dbContextFactory = new DefaultDbContextFactory(); var generator = new MasterDataDbGenerator(unitOfWorkFactory, dbContextFactory); var classifierRepositoryFactory = CreateClassifierRepositoryFactory(dbContextFactory); var insertHandler = new InsertClassifierHandler(unitOfWorkFactory, classifierRepositoryFactory); var updateHandler = new UpdateClassifierHandler(unitOfWorkFactory, classifierRepositoryFactory); var deleteHandler = new DeleteClassifierHandler(unitOfWorkFactory, classifierRepositoryFactory); using (var _ = unitOfWorkFactory.Create()) { // arrange generator.TypeCode = NumeratorTypeCode; await generator.InsertType(HierarchyType.None, cancellationToken); // act - insert var insertedIds = new List <Guid>(); for (var i = 0; i < 5; i++) { var insertResult = await insertHandler.Handle(new InsertClassifier { UserUid = generator.UserUid, Item = new Numerator { Type = generator.TypeCode, Code = "00" + i, Name = "00" + i + " - Test Numerator", EntityTypeCode = "DocumentType", Pattern = "{Number}" } }, cancellationToken); Assert.IsNotNull(insertResult); Assert.AreEqual(true, insertResult.Success); // ReSharper disable once PossibleInvalidOperationException insertedIds.Add(insertResult.Uid.Value); } var searchResult = await classifierRepositoryFactory.GetNamedOrDefaultService(generator.TypeCode) .Search(new ClassifierSearchRequest { TypeCode = generator.TypeCode }, cancellationToken); // assert Assert.IsNotNull(searchResult); Assert.AreEqual(insertedIds.Count, searchResult.Rows.Count); // act - update foreach (var classifier in searchResult.Rows.Cast <Numerator>()) { classifier.Name = classifier.Name.Replace("Test", "Updated"); classifier.Pattern = "No. " + classifier.Pattern; var updateCommand = new UpdateClassifier { UserUid = generator.UserUid, Item = classifier }; var updateResult = await updateHandler.Handle(updateCommand, cancellationToken); Assert.IsNotNull(updateResult); Assert.AreEqual(true, updateResult.Success); } searchResult = await classifierRepositoryFactory.GetNamedOrDefaultService(generator.TypeCode) .Search(new ClassifierSearchRequest { TypeCode = generator.TypeCode }, cancellationToken); // assert Assert.IsNotNull(searchResult); Assert.AreEqual(insertedIds.Count, searchResult.Rows.Count); Assert.AreEqual(0, searchResult.Rows.Count(x => x.Name.Contains("Test"))); Assert.AreEqual(insertedIds.Count, searchResult.Rows.Count(x => x.Name.Contains("Updated"))); Assert.AreEqual(insertedIds.Count, searchResult.Rows.Cast <Numerator>().Count(x => x.Pattern.Contains("No."))); // act - delete var command = new DeleteClassifier { UserUid = generator.UserUid, TypeCode = generator.TypeCode, Uids = insertedIds.ToArray() }; var result = await deleteHandler.Handle(command, cancellationToken); // assert Assert.IsNotNull(result); Assert.IsTrue(result.Success); Assert.AreEqual(insertedIds.Count, result.AffectedRows); searchResult = await classifierRepositoryFactory.GetNamedOrDefaultService(generator.TypeCode) .Search(new ClassifierSearchRequest { TypeCode = generator.TypeCode }, cancellationToken); // assert Assert.IsNotNull(searchResult); Assert.AreEqual(0, searchResult.Rows.Count); } }