@@ -400,3 +400,103 @@ func TestValidateUpgradeTask(t *testing.T) {
400400 assert .ErrorContains (t , err , local .KubeObjectName ())
401401 })
402402}
403+
404+ func TestCreateCloneTaskValidation (t * testing.T ) {
405+ tests := []struct {
406+ name string
407+ existingRevs []repository.PackageRevision
408+ expectedError bool
409+ errorContains string
410+ }{
411+ {
412+ name : "success - no existing revisions" ,
413+ existingRevs : []repository.PackageRevision {},
414+ expectedError : false ,
415+ },
416+ {
417+ name : "success - existing revision in different repo" ,
418+ existingRevs : []repository.PackageRevision {
419+ & fake.FakePackageRevision {
420+ PrKey : repository.PackageRevisionKey {
421+ PkgKey : repository.PackageKey {
422+ RepoKey : repository.RepositoryKey {
423+ Name : "different-repo" ,
424+ },
425+ Package : "test-package" ,
426+ },
427+ WorkspaceName : "v1" ,
428+ },
429+ },
430+ },
431+ expectedError : false ,
432+ },
433+ {
434+ name : "failure - existing revision with same package and repo" ,
435+ existingRevs : []repository.PackageRevision {
436+ & fake.FakePackageRevision {
437+ PrKey : repository.PackageRevisionKey {
438+ PkgKey : repository.PackageKey {
439+ RepoKey : repository.RepositoryKey {
440+ Name : "test-repo" ,
441+ },
442+ Package : "test-package" ,
443+ },
444+ WorkspaceName : "v1" ,
445+ },
446+ },
447+ },
448+ expectedError : true ,
449+ errorContains : "`clone` cannot create a new revision for package \" test-package\" that already exists in repo \" test-repo\" " ,
450+ },
451+ }
452+
453+ for _ , tt := range tests {
454+ t .Run (tt .name , func (t * testing.T ) {
455+ f := newTestFixture (t )
456+ mockPkgRev := setupMockPackageRevision (t )
457+ mockDraft := & mockrepo.MockPackageRevisionDraft {}
458+
459+ // Create a package revision with CLONE task
460+ f .packageRevision .Spec .Tasks = []porchapi.Task {
461+ {
462+ Type : porchapi .TaskTypeClone ,
463+ Clone : & porchapi.PackageCloneTaskSpec {
464+ Strategy : porchapi .ResourceMerge ,
465+ Upstream : porchapi.UpstreamPackage {
466+ Type : porchapi .RepositoryTypeGit ,
467+ Git : & porchapi.GitPackage {
468+ Repo : "https://example.com/repo" ,
469+ Ref : "main" ,
470+ Directory : "/" ,
471+ },
472+ },
473+ },
474+ },
475+ }
476+
477+ // Setup mocks
478+ mockDraft .On ("UpdateResources" , mock .Anything , mock .Anything , mock .Anything ).Return (nil )
479+ mockDraft .On ("UpdateLifecycle" , mock .Anything , mock .Anything ).Return (nil )
480+
481+ f .mockRepo .On ("ListPackageRevisions" , mock .Anything , mock .Anything ).Return (tt .existingRevs , nil )
482+ f .mockRepo .On ("CreatePackageRevisionDraft" , mock .Anything , mock .Anything ).Return (mockDraft , nil ).Maybe ()
483+ f .mockRepo .On ("ClosePackageRevisionDraft" , mock .Anything , mock .Anything , mock .Anything ).Return (mockPkgRev , nil ).Maybe ()
484+ f .mockRepo .On ("Close" , mock .Anything ).Return (nil ).Maybe ()
485+ f .mockRepo .On ("Key" , mock .Anything ).Return (repository.RepositoryKey {}).Maybe ()
486+
487+ f .mockTaskHandler .On ("ApplyTask" , mock .Anything , mock .Anything , mock .Anything , mock .Anything , mock .Anything ).Return (nil ).Maybe ()
488+
489+ _ , err := f .engine .CreatePackageRevision (context .Background (), f .repositoryObj , f .packageRevision , nil )
490+
491+ if tt .expectedError {
492+ assert .Error (t , err )
493+ assert .Contains (t , err .Error (), tt .errorContains )
494+ } else {
495+ assert .NoError (t , err )
496+ }
497+
498+ f .mockRepo .Close (context .Background ())
499+ f .mockRepo .AssertExpectations (t )
500+ })
501+ }
502+ }
0 commit comments