@@ -217,10 +217,16 @@ func TestProjectInitKeyAlreadyInitialized(t *testing.T) {
217217 _ = runProjectInit (projectInitCmd , []string {})
218218}
219219
220- func TestProjectInitKeyNotFound (t * testing.T ) {
220+ func TestProjectInitKeyNotFound_UserDeclines (t * testing.T ) {
221221 capture := testutil .CaptureStdout ()
222222 defer capture .Restore ()
223223
224+ mock , err := testutil .MockStdin ("n\n " )
225+ if err != nil {
226+ t .Fatalf ("Failed to mock stdin: %v" , err )
227+ }
228+ defer mock .Restore ()
229+
224230 server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
225231 w .WriteHeader (http .StatusNotFound )
226232 w .Header ().Set ("Content-Type" , "application/json" )
@@ -231,14 +237,122 @@ func TestProjectInitKeyNotFound(t *testing.T) {
231237 setupTestEnvironment (t , server .URL )
232238
233239 projectPath = "test-org/non-existent"
234- err : = runProjectInit (projectInitCmd , []string {})
240+ err = runProjectInit (projectInitCmd , []string {})
235241 if err == nil {
236- t .Error ("Expected error for non-existent project" )
242+ t .Error ("Expected error when user declines to create project" )
237243 return
238244 }
239- if ! strings .Contains (err .Error (), "Failed to get project info" ) {
240- t .Errorf ("Expected specific error message, got: %v" , err )
245+ if ! strings .Contains (err .Error (), "Project creation cancelled" ) {
246+ t .Errorf ("Expected 'Project creation cancelled' error, got: %v" , err )
247+ }
248+ capture .AssertContains (t , "does not exist" )
249+ capture .AssertContains (t , "Would you like to create it?" )
250+ }
251+
252+ func TestProjectInitKeyNotFound_UserCreates (t * testing.T ) {
253+ capture := testutil .CaptureStdout ()
254+ defer capture .Restore ()
255+
256+ mock , err := testutil .MockStdin ("y\n " )
257+ if err != nil {
258+ t .Fatalf ("Failed to mock stdin: %v" , err )
259+ }
260+ defer mock .Restore ()
261+
262+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
263+ switch r .URL .Path {
264+ case "/api/v1/projects/test-org" :
265+ if r .Method == "POST" {
266+ var req types.CreateProjectRequest
267+ if err := json .NewDecoder (r .Body ).Decode (& req ); err != nil {
268+ t .Fatalf ("Failed to decode request: %v" , err )
269+ }
270+
271+ projectData := types.Project {
272+ ID : 1 ,
273+ Name : "New Project" ,
274+ Slug : "new-project" ,
275+ CompositeSlug : "test-org/new-project" ,
276+ Description : "" ,
277+ KeyInitialized : false ,
278+ KeyVersion : 0 ,
279+ Role : "Owner" ,
280+ Organization : struct {
281+ ID int `json:"id"`
282+ Name string `json:"name"`
283+ Slug string `json:"slug"`
284+ }{
285+ ID : 1 ,
286+ Name : "Test Org" ,
287+ Slug : "test-org" ,
288+ },
289+ }
290+
291+ response := map [string ]interface {}{
292+ "success" : true ,
293+ "message" : "Project created successfully" ,
294+ "data" : map [string ]interface {}{
295+ "project" : projectData ,
296+ },
297+ }
298+
299+ w .Header ().Set ("Content-Type" , "application/json" )
300+ w .WriteHeader (http .StatusCreated )
301+ json .NewEncoder (w ).Encode (response )
302+ return
303+ }
304+ case "/api/v1/projects/test-org/new-project" :
305+ if r .Method == "GET" {
306+ w .WriteHeader (http .StatusNotFound )
307+ w .Header ().Set ("Content-Type" , "application/json" )
308+ json .NewEncoder (w ).Encode (map [string ]string {"error" : "project not found" })
309+ return
310+ }
311+ case "/api/v1/projects/test-org/new-project/initialize" :
312+ if r .Method != "POST" {
313+ t .Errorf ("Expected POST, got %s" , r .Method )
314+ }
315+
316+ var req types.InitializeProjectKeyRequest
317+ if err := json .NewDecoder (r .Body ).Decode (& req ); err != nil {
318+ t .Fatalf ("Failed to decode request: %v" , err )
319+ }
320+
321+ if req .WrappedProjectKey == "" {
322+ t .Error ("Expected wrapped project key" )
323+ }
324+
325+ if _ , err := crypto .Decode (req .WrappedProjectKey ); err != nil {
326+ t .Errorf ("Invalid encoded wrapped key: %v" , err )
327+ }
328+
329+ response := map [string ]interface {}{
330+ "success" : true ,
331+ "message" : "Project key initialized successfully" ,
332+ }
333+ w .Header ().Set ("Content-Type" , "application/json" )
334+ json .NewEncoder (w ).Encode (response )
335+
336+ default :
337+ t .Errorf ("Unexpected request path: %s" , r .URL .Path )
338+ w .WriteHeader (http .StatusNotFound )
339+ }
340+ }))
341+ defer server .Close ()
342+
343+ setupTestEnvironment (t , server .URL )
344+
345+ projectPath = "test-org/new-project"
346+ err = runProjectInit (projectInitCmd , []string {})
347+ if err != nil {
348+ t .Fatalf ("runProjectInit failed: %v" , err )
241349 }
350+
351+ capture .AssertContains (t , "does not exist" )
352+ capture .AssertContains (t , "Would you like to create it?" )
353+ capture .AssertContains (t , "Creating project" )
354+ capture .AssertContains (t , "created successfully" )
355+ capture .AssertContains (t , "initialized successfully" )
242356}
243357
244358func setupTestEnvironment (t * testing.T , serverURL string ) {
0 commit comments