···
+
"tangled.org/core/api/tangled"
+
"tangled.org/core/workflow"
+
func TestGetCloneInfo_PushTrigger(t *testing.T) {
+
Workflow: tangled.Pipeline_Workflow{
+
Clone: &tangled.Pipeline_CloneOpts{
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
+
Kind: string(workflow.TriggerKindPush),
+
Push: &tangled.Pipeline_PushTriggerData{
+
Ref: "refs/heads/main",
+
Repo: &tangled.Pipeline_TriggerRepo{
+
Did: "did:plc:user123",
+
WorkspaceDir: "/tangled/workspace",
+
info, err := GetCloneInfo(cfg)
+
t.Fatalf("GetCloneInfo failed: %v", err)
+
t.Error("Expected Skip to be false")
+
if info.CommitSHA != "abc123" {
+
t.Errorf("Expected CommitSHA 'abc123', got '%s'", info.CommitSHA)
+
expectedURL := "https://example.com/did:plc:user123/my-repo"
+
if info.RepoURL != expectedURL {
+
t.Errorf("Expected RepoURL '%s', got '%s'", expectedURL, info.RepoURL)
+
if len(info.Commands) != 5 {
+
t.Errorf("Expected 5 commands, got %d", len(info.Commands))
+
// Verify commands contain expected git operations
+
allCmds := strings.Join(info.Commands, " ")
+
if !strings.Contains(allCmds, "git init") {
+
t.Error("Commands should contain 'git init'")
+
if !strings.Contains(allCmds, "git remote add origin") {
+
t.Error("Commands should contain 'git remote add origin'")
+
if !strings.Contains(allCmds, "git fetch") {
+
t.Error("Commands should contain 'git fetch'")
+
if !strings.Contains(allCmds, "abc123") {
+
t.Error("Commands should contain commit SHA")
+
if !strings.Contains(allCmds, "git checkout FETCH_HEAD") {
+
t.Error("Commands should contain 'git checkout FETCH_HEAD'")
+
func TestGetCloneInfo_PullRequestTrigger(t *testing.T) {
+
Workflow: tangled.Pipeline_Workflow{
+
Clone: &tangled.Pipeline_CloneOpts{
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
+
Kind: string(workflow.TriggerKindPullRequest),
+
PullRequest: &tangled.Pipeline_PullRequestTriggerData{
+
SourceSha: "pr-sha-789",
+
SourceBranch: "feature-branch",
+
Repo: &tangled.Pipeline_TriggerRepo{
+
Did: "did:plc:user123",
+
WorkspaceDir: "/tangled/workspace",
+
info, err := GetCloneInfo(cfg)
+
t.Fatalf("GetCloneInfo failed: %v", err)
+
if info.CommitSHA != "pr-sha-789" {
+
t.Errorf("Expected CommitSHA 'pr-sha-789', got '%s'", info.CommitSHA)
+
allCmds := strings.Join(info.Commands, " ")
+
if !strings.Contains(allCmds, "pr-sha-789") {
+
t.Error("Commands should contain PR commit SHA")
+
func TestGetCloneInfo_ManualTrigger(t *testing.T) {
+
Workflow: tangled.Pipeline_Workflow{
+
Clone: &tangled.Pipeline_CloneOpts{
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
+
Kind: string(workflow.TriggerKindManual),
+
Manual: &tangled.Pipeline_ManualTriggerData{
+
Repo: &tangled.Pipeline_TriggerRepo{
+
Did: "did:plc:user123",
+
WorkspaceDir: "/tangled/workspace",
+
info, err := GetCloneInfo(cfg)
+
t.Fatalf("GetCloneInfo failed: %v", err)
+
// Manual triggers don't have a SHA yet (TODO)
+
if info.CommitSHA != "" {
+
t.Errorf("Expected empty CommitSHA for manual trigger, got '%s'", info.CommitSHA)
+
func TestGetCloneInfo_SkipFlag(t *testing.T) {
+
Workflow: tangled.Pipeline_Workflow{
+
Clone: &tangled.Pipeline_CloneOpts{
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
+
Kind: string(workflow.TriggerKindPush),
+
Push: &tangled.Pipeline_PushTriggerData{
+
Repo: &tangled.Pipeline_TriggerRepo{
+
Did: "did:plc:user123",
+
info, err := GetCloneInfo(cfg)
+
t.Fatalf("GetCloneInfo failed: %v", err)
+
t.Error("Expected Skip to be true")
+
if len(info.Commands) != 0 {
+
t.Errorf("Expected no commands when Skip is true, got %d commands", len(info.Commands))
+
func TestGetCloneInfo_DevMode(t *testing.T) {
+
Workflow: tangled.Pipeline_Workflow{
+
Clone: &tangled.Pipeline_CloneOpts{
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
+
Kind: string(workflow.TriggerKindPush),
+
Push: &tangled.Pipeline_PushTriggerData{
+
Repo: &tangled.Pipeline_TriggerRepo{
+
Knot: "localhost:3000",
+
Did: "did:plc:user123",
+
WorkspaceDir: "/tangled/workspace",
+
info, err := GetCloneInfo(cfg)
+
t.Fatalf("GetCloneInfo failed: %v", err)
+
// In dev mode, should use http:// and replace localhost with host.docker.internal
+
expectedURL := "http://host.docker.internal:3000/did:plc:user123/my-repo"
+
if info.RepoURL != expectedURL {
+
t.Errorf("Expected dev mode URL '%s', got '%s'", expectedURL, info.RepoURL)
+
func TestGetCloneInfo_DepthAndSubmodules(t *testing.T) {
+
Workflow: tangled.Pipeline_Workflow{
+
Clone: &tangled.Pipeline_CloneOpts{
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
+
Kind: string(workflow.TriggerKindPush),
+
Push: &tangled.Pipeline_PushTriggerData{
+
Repo: &tangled.Pipeline_TriggerRepo{
+
Did: "did:plc:user123",
+
WorkspaceDir: "/tangled/workspace",
+
info, err := GetCloneInfo(cfg)
+
t.Fatalf("GetCloneInfo failed: %v", err)
+
allCmds := strings.Join(info.Commands, " ")
+
if !strings.Contains(allCmds, "--depth=10") {
+
t.Error("Commands should contain '--depth=10'")
+
if !strings.Contains(allCmds, "--recurse-submodules=yes") {
+
t.Error("Commands should contain '--recurse-submodules=yes'")
+
func TestGetCloneInfo_DefaultDepth(t *testing.T) {
+
Workflow: tangled.Pipeline_Workflow{
+
Clone: &tangled.Pipeline_CloneOpts{
+
Depth: 0, // Default should be 1
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
+
Kind: string(workflow.TriggerKindPush),
+
Push: &tangled.Pipeline_PushTriggerData{
+
Repo: &tangled.Pipeline_TriggerRepo{
+
Did: "did:plc:user123",
+
WorkspaceDir: "/tangled/workspace",
+
info, err := GetCloneInfo(cfg)
+
t.Fatalf("GetCloneInfo failed: %v", err)
+
allCmds := strings.Join(info.Commands, " ")
+
if !strings.Contains(allCmds, "--depth=1") {
+
t.Error("Commands should default to '--depth=1'")
+
func TestGetCloneInfo_NilPushData(t *testing.T) {
+
Workflow: tangled.Pipeline_Workflow{
+
Clone: &tangled.Pipeline_CloneOpts{
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
+
Kind: string(workflow.TriggerKindPush),
+
Push: nil, // Nil push data should return error
+
Repo: &tangled.Pipeline_TriggerRepo{
+
Did: "did:plc:user123",
+
WorkspaceDir: "/tangled/workspace",
+
_, err := GetCloneInfo(cfg)
+
t.Error("Expected error when push data is nil")
+
if !strings.Contains(err.Error(), "push trigger metadata is nil") {
+
t.Errorf("Expected error about nil push metadata, got: %v", err)
+
func TestGetCloneInfo_NilPRData(t *testing.T) {
+
Workflow: tangled.Pipeline_Workflow{
+
Clone: &tangled.Pipeline_CloneOpts{
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
+
Kind: string(workflow.TriggerKindPullRequest),
+
PullRequest: nil, // Nil PR data should return error
+
Repo: &tangled.Pipeline_TriggerRepo{
+
Did: "did:plc:user123",
+
WorkspaceDir: "/tangled/workspace",
+
_, err := GetCloneInfo(cfg)
+
t.Error("Expected error when pull request data is nil")
+
if !strings.Contains(err.Error(), "pull request trigger metadata is nil") {
+
t.Errorf("Expected error about nil PR metadata, got: %v", err)
+
func TestGetCloneInfo_CustomWorkspace(t *testing.T) {
+
Workflow: tangled.Pipeline_Workflow{
+
Clone: &tangled.Pipeline_CloneOpts{
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
+
Kind: string(workflow.TriggerKindPush),
+
Push: &tangled.Pipeline_PushTriggerData{
+
Repo: &tangled.Pipeline_TriggerRepo{
+
Did: "did:plc:user123",
+
WorkspaceDir: "/custom/path",
+
info, err := GetCloneInfo(cfg)
+
t.Fatalf("GetCloneInfo failed: %v", err)
+
allCmds := strings.Join(info.Commands, " ")
+
if !strings.Contains(allCmds, "/custom/path") {
+
t.Error("Commands should use custom workspace directory")
+
func TestGetCloneInfo_DefaultWorkspace(t *testing.T) {
+
Workflow: tangled.Pipeline_Workflow{
+
Clone: &tangled.Pipeline_CloneOpts{
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
+
Kind: string(workflow.TriggerKindPush),
+
Push: &tangled.Pipeline_PushTriggerData{
+
Repo: &tangled.Pipeline_TriggerRepo{
+
Did: "did:plc:user123",
+
WorkspaceDir: "", // Empty should default to /tangled/workspace
+
info, err := GetCloneInfo(cfg)
+
t.Fatalf("GetCloneInfo failed: %v", err)
+
allCmds := strings.Join(info.Commands, " ")
+
if !strings.Contains(allCmds, "/tangled/workspace") {
+
t.Error("Commands should default to /tangled/workspace")