Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions ImmichFrame.Core.Tests/Logic/Pool/AlbumAssetsPoolTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ public async Task LoadAssets_ReturnsAssetsPresentIIncludedNotExcludedAlbums()
_mockAccountSettings.SetupGet(s => s.Albums).Returns(new List<Guid> { album1Id });
_mockAccountSettings.SetupGet(s => s.ExcludedAlbums).Returns(new List<Guid> { excludedAlbumId });

_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.Is<MetadataSearchDto>(d => d.AlbumIds.Contains(album1Id)), It.IsAny<CancellationToken>()))
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(d => d.AlbumIds.Contains(album1Id)), It.IsAny<CancellationToken>()))
.ReturnsAsync(new SearchResponseDto { Assets = new SearchAssetResponseDto { Items = new List<AssetResponseDto> { assetA, assetB, assetD }, Total = 3 } });
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.Is<MetadataSearchDto>(d => d.AlbumIds.Contains(excludedAlbumId)), It.IsAny<CancellationToken>()))
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(d => d.AlbumIds.Contains(excludedAlbumId)), It.IsAny<CancellationToken>()))
.ReturnsAsync(new SearchResponseDto { Assets = new SearchAssetResponseDto { Items = new List<AssetResponseDto> { assetB, assetC }, Total = 2 } });

// Act
Expand All @@ -62,16 +62,16 @@ public async Task LoadAssets_ReturnsAssetsPresentIIncludedNotExcludedAlbums()
Assert.That(result.Count, Is.EqualTo(2));
Assert.That(result.Any(a => a.Id == FixtureHelpers.GuidFor("A")));
Assert.That(result.Any(a => a.Id == FixtureHelpers.GuidFor("D")));
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.Is<MetadataSearchDto>(d => d.AlbumIds.Contains(album1Id)), It.IsAny<CancellationToken>()), Times.Once);
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.Is<MetadataSearchDto>(d => d.AlbumIds.Contains(excludedAlbumId)), It.IsAny<CancellationToken>()), Times.Once);
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(d => d.AlbumIds.Contains(album1Id)), It.IsAny<CancellationToken>()), Times.Once);
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(d => d.AlbumIds.Contains(excludedAlbumId)), It.IsAny<CancellationToken>()), Times.Once);
}

[Test]
public async Task LoadAssets_NoIncludedAlbums_ReturnsEmpty()
{
_mockAccountSettings.SetupGet(s => s.Albums).Returns(new List<Guid>());
_mockAccountSettings.SetupGet(s => s.ExcludedAlbums).Returns(new List<Guid> { Guid.NewGuid() });
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.IsAny<MetadataSearchDto>(), It.IsAny<CancellationToken>()))
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<MetadataSearchDto>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(new SearchResponseDto { Assets = new SearchAssetResponseDto { Items = new List<AssetResponseDto> { CreateAsset("excluded_only") }, Total = 1 } });


Expand All @@ -86,7 +86,7 @@ public async Task LoadAssets_NoExcludedAlbums_ReturnsAlbums()
_mockAccountSettings.SetupGet(s => s.Albums).Returns(new List<Guid> { album1Id });
_mockAccountSettings.SetupGet(s => s.ExcludedAlbums).Returns(new List<Guid>()); // Empty excluded

_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.Is<MetadataSearchDto>(d => d.AlbumIds.Contains(album1Id)), It.IsAny<CancellationToken>()))
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(d => d.AlbumIds.Contains(album1Id)), It.IsAny<CancellationToken>()))
.ReturnsAsync(new SearchResponseDto { Assets = new SearchAssetResponseDto { Items = new List<AssetResponseDto> { CreateAsset("A") }, Total = 1 } });

var result = (await _albumAssetsPool.GetAssets(25)).ToList();
Expand Down
6 changes: 3 additions & 3 deletions ImmichFrame.Core.Tests/Logic/Pool/AllAssetsPoolTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ public async Task GetAssets_ExcludesAssetsFromExcludedAlbums()

_mockImmichApi.Setup(api => api.SearchRandomAsync(It.IsAny<RandomSearchDto>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(assetsToReturnFromSearch);
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.Is<MetadataSearchDto>(d => d.AlbumIds.Contains(excludedAlbumId)), It.IsAny<CancellationToken>()))
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(d => d.AlbumIds.Contains(excludedAlbumId)), It.IsAny<CancellationToken>()))
.ReturnsAsync(new SearchResponseDto { Assets = new SearchAssetResponseDto { Items = new List<AssetResponseDto> { excludedAsset }, Total = 1 } });

// Act
Expand All @@ -196,7 +196,7 @@ public async Task GetAssets_ExcludesAssetsFromExcludedAlbums()
Assert.That(result.Any(a => a.Id == FixtureHelpers.GuidFor("excluded1")), Is.False);
var mainIds = mainAssets.Select(a => a.Id);
Assert.That(result.All(a => mainIds.Contains(a.Id)));
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.Is<MetadataSearchDto>(d => d.AlbumIds.Contains(excludedAlbumId)), It.IsAny<CancellationToken>()), Times.Once);
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(d => d.AlbumIds.Contains(excludedAlbumId)), It.IsAny<CancellationToken>()), Times.Once);
}

[Test]
Expand All @@ -218,6 +218,6 @@ public async Task GetAssets_NullExcludedAlbums_Succeeds()
Assert.That(result, Is.EqualTo(allAssets));

// Verify that no excluded-album lookup happened since ExcludedAlbums is null
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.IsAny<MetadataSearchDto>(), It.IsAny<CancellationToken>()), Times.Never);
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<MetadataSearchDto>(), It.IsAny<CancellationToken>()), Times.Never);
}
}
8 changes: 4 additions & 4 deletions ImmichFrame.Core.Tests/Logic/Pool/FavoriteAssetsPoolTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public async Task LoadAssets_CallsSearchAssetsAsync_WithFavoriteTrue_AndPaginate
var assetsPage1 = Enumerable.Range(0, batchSize).Select(i => CreateAsset($"fav_p1_{i}")).ToList();
var assetsPage2 = Enumerable.Range(0, 50).Select(i => CreateAsset($"fav_p2_{i}")).ToList();

_mockImmichApi.SetupSequence(api => api.SearchAssetsAsync(It.IsAny<MetadataSearchDto>(), It.IsAny<CancellationToken>()))
_mockImmichApi.SetupSequence(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<MetadataSearchDto>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(CreateSearchResult(assetsPage1, batchSize)) // Page 1, total indicates more might be available
.ReturnsAsync(CreateSearchResult(assetsPage2, 50)); // Page 2, total indicates this is the last page

Expand All @@ -64,7 +64,7 @@ public async Task LoadAssets_CallsSearchAssetsAsync_WithFavoriteTrue_AndPaginate
Assert.That(result.Any(a => a.Id == FixtureHelpers.GuidFor("fav_p2_49")));

_mockImmichApi.Verify(api => api.SearchAssetsAsync(
It.Is<MetadataSearchDto>(dto =>
It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(dto =>
dto.IsFavorite == true &&
dto.Type == AssetTypeEnum.IMAGE &&
dto.WithExif == true &&
Expand All @@ -73,7 +73,7 @@ public async Task LoadAssets_CallsSearchAssetsAsync_WithFavoriteTrue_AndPaginate
It.IsAny<CancellationToken>()), Times.Once);

_mockImmichApi.Verify(api => api.SearchAssetsAsync(
It.Is<MetadataSearchDto>(dto =>
It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(dto =>
dto.IsFavorite == true &&
dto.Type == AssetTypeEnum.IMAGE &&
dto.Page == 2 && dto.Size == batchSize),
Expand All @@ -83,7 +83,7 @@ public async Task LoadAssets_CallsSearchAssetsAsync_WithFavoriteTrue_AndPaginate
[Test]
public async Task LoadAssets_HandlesEmptyFavorites()
{
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.IsAny<MetadataSearchDto>(), It.IsAny<CancellationToken>()))
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<MetadataSearchDto>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(CreateSearchResult(new List<AssetResponseDto>(), 0));

var result = (await _favoriteAssetsPool.TestLoadAssets()).ToList();
Expand Down
20 changes: 10 additions & 10 deletions ImmichFrame.Core.Tests/Logic/Pool/PersonAssetsPoolTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,13 @@ public async Task LoadAssets_CallsSearchAssetsForEachPerson_AndPaginates()
var type = AssetTypeEnum.IMAGE;

// Person 1 - Page 1
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.Is<MetadataSearchDto>(d => d.PersonIds.Contains(person1Id) && d.Page == 1 && d.Type == type), It.IsAny<CancellationToken>()))
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(d => d.PersonIds.Contains(person1Id) && d.Page == 1 && d.Type == type), It.IsAny<CancellationToken>()))
.ReturnsAsync(CreateSearchResult(p1AssetsPage1, batchSize));
// Person 1 - Page 2
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.Is<MetadataSearchDto>(d => d.PersonIds.Contains(person1Id) && d.Page == 2 && d.Type == type), It.IsAny<CancellationToken>()))
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(d => d.PersonIds.Contains(person1Id) && d.Page == 2 && d.Type == type), It.IsAny<CancellationToken>()))
.ReturnsAsync(CreateSearchResult(p1AssetsPage2, 30));
// Person 2 - Page 1
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.Is<MetadataSearchDto>(d => d.PersonIds.Contains(person2Id) && d.Page == 1 && d.Type == type), It.IsAny<CancellationToken>()))
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(d => d.PersonIds.Contains(person2Id) && d.Page == 1 && d.Type == type), It.IsAny<CancellationToken>()))
.ReturnsAsync(CreateSearchResult(p2AssetsPage1, 20));

// Act
Expand All @@ -79,9 +79,9 @@ public async Task LoadAssets_CallsSearchAssetsForEachPerson_AndPaginates()
Assert.That(result.Any(a => a.Id == FixtureHelpers.GuidFor("p1_p2_29")));
Assert.That(result.Any(a => a.Id == FixtureHelpers.GuidFor("p2_p1_19")));

_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.Is<MetadataSearchDto>(d => d.PersonIds.Contains(person1Id) && d.Page == 1 && d.Type == type), It.IsAny<CancellationToken>()), Times.Once);
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.Is<MetadataSearchDto>(d => d.PersonIds.Contains(person1Id) && d.Page == 2 && d.Type == type), It.IsAny<CancellationToken>()), Times.Once);
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.Is<MetadataSearchDto>(d => d.PersonIds.Contains(person2Id) && d.Page == 1 && d.Type == type), It.IsAny<CancellationToken>()), Times.Once);
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(d => d.PersonIds.Contains(person1Id) && d.Page == 1 && d.Type == type), It.IsAny<CancellationToken>()), Times.Once);
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(d => d.PersonIds.Contains(person1Id) && d.Page == 2 && d.Type == type), It.IsAny<CancellationToken>()), Times.Once);
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(d => d.PersonIds.Contains(person2Id) && d.Page == 1 && d.Type == type), It.IsAny<CancellationToken>()), Times.Once);
}

[Test]
Expand All @@ -91,7 +91,7 @@ public async Task LoadAssets_NoPeopleConfigured_ReturnsEmpty()

var result = (await _personAssetsPool.TestLoadAssets()).ToList();
Assert.That(result, Is.Empty);
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.IsAny<MetadataSearchDto>(), It.IsAny<CancellationToken>()), Times.Never);
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<MetadataSearchDto>(), It.IsAny<CancellationToken>()), Times.Never);
}

[Test]
Expand All @@ -101,7 +101,7 @@ public async Task LoadAssets_NullPeople_ReturnsEmpty()

var result = (await _personAssetsPool.TestLoadAssets()).ToList();
Assert.That(result, Is.Empty);
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.IsAny<MetadataSearchDto>(), It.IsAny<CancellationToken>()), Times.Never);
_mockImmichApi.Verify(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<MetadataSearchDto>(), It.IsAny<CancellationToken>()), Times.Never);
}

[Test]
Expand All @@ -114,9 +114,9 @@ public async Task LoadAssets_PersonHasNoAssets_DoesNotAffectOthers()
var type = AssetTypeEnum.IMAGE;

var p1Assets = Enumerable.Range(0, 10).Select(i => CreateAsset($"p1_{i}")).ToList();
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.Is<MetadataSearchDto>(d => d.PersonIds.Contains(person1Id) && d.Type == type), It.IsAny<CancellationToken>()))
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(d => d.PersonIds.Contains(person1Id) && d.Type == type), It.IsAny<CancellationToken>()))
.ReturnsAsync(CreateSearchResult(p1Assets, 10));
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.Is<MetadataSearchDto>(d => d.PersonIds.Contains(person2Id) && d.Type == type), It.IsAny<CancellationToken>()))
_mockImmichApi.Setup(api => api.SearchAssetsAsync(It.IsAny<string>(), It.IsAny<string>(), It.Is<MetadataSearchDto>(d => d.PersonIds.Contains(person2Id) && d.Type == type), It.IsAny<CancellationToken>()))
.ReturnsAsync(CreateSearchResult(new List<AssetResponseDto>(), 0));

var result = (await _personAssetsPool.TestLoadAssets()).ToList();
Expand Down
Loading
Loading