private void AssertCorrectMethodsAreCalledForGenerateGroups(
            GroupGenerationDetails groupGenerationDetails,
            DateTime timeNow,
            int linkedToField,
            string?fullGroupLabel,
            string?customPromptOptionText = null,
            int?jobGroupId = null
            )
        {
            var isJobGroup = groupGenerationDetails.RegistrationField.Equals(RegistrationField.JobGroup);

            using (new AssertionScope())
            {
                if (!isJobGroup)
                {
                    A.CallTo(
                        () => centreRegistrationPromptsService.GetCentreRegistrationPromptsThatHaveOptionsByCentreId(
                            groupGenerationDetails.CentreId
                            )
                        )
                    .MustHaveHappenedOnceExactly();
                    A.CallTo(() => groupsDataService.GetGroupsForCentre(groupGenerationDetails.CentreId))
                    .MustHaveHappenedOnceExactly();
                }

                A.CallTo(
                    () => groupsDataService.AddDelegateGroup(
                        A <GroupDetails> .That.Matches(
                            gd =>
                            gd.CentreId == groupGenerationDetails.CentreId &&
                            gd.GroupLabel == fullGroupLabel &&
                            gd.GroupDescription == null &&
                            gd.AdminUserId == groupGenerationDetails.AdminId &&
                            gd.CreatedDate == timeNow &&
                            gd.LinkedToField == linkedToField &&
                            gd.SyncFieldChanges == groupGenerationDetails.SyncFieldChanges &&
                            gd.AddNewRegistrants == groupGenerationDetails.AddNewRegistrants &&
                            gd.PopulateExisting == groupGenerationDetails.PopulateExisting
                            )
                        )
                    ).MustHaveHappenedOnceExactly();

                A.CallTo(
                    () => groupsDataService.AddDelegatesWithMatchingAnswersToGroup(
                        NewGroupId,
                        A <DateTime> ._,
                        linkedToField,
                        groupGenerationDetails.CentreId,
                        isJobGroup ? null : customPromptOptionText,
                        jobGroupId
                        )
                    )
                .MustHaveHappenedOnceExactly();
            }
        }
        public void GenerateGroupsFromRegistrationField(GroupGenerationDetails groupDetails)
        {
            var isJobGroup    = groupDetails.RegistrationField.Equals(RegistrationField.JobGroup);
            var linkedToField = groupDetails.RegistrationField.LinkedToFieldId;

            (List <(int id, string name)> newGroupNames, string groupNamePrefix) = isJobGroup
                ? GetJobGroupsAndPrefix()
                : GetCentreRegistrationPromptsAndPrefix(groupDetails.CentreId, groupDetails.RegistrationField.Id);

            var groupsAtCentre = GetGroupsForCentre(groupDetails.CentreId).Select(g => g.GroupLabel).ToList();

            using var transaction = new TransactionScope();
            foreach (var(id, newGroupName) in newGroupNames)
            {
                var groupName = groupDetails.PrefixGroupName
                    ? GetGroupNameWithPrefix(groupNamePrefix, newGroupName)
                    : newGroupName;

                if (groupDetails.SkipDuplicateNames && groupsAtCentre.Contains(groupName))
                {
                    continue;
                }

                var newGroupId = AddDelegateGroup(
                    groupDetails.CentreId,
                    groupName,
                    null,
                    groupDetails.AdminId,
                    linkedToField,
                    groupDetails.SyncFieldChanges,
                    groupDetails.AddNewRegistrants,
                    groupDetails.PopulateExisting
                    );

                if (groupDetails.PopulateExisting)
                {
                    groupsDataService.AddDelegatesWithMatchingAnswersToGroup(
                        newGroupId,
                        clockService.UtcNow,
                        linkedToField,
                        groupDetails.CentreId,
                        isJobGroup ? null : newGroupName,
                        isJobGroup ? id : (int?)null
                        );
                }
            }

            transaction.Complete();
        }
        GenerateGroupsFromRegistrationField_calls_data_service_methods_with_correct_values_for_custom_prompt()
        {
            // Given
            const string groupName       = "Manager";
            const string groupNamePrefix = "Role";

            const int linkedToField     = 1;
            var       registrationField = RegistrationField.CentreRegistrationField1;

            var timeNow = DateTime.UtcNow;
            var groupGenerationDetails = new GroupGenerationDetails(
                1,
                101,
                registrationField,
                false,
                true,
                false,
                true,
                true
                );

            var centreRegistrationPrompt  = new CentreRegistrationPrompt(1, 1, groupNamePrefix, groupName, false);
            var centreRegistrationPrompts = new List <CentreRegistrationPrompt> {
                centreRegistrationPrompt
            };

            SetUpGenerateGroupFakes(timeNow, centreRegistrationPrompts);

            // When
            groupsService.GenerateGroupsFromRegistrationField(groupGenerationDetails);

            // Then
            AssertCorrectMethodsAreCalledForGenerateGroups(
                groupGenerationDetails,
                timeNow,
                linkedToField,
                groupName,
                groupName
                );
        }
        GenerateGroupsFromRegistrationField_calls_data_service_methods_with_correct_values_for_job_group()
        {
            // Given
            const string groupName  = "Nursing";
            const int    jobGroupId = 1;

            var timeNow   = DateTime.UtcNow;
            var jobGroups = new List <(int id, string name)> {
                (jobGroupId, groupName)
            };
            var registrationField      = RegistrationField.JobGroup;
            var groupGenerationDetails = new GroupGenerationDetails(
                1,
                101,
                registrationField,
                false,
                true,
                false,
                true,
                true
                );

            A.CallTo(() => jobGroupsDataService.GetJobGroupsAlphabetical()).Returns(jobGroups);

            SetUpGenerateGroupFakes(timeNow);

            // When
            groupsService.GenerateGroupsFromRegistrationField(groupGenerationDetails);

            // Then
            AssertCorrectMethodsAreCalledForGenerateGroups(
                groupGenerationDetails,
                timeNow,
                registrationField.LinkedToFieldId,
                groupName,
                groupName,
                jobGroupId
                );
        }
        GenerateGroupsFromRegistrationField_correctly_prefixes_group_name_with_custom_prompt_text_when_intended()
        {
            // Given
            const string groupName         = "Manager";
            const string groupNamePrefix   = "Role";
            var          registrationField = RegistrationField.CentreRegistrationField1;

            var timeNow = DateTime.UtcNow;
            var groupGenerationDetails = new GroupGenerationDetails(
                1,
                101,
                registrationField,
                true,
                true,
                false,
                true,
                true
                );

            var centreRegistrationPrompt  = new CentreRegistrationPrompt(1, 1, groupNamePrefix, groupName, false);
            var centreRegistrationPrompts = new List <CentreRegistrationPrompt> {
                centreRegistrationPrompt
            };

            SetUpGenerateGroupFakes(timeNow, centreRegistrationPrompts);

            // When
            groupsService.GenerateGroupsFromRegistrationField(groupGenerationDetails);

            // Then
            AssertCorrectMethodsAreCalledForGenerateGroups(
                groupGenerationDetails,
                timeNow,
                registrationField.LinkedToFieldId,
                $"{groupNamePrefix} - {groupName}",
                groupName
                );
        }
Exemple #6
0
        public IActionResult GenerateGroups(GenerateGroupsViewModel model)
        {
            if (!ModelState.IsValid)
            {
                model.RegistrationFieldOptions = GetRegistrationFieldOptionsSelectList(model.RegistrationFieldOptionId);
                return(View(model));
            }

            var adminId           = User.GetAdminIdKnownNotNull() !;
            var centreId          = User.GetCentreId();
            var registrationField = (RegistrationField)model.RegistrationFieldOptionId;

            var fieldIsValid = centreRegistrationPromptsService
                               .GetCentreRegistrationPromptsThatHaveOptionsByCentreId(centreId).Select(cp => cp.RegistrationField.Id)
                               .Contains(registrationField !.Id) || registrationField.Equals(RegistrationField.JobGroup);

            if (!fieldIsValid)
            {
                return(StatusCode(500));
            }

            var groupDetails = new GroupGenerationDetails(
                adminId,
                centreId,
                registrationField,
                model.PrefixGroupName,
                model.PopulateExisting,
                model.AddNewRegistrants,
                model.SyncFieldChanges,
                model.SkipDuplicateNames
                );

            groupsService.GenerateGroupsFromRegistrationField(groupDetails);

            return(RedirectToAction("Index"));
        }
        GenerateGroupsFromRegistrationField_skips_groups_with_duplicate_names()
        {
            // Given
            const string duplicateGroupName    = "Manager";
            const string nonDuplicateGroupName = "Receptionist";
            const string groupNamePrefix       = "Role";

            var timeNow = DateTime.UtcNow;
            var groupGenerationDetails = new GroupGenerationDetails(
                1,
                101,
                RegistrationField.CentreRegistrationField1,
                false,
                true,
                false,
                true,
                true
                );

            GivenCurrentTimeIs(timeNow);

            var centreRegistrationPrompt = new CentreRegistrationPrompt(
                1,
                1,
                groupNamePrefix,
                $"{duplicateGroupName}\r\n{nonDuplicateGroupName}",
                false
                );
            var centreRegistrationPrompts = new List <CentreRegistrationPrompt> {
                centreRegistrationPrompt
            };
            var groupAtCentre = new Group {
                GroupLabel = "Manager"
            };

            SetUpGenerateGroupFakes(timeNow, centreRegistrationPrompts, new List <Group> {
                groupAtCentre
            });

            // When
            groupsService.GenerateGroupsFromRegistrationField(groupGenerationDetails);

            // Then
            using (new AssertionScope())
            {
                A.CallTo(
                    () => groupsDataService.AddDelegateGroup(
                        A <GroupDetails> .That.Matches(
                            gd =>
                            gd.GroupLabel == duplicateGroupName
                            )
                        )
                    ).MustNotHaveHappened();
                A.CallTo(
                    () => groupsDataService.AddDelegateGroup(
                        A <GroupDetails> .That.Matches(
                            gd =>
                            gd.GroupLabel == nonDuplicateGroupName
                            )
                        )
                    ).MustHaveHappenedOnceExactly();
                A.CallTo(
                    () => groupsDataService.AddDelegatesWithMatchingAnswersToGroup(
                        A <int> ._,
                        A <DateTime> ._,
                        A <int> ._,
                        A <int> ._,
                        duplicateGroupName,
                        null
                        )
                    )
                .MustNotHaveHappened();
                A.CallTo(
                    () => groupsDataService.AddDelegatesWithMatchingAnswersToGroup(
                        A <int> ._,
                        A <DateTime> ._,
                        A <int> ._,
                        A <int> ._,
                        nonDuplicateGroupName,
                        null
                        )
                    )
                .MustHaveHappenedOnceExactly();
            }
        }