···
7
+
"tangled.org/core/api/tangled"
8
+
"tangled.org/core/workflow"
11
+
func TestGetCloneInfo_PushTrigger(t *testing.T) {
12
+
cfg := CloneOptions{
13
+
Workflow: tangled.Pipeline_Workflow{
14
+
Clone: &tangled.Pipeline_CloneOpts{
20
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
21
+
Kind: string(workflow.TriggerKindPush),
22
+
Push: &tangled.Pipeline_PushTriggerData{
25
+
Ref: "refs/heads/main",
27
+
Repo: &tangled.Pipeline_TriggerRepo{
28
+
Knot: "example.com",
29
+
Did: "did:plc:user123",
34
+
WorkspaceDir: "/tangled/workspace",
37
+
info, err := GetCloneInfo(cfg)
39
+
t.Fatalf("GetCloneInfo failed: %v", err)
43
+
t.Error("Expected Skip to be false")
46
+
if info.CommitSHA != "abc123" {
47
+
t.Errorf("Expected CommitSHA 'abc123', got '%s'", info.CommitSHA)
50
+
expectedURL := "https://example.com/did:plc:user123/my-repo"
51
+
if info.RepoURL != expectedURL {
52
+
t.Errorf("Expected RepoURL '%s', got '%s'", expectedURL, info.RepoURL)
55
+
if len(info.Commands) != 5 {
56
+
t.Errorf("Expected 5 commands, got %d", len(info.Commands))
59
+
// Verify commands contain expected git operations
60
+
allCmds := strings.Join(info.Commands, " ")
61
+
if !strings.Contains(allCmds, "git init") {
62
+
t.Error("Commands should contain 'git init'")
64
+
if !strings.Contains(allCmds, "git remote add origin") {
65
+
t.Error("Commands should contain 'git remote add origin'")
67
+
if !strings.Contains(allCmds, "git fetch") {
68
+
t.Error("Commands should contain 'git fetch'")
70
+
if !strings.Contains(allCmds, "abc123") {
71
+
t.Error("Commands should contain commit SHA")
73
+
if !strings.Contains(allCmds, "git checkout FETCH_HEAD") {
74
+
t.Error("Commands should contain 'git checkout FETCH_HEAD'")
78
+
func TestGetCloneInfo_PullRequestTrigger(t *testing.T) {
79
+
cfg := CloneOptions{
80
+
Workflow: tangled.Pipeline_Workflow{
81
+
Clone: &tangled.Pipeline_CloneOpts{
86
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
87
+
Kind: string(workflow.TriggerKindPullRequest),
88
+
PullRequest: &tangled.Pipeline_PullRequestTriggerData{
89
+
SourceSha: "pr-sha-789",
90
+
SourceBranch: "feature-branch",
91
+
TargetBranch: "main",
94
+
Repo: &tangled.Pipeline_TriggerRepo{
95
+
Knot: "example.com",
96
+
Did: "did:plc:user123",
101
+
WorkspaceDir: "/tangled/workspace",
104
+
info, err := GetCloneInfo(cfg)
106
+
t.Fatalf("GetCloneInfo failed: %v", err)
109
+
if info.CommitSHA != "pr-sha-789" {
110
+
t.Errorf("Expected CommitSHA 'pr-sha-789', got '%s'", info.CommitSHA)
113
+
allCmds := strings.Join(info.Commands, " ")
114
+
if !strings.Contains(allCmds, "pr-sha-789") {
115
+
t.Error("Commands should contain PR commit SHA")
119
+
func TestGetCloneInfo_ManualTrigger(t *testing.T) {
120
+
cfg := CloneOptions{
121
+
Workflow: tangled.Pipeline_Workflow{
122
+
Clone: &tangled.Pipeline_CloneOpts{
127
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
128
+
Kind: string(workflow.TriggerKindManual),
129
+
Manual: &tangled.Pipeline_ManualTriggerData{
132
+
Repo: &tangled.Pipeline_TriggerRepo{
133
+
Knot: "example.com",
134
+
Did: "did:plc:user123",
139
+
WorkspaceDir: "/tangled/workspace",
142
+
info, err := GetCloneInfo(cfg)
144
+
t.Fatalf("GetCloneInfo failed: %v", err)
147
+
// Manual triggers don't have a SHA yet (TODO)
148
+
if info.CommitSHA != "" {
149
+
t.Errorf("Expected empty CommitSHA for manual trigger, got '%s'", info.CommitSHA)
153
+
func TestGetCloneInfo_SkipFlag(t *testing.T) {
154
+
cfg := CloneOptions{
155
+
Workflow: tangled.Pipeline_Workflow{
156
+
Clone: &tangled.Pipeline_CloneOpts{
160
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
161
+
Kind: string(workflow.TriggerKindPush),
162
+
Push: &tangled.Pipeline_PushTriggerData{
165
+
Repo: &tangled.Pipeline_TriggerRepo{
166
+
Knot: "example.com",
167
+
Did: "did:plc:user123",
173
+
info, err := GetCloneInfo(cfg)
175
+
t.Fatalf("GetCloneInfo failed: %v", err)
179
+
t.Error("Expected Skip to be true")
182
+
if len(info.Commands) != 0 {
183
+
t.Errorf("Expected no commands when Skip is true, got %d commands", len(info.Commands))
187
+
func TestGetCloneInfo_DevMode(t *testing.T) {
188
+
cfg := CloneOptions{
189
+
Workflow: tangled.Pipeline_Workflow{
190
+
Clone: &tangled.Pipeline_CloneOpts{
195
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
196
+
Kind: string(workflow.TriggerKindPush),
197
+
Push: &tangled.Pipeline_PushTriggerData{
200
+
Repo: &tangled.Pipeline_TriggerRepo{
201
+
Knot: "localhost:3000",
202
+
Did: "did:plc:user123",
207
+
WorkspaceDir: "/tangled/workspace",
210
+
info, err := GetCloneInfo(cfg)
212
+
t.Fatalf("GetCloneInfo failed: %v", err)
215
+
// In dev mode, should use http:// and replace localhost with host.docker.internal
216
+
expectedURL := "http://host.docker.internal:3000/did:plc:user123/my-repo"
217
+
if info.RepoURL != expectedURL {
218
+
t.Errorf("Expected dev mode URL '%s', got '%s'", expectedURL, info.RepoURL)
222
+
func TestGetCloneInfo_DepthAndSubmodules(t *testing.T) {
223
+
cfg := CloneOptions{
224
+
Workflow: tangled.Pipeline_Workflow{
225
+
Clone: &tangled.Pipeline_CloneOpts{
231
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
232
+
Kind: string(workflow.TriggerKindPush),
233
+
Push: &tangled.Pipeline_PushTriggerData{
236
+
Repo: &tangled.Pipeline_TriggerRepo{
237
+
Knot: "example.com",
238
+
Did: "did:plc:user123",
243
+
WorkspaceDir: "/tangled/workspace",
246
+
info, err := GetCloneInfo(cfg)
248
+
t.Fatalf("GetCloneInfo failed: %v", err)
251
+
allCmds := strings.Join(info.Commands, " ")
252
+
if !strings.Contains(allCmds, "--depth=10") {
253
+
t.Error("Commands should contain '--depth=10'")
256
+
if !strings.Contains(allCmds, "--recurse-submodules=yes") {
257
+
t.Error("Commands should contain '--recurse-submodules=yes'")
261
+
func TestGetCloneInfo_DefaultDepth(t *testing.T) {
262
+
cfg := CloneOptions{
263
+
Workflow: tangled.Pipeline_Workflow{
264
+
Clone: &tangled.Pipeline_CloneOpts{
265
+
Depth: 0, // Default should be 1
269
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
270
+
Kind: string(workflow.TriggerKindPush),
271
+
Push: &tangled.Pipeline_PushTriggerData{
274
+
Repo: &tangled.Pipeline_TriggerRepo{
275
+
Knot: "example.com",
276
+
Did: "did:plc:user123",
280
+
WorkspaceDir: "/tangled/workspace",
283
+
info, err := GetCloneInfo(cfg)
285
+
t.Fatalf("GetCloneInfo failed: %v", err)
288
+
allCmds := strings.Join(info.Commands, " ")
289
+
if !strings.Contains(allCmds, "--depth=1") {
290
+
t.Error("Commands should default to '--depth=1'")
294
+
func TestGetCloneInfo_NilPushData(t *testing.T) {
295
+
cfg := CloneOptions{
296
+
Workflow: tangled.Pipeline_Workflow{
297
+
Clone: &tangled.Pipeline_CloneOpts{
302
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
303
+
Kind: string(workflow.TriggerKindPush),
304
+
Push: nil, // Nil push data should return error
305
+
Repo: &tangled.Pipeline_TriggerRepo{
306
+
Knot: "example.com",
307
+
Did: "did:plc:user123",
311
+
WorkspaceDir: "/tangled/workspace",
314
+
_, err := GetCloneInfo(cfg)
316
+
t.Error("Expected error when push data is nil")
319
+
if !strings.Contains(err.Error(), "push trigger metadata is nil") {
320
+
t.Errorf("Expected error about nil push metadata, got: %v", err)
324
+
func TestGetCloneInfo_NilPRData(t *testing.T) {
325
+
cfg := CloneOptions{
326
+
Workflow: tangled.Pipeline_Workflow{
327
+
Clone: &tangled.Pipeline_CloneOpts{
332
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
333
+
Kind: string(workflow.TriggerKindPullRequest),
334
+
PullRequest: nil, // Nil PR data should return error
335
+
Repo: &tangled.Pipeline_TriggerRepo{
336
+
Knot: "example.com",
337
+
Did: "did:plc:user123",
341
+
WorkspaceDir: "/tangled/workspace",
344
+
_, err := GetCloneInfo(cfg)
346
+
t.Error("Expected error when pull request data is nil")
349
+
if !strings.Contains(err.Error(), "pull request trigger metadata is nil") {
350
+
t.Errorf("Expected error about nil PR metadata, got: %v", err)
354
+
func TestGetCloneInfo_CustomWorkspace(t *testing.T) {
355
+
cfg := CloneOptions{
356
+
Workflow: tangled.Pipeline_Workflow{
357
+
Clone: &tangled.Pipeline_CloneOpts{
362
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
363
+
Kind: string(workflow.TriggerKindPush),
364
+
Push: &tangled.Pipeline_PushTriggerData{
367
+
Repo: &tangled.Pipeline_TriggerRepo{
368
+
Knot: "example.com",
369
+
Did: "did:plc:user123",
374
+
WorkspaceDir: "/custom/path",
377
+
info, err := GetCloneInfo(cfg)
379
+
t.Fatalf("GetCloneInfo failed: %v", err)
382
+
allCmds := strings.Join(info.Commands, " ")
383
+
if !strings.Contains(allCmds, "/custom/path") {
384
+
t.Error("Commands should use custom workspace directory")
388
+
func TestGetCloneInfo_DefaultWorkspace(t *testing.T) {
389
+
cfg := CloneOptions{
390
+
Workflow: tangled.Pipeline_Workflow{
391
+
Clone: &tangled.Pipeline_CloneOpts{
396
+
TriggerMetadata: tangled.Pipeline_TriggerMetadata{
397
+
Kind: string(workflow.TriggerKindPush),
398
+
Push: &tangled.Pipeline_PushTriggerData{
401
+
Repo: &tangled.Pipeline_TriggerRepo{
402
+
Knot: "example.com",
403
+
Did: "did:plc:user123",
408
+
WorkspaceDir: "", // Empty should default to /tangled/workspace
411
+
info, err := GetCloneInfo(cfg)
413
+
t.Fatalf("GetCloneInfo failed: %v", err)
416
+
allCmds := strings.Join(info.Commands, " ")
417
+
if !strings.Contains(allCmds, "/tangled/workspace") {
418
+
t.Error("Commands should default to /tangled/workspace")