Normal ON-AIR stays red until YouTube reports lifeCycleStatus=live, then turns green; TEST stays gold and stop restores the idle color. Status-color reference: https://www.carbondesignsystem.com/building-blocks/core/patterns/status-indicators
81 lines
2.8 KiB
C#
81 lines
2.8 KiB
C#
using System;
|
|
using System.ComponentModel;
|
|
using Xunit;
|
|
using ytLive.Helpers;
|
|
using ytLive.Models;
|
|
using ytLive.ViewModels;
|
|
|
|
namespace ytLive.Tests;
|
|
|
|
/// <summary>
|
|
/// The ON-AIR sign and menu-bar color follow the real MainViewModel state,
|
|
/// including the YouTube lifecycle confirmation before the bar turns green.
|
|
/// </summary>
|
|
[Collection("RealApp")]
|
|
public sealed class OnAirSignTests
|
|
{
|
|
[Fact]
|
|
public void OnAirBrush_And_TopBarBackground_Follow_YouTube_Live_State()
|
|
{
|
|
_app.Run(Run);
|
|
}
|
|
|
|
private readonly RealAppHost _app;
|
|
|
|
public OnAirSignTests(RealAppHost app) => _app = app;
|
|
|
|
private void Run()
|
|
{
|
|
var tempDb = System.IO.Path.Combine(System.IO.Path.GetTempPath(), $"ytLlive-onair-{Guid.NewGuid():N}.db");
|
|
MainViewModel.LayoutPathOverride = tempDb;
|
|
try
|
|
{
|
|
using (var schema = new ytLive.Services.LayoutStore(tempDb)) { }
|
|
Microsoft.Data.Sqlite.SqliteConnection.ClearAllPools();
|
|
|
|
var vm = new MainViewModel();
|
|
|
|
Assert.Equal(StreamStatus.Offline, vm.StreamStatus);
|
|
Assert.Equal("#5b6478", vm.OnAirBrush);
|
|
var idleBackground = vm.TopBarBackground;
|
|
|
|
var raised = 0;
|
|
vm.PropertyChanged += (_, e) => { if (e.PropertyName == nameof(MainViewModel.OnAirBrush)) raised++; };
|
|
|
|
vm.StreamVisibility = "Public";
|
|
Assert.Equal("#5b6478", vm.OnAirBrush);
|
|
|
|
vm.StreamStatus = StreamStatus.Streaming;
|
|
Assert.Equal("#ff5451", vm.OnAirBrush);
|
|
Assert.Equal(ThemeBrush.Hex("Brush.Primary"), vm.TopBarBackground);
|
|
|
|
vm.ApplyBroadcastLifecycleStatus("liveStarting");
|
|
Assert.Equal(ThemeBrush.Hex("Brush.Primary"), vm.TopBarBackground);
|
|
|
|
vm.StreamVisibility = "Private";
|
|
Assert.Equal("#22c55e", vm.OnAirBrush);
|
|
|
|
Assert.Equal(3, raised);
|
|
vm.ApplyBroadcastLifecycleStatus("live");
|
|
Assert.Equal(ThemeBrush.Hex("Brush.Positive"), vm.TopBarBackground);
|
|
|
|
vm.StreamStatus = StreamStatus.Offline;
|
|
Assert.Equal(idleBackground, vm.TopBarBackground);
|
|
|
|
vm.IsTestStream = true;
|
|
vm.StreamStatus = StreamStatus.Streaming;
|
|
Assert.Equal(ThemeBrush.Hex("Brush.TestContainer"), vm.TopBarBackground);
|
|
vm.ApplyBroadcastLifecycleStatus("live");
|
|
Assert.Equal(ThemeBrush.Hex("Brush.TestContainer"), vm.TopBarBackground);
|
|
vm.StreamStatus = StreamStatus.Offline;
|
|
Assert.Equal(idleBackground, vm.TopBarBackground);
|
|
}
|
|
finally
|
|
{
|
|
MainViewModel.LayoutPathOverride = null;
|
|
Microsoft.Data.Sqlite.SqliteConnection.ClearAllPools();
|
|
try { System.IO.File.Delete(tempDb); } catch { /* best-effort cleanup */ }
|
|
}
|
|
}
|
|
}
|