mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-04-22 10:04:44 +01:00
Merge branch 'master' into authenticationdb-efcore
# Conflicts: # Emby.Server.Implementations/Security/AuthenticationRepository.cs # Jellyfin.Server.Implementations/Security/AuthorizationContext.cs # MediaBrowser.Controller/Devices/IDeviceManager.cs
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using AutoFixture;
|
||||
using AutoFixture.AutoMoq;
|
||||
using Jellyfin.Api.Controllers;
|
||||
using Jellyfin.Api.Helpers;
|
||||
using Jellyfin.Api.Models.StreamingDtos;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.MediaEncoding;
|
||||
using Moq;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.Api.Tests.Controllers
|
||||
{
|
||||
public class DynamicHlsControllerTests
|
||||
{
|
||||
[Theory]
|
||||
[MemberData(nameof(GetSegmentLengths_Success_TestData))]
|
||||
public void GetSegmentLengths_Success(long runtimeTicks, int segmentlength, double[] expected)
|
||||
{
|
||||
var res = DynamicHlsController.GetSegmentLengthsInternal(runtimeTicks, segmentlength);
|
||||
Assert.Equal(expected.Length, res.Length);
|
||||
for (int i = 0; i < expected.Length; i++)
|
||||
{
|
||||
Assert.Equal(expected[i], res[i]);
|
||||
}
|
||||
}
|
||||
|
||||
public static IEnumerable<object[]> GetSegmentLengths_Success_TestData()
|
||||
{
|
||||
yield return new object[] { 0, 6, Array.Empty<double>() };
|
||||
yield return new object[]
|
||||
{
|
||||
TimeSpan.FromSeconds(3).Ticks,
|
||||
6,
|
||||
new double[] { 3 }
|
||||
};
|
||||
yield return new object[]
|
||||
{
|
||||
TimeSpan.FromSeconds(6).Ticks,
|
||||
6,
|
||||
new double[] { 6 }
|
||||
};
|
||||
yield return new object[]
|
||||
{
|
||||
TimeSpan.FromSeconds(3.3333333).Ticks,
|
||||
6,
|
||||
new double[] { 3.3333333 }
|
||||
};
|
||||
yield return new object[]
|
||||
{
|
||||
TimeSpan.FromSeconds(9.3333333).Ticks,
|
||||
6,
|
||||
new double[] { 6, 3.3333333 }
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@
|
||||
<PackageReference Include="AutoFixture" Version="4.17.0" />
|
||||
<PackageReference Include="AutoFixture.AutoMoq" Version="4.17.0" />
|
||||
<PackageReference Include="AutoFixture.Xunit2" Version="4.17.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="5.0.5" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="5.0.6" />
|
||||
<PackageReference Include="Microsoft.Extensions.Options" Version="5.0.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
|
||||
<PackageReference Include="xunit" Version="2.4.1" />
|
||||
|
||||
@@ -148,7 +148,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||
yield return new object[]
|
||||
{
|
||||
new VideoFileInfo(
|
||||
path: @"/server/Movies/Rain Man 1988 REMASTERED 1080p BluRay x264 AAC - Ozlem/Rain Man 1988 REMASTERED 1080p BluRay x264 AAC - Ozlem.mp4",
|
||||
path: @"/server/Movies/Rain Man 1988 REMASTERED 1080p BluRay x264 AAC - JEFF/Rain Man 1988 REMASTERED 1080p BluRay x264 AAC - JEFF.mp4",
|
||||
container: "mp4",
|
||||
name: "Rain Man",
|
||||
year: 1988)
|
||||
@@ -200,6 +200,10 @@ namespace Jellyfin.Naming.Tests.Video
|
||||
Assert.NotNull(results[0]);
|
||||
Assert.NotNull(results[1]);
|
||||
Assert.Null(results[2]);
|
||||
foreach (var result in results)
|
||||
{
|
||||
Assert.Null(result?.Container);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net5.0</TargetFramework>
|
||||
<IsPackable>false</IsPackable>
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<Nullable>enable</Nullable>
|
||||
<AnalysisMode>AllEnabledByDefault</AnalysisMode>
|
||||
<CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
|
||||
<PackageReference Include="Moq" Version="4.16.1" />
|
||||
<PackageReference Include="xunit" Version="2.4.1" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="coverlet.collector" Version="3.0.3">
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
|
||||
<!-- Code Analyzers -->
|
||||
<ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
|
||||
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
|
||||
<PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="../../MediaBrowser.Providers/MediaBrowser.Providers.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,96 @@
|
||||
#pragma warning disable CA1002 // Do not expose generic lists
|
||||
|
||||
using System.Collections.Generic;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Globalization;
|
||||
using MediaBrowser.Providers.MediaInfo;
|
||||
using Moq;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.Providers.Tests.MediaInfo
|
||||
{
|
||||
public class SubtitleResolverTests
|
||||
{
|
||||
public static IEnumerable<object[]> AddExternalSubtitleStreams_GivenMixedFilenames_ReturnsValidSubtitles_TestData()
|
||||
{
|
||||
var index = 0;
|
||||
yield return new object[]
|
||||
{
|
||||
new List<MediaStream>(),
|
||||
"/video/My.Video.mkv",
|
||||
index,
|
||||
new[]
|
||||
{
|
||||
"/video/My.Video.mp3",
|
||||
"/video/My.Video.png",
|
||||
"/video/My.Video.srt",
|
||||
"/video/My.Video.txt",
|
||||
"/video/My.Video.vtt",
|
||||
"/video/My.Video.ass",
|
||||
"/video/My.Video.sub",
|
||||
"/video/My.Video.ssa",
|
||||
"/video/My.Video.smi",
|
||||
"/video/My.Video.sami",
|
||||
"/video/My.Video.en.srt",
|
||||
"/video/My.Video.default.en.srt",
|
||||
"/video/My.Video.default.forced.en.srt",
|
||||
"/video/My.Video.en.default.forced.srt",
|
||||
"/video/My.Video.With.Additional.Garbage.en.srt",
|
||||
"/video/My.Video With Additional Garbage.srt"
|
||||
},
|
||||
new[]
|
||||
{
|
||||
CreateMediaStream("/video/My.Video.srt", "srt", null, index++),
|
||||
CreateMediaStream("/video/My.Video.vtt", "vtt", null, index++),
|
||||
CreateMediaStream("/video/My.Video.ass", "ass", null, index++),
|
||||
CreateMediaStream("/video/My.Video.sub", "sub", null, index++),
|
||||
CreateMediaStream("/video/My.Video.ssa", "ssa", null, index++),
|
||||
CreateMediaStream("/video/My.Video.smi", "smi", null, index++),
|
||||
CreateMediaStream("/video/My.Video.sami", "sami", null, index++),
|
||||
CreateMediaStream("/video/My.Video.en.srt", "srt", "en", index++),
|
||||
CreateMediaStream("/video/My.Video.default.en.srt", "srt", "en", index++, isDefault: true),
|
||||
CreateMediaStream("/video/My.Video.default.forced.en.srt", "srt", "en", index++, isForced: true, isDefault: true),
|
||||
CreateMediaStream("/video/My.Video.en.default.forced.srt", "srt", "en", index++, isForced: true, isDefault: true),
|
||||
CreateMediaStream("/video/My.Video.With.Additional.Garbage.en.srt", "srt", "en", index),
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(AddExternalSubtitleStreams_GivenMixedFilenames_ReturnsValidSubtitles_TestData))]
|
||||
public void AddExternalSubtitleStreams_GivenMixedFilenames_ReturnsValidSubtitles(List<MediaStream> streams, string videoPath, int startIndex, string[] files, MediaStream[] expectedResult)
|
||||
{
|
||||
new SubtitleResolver(Mock.Of<ILocalizationManager>()).AddExternalSubtitleStreams(streams, videoPath, startIndex, files);
|
||||
|
||||
Assert.Equal(expectedResult.Length, streams.Count);
|
||||
for (var i = 0; i < expectedResult.Length; i++)
|
||||
{
|
||||
var expected = expectedResult[i];
|
||||
var actual = streams[i];
|
||||
|
||||
Assert.Equal(expected.Index, actual.Index);
|
||||
Assert.Equal(expected.Type, actual.Type);
|
||||
Assert.Equal(expected.IsExternal, actual.IsExternal);
|
||||
Assert.Equal(expected.Path, actual.Path);
|
||||
Assert.Equal(expected.IsDefault, actual.IsDefault);
|
||||
Assert.Equal(expected.IsForced, actual.IsForced);
|
||||
Assert.Equal(expected.Language, actual.Language);
|
||||
}
|
||||
}
|
||||
|
||||
private static MediaStream CreateMediaStream(string path, string codec, string? language, int index, bool isForced = false, bool isDefault = false)
|
||||
{
|
||||
return new ()
|
||||
{
|
||||
Index = index,
|
||||
Codec = codec,
|
||||
Type = MediaStreamType.Subtitle,
|
||||
IsExternal = true,
|
||||
Path = path,
|
||||
IsDefault = isDefault,
|
||||
IsForced = isForced,
|
||||
Language = language
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
27
tests/Jellyfin.Providers.Tests/Tmdb/TmdbUtilsTests.cs
Normal file
27
tests/Jellyfin.Providers.Tests/Tmdb/TmdbUtilsTests.cs
Normal file
@@ -0,0 +1,27 @@
|
||||
using MediaBrowser.Providers.Plugins.Tmdb;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.Providers.Tests.Tmdb
|
||||
{
|
||||
public static class TmdbUtilsTests
|
||||
{
|
||||
[Theory]
|
||||
[InlineData("de", "de")]
|
||||
[InlineData("En", "En")]
|
||||
[InlineData("de-de", "de-DE")]
|
||||
[InlineData("en-US", "en-US")]
|
||||
[InlineData("de-CH", "de")]
|
||||
public static void NormalizeLanguage_Valid_Success(string input, string expected)
|
||||
{
|
||||
Assert.Equal(expected, TmdbUtils.NormalizeLanguage(input));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(null, null)]
|
||||
[InlineData("", "")]
|
||||
public static void NormalizeLanguage_Invalid_Equal(string? input, string? expected)
|
||||
{
|
||||
Assert.Equal(expected, TmdbUtils.NormalizeLanguage(input!));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net.Http;
|
||||
using System.Text.Json;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using AutoFixture;
|
||||
@@ -15,8 +16,6 @@ namespace Jellyfin.Server.Implementations.Tests.LiveTv
|
||||
{
|
||||
public class HdHomerunHostTests
|
||||
{
|
||||
private const string TestIp = "http://192.168.1.182";
|
||||
|
||||
private readonly Fixture _fixture;
|
||||
private readonly HdHomerunHost _hdHomerunHost;
|
||||
|
||||
@@ -30,7 +29,7 @@ namespace Jellyfin.Server.Implementations.Tests.LiveTv
|
||||
{
|
||||
return Task.FromResult(new HttpResponseMessage()
|
||||
{
|
||||
Content = new StreamContent(File.OpenRead("Test Data/LiveTv/" + m.RequestUri?.Segments[^1]))
|
||||
Content = new StreamContent(File.OpenRead(Path.Combine("Test Data/LiveTv", m.RequestUri!.Host, m.RequestUri.Segments[^1])))
|
||||
});
|
||||
});
|
||||
|
||||
@@ -50,7 +49,7 @@ namespace Jellyfin.Server.Implementations.Tests.LiveTv
|
||||
{
|
||||
var host = new TunerHostInfo()
|
||||
{
|
||||
Url = TestIp
|
||||
Url = "192.168.1.182"
|
||||
};
|
||||
|
||||
var modelInfo = await _hdHomerunHost.GetModelInfo(host, true, CancellationToken.None).ConfigureAwait(false);
|
||||
@@ -65,6 +64,26 @@ namespace Jellyfin.Server.Implementations.Tests.LiveTv
|
||||
Assert.Equal("http://192.168.1.182:80/lineup.json", modelInfo.LineupURL);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetModelInfo_Legacy_Success()
|
||||
{
|
||||
var host = new TunerHostInfo()
|
||||
{
|
||||
Url = "10.10.10.100"
|
||||
};
|
||||
|
||||
var modelInfo = await _hdHomerunHost.GetModelInfo(host, true, CancellationToken.None).ConfigureAwait(false);
|
||||
Assert.Equal("HDHomeRun DUAL", modelInfo.FriendlyName);
|
||||
Assert.Equal("HDHR3-US", modelInfo.ModelNumber);
|
||||
Assert.Equal("hdhomerun3_atsc", modelInfo.FirmwareName);
|
||||
Assert.Equal("20200225", modelInfo.FirmwareVersion);
|
||||
Assert.Equal("10xxxxx5", modelInfo.DeviceID);
|
||||
Assert.Null(modelInfo.DeviceAuth);
|
||||
Assert.Equal(2, modelInfo.TunerCount);
|
||||
Assert.Equal("http://10.10.10.100:80", modelInfo.BaseURL);
|
||||
Assert.Null(modelInfo.LineupURL);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetModelInfo_EmptyUrl_ArgumentException()
|
||||
{
|
||||
@@ -81,7 +100,7 @@ namespace Jellyfin.Server.Implementations.Tests.LiveTv
|
||||
{
|
||||
var host = new TunerHostInfo()
|
||||
{
|
||||
Url = TestIp
|
||||
Url = "192.168.1.182"
|
||||
};
|
||||
|
||||
var channels = await _hdHomerunHost.GetLineup(host, CancellationToken.None).ConfigureAwait(false);
|
||||
@@ -93,12 +112,24 @@ namespace Jellyfin.Server.Implementations.Tests.LiveTv
|
||||
Assert.Equal("http://192.168.1.111:5004/auto/v4.1", channels[0].URL);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetLineup_Legacy_Success()
|
||||
{
|
||||
var host = new TunerHostInfo()
|
||||
{
|
||||
Url = "10.10.10.100"
|
||||
};
|
||||
|
||||
// Placeholder json is invalid, just need to make sure we can reach it
|
||||
await Assert.ThrowsAsync<JsonException>(() => _hdHomerunHost.GetLineup(host, CancellationToken.None));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetLineup_ImportFavoritesOnly_Success()
|
||||
{
|
||||
var host = new TunerHostInfo()
|
||||
{
|
||||
Url = TestIp,
|
||||
Url = "192.168.1.182",
|
||||
ImportFavoritesOnly = true
|
||||
};
|
||||
|
||||
@@ -114,9 +145,9 @@ namespace Jellyfin.Server.Implementations.Tests.LiveTv
|
||||
[Fact]
|
||||
public async Task TryGetTunerHostInfo_Valid_Success()
|
||||
{
|
||||
var host = await _hdHomerunHost.TryGetTunerHostInfo(TestIp, CancellationToken.None).ConfigureAwait(false);
|
||||
var host = await _hdHomerunHost.TryGetTunerHostInfo("192.168.1.182", CancellationToken.None).ConfigureAwait(false);
|
||||
Assert.Equal(_hdHomerunHost.Type, host.Type);
|
||||
Assert.Equal(TestIp, host.Url);
|
||||
Assert.Equal("192.168.1.182", host.Url);
|
||||
Assert.Equal("HDHomeRun PRIME", host.FriendlyName);
|
||||
Assert.Equal("FFFFFFFF", host.DeviceId);
|
||||
Assert.Equal(3, host.TunerCount);
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Emby.Server.Implementations.LiveTv.EmbyTV;
|
||||
using MediaBrowser.Controller.LiveTv;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.Server.Implementations.Tests.LiveTv
|
||||
{
|
||||
public static class RecordingHelperTests
|
||||
{
|
||||
public static IEnumerable<object[]> GetRecordingName_Success_TestData()
|
||||
{
|
||||
yield return new object[]
|
||||
{
|
||||
"The Incredibles 2020_04_20_21_06_00",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "The Incredibles",
|
||||
StartDate = new DateTime(2020, 4, 20, 21, 6, 0, DateTimeKind.Local),
|
||||
IsMovie = true
|
||||
}
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"The Incredibles (2004)",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "The Incredibles",
|
||||
IsMovie = true,
|
||||
ProductionYear = 2004
|
||||
}
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"The Big Bang Theory 2020_04_20_21_06_00",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "The Big Bang Theory",
|
||||
StartDate = new DateTime(2020, 4, 20, 21, 6, 0, DateTimeKind.Local),
|
||||
IsProgramSeries = true,
|
||||
}
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"The Big Bang Theory S12E10",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "The Big Bang Theory",
|
||||
IsProgramSeries = true,
|
||||
SeasonNumber = 12,
|
||||
EpisodeNumber = 10
|
||||
}
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"The Big Bang Theory S12E10 The VCR Illumination",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "The Big Bang Theory",
|
||||
IsProgramSeries = true,
|
||||
SeasonNumber = 12,
|
||||
EpisodeNumber = 10,
|
||||
EpisodeTitle = "The VCR Illumination"
|
||||
}
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"The Big Bang Theory 2018-12-06",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "The Big Bang Theory",
|
||||
IsProgramSeries = true,
|
||||
OriginalAirDate = new DateTime(2018, 12, 6)
|
||||
}
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"The Big Bang Theory 2018-12-06 - The VCR Illumination",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "The Big Bang Theory",
|
||||
IsProgramSeries = true,
|
||||
OriginalAirDate = new DateTime(2018, 12, 6),
|
||||
EpisodeTitle = "The VCR Illumination"
|
||||
}
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"The Big Bang Theory 2018_12_06_21_06_00 - The VCR Illumination",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "The Big Bang Theory",
|
||||
StartDate = new DateTime(2018, 12, 6, 21, 6, 0, DateTimeKind.Local),
|
||||
IsProgramSeries = true,
|
||||
OriginalAirDate = new DateTime(2018, 12, 6),
|
||||
EpisodeTitle = "The VCR Illumination"
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(GetRecordingName_Success_TestData))]
|
||||
public static void GetRecordingName_Success(string expected, TimerInfo timerInfo)
|
||||
{
|
||||
Assert.Equal(expected, RecordingHelper.GetRecordingName(timerInfo));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{"FriendlyName":"HDHomeRun DUAL","ModelNumber":"HDHR3-US","Legacy":1,"FirmwareName":"hdhomerun3_atsc","FirmwareVersion":"20200225","DeviceID":"10xxxxx5","TunerCount":2,"BaseURL":"http://10.10.10.100:80"}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -12,7 +12,7 @@
|
||||
<PackageReference Include="AutoFixture" Version="4.17.0" />
|
||||
<PackageReference Include="AutoFixture.AutoMoq" Version="4.17.0" />
|
||||
<PackageReference Include="AutoFixture.Xunit2" Version="4.17.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="5.0.5" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="5.0.6" />
|
||||
<PackageReference Include="Microsoft.Extensions.Options" Version="5.0.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
|
||||
<PackageReference Include="xunit" Version="2.4.1" />
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<PackageReference Include="AutoFixture" Version="4.17.0" />
|
||||
<PackageReference Include="AutoFixture.AutoMoq" Version="4.17.0" />
|
||||
<PackageReference Include="AutoFixture.Xunit2" Version="4.17.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="5.0.5" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="5.0.6" />
|
||||
<PackageReference Include="Microsoft.Extensions.Options" Version="5.0.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
|
||||
<PackageReference Include="xunit" Version="2.4.1" />
|
||||
|
||||
Reference in New Issue
Block a user