Nach einem Login mit korrigierter Groß-/Kleinschreibung (siehe vorheriger Fix zur userId- Stabilität) bezog sich die lokale Versionsverfolgung je Entität (BasedOnServerSeq-Cache) und der Pull-Cursor weiterhin auf das alte Konto - ServerSeq-Werte sind aber nur innerhalb des Event-Logs EINES Kontos gültig. Der Push wurde zu Recht abgelehnt, der Server kannte die Entität unter der neuen userId aber gar nicht (404 beim Nachladen), und HandleRejectedAsync gab bei einem 404 bisher einfach auf, ohne den veralteten Cache-Eintrag zu bereinigen - derselbe Fehlschlag bei jedem weiteren Sync-Versuch. Dreiteiliger Fix: (1) ein 404 beim Nachladen löscht jetzt den stale Cache-Eintrag, sodass der nächste Push die Entität korrekt als neu behandelt und selbstheilend durchgeht; (2) der "Vollständigen Sync erzwingen"-Button setzt jetzt auch die Push-Versionsverfolgung zurück, nicht nur den Pull-Cursor; (3) SyncLogin erkennt einen echten Kontowechsel künftig proaktiv anhand der kanonischen userId aus der Server-Antwort und resettet automatisch, bevor der Folgefehler überhaupt auftreten kann. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
99 lines
3.0 KiB
C#
99 lines
3.0 KiB
C#
using LehrerApp.Desktop.Services;
|
|
using Xunit;
|
|
|
|
namespace LehrerApp.Desktop.Tests;
|
|
|
|
public sealed class SyncSettingsServiceTests
|
|
{
|
|
private static string BuildTempPath()
|
|
{
|
|
var path = Path.Combine(Path.GetTempPath(), $"lehrerapp-syncsettingssvc-tests-{Guid.NewGuid():N}");
|
|
Directory.CreateDirectory(path);
|
|
return path;
|
|
}
|
|
|
|
[Fact]
|
|
public void SetServerUrl_PersistiertUeberNeueInstanz()
|
|
{
|
|
var path = BuildTempPath();
|
|
new SyncSettingsService(path).SetServerUrl("https://sync.example.com");
|
|
|
|
var reloaded = new SyncSettingsService(path);
|
|
|
|
Assert.Equal("https://sync.example.com", reloaded.ServerUrl);
|
|
}
|
|
|
|
[Fact]
|
|
public void SetCredentialsAndToken_TokenIstVerschluesseltAbrufbar()
|
|
{
|
|
var service = new SyncSettingsService(BuildTempPath());
|
|
|
|
service.SetCredentialsAndToken("sebastian", "geheimes-token-123");
|
|
|
|
Assert.True(service.IsLoggedIn);
|
|
Assert.Equal("sebastian", service.Username);
|
|
Assert.Equal("geheimes-token-123", service.GetToken());
|
|
}
|
|
|
|
[Fact]
|
|
public void Token_UeberlebtNeueInstanzMitDemselbenPfad()
|
|
{
|
|
var path = BuildTempPath();
|
|
new SyncSettingsService(path).SetCredentialsAndToken("sebastian", "token-abc");
|
|
|
|
var reloaded = new SyncSettingsService(path);
|
|
|
|
Assert.True(reloaded.IsLoggedIn);
|
|
Assert.Equal("token-abc", reloaded.GetToken());
|
|
}
|
|
|
|
[Fact]
|
|
public void TokenDateiEnthaeltNichtDenKlartext()
|
|
{
|
|
var path = BuildTempPath();
|
|
var service = new SyncSettingsService(path);
|
|
service.SetCredentialsAndToken("sebastian", "geheimes-token-123");
|
|
|
|
var raw = File.ReadAllText(Path.Combine(path, "sync-settings.json"));
|
|
|
|
Assert.DoesNotContain("geheimes-token-123", raw);
|
|
}
|
|
|
|
[Fact]
|
|
public void SetCredentialsAndToken_MitUserId_PersistiertLastUserIdUeberNeueInstanz()
|
|
{
|
|
var path = BuildTempPath();
|
|
new SyncSettingsService(path).SetCredentialsAndToken("Sebastian", "token-abc", "sebastian");
|
|
|
|
var reloaded = new SyncSettingsService(path);
|
|
|
|
Assert.Equal("sebastian", reloaded.LastUserId);
|
|
}
|
|
|
|
[Fact]
|
|
public void SetCredentialsAndToken_OhneUserId_LaesstVorhandeneLastUserIdUnveraendert()
|
|
{
|
|
var service = new SyncSettingsService(BuildTempPath());
|
|
service.SetCredentialsAndToken("sebastian", "token-1", "sebastian");
|
|
|
|
service.SetCredentialsAndToken("sebastian", "token-2");
|
|
|
|
Assert.Equal("sebastian", service.LastUserId);
|
|
}
|
|
|
|
[Fact]
|
|
public void Logout_EntferntTokenBehaeltAberServerUrlUndUsername()
|
|
{
|
|
var service = new SyncSettingsService(BuildTempPath());
|
|
service.SetServerUrl("https://sync.example.com");
|
|
service.SetCredentialsAndToken("sebastian", "token-abc");
|
|
|
|
service.Logout();
|
|
|
|
Assert.False(service.IsLoggedIn);
|
|
Assert.Null(service.GetToken());
|
|
Assert.Equal("https://sync.example.com", service.ServerUrl);
|
|
Assert.Equal("sebastian", service.Username);
|
|
}
|
|
}
|