package projectinstance import ( "context" "testing" ) func TestTerminateInstance_UpdatesProjectLifecycle(t *testing.T) { ctx := context.Background() store := NewMemoryStore() _ = SeedProjectMeta(store, 300, LifecyclePlanning, "", 1, 0) svc := NewService(store, TestResolver(), nil, &StubDocChecker{States: map[string]string{"intake": "approved"}}) _, _ = svc.SaveWorkflowPlan(ctx, 300, 1, true, SavePlanInput{ Plan: ValidTestPlan(), ExpectedPlanRevision: 0, ExpectedSelectionVersion: 1, }) preview, _ := svc.ActivationPreview(ctx, 300, 1, true) activated, _ := svc.Activate(ctx, 300, 1, true, ActivateInput{ ConfirmationToken: preview.ConfirmationToken, ExpectedProjectVersion: preview.ExpectedProjectVersion, ExpectedPlanRevision: preview.ExpectedPlanRevision, }) pv, err := svc.GetTerminationPreview(ctx, activated.Instance.ID, 300, 1, true) if err != nil { t.Fatalf("GetTerminationPreview: %v", err) } if !pv.CanTerminate { t.Fatal("expected can terminate") } res, err := svc.TerminateInstance(ctx, activated.Instance.ID, 300, 1, true, TerminateInput{ Reason: "测试终止", Confirm: true, ExpectedConfigRevision: activated.Instance.ConfigRevision, }) if err != nil { t.Fatalf("TerminateInstance: %v", err) } if res.Instance.Status != "terminated" { t.Fatalf("expected terminated, got %q", res.Instance.Status) } lifecycle, activeKey, _, _, err := store.GetProjectMeta(ctx, 300) if err != nil { t.Fatalf("GetProjectMeta: %v", err) } if lifecycle != LifecyclePlanning || activeKey != "" { t.Fatalf("expected planning with empty key, got lifecycle=%q key=%q", lifecycle, activeKey) } }