Example #1
0
        private void GivenLearningHubApiReturnsResources(decimal rating)
        {
            var clientResponse = new BulkResourceReferences
            {
                ResourceReferences = new List <ResourceReferenceWithResourceDetails>
                {
                    new ResourceReferenceWithResourceDetails
                    {
                        ResourceId  = 0,
                        RefId       = LearningHubResourceReferenceId,
                        Title       = ResourceName,
                        Description = ResourceDescription,
                        Catalogue   = new Catalogue {
                            Name = ResourceCatalogue
                        },
                        ResourceType = ResourceType,
                        Rating       = rating,
                        Link         = ResourceLink,
                    },
                },
                UnmatchedResourceReferenceIds = new List <int>(),
            };

            A.CallTo(() => learningHubResourceService.GetResourceReferenceDetailsByReferenceIds(A <List <int> > ._))
            .Returns(clientResponse.ResourceReferences);

            A.CallTo(() => learningHubResourceService.GetBulkResourcesByReferenceIds(A <List <int> > ._))
            .Returns((clientResponse, false));
        }
        GetBulkResourcesByReferenceIdsAndPopulateDeletedDetailsFromDatabase_returns_fallback_data_without_marking_resources_as_deleted_if_API_throws_exception()
        {
            // Given
            var resource1 = Builder <ResourceReferenceWithResourceDetails> .CreateNew()
                            .With(r => r.RefId = 1).And(r => r.AbsentInLearningHub = false).Build();

            var resource2 = Builder <ResourceReferenceWithResourceDetails> .CreateNew()
                            .With(r => r.RefId = 2).And(r => r.AbsentInLearningHub = false).Build();

            var resourceReferenceIdsToRetrieve = new[] { 1, 2, 3 };
            var bulkResources = new BulkResourceReferences
            {
                ResourceReferences = new List <ResourceReferenceWithResourceDetails>
                {
                    resource1,
                    resource2,
                },
                UnmatchedResourceReferenceIds = new List <int> {
                    3
                },
            };

            A.CallTo(() => learningHubApiClient.GetBulkResourcesByReferenceIds(A <IEnumerable <int> > ._))
            .Throws(new LearningHubResponseException("exception", HttpStatusCode.Unauthorized));
            A.CallTo(
                () => learningResourceReferenceDataService.GetResourceReferenceDetailsByReferenceIds(
                    A <IEnumerable <int> > ._
                    )
                ).Returns(new List <ResourceReferenceWithResourceDetails> {
                resource1, resource2
            });

            // When
            var(bulkResourceReferences, apiIsAccessible) =
                (await learningHubResourceService.GetBulkResourcesByReferenceIdsAndPopulateDeletedDetailsFromDatabase(
                     resourceReferenceIdsToRetrieve
                     )) !;

            // Then
            using (new AssertionScope())
            {
                bulkResourceReferences.Should().BeEquivalentTo(bulkResources);
                bulkResourceReferences.ResourceReferences[0].AbsentInLearningHub.Should().BeFalse();
                bulkResourceReferences.ResourceReferences[1].AbsentInLearningHub.Should().BeFalse();
                apiIsAccessible.Should().BeFalse();
                A.CallTo(
                    () => learningHubApiClient.GetBulkResourcesByReferenceIds(
                        A <IEnumerable <int> > .That.IsSameSequenceAs(resourceReferenceIdsToRetrieve)
                        )
                    )
                .MustHaveHappenedOnceExactly();
                A.CallTo(
                    () => learningResourceReferenceDataService.GetResourceReferenceDetailsByReferenceIds(
                        A <IEnumerable <int> > .That.IsSameSequenceAs(resourceReferenceIdsToRetrieve)
                        )
                    )
                .MustHaveHappenedOnceExactly();
            }
        }
Example #3
0
        public async Task GetCompleteActionPlanResources_returns_correctly_matched_action_plan_items_with_repeated_resource()
        {
            // Given
            const int delegateId     = 1;
            var       learningLogIds = new List <int> {
                4, 5, 6
            };
            var learningResourceIds = new List <int> {
                15, 26, 15
            };
            var expectedLearningResourceIdsUsedInApiCall = new List <int> {
                15, 26
            };
            var learningLogItems = Builder <LearningLogItem> .CreateListOfSize(3).All()
                                   .With(i => i.CompletedDate = DateTime.UtcNow)
                                   .And(i => i.ArchivedDate   = null)
                                   .And((i, index) => i.LearningHubResourceReferenceId = learningResourceIds[index])
                                   .And((i, index) => i.LearningLogItemId = learningLogIds[index])
                                   .Build();

            A.CallTo(() => learningLogItemsDataService.GetLearningLogItems(delegateId))
            .Returns(learningLogItems);
            var matchedResources = Builder <ResourceReferenceWithResourceDetails> .CreateListOfSize(2).All()
                                   .With((r, index) => r.RefId = learningResourceIds[index])
                                   .And((r, index) => r.Title  = $"Title {learningResourceIds[index]}")
                                   .And(r => r.Catalogue       = genericCatalogue).Build().ToList();

            var unmatchedResourceReferences = new List <int>();
            var bulkReturnedItems           = new BulkResourceReferences
            {
                ResourceReferences            = matchedResources,
                UnmatchedResourceReferenceIds = unmatchedResourceReferences,
            };

            A.CallTo(() => learningHubApiClient.GetBulkResourcesByReferenceIds(A <IEnumerable <int> > ._))
            .Returns(bulkReturnedItems);

            // When
            var result = await actionPlanService.GetCompletedActionPlanResources(delegateId);

            // Then
            List <(int id, string title)> resultIdsAndTitles = result.Select(r => (r.Id, r.Name)).ToList();

            using (new AssertionScope())
            {
                resultIdsAndTitles.Count.Should().Be(3);
                resultIdsAndTitles[0].Should().Be((4, "Title 15"));
                resultIdsAndTitles[1].Should().Be((5, "Title 26"));
                resultIdsAndTitles[2].Should().Be((6, "Title 15"));
                A.CallTo(
                    () => learningHubApiClient.GetBulkResourcesByReferenceIds(
                        A <IEnumerable <int> > .That.IsSameSequenceAs(expectedLearningResourceIdsUsedInApiCall)
                        )
                    )
                .MustHaveHappenedOnceExactly();
            }
        }
Example #4
0
        GetRecommendedLearningForSelfAssessment_calls_learning_hub_resource_service_with_only_the_first_MaxSignpostedResources_ids_ordered_by_descending_recommendation_score()
        {
            // Given
            var competencyLearningResources = Builder <CompetencyLearningResource> .CreateListOfSize(50).Build();

            var resourceReferences =
                Builder <ResourceReferenceWithResourceDetails> .CreateListOfSize(50)
                .All()
                .With(rr => rr.Catalogue = new Catalogue {
                Name = ResourceCatalogue
            })
                .Build()
                .ToList();

            var clientResponse = new BulkResourceReferences
            {
                ResourceReferences            = resourceReferences,
                UnmatchedResourceReferenceIds = new List <int>(),
            };

            A.CallTo(() => configDataService.GetConfigValue("MaxSignpostedResources")).Returns("3");

            A.CallTo(() => learningHubResourceService.GetResourceReferenceDetailsByReferenceIds(A <List <int> > ._))
            .Returns(resourceReferences);

            A.CallTo(() => learningHubResourceService.GetBulkResourcesByReferenceIds(A <List <int> > ._))
            .Returns((clientResponse, false));

            A.CallTo(() => selfAssessmentDataService.GetCompetencyIdsForSelfAssessment(SelfAssessmentId))
            .Returns(new[] { CompetencyId });

            A.CallTo(
                () => competencyLearningResourcesDataService.GetActiveCompetencyLearningResourcesByCompetencyId(
                    CompetencyId
                    )
                ).Returns(competencyLearningResources);

            // When
            await recommendedLearningService.GetRecommendedLearningForSelfAssessment(SelfAssessmentId, DelegateId);

            // Then
            A.CallTo(
                () => learningHubResourceService.GetResourceReferenceDetailsByReferenceIds(
                    A <List <int> > .That.IsSameSequenceAs(Enumerable.Range(1, 50).ToList())
                    )
                )
            .MustHaveHappenedOnceExactly();

            A.CallTo(
                () => learningHubResourceService.GetBulkResourcesByReferenceIds(
                    A <List <int> > .That.IsSameSequenceAs(new List <int> {
                50, 49, 48
            })
                    )
                ).MustHaveHappenedOnceExactly();
        }
        public async Task GetBulkResourcesByReferenceIds_returns_API_data_if_retrieved()
        {
            // Given
            var resource1 = Builder <ResourceReferenceWithResourceDetails> .CreateNew()
                            .With(r => r.RefId = 1).And(r => r.AbsentInLearningHub = false).Build();

            var resource2 = Builder <ResourceReferenceWithResourceDetails> .CreateNew()
                            .With(r => r.RefId = 2).And(r => r.AbsentInLearningHub = false).Build();

            var resourceReferenceIdsToRetrieve = new[] { 1, 2, 3 };
            var bulkResources = new BulkResourceReferences
            {
                ResourceReferences = new List <ResourceReferenceWithResourceDetails>
                {
                    resource1,
                    resource2,
                },
                UnmatchedResourceReferenceIds = new List <int> {
                    3
                },
            };

            A.CallTo(() => learningHubApiClient.GetBulkResourcesByReferenceIds(A <IEnumerable <int> > ._))
            .Returns(bulkResources);

            // When
            var result =
                (await learningHubResourceService.GetBulkResourcesByReferenceIds(resourceReferenceIdsToRetrieve)) !;

            // Then
            using (new AssertionScope())
            {
                result.bulkResourceReferences.Should().BeEquivalentTo(bulkResources);
                result.apiIsAccessible.Should().BeTrue();
                A.CallTo(
                    () => learningHubApiClient.GetBulkResourcesByReferenceIds(
                        A <IEnumerable <int> > .That.IsSameSequenceAs(resourceReferenceIdsToRetrieve)
                        )
                    )
                .MustHaveHappenedOnceExactly();
                A.CallTo(
                    () => learningResourceReferenceDataService.GetResourceReferenceDetailsByReferenceIds(
                        A <IEnumerable <int> > ._
                        )
                    )
                .MustNotHaveHappened();
            }
        }
Example #6
0
        public async Task GetRecommendedLearningForSelfAssessment_calls_learning_hub_api_with_distinct_ids()
        {
            // Given
            A.CallTo(() => selfAssessmentDataService.GetCompetencyIdsForSelfAssessment(SelfAssessmentId))
            .Returns(new[] { 1, 2, 3, 4, 5 });

            var competencyLearningResources = Builder <CompetencyLearningResource> .CreateListOfSize(5).All()
                                              .With(clr => clr.LearningHubResourceReferenceId = LearningHubResourceReferenceId)
                                              .And(clr => clr.LearningResourceReferenceId     = LearningResourceReferenceId).Build();

            A.CallTo(
                () => competencyLearningResourcesDataService.GetCompetencyLearningResourcesByCompetencyId(A <int> ._)
                ).Returns(competencyLearningResources);

            var clientResponse = new BulkResourceReferences
            {
                ResourceReferences = new List <ResourceReferenceWithResourceDetails>
                {
                    new ResourceReferenceWithResourceDetails
                    {
                        ResourceId  = 0,
                        RefId       = LearningHubResourceReferenceId,
                        Title       = ResourceName,
                        Description = ResourceDescription,
                        Catalogue   = new Catalogue {
                            Name = ResourceCatalogue
                        },
                        ResourceType = ResourceType,
                        Rating       = 0,
                        Link         = ResourceLink,
                    },
                },
            };

            A.CallTo(() => learningHubApiClient.GetBulkResourcesByReferenceIds(A <IEnumerable <int> > ._))
            .Returns(clientResponse);

            // When
            await recommendedLearningService.GetRecommendedLearningForSelfAssessment(SelfAssessmentId, DelegateId);

            // Then
            A.CallTo(
                () => learningHubApiClient.GetBulkResourcesByReferenceIds(
                    A <IEnumerable <int> > .That.Matches(i => i.Single() == LearningHubResourceReferenceId)
                    )
                )
            .MustHaveHappenedOnceExactly();
        }
Example #7
0
        private void GivenResourceForSelfAssessmentIsReturnedByLearningHubApi(decimal rating = 0)
        {
            A.CallTo(() => selfAssessmentDataService.GetCompetencyIdsForSelfAssessment(SelfAssessmentId))
            .Returns(new[] { CompetencyId });

            var competencyLearningResource = new CompetencyLearningResource
            {
                Id           = CompetencyLearningResourceId,
                CompetencyId = CompetencyId,
                LearningResourceReferenceId = LearningResourceReferenceId,
                AdminId = 7,
                LearningHubResourceReferenceId = LearningHubResourceReferenceId,
            };

            A.CallTo(
                () => competencyLearningResourcesDataService.GetCompetencyLearningResourcesByCompetencyId(CompetencyId)
                ).Returns(new List <CompetencyLearningResource> {
                competencyLearningResource
            });

            var clientResponse = new BulkResourceReferences
            {
                ResourceReferences = new List <ResourceReferenceWithResourceDetails>
                {
                    new ResourceReferenceWithResourceDetails
                    {
                        ResourceId  = 0,
                        RefId       = LearningHubResourceReferenceId,
                        Title       = ResourceName,
                        Description = ResourceDescription,
                        Catalogue   = new Catalogue {
                            Name = ResourceCatalogue
                        },
                        ResourceType = ResourceType,
                        Rating       = rating,
                        Link         = ResourceLink,
                    },
                },
            };

            A.CallTo(() => learningHubApiClient.GetBulkResourcesByReferenceIds(A <IEnumerable <int> > ._))
            .Returns(clientResponse);
        }
Example #8
0
        private void GivenLearningHubApiBulkResponseReturnsExpectedResources(IList <int> learningResourceIds)
        {
            var matchedResources = Builder <ResourceReferenceWithResourceDetails> .CreateListOfSize(3).All()
                                   .With((r, index) => r.RefId = learningResourceIds[index])
                                   .And((r, index) => r.Title  = $"Title {learningResourceIds[index]}")
                                   .And(r => r.Catalogue       = genericCatalogue).Build().ToList();

            var unmatchedResourceReferences = new List <int>
            {
                learningResourceIds[3],
                learningResourceIds[4],
            };
            var bulkReturnedItems = new BulkResourceReferences
            {
                ResourceReferences            = matchedResources,
                UnmatchedResourceReferenceIds = unmatchedResourceReferences,
            };

            A.CallTo(() => learningHubApiClient.GetBulkResourcesByReferenceIds(A <IEnumerable <int> > ._))
            .Returns(bulkReturnedItems);
        }
Example #9
0
        private void GivenLearningHubResourceServiceBulkResponseReturnsExpectedResources(IList <int> learningResourceIds)
        {
            var matchedResources = Builder <ResourceReferenceWithResourceDetails> .CreateListOfSize(3).All()
                                   .With((r, index) => r.RefId = learningResourceIds[index])
                                   .And((r, index) => r.Title  = $"Title {learningResourceIds[index]}")
                                   .And(r => r.Catalogue       = genericCatalogue).Build().ToList();

            var unmatchedResourceReferences = new List <int>
            {
                learningResourceIds[3],
                learningResourceIds[4],
            };
            var bulkReturnedItems = new BulkResourceReferences
            {
                ResourceReferences            = matchedResources,
                UnmatchedResourceReferenceIds = unmatchedResourceReferences,
            };

            A.CallTo(
                () => learningHubResourceService
                .GetBulkResourcesByReferenceIdsAndPopulateDeletedDetailsFromDatabase(A <List <int> > ._)
                )
            .Returns((bulkReturnedItems, false));
        }
        GetBulkResourcesByReferenceIdsAndPopulateDeletedDetailsFromDatabase_returns_API_data_and_fetches_fallback_data_for_unmatched_reference_ids()
        {
            // Given
            var resource1 = Builder <ResourceReferenceWithResourceDetails> .CreateNew()
                            .With(r => r.RefId = 1).And(r => r.AbsentInLearningHub = false).Build();

            var resource2 = Builder <ResourceReferenceWithResourceDetails> .CreateNew()
                            .With(r => r.RefId = 2).And(r => r.AbsentInLearningHub = false).Build();

            var resource3 = Builder <ResourceReferenceWithResourceDetails> .CreateNew()
                            .With(r => r.RefId = 3).And(r => r.AbsentInLearningHub = false).Build();

            var resourceReferenceIdsToRetrieve         = new[] { 1, 2, 3, 4 };
            var initiallyUnmatchedResourceReferenceIds = new List <int> {
                3, 4
            };
            var bulkResources = new BulkResourceReferences
            {
                ResourceReferences = new List <ResourceReferenceWithResourceDetails>
                {
                    resource1,
                    resource2,
                },
                UnmatchedResourceReferenceIds = initiallyUnmatchedResourceReferenceIds,
            };

            A.CallTo(() => learningHubApiClient.GetBulkResourcesByReferenceIds(A <IEnumerable <int> > ._))
            .Returns(bulkResources);
            A.CallTo(
                () => learningResourceReferenceDataService.GetResourceReferenceDetailsByReferenceIds(
                    A <IEnumerable <int> > ._
                    )
                )
            .Returns(new List <ResourceReferenceWithResourceDetails> {
                resource3
            });

            // When
            var(bulkResourceReferences, apiIsAccessible) =
                (await learningHubResourceService.GetBulkResourcesByReferenceIdsAndPopulateDeletedDetailsFromDatabase(
                     resourceReferenceIdsToRetrieve
                     )) !;

            // Then
            using (new AssertionScope())
            {
                bulkResourceReferences.ResourceReferences[0].Should().BeEquivalentTo(resource1);
                bulkResourceReferences.ResourceReferences[0].AbsentInLearningHub.Should().BeFalse();
                bulkResourceReferences.ResourceReferences[1].Should().BeEquivalentTo(resource2);
                bulkResourceReferences.ResourceReferences[1].AbsentInLearningHub.Should().BeFalse();
                bulkResourceReferences.ResourceReferences[2].Should().BeEquivalentTo(
                    resource3,
                    options => options.Excluding(r => r.AbsentInLearningHub)
                    );
                bulkResourceReferences.ResourceReferences[2].AbsentInLearningHub.Should().BeTrue();
                bulkResourceReferences.UnmatchedResourceReferenceIds.Should().BeEquivalentTo(new List <int> {
                    4
                });
                apiIsAccessible.Should().BeTrue();
                A.CallTo(
                    () => learningHubApiClient.GetBulkResourcesByReferenceIds(
                        A <IEnumerable <int> > .That.IsSameSequenceAs(resourceReferenceIdsToRetrieve)
                        )
                    )
                .MustHaveHappenedOnceExactly();
                A.CallTo(
                    () => learningResourceReferenceDataService.GetResourceReferenceDetailsByReferenceIds(
                        A <IEnumerable <int> > .That.IsSameSequenceAs(initiallyUnmatchedResourceReferenceIds)
                        )
                    )
                .MustHaveHappenedOnceExactly();
            }
        }