VanguardReMaster/server/tests/Vanguard.Server.Tests/PracticeBotE2ETests.cs

81 lines
3.0 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Net.Http.Headers;
using System.Net.Http.Json;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Testing;
using Vanguard.Server.Api;
using Vanguard.Server.Auth;
using Vanguard.Server.Meta;
using Xunit.Sdk;
namespace Vanguard.Server.Tests;
[Collection("Orleans")]
public class PracticeBotE2ETests
{
[Fact]
public async Task Player_Can_Play_A_Practice_Match_Against_Bot()
{
using var factory = new WebApplicationFactory<Program>()
.WithWebHostBuilder(builder =>
{
builder.UseSetting("Orleans:Enabled", "true");
builder.UseSetting("Orleans:SiloPort", "21112");
builder.UseSetting("Orleans:GatewayPort", "21001");
});
using var anonymous = factory.CreateClient();
var register = await anonymous.PostAsJsonAsync(
"/api/auth/register",
new { userName = "practice-player", password = "Practice12345!" });
if (!register.IsSuccessStatusCode)
throw new XunitException(await register.Content.ReadAsStringAsync());
var auth = (await register.Content.ReadFromJsonAsync<AuthResponse>())!;
using var http = factory.CreateClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", auth.AccessToken);
var onboarding = await http.PostAsJsonAsync(
"/api/meta/onboarding",
new { deckId = "td01" });
if (!onboarding.IsSuccessStatusCode)
throw new XunitException(await onboarding.Content.ReadAsStringAsync());
var trialDeck = ServerTestData.TrialDecks.Decks.Single(deck => deck.Id == "td01");
var createDeck = await http.PostAsJsonAsync(
"/api/decks",
new { name = "Practice deck", cards = trialDeck.ToDeck() });
if (!createDeck.IsSuccessStatusCode)
throw new XunitException(await createDeck.Content.ReadAsStringAsync());
var deck = (await createDeck.Content.ReadFromJsonAsync<DeckDto>())!;
var practice = await http.PostAsJsonAsync(
"/api/game/practice",
new { deckId = deck.Id });
if (!practice.IsSuccessStatusCode)
throw new XunitException(await practice.Content.ReadAsStringAsync());
var start = (await practice.Content.ReadFromJsonAsync<PracticeStartResponse>())!;
Assert.Equal(0, start.Seat);
Assert.False(string.IsNullOrWhiteSpace(start.Ticket));
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(120));
await using var client = await TestGameClient.ConnectAsync(
factory, start.MatchId, start.Ticket, "practice-player", 0, cts.Token);
await client.PlayRandomlyAsync(seed: 7, cts.Token);
Assert.True(client.View.IsFinished, "Практика с ботом не завершилась.");
Assert.InRange(client.View.Winner, 0, 1);
var history = await http.GetFromJsonAsync<MatchHistoryResponse>("/api/matches");
Assert.NotNull(history);
Assert.Empty(history!.Items);
}
}