v1 task queue: add TASK 19-23 (transitions, hotkeys, media source, audio sync, studio mode)

- TASKS.md: added 5 new tasks for v1 feature completeness, execution order, updated backlog
- MONETIZATION.md: added v1 feature completeness section (competitive gap analysis)
- ai.md: added v1 task queue note in Current limitations/TODOs
- HANDOFF.md: updated session state and next steps
- ViewModels/SocialsDialogViewModel.cs: removed isPremium parameter (social slot locks)
- ViewModels/MainViewModel.cs: removed isPremium argument from SocialsDialogViewModel constructor
- ytLive.Tests/SocialsDialogViewModelTests.cs: updated 5 tests for unlocked slots
This commit is contained in:
2026-08-19 11:51:32 -07:00
parent f9ad7c2cb1
commit e97406d649
6 changed files with 375 additions and 103 deletions
+13 -20
View File
@@ -77,7 +77,6 @@ public class SocialsDialogViewModelTests
ISocialValidator? validator = null,
SignInFake? signIn = null,
YouTubeChannel? account = null,
bool isPremium = false,
SocialsConfig? current = null)
{
return new SocialsDialogViewModel(
@@ -85,7 +84,6 @@ public class SocialsDialogViewModelTests
signIn != null ? signIn.Next : () => Task.FromResult<YouTubeChannel?>(null),
SignOut,
account,
isPremium,
current);
}
@@ -98,14 +96,14 @@ public class SocialsDialogViewModelTests
var signIn = new SignInFake();
var vm = Create(validator, signIn);
// Gate: signed out, freemium → row 0 is the sign-in prompt, rows 2-5 locked.
// Gate: signed out → row 0 is the sign-in prompt, all slots available.
Assert.True(vm.ShowSignInBanner);
Assert.Equal(6, vm.Slots.Count);
Assert.True(vm.Slots[0].IsSignIn);
Assert.False(vm.Slots[0].IsLocked);
Assert.False(vm.Slots[1].IsLocked);
Assert.True(vm.Slots[2].IsLocked);
Assert.True(vm.Slots[5].IsLocked);
Assert.False(vm.Slots[2].IsLocked);
Assert.False(vm.Slots[5].IsLocked);
Assert.True(vm.CanSave);
// Row 1: add a validated X handle. Save is blocked while input is unvalidated.
@@ -121,16 +119,15 @@ public class SocialsDialogViewModelTests
Assert.False(vm.Slots[1].IsEditing);
Assert.True(vm.CanSave);
// Rows 2-5 are locked on the free tier — starting an edit there is blocked.
// Rows 2-5 are available — starting an edit there works.
vm.StartEdit(2);
Assert.False(vm.Slots[2].IsEditing);
Assert.True(vm.Slots[2].IsLocked);
Assert.True(vm.Slots[2].IsEditing);
Assert.False(vm.Slots[2].IsLocked);
// Delete the X entry: the slot empties and unlocks nothing else.
// Delete the X entry: the slot empties.
await vm.DeleteSlotAsync(1);
Assert.False(vm.Slots[1].IsFilled);
Assert.False(vm.Slots[1].IsLocked);
Assert.True(vm.Slots[2].IsLocked);
// Delete row 0 while signed out is a no-op.
await vm.DeleteSlotAsync(0);
@@ -195,16 +192,12 @@ public class SocialsDialogViewModelTests
// ── Unit tests ──
[Fact]
public void Freemium_LocksSlotsBeyondTwo_PremiumUnlocksAll()
public void AllSlots_AlwaysUnlocked()
{
var free = Create();
Assert.True(free.Slots[2].IsLocked);
Assert.True(free.Slots[5].IsLocked);
Assert.False(free.Slots[1].IsLocked);
var premium = Create(isPremium: true);
Assert.All(premium.Slots, s => Assert.False(s.IsLocked));
Assert.False(premium.Slots[5].IsLocked);
var vm = Create();
Assert.All(vm.Slots, s => Assert.False(s.IsLocked));
Assert.False(vm.Slots[2].IsLocked);
Assert.False(vm.Slots[5].IsLocked);
}
[Fact]
@@ -268,7 +261,7 @@ public class SocialsDialogViewModelTests
Assert.Equal("Fresh Channel", vm.Slots[0].Handle);
Assert.Equal(SocialService.Twitch, vm.Slots[1].Service);
Assert.Equal("oldstreamer", vm.Slots[1].Handle);
Assert.True(vm.Slots[2].IsLocked);
Assert.False(vm.Slots[2].IsLocked);
vm.SaveCommand.Execute(null);
Assert.Equal(2, vm.CommittedEntries!.Count);