1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
|
using System;
using Emby.Server.Implementations.Data;
using Jellyfin.Database.Implementations.Entities;
using Jellyfin.Server.Implementations.Item;
using MediaBrowser.Controller.Entities;
using Xunit;
using BaseItemKind = Jellyfin.Data.Enums.BaseItemKind;
namespace Jellyfin.Server.Implementations.Tests.Item;
public sealed class BaseItemRepositoryItemValueTests : SqliteDbTestFixture
{
private readonly BaseItemRepository _repository;
private readonly string _audioTypeName;
private readonly string _movieTypeName;
public BaseItemRepositoryItemValueTests()
{
var itemTypeLookup = new ItemTypeLookup();
_audioTypeName = itemTypeLookup.BaseItemKindNames[BaseItemKind.Audio];
_movieTypeName = itemTypeLookup.BaseItemKindNames[BaseItemKind.Movie];
_repository = CreateBaseItemRepository(itemTypeLookup);
}
[Fact]
public void GetQueryFiltersLegacy_GroupsAndFiltersItemValues()
{
var firstItem = CreateMovieEntity(Guid.NewGuid(), "First");
var secondItem = CreateMovieEntity(Guid.NewGuid(), "Second");
var excludedItem = new BaseItemEntity
{
Id = Guid.NewGuid(),
Type = _audioTypeName,
Name = "Excluded Audio",
MediaType = "Audio",
IsMovie = false,
IsFolder = false,
IsVirtualItem = false
};
var firstTag = new ItemValue
{
ItemValueId = Guid.NewGuid(),
Type = ItemValueType.Tags,
Value = "Alpha",
CleanValue = "alpha"
};
var duplicateTag = new ItemValue
{
ItemValueId = Guid.NewGuid(),
Type = ItemValueType.Tags,
Value = "alpha",
CleanValue = "alpha"
};
var secondTag = new ItemValue
{
ItemValueId = Guid.NewGuid(),
Type = ItemValueType.Tags,
Value = "Beta",
CleanValue = "beta"
};
var genre = new ItemValue
{
ItemValueId = Guid.NewGuid(),
Type = ItemValueType.Genre,
Value = "Genre Leak",
CleanValue = "genre leak"
};
var excludedTag = new ItemValue
{
ItemValueId = Guid.NewGuid(),
Type = ItemValueType.Tags,
Value = "Excluded Tag",
CleanValue = "excluded tag"
};
var excludedGenre = new ItemValue
{
ItemValueId = Guid.NewGuid(),
Type = ItemValueType.Genre,
Value = "Excluded Genre",
CleanValue = "excluded genre"
};
using (var context = CreateDbContext())
{
context.BaseItems.AddRange(firstItem, secondItem, excludedItem);
context.ItemValues.AddRange(firstTag, duplicateTag, secondTag, genre, excludedTag, excludedGenre);
context.ItemValuesMap.AddRange(
CreateMap(firstItem, firstTag),
CreateMap(firstItem, duplicateTag),
CreateMap(secondItem, secondTag),
CreateMap(firstItem, genre),
CreateMap(excludedItem, excludedTag),
CreateMap(excludedItem, excludedGenre));
context.SaveChanges();
}
var result = _repository.GetQueryFiltersLegacy(new InternalItemsQuery(new Database.Implementations.Entities.User("test", "auth", "reset"))
{
IncludeItemTypes = [BaseItemKind.Movie]
});
Assert.Equal(["Alpha", "Beta"], result.Tags);
Assert.Equal(["Genre Leak"], result.Genres);
}
[Fact]
public void GetGenreNames_GroupsAndFiltersMappedItemValues()
{
var movie = CreateMovieEntity(Guid.NewGuid(), "Movie");
var audio = new BaseItemEntity
{
Id = Guid.NewGuid(),
Type = _audioTypeName,
Name = "Audio",
MediaType = "Audio",
IsFolder = false,
IsVirtualItem = false
};
var movieGenre = CreateItemValue(ItemValueType.Genre, "Movie Genre", "movie genre");
var duplicateMovieGenre = CreateItemValue(ItemValueType.Genre, "movie genre", "movie genre");
var musicGenre = CreateItemValue(ItemValueType.Genre, "Music Genre", "music genre");
var orphanedGenre = CreateItemValue(ItemValueType.Genre, "Orphaned Genre", "orphaned genre");
using (var context = CreateDbContext())
{
context.BaseItems.AddRange(movie, audio);
context.ItemValues.AddRange(movieGenre, duplicateMovieGenre, musicGenre, orphanedGenre);
context.ItemValuesMap.AddRange(
CreateMap(movie, movieGenre),
CreateMap(movie, duplicateMovieGenre),
CreateMap(audio, musicGenre));
context.SaveChanges();
}
Assert.Equal(["Movie Genre"], _repository.GetGenreNames());
Assert.Equal(["Music Genre"], _repository.GetMusicGenreNames());
}
private BaseItemEntity CreateMovieEntity(Guid id, string name)
{
return new BaseItemEntity
{
Id = id,
Type = _movieTypeName,
Name = name,
MediaType = "Video",
IsMovie = true,
IsFolder = false,
IsVirtualItem = false
};
}
private static ItemValueMap CreateMap(BaseItemEntity item, ItemValue itemValue)
{
return new ItemValueMap
{
ItemId = item.Id,
ItemValueId = itemValue.ItemValueId,
Item = item,
ItemValue = itemValue
};
}
private static ItemValue CreateItemValue(ItemValueType type, string value, string cleanValue)
{
return new ItemValue
{
ItemValueId = Guid.NewGuid(),
Type = type,
Value = value,
CleanValue = cleanValue
};
}
}
|