package promptkit_test import ( "context" "fmt" "sync" "testing" "go.maximumdirect.net/configkit" "go.maximumdirect.net/promptkit" ) type independentArtifactReader struct{} func (independentArtifactReader) Read(_ context.Context, ref promptkit.ArtifactRef) (*promptkit.Artifact, error) { return &promptkit.Artifact{Body: []byte(ref.Body), Hash: ref.Body}, nil } func TestConcurrentPreparationWithTransferredArtifacts(t *testing.T) { input := configkit.Input{Source: configkit.Mapping("ownership", map[string]any{ "profiles": []any{map[string]any{"id": "profile", "endpoint": "https://example.invalid/v1", "model": "model"}}, "prompts": []any{map[string]any{"id": "prompt", "default_profile": "profile", "inputs": []any{map[string]any{"name": "document", "required": true}}, "messages": []any{map[string]any{"role": "user", "content": `{{input "document"}}`}}, "output": map[string]any{"format": "text", "validation_mode": "none"}}}, })} engine, err := promptkit.NewEngine(promptkit.Config{Sources: promptkit.ConfigurationSources{Main: &input}}, promptkit.WithArtifactReader(independentArtifactReader{})) if err != nil { t.Fatal(err) } var group sync.WaitGroup for i := range 24 { group.Go(func() { value := fmt.Sprintf("body-%d", i) prepared, err := engine.Prepare(context.Background(), promptkit.RunRequest{PromptID: "prompt", Inputs: map[string]promptkit.ArtifactRef{"document": promptkit.Inline(value)}}) if err != nil { t.Errorf("prepare: %v", err) return } if len(prepared.Messages) != 1 || prepared.Messages[0].Content != value || prepared.InputHashes["document"] != value { t.Errorf("prepared = %+v", prepared) } }) } group.Wait() }