11package validation
22
33import (
4+ "io"
5+ "os"
6+ "strings"
47 "testing"
58
69 "github.com/buildkite/cli/v3/internal/config"
@@ -52,6 +55,29 @@ func TestValidateConfiguration_MissingValues(t *testing.T) {
5255 t .Fatalf ("expected no error when token and org are set, got %v" , err )
5356 }
5457 })
58+
59+ t .Run ("missing org warning is written to stderr" , func (t * testing.T ) {
60+ t .Setenv ("BUILDKITE_API_TOKEN" , "token" )
61+ t .Setenv ("BUILDKITE_ORGANIZATION_SLUG" , "" )
62+ conf := newTestConfig (t )
63+
64+ var validationErr error
65+ stdout , stderr := captureStandardStreams (t , func () {
66+ validationErr = ValidateConfiguration (conf , "pipeline view" )
67+ })
68+
69+ if validationErr != nil {
70+ t .Fatalf ("expected no error when only org is missing, got %v" , validationErr )
71+ }
72+
73+ if stdout != "" {
74+ t .Fatalf ("expected stdout to remain empty, got %q" , stdout )
75+ }
76+
77+ if ! strings .Contains (stderr , "Warning: no organization set" ) {
78+ t .Fatalf ("expected stderr warning, got %q" , stderr )
79+ }
80+ })
5581}
5682
5783func newTestConfig (t * testing.T ) * config.Config {
@@ -61,3 +87,54 @@ func newTestConfig(t *testing.T) *config.Config {
6187 bkKeyring .MockForTesting ()
6288 return config .New (nil , nil )
6389}
90+
91+ func captureStandardStreams (t * testing.T , fn func ()) (stdout , stderr string ) {
92+ t .Helper ()
93+
94+ oldStdout := os .Stdout
95+ oldStderr := os .Stderr
96+
97+ stdoutR , stdoutW , err := os .Pipe ()
98+ if err != nil {
99+ t .Fatalf ("os.Pipe() stdout error = %v" , err )
100+ }
101+ stderrR , stderrW , err := os .Pipe ()
102+ if err != nil {
103+ t .Fatalf ("os.Pipe() stderr error = %v" , err )
104+ }
105+
106+ os .Stdout = stdoutW
107+ os .Stderr = stderrW
108+
109+ defer func () {
110+ os .Stdout = oldStdout
111+ os .Stderr = oldStderr
112+ }()
113+
114+ fn ()
115+
116+ if err := stdoutW .Close (); err != nil {
117+ t .Fatalf ("stdout close error = %v" , err )
118+ }
119+ if err := stderrW .Close (); err != nil {
120+ t .Fatalf ("stderr close error = %v" , err )
121+ }
122+
123+ stdoutBytes , err := io .ReadAll (stdoutR )
124+ if err != nil {
125+ t .Fatalf ("stdout read error = %v" , err )
126+ }
127+ stderrBytes , err := io .ReadAll (stderrR )
128+ if err != nil {
129+ t .Fatalf ("stderr read error = %v" , err )
130+ }
131+
132+ if err := stdoutR .Close (); err != nil {
133+ t .Fatalf ("stdout reader close error = %v" , err )
134+ }
135+ if err := stderrR .Close (); err != nil {
136+ t .Fatalf ("stderr reader close error = %v" , err )
137+ }
138+
139+ return string (stdoutBytes ), string (stderrBytes )
140+ }
0 commit comments