public async Task ExecuteInternal_LockedByAnotherUser_ThrowsConflictException() { // Arrange ConflictException conflictException = null; _artifactVersionsRepository.Setup(t => t.IsItemDeleted(ArtifactId)) .ReturnsAsync(false); var vcArtifactInfo = new VersionControlArtifactInfo { Id = ArtifactId, VersionCount = CurrentVersionId, LockedByUser = new UserGroup { Id = UserId + 10 } }; _artifactVersionsRepository.Setup(t => t.GetVersionControlArtifactInfoAsync(ArtifactId, null, UserId)) .ReturnsAsync(vcArtifactInfo); // Act try { await _stateChangeExecutor.Execute(); } catch (ConflictException ex) { conflictException = ex; } // Assert Assert.IsNotNull(conflictException); Assert.AreEqual(ErrorCodes.Conflict, conflictException.ErrorCode); }
public async Task GetVersionControlArtifactInfoAsync_SubArtifactIdNotNull() { // Arrange int userId = 1, itemId = 11, artifactId = 10; SqlConnectionWrapperMock connectionWrapperMock = new SqlConnectionWrapperMock(); Mock <IArtifactRepository> artifactRepositoryMock = new Mock <IArtifactRepository>(); artifactRepositoryMock .Setup(m => m.GetArtifactBasicDetails(itemId, userId, null)) .ReturnsAsync(new ArtifactBasicDetails { ItemId = itemId, ArtifactId = artifactId }); Mock <IArtifactPermissionsRepository> artifactPermissionsRepositoryMock = new Mock <IArtifactPermissionsRepository>(); artifactPermissionsRepositoryMock.Setup(apr => apr.GetArtifactPermissions( It.IsAny <IEnumerable <int> >(), It.IsAny <int>(), It.IsAny <bool>(), It.IsAny <int>(), It.IsAny <bool>(), null)) .ReturnsAsync(new Dictionary <int, RolePermissions> { { artifactId, RolePermissions.Read } }); SqlArtifactVersionsRepository artifactVersionsRepository = new SqlArtifactVersionsRepository( connectionWrapperMock.Object, artifactRepositoryMock.Object, artifactPermissionsRepositoryMock.Object, _itemInfoRepositoryMock.Object); // Act VersionControlArtifactInfo artifactInfo = (await artifactVersionsRepository.GetVersionControlArtifactInfoAsync(itemId, null, userId)); // Assert connectionWrapperMock.Verify(); Assert.IsNotNull(artifactInfo.SubArtifactId); }
public async Task GetVersionControlArtifactInfoAsync_Success() { // Arrange const int userId = 1; var session = new Session { UserId = userId }; const int itemId = 10; var vcArtifactInfo = new VersionControlArtifactInfo(); var mockArtifactVersionsRepository = new Mock <IArtifactVersionsRepository>(); mockArtifactVersionsRepository.Setup(r => r.GetVersionControlArtifactInfoAsync(itemId, null, userId)).ReturnsAsync(vcArtifactInfo); var artifactVersionsController = new ArtifactVersionsController(mockArtifactVersionsRepository.Object, null) { Request = new HttpRequestMessage() }; artifactVersionsController.Request.Properties[ServiceConstants.SessionProperty] = session; // Act var result = await artifactVersionsController.GetVersionControlArtifactInfoAsync(itemId, null); // Assert Assert.AreSame(vcArtifactInfo, result); }
public ExecutionParameters( int userId, VersionControlArtifactInfo artifactInfo, ItemTypeReuseTemplate reuseTemplate, List <WorkflowPropertyType> customPropertyTypes, ISaveArtifactRepository saveArtifactRepository, IDbTransaction transaction, IValidationContext validationContext) : this( userId, artifactInfo, reuseTemplate, customPropertyTypes, saveArtifactRepository, transaction, validationContext, new List <IPropertyValidator>() { new TextPropertyValidator(), new NumberPropertyValidator(), new DatePropertyValidator(), new UserPropertyValidator(), new ChoicePropertyValidator() }, new ReusePropertyValidator()) { }
private async Task ValidateArtifact(VersionControlArtifactInfo artifactInfo) { // Confirm that the artifact is not deleted var isDeleted = await _stateChangeExecutorRepositories.ArtifactVersionsRepository.IsItemDeleted(_input.ArtifactId); if (isDeleted) { throw new ConflictException(I18NHelper.FormatInvariant("Artifact has been deleted and is no longer available for workflow state change. Please refresh your view.")); } if (artifactInfo.IsDeleted) { throw new ConflictException(I18NHelper.FormatInvariant("Artifact has been deleted and is no longer available for workflow state change. Please refresh your view.")); } if (artifactInfo.VersionCount != _input.CurrentVersionId) { throw new ConflictException(I18NHelper.FormatInvariant("Artifact has been updated. The current version of the artifact {0} does not match the specified version {1}. Please refresh your view.", artifactInfo.VersionCount, _input.CurrentVersionId)); } // Lock is obtained by current user inside the stored procedure itself // Check that it is not locked by some other user if (artifactInfo.LockedByUser != null && artifactInfo.LockedByUser.Id != _userId) { throw new ConflictException(I18NHelper.FormatInvariant("Artifact has been updated. Artifact is locked by another user. Please refresh your view.")); } }
public async Task ExecuteInternal_NoTransitionAvailableForStates_ThrowsConflictException() { // Arrange ConflictException conflictException = null; _artifactVersionsRepository.Setup(t => t.IsItemDeleted(ArtifactId)) .ReturnsAsync(false); var vcArtifactInfo = new VersionControlArtifactInfo { Id = ArtifactId, VersionCount = CurrentVersionId, LockedByUser = new UserGroup { Id = UserId } }; _artifactVersionsRepository.Setup(t => t.GetVersionControlArtifactInfoAsync(ArtifactId, null, UserId)) .ReturnsAsync(vcArtifactInfo); var fromState = new WorkflowState { Id = FromStateId, WorkflowId = WorkflowId, Name = "Ready" }; _workflowRepository.Setup(t => t.GetStateForArtifactAsync(UserId, ArtifactId, int.MaxValue, true)) .ReturnsAsync(fromState); _workflowRepository.Setup( t => t.GetTransitionForAssociatedStatesAsync(UserId, ArtifactId, WorkflowId, FromStateId, ToStateId, TransitionId)) .ReturnsAsync((WorkflowTransition)null); _workflowRepository.Setup( t => t.GetWorkflowEventTriggersForTransition(UserId, ArtifactId, WorkflowId, FromStateId, ToStateId, TransitionId)) .ThrowsAsync(new ConflictException("", ErrorCodes.Conflict)); // Act try { await _stateChangeExecutor.Execute(); } catch (ConflictException ex) { conflictException = ex; } // Assert Assert.IsNotNull(conflictException); Assert.AreEqual(ErrorCodes.Conflict, conflictException.ErrorCode); }
public async Task GetVersionControlArtifactInfoAsync_IsNotExistsInBaselines() { // Arrange int userId = 1, artifactId = 10, baselineId = 20, revisionId = 30; var artifactVersionsRepository = CreateSqlRepositoryMock(userId, artifactId, baselineId, revisionId, null, null); // Act VersionControlArtifactInfo artifactInfo = (await artifactVersionsRepository.GetVersionControlArtifactInfoAsync(artifactId, baselineId, userId)); // Assert Assert.IsTrue(artifactInfo.IsNotExistsInBaseline != null && artifactInfo.IsNotExistsInBaseline.Value); }
public async Task <ExecutionParameters> BuildTriggerExecutionParameters( int userId, VersionControlArtifactInfo artifactInfo, WorkflowEventTriggers triggers, IDbTransaction transaction = null) { if (triggers.IsEmpty()) { return(null); } var artifactId = artifactInfo.Id; var isArtifactReadOnlyReuse = await _stateChangeExecutorRepositories.ReuseRepository.DoItemsContainReadonlyReuse(new[] { artifactId }, transaction); ItemTypeReuseTemplate reuseTemplate = null; var artifactId2StandardTypeId = await _stateChangeExecutorRepositories.ReuseRepository.GetStandardTypeIdsForArtifactsIdsAsync(new HashSet <int> { artifactId }); var instanceItemTypeId = artifactId2StandardTypeId[artifactId].InstanceTypeId; if (instanceItemTypeId == null) { throw new BadRequestException("Artifact is not a standard artifact type"); } if (isArtifactReadOnlyReuse.ContainsKey(artifactId) && isArtifactReadOnlyReuse[artifactId]) { reuseTemplate = await LoadReuseSettings(instanceItemTypeId.Value); } var customItemTypeToPropertiesMap = await LoadCustomPropertyInformation(new[] { instanceItemTypeId.Value }, triggers, artifactInfo.ProjectId, userId, artifactId); var propertyTypes = new List <WorkflowPropertyType>(); if (customItemTypeToPropertiesMap.ContainsKey(artifactInfo.ItemTypeId)) { propertyTypes = customItemTypeToPropertiesMap[artifactInfo.ItemTypeId]; } var usersAndGroups = await LoadUsersAndGroups(triggers); return(new ExecutionParameters( userId, artifactInfo, reuseTemplate, propertyTypes, _stateChangeExecutorRepositories.SaveArtifactRepository, transaction, new ValidationContext(usersAndGroups.Item1, usersAndGroups.Item2))); }
public async Task GetVersionControlArtifactInfoAsync_NotIncludedArtifactInBaselines() { // Arrange int userId = 1, artifactId = 10, baselineId = 20, revisionId = 30; var artifactVersionsRepository = CreateSqlRepositoryMock(userId, artifactId, baselineId, revisionId, null, new HashSet <int>() { 12 }); // Act VersionControlArtifactInfo artifactInfo = (await artifactVersionsRepository.GetVersionControlArtifactInfoAsync(artifactId, baselineId, userId)); // Assert Assert.IsTrue(artifactInfo.IsIncludedInBaseline != null && artifactInfo.IsIncludedInBaseline.Value == false); }
public async Task BuildTriggerExecutionParameters_WhenValid_ReturnsExecutionParameters() { // Arrange var artifactId = 1; var artifactStandardItemTypeId = 2; var artifactItemTypeId = 3; var artifactInfo = new VersionControlArtifactInfo() { Id = artifactId, ItemTypeId = artifactItemTypeId }; var triggers = new WorkflowEventTriggers(); triggers.Add(new WorkflowEventTrigger()); var sqlItemTypeInfo = new SqlItemTypeInfo() { InstanceTypeId = artifactStandardItemTypeId }; var isArtifactReadonlyReuseDictionary = new Dictionary <int, bool>() { { artifactId, false } }; var artifactStandardItemTypeDictionary = new Dictionary <int, SqlItemTypeInfo>() { { artifactId, sqlItemTypeInfo } }; _reuseRepository.Setup( r => r.DoItemsContainReadonlyReuse(It.IsAny <IEnumerable <int> >(), It.IsAny <IDbTransaction>())) .ReturnsAsync(isArtifactReadonlyReuseDictionary); _reuseRepository.Setup( r => r.GetStandardTypeIdsForArtifactsIdsAsync(It.IsAny <ISet <int> >())) .ReturnsAsync(artifactStandardItemTypeDictionary); var result = await _stateChangeExecutorHelper.BuildTriggerExecutionParameters(1, artifactInfo, triggers, null); // Assert Assert.IsNotNull(result); }
public async Task GetVersionControlArtifactInfoAsync_LatestDeleted() { // Arrange int userId = 1, itemId = 11, artifactId = 10, lockedByUserId = 2, latestDeletedByUserId = 3; SqlConnectionWrapperMock connectionWrapperMock = new SqlConnectionWrapperMock(); Mock <IArtifactRepository> artifactRepositoryMock = new Mock <IArtifactRepository>(); artifactRepositoryMock .Setup(m => m.GetArtifactBasicDetails(itemId, userId, null)) .ReturnsAsync(new ArtifactBasicDetails { ItemId = itemId, ArtifactId = artifactId, DraftDeleted = false, LatestDeleted = true, UserId = userId, LockedByUserId = lockedByUserId, LatestDeletedByUserId = latestDeletedByUserId }); Mock <IArtifactPermissionsRepository> artifactPermissionsRepositoryMock = new Mock <IArtifactPermissionsRepository>(); artifactPermissionsRepositoryMock.Setup(apr => apr.GetArtifactPermissions( It.IsAny <IEnumerable <int> >(), It.IsAny <int>(), It.IsAny <bool>(), It.IsAny <int>(), It.IsAny <bool>(), null)) .ReturnsAsync(new Dictionary <int, RolePermissions> { { artifactId, RolePermissions.Read } }); SqlArtifactVersionsRepository artifactVersionsRepository = new SqlArtifactVersionsRepository( connectionWrapperMock.Object, artifactRepositoryMock.Object, artifactPermissionsRepositoryMock.Object, _itemInfoRepositoryMock.Object); // Act VersionControlArtifactInfo artifactInfo = (await artifactVersionsRepository.GetVersionControlArtifactInfoAsync(itemId, null, userId)); // Assert connectionWrapperMock.Verify(); Assert.IsNotNull(artifactInfo.DeletedByUser); Assert.IsNotNull(artifactInfo.DeletedByUser.Id); Assert.IsTrue(artifactInfo.DeletedByUser.Id.Value == latestDeletedByUserId); }
public ExecutionParameters( int userId, VersionControlArtifactInfo artifactInfo, ItemTypeReuseTemplate reuseTemplate, List <WorkflowPropertyType> customPropertyTypes, ISaveArtifactRepository saveArtifactRepository, IDbTransaction transaction, IValidationContext validationContext, IReadOnlyList <IPropertyValidator> validators, IReusePropertyValidator reuseValidator) { UserId = userId; ArtifactInfo = artifactInfo; ReuseItemTemplate = reuseTemplate; CustomPropertyTypes = customPropertyTypes; SaveRepository = saveArtifactRepository; Transaction = transaction; Validators = validators; ReuseValidator = reuseValidator; ValidationContext = validationContext; }
public async Task GetVersionControlArtifactInfoAsync_NoChangesLockedBySomeoneElse() { // Arrange int userId = 1, itemId = 11, artifactId = 10, lockedByUserId = 2; SqlConnectionWrapperMock connectionWrapperMock = new SqlConnectionWrapperMock(); Mock <IArtifactRepository> artifactRepositoryMock = new Mock <IArtifactRepository>(); artifactRepositoryMock .Setup(m => m.GetArtifactBasicDetails(itemId, userId, null)) .ReturnsAsync(new ArtifactBasicDetails { ItemId = itemId, ArtifactId = artifactId, HasDraftRelationships = false, UserId = userId, LockedByUserId = lockedByUserId, }); Mock <IArtifactPermissionsRepository> artifactPermissionsRepositoryMock = new Mock <IArtifactPermissionsRepository>(); artifactPermissionsRepositoryMock.Setup(apr => apr.GetArtifactPermissions( It.IsAny <IEnumerable <int> >(), It.IsAny <int>(), It.IsAny <bool>(), It.IsAny <int>(), It.IsAny <bool>(), null)) .ReturnsAsync(new Dictionary <int, RolePermissions> { { artifactId, RolePermissions.Read } }); SqlArtifactVersionsRepository artifactVersionsRepository = new SqlArtifactVersionsRepository( connectionWrapperMock.Object, artifactRepositoryMock.Object, artifactPermissionsRepositoryMock.Object, _itemInfoRepositoryMock.Object); // Act VersionControlArtifactInfo artifactInfo = (await artifactVersionsRepository.GetVersionControlArtifactInfoAsync(itemId, null, userId)); // Assert connectionWrapperMock.Verify(); Assert.IsFalse(artifactInfo.HasChanges); }
public async Task SavePropertyChangeActions( int userId, IEnumerable <IPropertyChangeAction> actions, IEnumerable <WorkflowPropertyType> propertyTypes, VersionControlArtifactInfo artifact, IDbTransaction transaction = null) { var propertyValueVersionsTable = PopulateSavePropertyValueVersionsTable(actions, propertyTypes, artifact); var propertyValueImagesTable = PopulateImagePropertyValueVersionsTable(); var parameters = new DynamicParameters(); parameters.Add("@propertyValueVersions", propertyValueVersionsTable); parameters.Add("@propertyValueImages", propertyValueImagesTable); parameters.Add("@userId", userId); const string storedProcedure = "SavePropertyValueVersions"; if (transaction == null) { await _connectionWrapper.QueryAsync <dynamic> ( storedProcedure, parameters, commandType : CommandType.StoredProcedure); } else { await transaction.Connection.QueryAsync <dynamic> ( storedProcedure, parameters, transaction, commandType : CommandType.StoredProcedure); } }
public async Task <VersionControlArtifactInfo> GetVersionControlArtifactInfoAsync(int itemId, int?baselineId, int userId) { var artifactBasicDetails = await _artifactRepository.GetArtifactBasicDetails(itemId, userId); if (artifactBasicDetails == null) { var errorMessage = I18NHelper.FormatInvariant("Item (Id:{0}) is not found.", itemId); throw new ResourceNotFoundException(errorMessage, ErrorCodes.ResourceNotFound); } // Always getting permissions for the Head version of an artifact. // But, just in case, RevisionId and AddDrafts are available in ArtifactBasicDetails. var itemIdsPermissions = await _artifactPermissionsRepository.GetArtifactPermissions(Enumerable.Repeat(artifactBasicDetails.ArtifactId, 1), userId); if (!itemIdsPermissions.ContainsKey(artifactBasicDetails.ArtifactId) || !itemIdsPermissions[artifactBasicDetails.ArtifactId].HasFlag(RolePermissions.Read)) { var errorMessage = I18NHelper.FormatInvariant("User does not have permissions for Artifact (Id:{0}).", artifactBasicDetails.ArtifactId); throw new AuthorizationException(errorMessage, ErrorCodes.UnauthorizedAccess); } var artifactInfo = new VersionControlArtifactInfo { Id = artifactBasicDetails.ArtifactId, SubArtifactId = artifactBasicDetails.ArtifactId != artifactBasicDetails.ItemId ? (int?)artifactBasicDetails.ItemId : null, Name = artifactBasicDetails.Name, ProjectId = artifactBasicDetails.ProjectId, ParentId = artifactBasicDetails.ParentId, OrderIndex = artifactBasicDetails.OrderIndex, ItemTypeId = artifactBasicDetails.ItemTypeId, Prefix = artifactBasicDetails.Prefix, PredefinedType = (ItemTypePredefined)artifactBasicDetails.PrimitiveItemTypePredefined, Version = artifactBasicDetails.VersionIndex != null && artifactBasicDetails.VersionIndex.Value <= 0 ? -1 : artifactBasicDetails.VersionIndex, VersionCount = artifactBasicDetails.VersionsCount, IsDeleted = artifactBasicDetails.DraftDeleted || artifactBasicDetails.LatestDeleted, HasChanges = artifactBasicDetails.LockedByUserId != null && artifactBasicDetails.LockedByUserId.Value == userId || artifactBasicDetails.HasDraftRelationships, LockedByUser = artifactBasicDetails.LockedByUserId != null ? new UserGroup { Id = artifactBasicDetails.LockedByUserId.Value, DisplayName = artifactBasicDetails.LockedByUserName } : null, LockedDateTime = artifactBasicDetails.LockedByUserTime != null ? (DateTime?)DateTime.SpecifyKind(artifactBasicDetails.LockedByUserTime.Value, DateTimeKind.Utc) : null }; if (artifactBasicDetails.DraftDeleted) { artifactInfo.DeletedByUser = artifactBasicDetails.UserId != null ? new UserGroup { Id = artifactBasicDetails.UserId.Value, DisplayName = artifactBasicDetails.UserName } : null; artifactInfo.DeletedDateTime = artifactBasicDetails.LastSaveTimestamp != null ? (DateTime?)DateTime.SpecifyKind(artifactBasicDetails.LastSaveTimestamp.Value, DateTimeKind.Utc) : null; } else if (artifactBasicDetails.LatestDeleted) { artifactInfo.DeletedByUser = artifactBasicDetails.LatestDeletedByUserId != null ? new UserGroup { Id = artifactBasicDetails.LatestDeletedByUserId.Value, DisplayName = artifactBasicDetails.LatestDeletedByUserName } : null; artifactInfo.DeletedDateTime = artifactBasicDetails.LatestDeletedByUserTime != null ? (DateTime?)DateTime.SpecifyKind(artifactBasicDetails.LatestDeletedByUserTime.Value, DateTimeKind.Utc) : null; } artifactInfo.Permissions = itemIdsPermissions[artifactBasicDetails.ArtifactId]; if (baselineId != null) { var baselineRevisionId = await _itemInfoRepository.GetRevisionId(itemId, userId, null, baselineId.Value); var itemInfo = await _artifactPermissionsRepository.GetItemInfo(itemId, userId, false, baselineRevisionId); if (itemInfo == null) { artifactInfo.IsNotExistsInBaseline = true; } artifactInfo.IsIncludedInBaseline = await IsArtifactInBaseline(artifactBasicDetails.ArtifactId, baselineId.Value, userId); } return(artifactInfo); }
public async Task GetTransitionsAsync_ChangeStateForArtifactAsync_SuccessfullyCallsRepo() { // Arrange int itemId = 1; int userId = 1; int workflowId = 4; int fromStateId = 2; int toStateId = 5; const int transitionId = 10; var vcArtifactInfo = new VersionControlArtifactInfo { Id = itemId, VersionCount = 10, LockedByUser = new UserGroup { Id = userId } }; _artifactVersionsRepositoryMock.Setup(t => t.IsItemDeleted(itemId)) .ReturnsAsync(false); _artifactVersionsRepositoryMock.Setup(t => t.GetVersionControlArtifactInfoAsync(itemId, null, 1)) .ReturnsAsync(vcArtifactInfo); _applicationSettingsRepositoryMock.Setup(t => t.GetTenantInfo(It.IsAny <IDbTransaction>())).ReturnsAsync(new TenantInfo() { TenantId = Guid.NewGuid().ToString() }); var wfStateChangeParam = new WorkflowStateChangeParameter { CurrentVersionId = 10, ToStateId = toStateId, FromStateId = fromStateId, TransitionId = transitionId }; var fromState = new WorkflowState { Id = fromStateId, WorkflowId = workflowId, Name = "Ready" }; var toState = new WorkflowState { Id = toStateId, Name = "Close", WorkflowId = workflowId }; _workflowRepositoryMock.Setup(t => t.GetStateForArtifactAsync(userId, itemId, int.MaxValue, true)) .ReturnsAsync(fromState); var transition = new WorkflowTransition() { FromState = fromState, Id = transitionId, ToState = toState, WorkflowId = workflowId, Name = "Ready to Closed" }; _workflowRepositoryMock.Setup( t => t.GetTransitionForAssociatedStatesAsync(userId, itemId, workflowId, fromStateId, toStateId, transitionId)) .ReturnsAsync(transition); _workflowRepositoryMock.Setup( t => t.GetWorkflowEventTriggersForTransition(userId, itemId, workflowId, fromStateId, toStateId, transitionId)) .ReturnsAsync(new WorkflowTriggersContainer()); _workflowRepositoryMock.Setup(t => t.ChangeStateForArtifactAsync(1, itemId, It.IsAny <WorkflowStateChangeParameterEx>(), It.IsAny <IDbTransaction>())) .ReturnsAsync(toState); // Act var result = await _workflowServiceMock.ChangeStateForArtifactAsync(1, "admin", itemId, wfStateChangeParam); // Assert Assert.AreEqual(toState, result.Item); Assert.AreEqual(QueryResultCode.Success, result.ResultCode); }
private DataTable PopulateSavePropertyValueVersionsTable( IEnumerable <IPropertyChangeAction> actions, IEnumerable <WorkflowPropertyType> propertyTypes, VersionControlArtifactInfo artifact) { DataTable propertyValueVersionsTable = new DataTable(); propertyValueVersionsTable.Locale = CultureInfo.InvariantCulture; propertyValueVersionsTable.Columns.Add("NodeId", typeof(long)); propertyValueVersionsTable.Columns.Add("NodeDeleted", typeof(bool)); // propertyValueVersionsTable.Columns.Add("VersionProjectId", typeof(int)); propertyValueVersionsTable.Columns.Add("VersionArtifactId", typeof(int)); propertyValueVersionsTable.Columns.Add("VersionItemId", typeof(int)); propertyValueVersionsTable.Columns.Add("PropertyTypePredefined", typeof(int)); propertyValueVersionsTable.Columns.Add("PrimitiveType", typeof(int)); propertyValueVersionsTable.Columns.Add("DecimalValue", typeof(byte[])); propertyValueVersionsTable.Columns.Add("DateValue", typeof(DateTime)); propertyValueVersionsTable.Columns.Add("UserValue", typeof(string)); propertyValueVersionsTable.Columns.Add("UserLabel", typeof(string)); propertyValueVersionsTable.Columns.Add("StringValue", typeof(string)); propertyValueVersionsTable.Columns.Add("ImageValue_ImageId", typeof(int)); propertyValueVersionsTable.Columns.Add("CustomPropertyChar", typeof(string)); propertyValueVersionsTable.Columns.Add("PropertyType_PropertyTypeId", typeof(int)); // propertyValueVersionsTable.Columns.Add("SearchableValue", typeof(string)); foreach (var action in actions) { var propertyType = propertyTypes.FirstOrDefault(a => a.InstancePropertyTypeId == action.InstancePropertyTypeId); var customPropertyChar = GetCustomPropertyChar(action.PropertyLiteValue, propertyType); var searchableValue = GetSearchableValue(action.PropertyLiteValue, propertyType); if (propertyType is TextPropertyType) { propertyValueVersionsTable.Rows.Add(propertyType.PropertyTypeId, false, artifact.ProjectId, artifact.Id, artifact.Id, (int)propertyType.Predefined, // (int)PropertyPrimitiveType.Text, null, null, null, null, GetTextPropertyValue(propertyType, action.PropertyLiteValue), null, // customPropertyChar, propertyType.PropertyTypeId, searchableValue); } else if (propertyType is NumberPropertyType) { propertyValueVersionsTable.Rows.Add(propertyType.PropertyTypeId, false, artifact.ProjectId, artifact.Id, artifact.Id, (int)propertyType.Predefined, // (int)PropertyPrimitiveType.Number, PropertyHelper.GetBytes(action.PropertyLiteValue.NumberValue), null, null, null, null, null, // customPropertyChar, propertyType.PropertyTypeId, searchableValue); } else if (propertyType is DatePropertyType) { propertyValueVersionsTable.Rows.Add(propertyType.PropertyTypeId, false, artifact.ProjectId, artifact.Id, artifact.Id, (int)propertyType.Predefined, // (int)PropertyPrimitiveType.Date, null, action.PropertyLiteValue.DateValue, null, null, null, null, // customPropertyChar, propertyType.PropertyTypeId, searchableValue); } else if (propertyType is UserPropertyType) { propertyValueVersionsTable.Rows.Add(propertyType.PropertyTypeId, false, artifact.ProjectId, artifact.Id, artifact.Id, (int)propertyType.Predefined, // (int)PropertyPrimitiveType.User, null, null, PropertyHelper.ParseUserGroupsToString(action.PropertyLiteValue.UsersAndGroups), null, null, null, // customPropertyChar, propertyType.PropertyTypeId, searchableValue); } else if (propertyType is ChoicePropertyType) { propertyValueVersionsTable.Rows.Add(propertyType.PropertyTypeId, false, artifact.ProjectId, artifact.Id, artifact.Id, (int)propertyType.Predefined, // (int)PropertyPrimitiveType.Choice, null, null, null, null, action.PropertyLiteValue.TextOrChoiceValue, null, // customPropertyChar, propertyType.PropertyTypeId, searchableValue); } } propertyValueVersionsTable.SetTypeName("SavePropertyValueVersionsCollection"); return(propertyValueVersionsTable); }
public async Task ExecuteInternal_CouldNotChangeState_ReturnsFailedResult() { // Arrange _artifactVersionsRepository.Setup(t => t.IsItemDeleted(ArtifactId)) .ReturnsAsync(false); _applicationSettingsRepositoryMock.Setup(t => t.GetTenantInfo(It.IsAny <IDbTransaction>())).ReturnsAsync(new TenantInfo() { TenantId = Guid.NewGuid().ToString() }); var vcArtifactInfo = new VersionControlArtifactInfo { Id = ArtifactId, VersionCount = CurrentVersionId, LockedByUser = new UserGroup { Id = UserId } }; _artifactVersionsRepository.Setup(t => t.GetVersionControlArtifactInfoAsync(ArtifactId, null, UserId)) .ReturnsAsync(vcArtifactInfo); var fromState = new WorkflowState { Id = FromStateId, WorkflowId = WorkflowId, Name = "Ready" }; _workflowRepository.Setup(t => t.GetStateForArtifactAsync(UserId, ArtifactId, int.MaxValue, true)) .ReturnsAsync(fromState); var toState = new WorkflowState { Id = ToStateId, Name = "Close", WorkflowId = WorkflowId }; var transition = new WorkflowTransition() { FromState = fromState, Id = TransitionId, ToState = toState, WorkflowId = WorkflowId, Name = "Ready to Closed" }; _workflowRepository.Setup( t => t.GetTransitionForAssociatedStatesAsync(UserId, ArtifactId, WorkflowId, FromStateId, ToStateId, TransitionId)) .ReturnsAsync(transition); _workflowRepository.Setup( t => t.GetWorkflowEventTriggersForTransition(UserId, ArtifactId, WorkflowId, FromStateId, ToStateId, TransitionId)) .ReturnsAsync(new WorkflowTriggersContainer()); _workflowRepository.Setup(t => t.ChangeStateForArtifactAsync(UserId, ArtifactId, It.IsAny <WorkflowStateChangeParameterEx>(), It.IsAny <IDbTransaction>())) .ReturnsAsync((WorkflowState)null); // Act var result = await _stateChangeExecutor.Execute(); // Assert Assert.IsNotNull(result); Assert.AreEqual(QueryResultCode.Failure, result.ResultCode); }
public async Task ExecuteInternal_WhenSynchronouTriggersErrors_ThrowsConflictException() { // Arrange _artifactVersionsRepository.Setup(t => t.IsItemDeleted(ArtifactId)) .ReturnsAsync(false); _applicationSettingsRepositoryMock.Setup(t => t.GetTenantInfo(It.IsAny <IDbTransaction>())).ReturnsAsync(new TenantInfo() { TenantId = Guid.NewGuid().ToString() }); var vcArtifactInfo = new VersionControlArtifactInfo { Id = ArtifactId, VersionCount = CurrentVersionId, LockedByUser = new UserGroup { Id = UserId } }; _artifactVersionsRepository.Setup(t => t.GetVersionControlArtifactInfoAsync(ArtifactId, null, UserId)) .ReturnsAsync(vcArtifactInfo); var fromState = new WorkflowState { Id = FromStateId, WorkflowId = WorkflowId, Name = "Ready" }; _workflowRepository.Setup(t => t.GetStateForArtifactAsync(UserId, ArtifactId, int.MaxValue, true)) .ReturnsAsync(fromState); var toState = new WorkflowState { Id = ToStateId, Name = "Close", WorkflowId = WorkflowId }; var transition = new WorkflowTransition() { FromState = fromState, Id = TransitionId, ToState = toState, WorkflowId = WorkflowId, Name = "Ready to Closed" }; _workflowRepository.Setup( t => t.GetTransitionForAssociatedStatesAsync(UserId, ArtifactId, WorkflowId, FromStateId, ToStateId, TransitionId)) .ReturnsAsync(transition); var workflowEventAction = new Mock <IWorkflowEventAction>(); workflowEventAction.Setup(a => a.ValidateAction(It.IsAny <IExecutionParameters>())).Returns(new PropertySetResult(-1, -1, "")); var triggerContainer = new WorkflowTriggersContainer(); triggerContainer.SynchronousTriggers.Add(new WorkflowEventTrigger() { Action = workflowEventAction.Object, Name = "Test'" }); _workflowRepository.Setup( t => t.GetWorkflowEventTriggersForTransition(UserId, ArtifactId, WorkflowId, FromStateId, ToStateId, TransitionId)) .ReturnsAsync(triggerContainer); _workflowRepository.Setup(t => t.ChangeStateForArtifactAsync(UserId, ArtifactId, It.IsAny <WorkflowStateChangeParameterEx>(), It.IsAny <IDbTransaction>())) .ReturnsAsync((WorkflowState)null); // Act await _stateChangeExecutor.Execute(); }
public async Task ExecuteInternal_StateChangeAndPublish_CallsBoth() { // Arrange _artifactVersionsRepository.Setup(t => t.IsItemDeleted(ArtifactId)) .ReturnsAsync(false); _applicationSettingsRepositoryMock.Setup(t => t.GetTenantInfo(It.IsAny <IDbTransaction>())).ReturnsAsync(new TenantInfo() { TenantId = Guid.NewGuid().ToString() }); var vcArtifactInfo = new VersionControlArtifactInfo { Id = ArtifactId, VersionCount = CurrentVersionId, LockedByUser = new UserGroup { Id = UserId } }; _artifactVersionsRepository.Setup(t => t.GetVersionControlArtifactInfoAsync(ArtifactId, null, UserId)) .ReturnsAsync(vcArtifactInfo); var fromState = new WorkflowState { Id = FromStateId, WorkflowId = WorkflowId, Name = "Ready" }; _workflowRepository.Setup(t => t.GetStateForArtifactAsync(UserId, ArtifactId, int.MaxValue, true)) .ReturnsAsync(fromState); var toState = new WorkflowState { Id = ToStateId, Name = "Close", WorkflowId = WorkflowId }; var transition = new WorkflowTransition() { FromState = fromState, Id = TransitionId, ToState = toState, WorkflowId = WorkflowId, Name = "Ready to Closed" }; _workflowRepository.Setup( t => t.GetTransitionForAssociatedStatesAsync(UserId, ArtifactId, WorkflowId, FromStateId, ToStateId, TransitionId)) .ReturnsAsync(transition); _workflowRepository.Setup( t => t.GetWorkflowEventTriggersForTransition(UserId, ArtifactId, WorkflowId, FromStateId, ToStateId, TransitionId)) .ReturnsAsync(new WorkflowTriggersContainer()); _workflowRepository.Setup(t => t.ChangeStateForArtifactAsync(UserId, ArtifactId, It.IsAny <WorkflowStateChangeParameterEx>(), It.IsAny <IDbTransaction>())) .ReturnsAsync((WorkflowState)null); // Act await _stateChangeExecutor.Execute(); // Assert _workflowRepository.Verify(t => t.GetStateForArtifactAsync(UserId, ArtifactId, int.MaxValue, true)); _versionControlService.Verify(t => t.PublishArtifacts(It.IsAny <PublishParameters>(), It.IsAny <IDbTransaction>())); }