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);
        }
示例#2
0
        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);
        }
示例#4
0
 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())
 {
 }
示例#5
0
        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);
        }
示例#7
0
        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)));
        }
示例#9
0
        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);
        }
示例#10
0
        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);
        }
示例#11
0
        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);
        }
示例#12
0
 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;
 }
示例#13
0
        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);
        }
示例#14
0
        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);
            }
        }
示例#15
0
        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);
        }
示例#17
0
        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>()));
        }