101 lines
3.1 KiB
C#
101 lines
3.1 KiB
C#
using System;
|
|
using System.IO;
|
|
using Xunit;
|
|
using ytLive.Services.Entitlement;
|
|
using ytLive.ViewModels;
|
|
|
|
namespace ytLive.Tests;
|
|
|
|
/// <summary>
|
|
/// Steam ownership is cached once into the app-wide binary flag.
|
|
///
|
|
/// <para>The rule that must never break: a missing paid app ID, Steam client, or native library
|
|
/// fails closed.</para>
|
|
/// </summary>
|
|
// Shares the static MainViewModel.LayoutPathOverride with the sibling class; without a
|
|
// shared collection xUnit runs them in parallel and the two view models fight over one temp DB.
|
|
[Collection("MainViewModelLayoutPath")]
|
|
public class EntitlementTests
|
|
{
|
|
[Fact]
|
|
public void No_configured_paid_app_id_reads_as_not_owned()
|
|
{
|
|
var entitlement = SteamEntitlement.NotConfigured();
|
|
Assert.False(entitlement.IsAppOwned);
|
|
Assert.Contains("paid Steam app ID is not configured", entitlement.ErrorMessage);
|
|
}
|
|
|
|
[Fact]
|
|
public void Steam_ownership_checks_the_paid_app_id()
|
|
{
|
|
const uint paidAppId = 1234567u;
|
|
uint queriedAppId = 0;
|
|
var entitlement = new SteamEntitlement(
|
|
paidAppId,
|
|
initializeSteam: () => true,
|
|
isAppSubscribed: appId =>
|
|
{
|
|
queriedAppId = appId;
|
|
return true;
|
|
},
|
|
shutdownSteam: () => { });
|
|
|
|
Assert.True(entitlement.IsAppOwned);
|
|
Assert.Equal(paidAppId, queriedAppId);
|
|
Assert.Null(entitlement.ErrorMessage);
|
|
}
|
|
|
|
[Fact]
|
|
public void A_steam_entitlement_without_a_client_fails_closed()
|
|
{
|
|
var entitlement = new SteamEntitlement(1234567u, () => false, _ => true, () => { });
|
|
Assert.False(entitlement.IsAppOwned);
|
|
Assert.Contains("Open Steam", entitlement.ErrorMessage);
|
|
}
|
|
|
|
[Fact]
|
|
public void A_valid_steam_check_for_an_unowned_account_is_not_an_authentication_error()
|
|
{
|
|
var entitlement = new SteamEntitlement(1234567u, () => true, _ => false, () => { });
|
|
|
|
Assert.False(entitlement.IsAppOwned);
|
|
Assert.Null(entitlement.ErrorMessage);
|
|
}
|
|
|
|
[Fact]
|
|
public void The_fake_reports_what_a_test_sets()
|
|
{
|
|
var fake = new FakeEntitlement(true);
|
|
Assert.True(fake.IsAppOwned);
|
|
fake.IsAppOwned = false;
|
|
Assert.False(fake.IsAppOwned);
|
|
}
|
|
|
|
[Fact]
|
|
public void The_view_model_takes_its_answer_from_the_rail()
|
|
{
|
|
var tempDb = Path.Combine(Path.GetTempPath(), $"llamacasty-entitlement-{Guid.NewGuid():N}.db");
|
|
MainViewModel.LayoutPathOverride = tempDb;
|
|
try
|
|
{
|
|
var vm = new MainViewModel();
|
|
|
|
Assert.True(vm.IsAppOwned);
|
|
Assert.True(vm.HasProOutput);
|
|
|
|
vm.EntitlementOverride = new FakeEntitlement(false);
|
|
Assert.False(vm.IsAppOwned);
|
|
Assert.False(vm.HasProOutput);
|
|
|
|
vm.EntitlementOverride = new FakeEntitlement(true);
|
|
Assert.True(vm.IsAppOwned);
|
|
Assert.True(vm.HasProOutput);
|
|
}
|
|
finally
|
|
{
|
|
MainViewModel.LayoutPathOverride = null;
|
|
try { File.Delete(tempDb); } catch (IOException) { }
|
|
}
|
|
}
|
|
}
|