import { RecentVideosRecommendationService } from '@app/videos/recommendations/recent-videos-recommendation.service' import { VideosProvider } from '@app/shared/video/video.service' import { EMPTY, of } from 'rxjs' import Mock = jest.Mock describe('"Recent Videos" Recommender', () => { describe('getRecommendations', () => { let videosService: VideosProvider let service: RecentVideosRecommendationService let getVideosMock: Mock beforeEach(() => { getVideosMock = jest.fn(() => EMPTY) videosService = { getVideos: getVideosMock } service = new RecentVideosRecommendationService(videosService) }) it('should filter out the given UUID from the results', async (done) => { const vids = [ { uuid: 'uuid1' }, { uuid: 'uuid2' } ] getVideosMock.mockReturnValueOnce(of({ videos: vids })) const result = await service.getRecommendations({ uuid: 'uuid1' }).toPromise() const uuids = result.map(v => v.uuid) expect(uuids).toEqual(['uuid2']) done() }) it('should return 5 results when the given UUID is NOT in the first 5 results', async (done) => { const vids = [ { uuid: 'uuid2' }, { uuid: 'uuid3' }, { uuid: 'uuid4' }, { uuid: 'uuid5' }, { uuid: 'uuid6' }, { uuid: 'uuid7' } ] getVideosMock.mockReturnValueOnce(of({ videos: vids })) const result = await service.getRecommendations({ uuid: 'uuid1' }).toPromise() expect(result.length).toEqual(5) done() }) it('should return 5 results when the given UUID IS PRESENT in the first 5 results', async (done) => { const vids = [ { uuid: 'uuid1' }, { uuid: 'uuid2' }, { uuid: 'uuid3' }, { uuid: 'uuid4' }, { uuid: 'uuid5' }, { uuid: 'uuid6' } ] getVideosMock .mockReturnValueOnce(of({ videos: vids })) const result = await service.getRecommendations({ uuid: 'uuid1' }).toPromise() expect(result.length).toEqual(5) done() }) it('should fetch an extra result in case the given UUID is in the list', async (done) => { await service.getRecommendations({ uuid: 'uuid1' }).toPromise() let expectedSize = service.pageSize + 1 let params = { currentPage: jasmine.anything(), itemsPerPage: expectedSize } expect(getVideosMock).toHaveBeenCalledWith(params, jasmine.anything()) done() }) }) })