Replaced the anonymous JSON shapes of the Visual Briefing assistant with records

This commit is contained in:
Thorsten Sommer committed 2026-11-03 08:29:50 +01:00
1 parent 8dd208d6e6
commit fc3dc57e60
27 files changed
+409 -219

No files matched your search

@@ -0,0 +1 @@
{"slots":{"overview-title":"Text of overview-title, with Gr\u00F6\u00DFe and \u20AC","overview-summary":"Text of overview-summary, with Gr\u00F6\u00DFe and \u20AC","chart-line-title":"Text of chart-line-title, with Gr\u00F6\u00DFe and \u20AC","chart-line-caption":"Text of chart-line-caption, with Gr\u00F6\u00DFe and \u20AC","chart-area-title":"Text of chart-area-title, with Gr\u00F6\u00DFe and \u20AC","chart-area-caption":"Text of chart-area-caption, with Gr\u00F6\u00DFe and \u20AC","chart-bar-title":"Text of chart-bar-title, with Gr\u00F6\u00DFe and \u20AC","chart-bar-caption":"Text of chart-bar-caption, with Gr\u00F6\u00DFe and \u20AC","chart-stacked_bar-title":"Text of chart-stacked_bar-title, with Gr\u00F6\u00DFe and \u20AC","chart-stacked_bar-caption":"Text of chart-stacked_bar-caption, with Gr\u00F6\u00DFe and \u20AC","chart-scatter-title":"Text of chart-scatter-title, with Gr\u00F6\u00DFe and \u20AC","chart-scatter-caption":"Text of chart-scatter-caption, with Gr\u00F6\u00DFe and \u20AC","chart-pie-title":"Text of chart-pie-title, with Gr\u00F6\u00DFe and \u20AC","chart-pie-caption":"Text of chart-pie-caption, with Gr\u00F6\u00DFe and \u20AC","chart-donut-title":"Text of chart-donut-title, with Gr\u00F6\u00DFe and \u20AC","chart-donut-caption":"Text of chart-donut-caption, with Gr\u00F6\u00DFe and \u20AC","chart-radar-title":"Text of chart-radar-title, with Gr\u00F6\u00DFe and \u20AC","chart-radar-caption":"Text of chart-radar-caption, with Gr\u00F6\u00DFe and \u20AC","simulation-title":"Text of simulation-title, with Gr\u00F6\u00DFe and \u20AC","simulation-summary":"Text of simulation-summary, with Gr\u00F6\u00DFe and \u20AC","simulation-result":"Text of simulation-result, with Gr\u00F6\u00DFe and \u20AC"},"charts":[{"componentId":"chart-line","kind":"LINE","categories":["Q1","Q2","Q3"],"series":[{"name":"Revenue","values":[12.5,14,9.75]},{"name":"Costs","values":[8,7.25,10]}]},{"componentId":"chart-area","kind":"AREA","categories":["Q1","Q2","Q3"],"series":[{"name":"Revenue","values":[12.5,14,9.75]},{"name":"Costs","values":[8,7.25,10]}]},{"componentId":"chart-bar","kind":"BAR","categories":["Q1","Q2","Q3"],"series":[{"name":"Revenue","values":[12.5,14,9.75]},{"name":"Costs","values":[8,7.25,10]}]},{"componentId":"chart-stacked_bar","kind":"STACKED_BAR","categories":["Q1","Q2","Q3"],"series":[{"name":"Revenue","values":[12.5,14,9.75]},{"name":"Costs","values":[8,7.25,10]}]},{"componentId":"chart-scatter","kind":"SCATTER","categories":["Q1","Q2","Q3"],"series":[{"name":"Revenue","values":[12.5,14,9.75]},{"name":"Costs","values":[8,7.25,10]}]},{"componentId":"chart-pie","kind":"PIE","categories":["Q1","Q2","Q3"],"series":[{"name":"Revenue","values":[12.5,14,9.75]},{"name":"Costs","values":[8,7.25,10]}]},{"componentId":"chart-donut","kind":"DONUT","categories":["Q1","Q2","Q3"],"series":[{"name":"Revenue","values":[12.5,14,9.75]},{"name":"Costs","values":[8,7.25,10]}]},{"componentId":"chart-radar","kind":"RADAR","categories":["Q1","Q2","Q3"],"series":[{"name":"Revenue","values":[12.5,14,9.75]},{"name":"Costs","values":[8,7.25,10]}]}],"controls":[{"controlId":"growth","componentId":"simulation","kind":"RANGE","initialValue":3,"options":[]},{"controlId":"scenario","componentId":"simulation","kind":"SELECT","initialValue":"base","options":[{"value":"base","label":"Base case"},{"value":"high","label":"Gr\u00F6\u00DFeres Wachstum"}]}],"formulas":[{"componentId":"simulation","outputSlotId":"simulation-result","formula":{"formulaVersion":1,"op":"multiply","args":[{"path":"interactions.state.growth"},{"value":2}]}}],"accessibility":{"chart-line":"Revenue rises in Q2 and falls in Q3.","simulation":"The growth changes the result."},"sourceReferences":{"chart-line":["S1","S2"]},"labels":{"reset":"Zur\u00FCcksetzen","brand":"MindWork AI Studio"}}
@@ -0,0 +1 @@
{"name":"name sample 3","author":"author sample 4","settings":{"providerId":"providerId sample 7","modelId":"modelId sample 8","profileId":"profileId sample 9","targetLanguage":1,"customTargetLanguage":"customTargetLanguage sample 10","audienceProfile":1,"audienceAgeGroup":1,"audienceOrganizationalLevel":1,"audienceExpertise":1,"showSourceReferences":true,"optimizeImages":true,"instruction":"instruction sample 11","protectionLevel":"INTERNAL","customProtectionLevel":"customProtectionLevel sample 12"},"sources":[{"path":"/samples/path-17.txt","kind":"VISUAL_ASSET"},{"path":"/samples/path-22.txt","kind":"VISUAL_ASSET"}]}
@@ -0,0 +1 @@
{"schemaVersion":2,"runtimeVersion":1,"aiStudioVersion":"validation","assets":{"assetId sample 48":"data:image/png;base64,AA==","assetId sample 51":"data:image/png;base64,AA=="},"footer":{"createdWith":"validation","models":"validation","createdAt":"validation","authors":"validation","protection":"validation"}}
@@ -0,0 +1,47 @@
using System.Text.Json;
using AIStudio.Assistants.VisualBriefing;
namespace AIStudio.Tests.Serialization;
/// <summary>
/// Checks that the records of the Visual Briefing assistant write the same JSON as the anonymous shapes they replaced.
/// </summary>
/// <remarks>
/// The files in the folder Fixtures were written by the anonymous shapes themselves, before the records existed. The
/// content data and the protected data for the validation reach the HTML of a briefing, and the fingerprint of the
/// editor decides whether a briefing gets saved: a field under another name or in another place changes all three.
/// </remarks>
[TestFixture]
public sealed class VisualBriefingShapeTests
{
[Test]
public void TheContentDataGetsWrittenAsBefore()
{
var data = JsonSerializer.SerializeToElement(VisualBriefingContentData.Of(VisualBriefingSamples.Content()), VisualBriefingJson.Canonical);
Assert.That(data.GetRawText(), Is.EqualTo(JsonGoldenFileTests.ReadFixture("visual-briefing-content-data.json")));
}
[Test]
public void TheProtectedDataForTheValidationGetsWrittenAsBefore()
{
var evidence = Read<VisualBriefingEvidenceArtifact>("visual-briefing-evidence-artifact.json");
var data = JsonSerializer.SerializeToElement(VisualBriefingProtectedData.ForValidation(evidence.AssetPlan), VisualBriefingJson.Canonical);
Assert.That(data.GetRawText(), Is.EqualTo(JsonGoldenFileTests.ReadFixture("visual-briefing-validation-protected-data.json")));
}
[Test]
public void TheFingerprintOfTheEditorGetsWrittenAsBefore()
{
var manifest = Read<VisualBriefingManifest>("visual-briefing-manifest.json");
var fingerprint = new VisualBriefingPersistenceFingerprint(
manifest.Name,
manifest.Author,
manifest.Settings,
[.. manifest.Sources.Select(source => new VisualBriefingSourceFingerprint(source.Path, source.Kind))]);
Assert.That(JsonSerializer.Serialize(fingerprint, VisualBriefingJson.Canonical), Is.EqualTo(JsonGoldenFileTests.ReadFixture("visual-briefing-persistence-fingerprint.json")));
}
private static T Read<T>(string fileName) => JsonSerializer.Deserialize<T>(JsonGoldenFileTests.ReadFixture(fileName), VisualBriefingJson.Persistence)!;
}