import { mapAsset } from 'src/dtos/asset-response.dto'; import { SearchSuggestionType } from 'src/dtos/search.dto'; import { IAssetRepository } from 'src/interfaces/asset.interface'; import { IPersonRepository } from 'src/interfaces/person.interface'; import { ISearchRepository } from 'src/interfaces/search.interface'; import { SearchService } from 'src/services/search.service'; import { assetStub } from 'test/fixtures/asset.stub'; import { authStub } from 'test/fixtures/auth.stub'; import { personStub } from 'test/fixtures/person.stub'; import { newTestService } from 'test/utils'; import { Mocked, beforeEach, vitest } from 'vitest'; vitest.useFakeTimers(); describe(SearchService.name, () => { let sut: SearchService; let assetMock: Mocked; let personMock: Mocked; let searchMock: Mocked; beforeEach(() => { ({ sut, assetMock, personMock, searchMock } = newTestService(SearchService)); }); it('should work', () => { expect(sut).toBeDefined(); }); describe('searchPerson', () => { it('should pass options to search', async () => { const { name } = personStub.withName; await sut.searchPerson(authStub.user1, { name, withHidden: false }); expect(personMock.getByName).toHaveBeenCalledWith(authStub.user1.user.id, name, { withHidden: false }); await sut.searchPerson(authStub.user1, { name, withHidden: true }); expect(personMock.getByName).toHaveBeenCalledWith(authStub.user1.user.id, name, { withHidden: true }); }); }); describe('getExploreData', () => { it('should get assets by city and tag', async () => { assetMock.getAssetIdByCity.mockResolvedValue({ fieldName: 'exifInfo.city', items: [{ value: 'Paris', data: assetStub.image.id }], }); assetMock.getByIdsWithAllRelations.mockResolvedValue([assetStub.image, assetStub.imageFrom2015]); const expectedResponse = [ { fieldName: 'exifInfo.city', items: [{ value: 'Paris', data: mapAsset(assetStub.image) }] }, ]; const result = await sut.getExploreData(authStub.user1); expect(result).toEqual(expectedResponse); }); }); describe('getSearchSuggestions', () => { it('should return search suggestions for country', async () => { searchMock.getCountries.mockResolvedValue(['USA']); await expect( sut.getSearchSuggestions(authStub.user1, { includeNull: false, type: SearchSuggestionType.COUNTRY }), ).resolves.toEqual(['USA']); expect(searchMock.getCountries).toHaveBeenCalledWith([authStub.user1.user.id]); }); it('should return search suggestions for country (including null)', async () => { searchMock.getCountries.mockResolvedValue(['USA']); await expect( sut.getSearchSuggestions(authStub.user1, { includeNull: true, type: SearchSuggestionType.COUNTRY }), ).resolves.toEqual(['USA', null]); expect(searchMock.getCountries).toHaveBeenCalledWith([authStub.user1.user.id]); }); it('should return search suggestions for state', async () => { searchMock.getStates.mockResolvedValue(['California']); await expect( sut.getSearchSuggestions(authStub.user1, { includeNull: false, type: SearchSuggestionType.STATE }), ).resolves.toEqual(['California']); expect(searchMock.getStates).toHaveBeenCalledWith([authStub.user1.user.id], expect.anything()); }); it('should return search suggestions for state (including null)', async () => { searchMock.getStates.mockResolvedValue(['California']); await expect( sut.getSearchSuggestions(authStub.user1, { includeNull: true, type: SearchSuggestionType.STATE }), ).resolves.toEqual(['California', null]); expect(searchMock.getStates).toHaveBeenCalledWith([authStub.user1.user.id], expect.anything()); }); it('should return search suggestions for city', async () => { searchMock.getCities.mockResolvedValue(['Denver']); await expect( sut.getSearchSuggestions(authStub.user1, { includeNull: false, type: SearchSuggestionType.CITY }), ).resolves.toEqual(['Denver']); expect(searchMock.getCities).toHaveBeenCalledWith([authStub.user1.user.id], expect.anything()); }); it('should return search suggestions for city (including null)', async () => { searchMock.getCities.mockResolvedValue(['Denver']); await expect( sut.getSearchSuggestions(authStub.user1, { includeNull: true, type: SearchSuggestionType.CITY }), ).resolves.toEqual(['Denver', null]); expect(searchMock.getCities).toHaveBeenCalledWith([authStub.user1.user.id], expect.anything()); }); it('should return search suggestions for camera make', async () => { searchMock.getCameraMakes.mockResolvedValue(['Nikon']); await expect( sut.getSearchSuggestions(authStub.user1, { includeNull: false, type: SearchSuggestionType.CAMERA_MAKE }), ).resolves.toEqual(['Nikon']); expect(searchMock.getCameraMakes).toHaveBeenCalledWith([authStub.user1.user.id], expect.anything()); }); it('should return search suggestions for camera make (including null)', async () => { searchMock.getCameraMakes.mockResolvedValue(['Nikon']); await expect( sut.getSearchSuggestions(authStub.user1, { includeNull: true, type: SearchSuggestionType.CAMERA_MAKE }), ).resolves.toEqual(['Nikon', null]); expect(searchMock.getCameraMakes).toHaveBeenCalledWith([authStub.user1.user.id], expect.anything()); }); it('should return search suggestions for camera model', async () => { searchMock.getCameraModels.mockResolvedValue(['Fujifilm X100VI']); await expect( sut.getSearchSuggestions(authStub.user1, { includeNull: false, type: SearchSuggestionType.CAMERA_MODEL }), ).resolves.toEqual(['Fujifilm X100VI']); expect(searchMock.getCameraModels).toHaveBeenCalledWith([authStub.user1.user.id], expect.anything()); }); it('should return search suggestions for camera model (including null)', async () => { searchMock.getCameraModels.mockResolvedValue(['Fujifilm X100VI']); await expect( sut.getSearchSuggestions(authStub.user1, { includeNull: true, type: SearchSuggestionType.CAMERA_MODEL }), ).resolves.toEqual(['Fujifilm X100VI', null]); expect(searchMock.getCameraModels).toHaveBeenCalledWith([authStub.user1.user.id], expect.anything()); }); }); });