KI-Unterstützung: neuer Einstellungen-Tab (Anmeldung, Guthaben) und Button im Planungs-Tab, der Einheiten+Stunden als JSON an ein neues PHP-Backend (ai-backend/) sendet und die Antwort als prüfbare Vorschlagsliste zurückbringt. Provider-Aufruf, Guthabenverwaltung und Abrechnung nach echten Token-Kosten laufen serverseitig, der Desktop-Client sieht nie einen LLM-API-Key. Zentral abgesichert: eine von der KI zurückgegebene Stunden-Id, die zu keiner echten Lesson der Einheit passt, wird nie als Update übernommen, sondern immer als neue Stunde behandelt. Kompetenzkatalog-Import (8.1.2): JSON-Export/Import für Kompetenzkataloge.
74 lines
2.0 KiB
C#
74 lines
2.0 KiB
C#
using LehrerApp.Desktop.Services;
|
|
using Xunit;
|
|
|
|
namespace LehrerApp.Desktop.Tests;
|
|
|
|
public sealed class AiSettingsServiceTests
|
|
{
|
|
private static string BuildTempPath()
|
|
{
|
|
var path = Path.Combine(Path.GetTempPath(), $"lehrerapp-aisettingssvc-tests-{Guid.NewGuid():N}");
|
|
Directory.CreateDirectory(path);
|
|
return path;
|
|
}
|
|
|
|
[Fact]
|
|
public void SetEnabled_PersistiertUeberNeueInstanz()
|
|
{
|
|
var path = BuildTempPath();
|
|
new AiSettingsService(path).SetEnabled(true);
|
|
|
|
var reloaded = new AiSettingsService(path);
|
|
|
|
Assert.True(reloaded.Enabled);
|
|
}
|
|
|
|
[Fact]
|
|
public void SetCredentialsAndToken_TokenIstVerschluesseltAbrufbar()
|
|
{
|
|
var service = new AiSettingsService(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 AiSettingsService(path).SetCredentialsAndToken("sebastian", "token-abc");
|
|
|
|
var reloaded = new AiSettingsService(path);
|
|
|
|
Assert.True(reloaded.IsLoggedIn);
|
|
Assert.Equal("token-abc", reloaded.GetToken());
|
|
}
|
|
|
|
[Fact]
|
|
public void TokenDateiEnthaeltNichtDenKlartext()
|
|
{
|
|
var path = BuildTempPath();
|
|
var service = new AiSettingsService(path);
|
|
service.SetCredentialsAndToken("sebastian", "geheimes-token-123");
|
|
|
|
var raw = File.ReadAllText(Path.Combine(path, "ai-settings.json"));
|
|
|
|
Assert.DoesNotContain("geheimes-token-123", raw);
|
|
}
|
|
|
|
[Fact]
|
|
public void Logout_EntferntToken()
|
|
{
|
|
var service = new AiSettingsService(BuildTempPath());
|
|
service.SetCredentialsAndToken("sebastian", "token-abc");
|
|
|
|
service.Logout();
|
|
|
|
Assert.False(service.IsLoggedIn);
|
|
Assert.Null(service.GetToken());
|
|
}
|
|
}
|