@@ -6,6 +6,7 @@ using System.Runtime.CompilerServices; | |||||
[assembly: InternalsVisibleTo("Discord.Net.Commands")] | [assembly: InternalsVisibleTo("Discord.Net.Commands")] | ||||
[assembly: InternalsVisibleTo("Discord.Net.Tests")] | [assembly: InternalsVisibleTo("Discord.Net.Tests")] | ||||
[assembly: InternalsVisibleTo("Discord.Net.Tests.Unit")] | [assembly: InternalsVisibleTo("Discord.Net.Tests.Unit")] | ||||
[assembly: InternalsVisibleTo("Discord.Net.Tests.Integration")] | |||||
[assembly: InternalsVisibleTo("Discord.Net.Interactions")] | [assembly: InternalsVisibleTo("Discord.Net.Interactions")] | ||||
[assembly: TypeForwardedTo(typeof(Discord.Embed))] | [assembly: TypeForwardedTo(typeof(Discord.Embed))] | ||||
@@ -132,12 +132,15 @@ namespace Discord.Rest | |||||
} | } | ||||
public static ulong GetUploadLimit(IGuild guild) | public static ulong GetUploadLimit(IGuild guild) | ||||
{ | { | ||||
return guild.PremiumTier switch | |||||
var tierFactor = guild.PremiumTier switch | |||||
{ | { | ||||
PremiumTier.Tier2 => 50ul * 1000000, | |||||
PremiumTier.Tier3 => 100ul * 1000000, | |||||
_ => 8ul * 1000000 | |||||
PremiumTier.Tier2 => 50, | |||||
PremiumTier.Tier3 => 100, | |||||
_ => 8 | |||||
}; | }; | ||||
var mebibyte = Math.Pow(2, 20); | |||||
return (ulong) (tierFactor * mebibyte); | |||||
} | } | ||||
#endregion | #endregion | ||||
@@ -151,7 +154,7 @@ namespace Discord.Rest | |||||
if (fromUserId.HasValue) | if (fromUserId.HasValue) | ||||
return GetBansAsync(guild, client, fromUserId.Value + 1, Direction.Before, around + 1, options) | return GetBansAsync(guild, client, fromUserId.Value + 1, Direction.Before, around + 1, options) | ||||
.Concat(GetBansAsync(guild, client, fromUserId.Value, Direction.After, around, options)); | .Concat(GetBansAsync(guild, client, fromUserId.Value, Direction.After, around, options)); | ||||
else | |||||
else | |||||
return GetBansAsync(guild, client, null, Direction.Before, around + 1, options); | return GetBansAsync(guild, client, null, Direction.Before, around + 1, options); | ||||
} | } | ||||
@@ -908,7 +911,7 @@ namespace Discord.Rest | |||||
if (endTime != null && endTime <= startTime) | if (endTime != null && endTime <= startTime) | ||||
throw new ArgumentOutOfRangeException(nameof(endTime), $"{nameof(endTime)} cannot be before the start time"); | throw new ArgumentOutOfRangeException(nameof(endTime), $"{nameof(endTime)} cannot be before the start time"); | ||||
var apiArgs = new CreateGuildScheduledEventParams() | var apiArgs = new CreateGuildScheduledEventParams() | ||||
{ | { | ||||
ChannelId = channelId ?? Optional<ulong>.Unspecified, | ChannelId = channelId ?? Optional<ulong>.Unspecified, | ||||
@@ -14,6 +14,7 @@ | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="FluentAssertions" Version="6.7.0" /> | |||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" /> | <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" /> | ||||
<PackageReference Include="xunit" Version="2.4.1" /> | <PackageReference Include="xunit" Version="2.4.1" /> | ||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3"> | <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3"> | ||||
@@ -0,0 +1,53 @@ | |||||
using Discord.API; | |||||
using Discord.API.Rest; | |||||
using Discord.Net; | |||||
using Discord.Rest; | |||||
using FluentAssertions; | |||||
using System; | |||||
using System.IO; | |||||
using System.Threading.Tasks; | |||||
using Xunit; | |||||
namespace Discord; | |||||
[CollectionDefinition(nameof(DiscordRestApiClientTests), DisableParallelization = true)] | |||||
public class DiscordRestApiClientTests : IClassFixture<RestGuildFixture>, IAsyncDisposable | |||||
{ | |||||
private readonly DiscordRestApiClient _apiClient; | |||||
private readonly IGuild _guild; | |||||
private readonly ITextChannel _channel; | |||||
public DiscordRestApiClientTests(RestGuildFixture guildFixture) | |||||
{ | |||||
_guild = guildFixture.Guild; | |||||
_apiClient = guildFixture.Client.ApiClient; | |||||
_channel = _guild.CreateTextChannelAsync("testChannel").Result; | |||||
} | |||||
public async ValueTask DisposeAsync() | |||||
{ | |||||
await _channel.DeleteAsync(); | |||||
} | |||||
[Fact] | |||||
public async Task UploadFile_WithMaximumSize_DontThrowsException() | |||||
{ | |||||
var fileSize = GuildHelper.GetUploadLimit(_guild); | |||||
using var stream = new MemoryStream(new byte[fileSize]); | |||||
await _apiClient.UploadFileAsync(_channel.Id, new UploadFileParams(new FileAttachment(stream, "filename"))); | |||||
} | |||||
[Fact] | |||||
public async Task UploadFile_WithOverSize_ThrowsException() | |||||
{ | |||||
var fileSize = GuildHelper.GetUploadLimit(_guild) + 1; | |||||
using var stream = new MemoryStream(new byte[fileSize]); | |||||
Func<Task> upload = async () => | |||||
await _apiClient.UploadFileAsync(_channel.Id, new UploadFileParams(new FileAttachment(stream, "filename"))); | |||||
await upload.Should().ThrowExactlyAsync<HttpException>() | |||||
.Where(e => e.DiscordCode == DiscordErrorCode.RequestEntityTooLarge); | |||||
} | |||||
} |
@@ -12,7 +12,9 @@ | |||||
<ProjectReference Include="../../src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj" /> | <ProjectReference Include="../../src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="FluentAssertions" Version="6.7.0" /> | |||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" /> | <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" /> | ||||
<PackageReference Include="Moq" Version="4.18.1" /> | |||||
<PackageReference Include="xunit" Version="2.4.1" /> | <PackageReference Include="xunit" Version="2.4.1" /> | ||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3"> | <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3"> | ||||
<PrivateAssets>all</PrivateAssets> | <PrivateAssets>all</PrivateAssets> | ||||
@@ -0,0 +1,25 @@ | |||||
using Discord.Rest; | |||||
using FluentAssertions; | |||||
using Moq; | |||||
using System; | |||||
using Xunit; | |||||
namespace Discord; | |||||
public class GuildHelperTests | |||||
{ | |||||
[Theory] | |||||
[InlineData(PremiumTier.None, 8)] | |||||
[InlineData(PremiumTier.Tier1, 8)] | |||||
[InlineData(PremiumTier.Tier2, 50)] | |||||
[InlineData(PremiumTier.Tier3, 100)] | |||||
public void GetUploadLimit(PremiumTier tier, ulong factor) | |||||
{ | |||||
var guild = Mock.Of<IGuild>(g => g.PremiumTier == tier); | |||||
var expected = factor * (ulong)Math.Pow(2, 20); | |||||
var actual = GuildHelper.GetUploadLimit(guild); | |||||
actual.Should().Be(expected); | |||||
} | |||||
} |