@@ -21,6 +21,9 @@ func TestBuildConfigDefaultsToMemoryStore(t *testing.T) {
2121 if cfg .StoreFile != "" {
2222 t .Fatalf ("StoreFile = %q, want empty" , cfg .StoreFile )
2323 }
24+ if cfg .RunnerProfile != "" {
25+ t .Fatalf ("RunnerProfile = %q, want empty" , cfg .RunnerProfile )
26+ }
2427 if cfg .RunnerCommand != "" {
2528 t .Fatalf ("RunnerCommand = %q, want empty" , cfg .RunnerCommand )
2629 }
@@ -70,6 +73,85 @@ func TestBuildConfigParsesStoreFile(t *testing.T) {
7073 }
7174}
7275
76+ func TestBuildConfigAppliesRunnerProfilePreset (t * testing.T ) {
77+ cfg , err := buildConfig ([]string {"--runner-profile" , "agenthub-runner-mock" })
78+ if err != nil {
79+ t .Fatalf ("buildConfig returned error: %v" , err )
80+ }
81+
82+ if cfg .RunnerProfile != "agenthub-runner-mock" {
83+ t .Fatalf ("RunnerProfile = %q, want preset name" , cfg .RunnerProfile )
84+ }
85+ if cfg .RunnerCommand != "agenthub-runner" {
86+ t .Fatalf ("RunnerCommand = %q, want preset command" , cfg .RunnerCommand )
87+ }
88+ if got , want := []string (cfg .RunnerArgs ), []string {"--mock" }; strings .Join (got , "\x00 " ) != strings .Join (want , "\x00 " ) {
89+ t .Fatalf ("RunnerArgs = %#v, want %#v" , got , want )
90+ }
91+ }
92+
93+ func TestBuildConfigRunnerProfileAllowsCommandOverride (t * testing.T ) {
94+ cfg , err := buildConfig ([]string {
95+ "--runner-profile" , "agenthub-runner-mock" ,
96+ "--runner-command" , "custom-runner" ,
97+ })
98+ if err != nil {
99+ t .Fatalf ("buildConfig returned error: %v" , err )
100+ }
101+
102+ if cfg .RunnerCommand != "custom-runner" {
103+ t .Fatalf ("RunnerCommand = %q, want custom command" , cfg .RunnerCommand )
104+ }
105+ if got , want := []string (cfg .RunnerArgs ), []string {"--mock" }; strings .Join (got , "\x00 " ) != strings .Join (want , "\x00 " ) {
106+ t .Fatalf ("RunnerArgs = %#v, want %#v" , got , want )
107+ }
108+ }
109+
110+ func TestBuildConfigRunnerProfilePreservesUserArgOrder (t * testing.T ) {
111+ cfg , err := buildConfig ([]string {
112+ "--runner-profile" , "agenthub-runner-mock" ,
113+ "--runner-arg" , "--addr=127.0.0.1:0" ,
114+ })
115+ if err != nil {
116+ t .Fatalf ("buildConfig returned error: %v" , err )
117+ }
118+
119+ if got , want := []string (cfg .RunnerArgs ), []string {"--mock" , "--addr=127.0.0.1:0" }; strings .Join (got , "\x00 " ) != strings .Join (want , "\x00 " ) {
120+ t .Fatalf ("RunnerArgs = %#v, want %#v" , got , want )
121+ }
122+ }
123+
124+ func TestBuildConfigRunnerProfileValidatesUserEnvTemplate (t * testing.T ) {
125+ cfg , err := buildConfig ([]string {
126+ "--runner-profile" , "agenthub-runner-mock" ,
127+ "--runner-env" , "PROFILE_RUN={{run.id}}" ,
128+ })
129+ if err != nil {
130+ t .Fatalf ("buildConfig returned error: %v" , err )
131+ }
132+
133+ if got , want := []string (cfg .RunnerEnv ), []string {"PROFILE_RUN={{run.id}}" }; strings .Join (got , "\x00 " ) != strings .Join (want , "\x00 " ) {
134+ t .Fatalf ("RunnerEnv = %#v, want %#v" , got , want )
135+ }
136+ }
137+
138+ func TestBuildConfigRunnerProfileRejectsInvalidUserEnvTemplate (t * testing.T ) {
139+ _ , err := buildConfig ([]string {
140+ "--runner-profile" , "agenthub-runner-mock" ,
141+ "--runner-env" , "BAD={{unknown}}" ,
142+ })
143+ if err == nil || ! strings .Contains (err .Error (), "--runner-env" ) || ! strings .Contains (err .Error (), "unknown placeholder" ) {
144+ t .Fatalf ("buildConfig error = %v, want runner env unknown placeholder error" , err )
145+ }
146+ }
147+
148+ func TestBuildConfigRejectsUnknownRunnerProfile (t * testing.T ) {
149+ _ , err := buildConfig ([]string {"--runner-profile" , "missing-profile" })
150+ if err == nil || ! strings .Contains (err .Error (), "unknown --runner-profile" ) {
151+ t .Fatalf ("buildConfig error = %v, want unknown runner profile error" , err )
152+ }
153+ }
154+
73155func TestBuildConfigRejectsUnexpectedArguments (t * testing.T ) {
74156 _ , err := buildConfig ([]string {"unexpected" })
75157 if err == nil || ! strings .Contains (err .Error (), "unexpected positional arguments" ) {
0 commit comments