package artifacts import ( "reflect" "testing" "gitea.maximumdirect.net/eric/narratio/internal/config" ) func TestCollectPreviousArtifactRequirements(t *testing.T) { tests := []struct { name string artifactsCfg map[string]config.ScriptoriumArtifactConfig want []PreviousArtifactRequirement }{ { name: "no artifacts", artifactsCfg: nil, want: nil, }, { name: "no previous inputs", artifactsCfg: map[string]config.ScriptoriumArtifactConfig{ "session_recap": { Enabled: true, Inputs: map[string]config.ScriptoriumInputConfig{ "transcript": {Source: "narratio.transcript.final_trimmed", Required: true}, }, }, }, want: nil, }, { name: "one optional previous input", artifactsCfg: map[string]config.ScriptoriumArtifactConfig{ "session_recap": { Enabled: true, Inputs: map[string]config.ScriptoriumInputConfig{ "previous_recap": {Source: "narratio.previous_session.artifact.session_recap", Required: false}, }, }, }, want: []PreviousArtifactRequirement{ { Name: "session_recap", Required: false, Sources: []string{"pipeline.scriptorium.artifacts.session_recap.inputs.previous_recap.source"}, }, }, }, { name: "one required previous input", artifactsCfg: map[string]config.ScriptoriumArtifactConfig{ "quest_log": { Enabled: true, Inputs: map[string]config.ScriptoriumInputConfig{ "previous_quest_log": {Source: "narratio.previous_session.artifact.quest_log", Required: true}, }, }, }, want: []PreviousArtifactRequirement{ { Name: "quest_log", Required: true, Sources: []string{"pipeline.scriptorium.artifacts.quest_log.inputs.previous_quest_log.source"}, }, }, }, { name: "duplicate references are deduped", artifactsCfg: map[string]config.ScriptoriumArtifactConfig{ "a": { Enabled: true, Inputs: map[string]config.ScriptoriumInputConfig{ "x": {Source: "narratio.previous_session.artifact.session_recap", Required: false}, }, }, "b": { Enabled: true, Inputs: map[string]config.ScriptoriumInputConfig{ "y": {Source: "narratio.previous_session.artifact.session_recap", Required: false}, }, }, }, want: []PreviousArtifactRequirement{ { Name: "session_recap", Required: false, Sources: []string{ "pipeline.scriptorium.artifacts.a.inputs.x.source", "pipeline.scriptorium.artifacts.b.inputs.y.source", }, }, }, }, { name: "required plus optional reference becomes required", artifactsCfg: map[string]config.ScriptoriumArtifactConfig{ "a": { Enabled: true, Inputs: map[string]config.ScriptoriumInputConfig{ "x": {Source: "narratio.previous_session.artifact.session_recap", Required: false}, }, }, "b": { Enabled: true, Inputs: map[string]config.ScriptoriumInputConfig{ "y": {Source: "narratio.previous_session.artifact.session_recap", Required: true}, }, }, }, want: []PreviousArtifactRequirement{ { Name: "session_recap", Required: true, Sources: []string{ "pipeline.scriptorium.artifacts.a.inputs.x.source", "pipeline.scriptorium.artifacts.b.inputs.y.source", }, }, }, }, { name: "disabled artifact references are ignored", artifactsCfg: map[string]config.ScriptoriumArtifactConfig{ "disabled_artifact": { Enabled: false, Inputs: map[string]config.ScriptoriumInputConfig{ "x": {Source: "narratio.previous_session.artifact.session_recap", Required: true}, }, }, "enabled_artifact": { Enabled: true, Inputs: map[string]config.ScriptoriumInputConfig{ "y": {Source: "narratio.previous_session.artifact.quest_log", Required: false}, }, }, }, want: []PreviousArtifactRequirement{ { Name: "quest_log", Required: false, Sources: []string{"pipeline.scriptorium.artifacts.enabled_artifact.inputs.y.source"}, }, }, }, { name: "deterministic ordering", artifactsCfg: map[string]config.ScriptoriumArtifactConfig{ "zz": { Enabled: true, Inputs: map[string]config.ScriptoriumInputConfig{ "b_input": {Source: "narratio.previous_session.artifact.quest_log", Required: false}, "a_input": {Source: "narratio.previous_session.artifact.session_recap", Required: false}, }, }, "aa": { Enabled: true, Inputs: map[string]config.ScriptoriumInputConfig{ "c_input": {Source: "narratio.previous_session.artifact.session_recap", Required: false}, }, }, }, want: []PreviousArtifactRequirement{ { Name: "quest_log", Required: false, Sources: []string{"pipeline.scriptorium.artifacts.zz.inputs.b_input.source"}, }, { Name: "session_recap", Required: false, Sources: []string{ "pipeline.scriptorium.artifacts.aa.inputs.c_input.source", "pipeline.scriptorium.artifacts.zz.inputs.a_input.source", }, }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { effective, err := ResolveEffectiveArtifactSet(ConfiguredArtifactDefinitions(tt.artifactsCfg), nil) if err != nil { t.Fatalf("ResolveEffectiveArtifactSet() error = %v", err) } got := CollectPreviousArtifactRequirements(tt.artifactsCfg, effective) if !reflect.DeepEqual(got, tt.want) { t.Fatalf("CollectPreviousArtifactRequirements() = %#v, want %#v", got, tt.want) } }) } }