@@ -2,6 +2,7 @@ package services
22
33import (
44 "context"
5+ "encoding/json"
56 "testing"
67
78 "github.com/monkeycode/mysql-ops-platform/internal/models"
@@ -311,6 +312,81 @@ func TestExecuteClusterDeployPlan_RejectsRealMode(t *testing.T) {
311312 require .Contains (t , err .Error (), "only supports pseudo" )
312313}
313314
315+ func TestGetDeployPlan_ReturnsDeserializedPlan (t * testing.T ) {
316+ ctx := context .Background ()
317+ db := newTestDB ()
318+ clusterRepo := repositories .NewClusterDeployRepository (db )
319+ service := NewClusterDeployService (clusterRepo , nil , nil , nil , nil , config.ClusterDefaults {})
320+
321+ // Create a deployment with plan_json populated
322+ plan := & ClusterDeployPlan {
323+ DeploymentID : "plan-test-001" ,
324+ ClusterType : "ha" ,
325+ Mode : "pseudo" ,
326+ Nodes : []PlanNode {
327+ {ID : "node-1" , Host : "10.0.0.11" , MySQLPort : 3306 , Role : "master" , AgentPort : 9090 , ServerID : 1 },
328+ {ID : "node-2" , Host : "10.0.0.12" , MySQLPort : 3307 , Role : "replica" , AgentPort : 9090 , ServerID : 2 },
329+ },
330+ Steps : []PlanStep {
331+ {ID : "step-1" , Name : "validate_input" , Type : "validate" , TargetNode : "" },
332+ {ID : "step-2" , Name : "deploy_master" , Type : "bootstrap" , TargetNode : "node-1" },
333+ {ID : "step-3" , Name : "deploy_replica" , Type : "join" , TargetNode : "node-2" },
334+ {ID : "step-4" , Name : "verify" , Type : "verify" , TargetNode : "" },
335+ },
336+ }
337+ planJSON := mustMarshalJSON (plan )
338+
339+ require .NoError (t , clusterRepo .Create (ctx , & models.ClusterDeployment {
340+ ID : "plan-test-001" ,
341+ ClusterType : "ha" ,
342+ Name : "plan-test-001" ,
343+ Status : "completed" ,
344+ PlanJSON : planJSON ,
345+ }))
346+
347+ // Call GetDeployPlan
348+ result , err := service .GetDeployPlan (ctx , "plan-test-001" )
349+ require .NoError (t , err )
350+ require .Equal (t , "plan-test-001" , result .DeploymentID )
351+ require .Equal (t , "ha" , result .ClusterType )
352+ require .Len (t , result .Nodes , 2 )
353+ require .Equal (t , "10.0.0.11" , result .Nodes [0 ].Host )
354+ require .Equal (t , "master" , result .Nodes [0 ].Role )
355+ require .Equal (t , 1 , result .Nodes [0 ].ServerID )
356+ require .Equal (t , "10.0.0.12" , result .Nodes [1 ].Host )
357+ require .Equal (t , 2 , result .Nodes [1 ].ServerID )
358+ require .Len (t , result .Steps , 4 )
359+ require .Equal (t , "validate_input" , result .Steps [0 ].Name )
360+ require .Equal (t , "deploy_master" , result .Steps [1 ].Name )
361+ }
362+
363+ func TestGetDeployPlan_ReturnsErrorWhenEmpty (t * testing.T ) {
364+ ctx := context .Background ()
365+ db := newTestDB ()
366+ clusterRepo := repositories .NewClusterDeployRepository (db )
367+ service := NewClusterDeployService (clusterRepo , nil , nil , nil , nil , config.ClusterDefaults {})
368+
369+ require .NoError (t , clusterRepo .Create (ctx , & models.ClusterDeployment {
370+ ID : "plan-test-empty" ,
371+ ClusterType : "ha" ,
372+ Name : "plan-test-empty" ,
373+ Status : "pending" ,
374+ PlanJSON : "" ,
375+ }))
376+
377+ _ , err := service .GetDeployPlan (ctx , "plan-test-empty" )
378+ require .Error (t , err )
379+ require .Contains (t , err .Error (), "no plan found" )
380+ }
381+
382+ func mustMarshalJSON (v interface {}) string {
383+ data , err := json .Marshal (v )
384+ if err != nil {
385+ panic (err )
386+ }
387+ return string (data )
388+ }
389+
314390func stepIDs (steps []PlanStep ) []string {
315391 out := make ([]string , 0 , len (steps ))
316392 for _ , step := range steps {
0 commit comments