public async Task AssignsTemplateVersionAndQueuesAssignTemplateCalculationJobIfTheSuppliedTemplateVersionsDiffersToTheSpecificationVersion()
        {
            string fundingStream      = NewRandomString();
            string existingTemplateId = NewRandomString();
            string changedTemplateId  = NewRandomString();
            string specificationId    = NewRandomString();
            string fundingPeriodId    = NewRandomString();

            SpecificationVersion previousSpecificationVersion = NewSpecificationVersion(_ => _.WithSpecificationId(specificationId)
                                                                                        .WithFundingPeriodId(fundingPeriodId)
                                                                                        .WithTemplateIds((fundingStream, existingTemplateId)));

            SpecificationVersion specificationVersion = previousSpecificationVersion.DeepCopy();

            Reference user = NewUser();

            string correlationId = NewRandomString();

            GivenAllTheAssociateTemplateIdWithSpecificationCallsSucceed();

            await WhenTemplateVersionChangeIsHandled(previousSpecificationVersion,
                                                     specificationVersion,
                                                     new Dictionary <string, string>
            {
                { fundingStream, changedTemplateId }
            },
                                                     user,
                                                     correlationId);

            ThenTheProcessMappingsWasCalled(fundingStream, changedTemplateId, specificationId);
            AndTheAssignTemplateCalculationJobWasNotCreated(specificationId, fundingStream, fundingPeriodId, existingTemplateId);
        }
        public async Task AssignsTemplateVersionAndQueuesAssignTemplateCalculationJobForAnyChangedTemplateVersionsInTheSpecificationVersion()
        {
            string fundingStreamOne   = NewRandomString();
            string fundingStreamTwo   = NewRandomString();
            string fundingStreamThree = NewRandomString();

            string existingTemplateIdOne   = NewRandomString();
            string existingTemplateIdTwo   = NewRandomString();
            string existingTemplateIdThree = NewRandomString();

            string changedTemplateIdTwo = NewRandomString();

            IDictionary <string, string> assignedTemplateIds = NewAssignTemplateIds((fundingStreamOne, existingTemplateIdOne),
                                                                                    (fundingStreamTwo, changedTemplateIdTwo));

            string specificationId = NewRandomString();
            string fundingPeriodId = NewRandomString();

            SpecificationVersion previousSpecificationVersion = NewSpecificationVersion(_ => _.WithSpecificationId(specificationId)
                                                                                        .WithFundingPeriodId(fundingPeriodId)
                                                                                        .WithTemplateIds((fundingStreamOne, existingTemplateIdOne),
                                                                                                         (fundingStreamTwo, existingTemplateIdTwo),
                                                                                                         (fundingStreamThree, existingTemplateIdThree)));

            SpecificationVersion specificationVersion = previousSpecificationVersion.DeepCopy();

            Reference user = NewUser();

            string correlationId = NewRandomString();

            GivenAllTheAssociateTemplateIdWithSpecificationCallsSucceed();

            await WhenTemplateVersionChangeIsHandled(previousSpecificationVersion,
                                                     specificationVersion,
                                                     assignedTemplateIds,
                                                     user,
                                                     correlationId);

            ThenTheProcessMappingsWasCalled(fundingStreamTwo, changedTemplateIdTwo, specificationId);
            AndTheProcessMappingsWasNotCalled(fundingStreamTwo, existingTemplateIdTwo, specificationId);
            AndTheProcessMappingsWasNotCalled(fundingStreamOne, existingTemplateIdOne, specificationId);
            AndTheProcessMappingsWasNotCalled(fundingStreamThree, existingTemplateIdThree, specificationId);
            AndTheAssignTemplateCalculationJobWasCreated(user, correlationId, specificationId, fundingStreamTwo, fundingPeriodId, changedTemplateIdTwo);
            AndTheAssignTemplateCalculationJobWasNotCreated(user, correlationId, specificationId, fundingStreamTwo, fundingPeriodId, existingTemplateIdTwo);
            AndTheAssignTemplateCalculationJobWasNotCreated(user, correlationId, specificationId, fundingStreamOne, fundingPeriodId, existingTemplateIdOne);
            AndTheAssignTemplateCalculationJobWasNotCreated(user, correlationId, specificationId, fundingStreamOne, fundingPeriodId, existingTemplateIdThree);
            AndTheSpecVersionTemplateVersionsAssigned(specificationVersion, fundingStreamTwo, changedTemplateIdTwo);
        }