@@ -30,9 +30,12 @@ import (
3030 fakecache "github.com/nephio-project/porch/pkg/cache/fake"
3131 "github.com/nephio-project/porch/pkg/cache/repomap"
3232 cachetypes "github.com/nephio-project/porch/pkg/cache/types"
33+ "github.com/nephio-project/porch/pkg/externalrepo/fake"
3334 "github.com/nephio-project/porch/pkg/externalrepo/git"
3435 externalrepotypes "github.com/nephio-project/porch/pkg/externalrepo/types"
3536 "github.com/nephio-project/porch/pkg/repository"
37+ "github.com/stretchr/testify/assert"
38+ "github.com/stretchr/testify/require"
3639 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3740 "k8s.io/apimachinery/pkg/runtime"
3841 k8sfake "sigs.k8s.io/controller-runtime/pkg/client/fake"
@@ -323,3 +326,122 @@ func createMetadataStoreFromArchive(t *testing.T, testPath, name string) meta.Me
323326 Metas : metas ,
324327 }
325328}
329+
330+ func TestFindUpstreamReference (t * testing.T ) {
331+ ctx := context .Background ()
332+ cache := & Cache {repositories : repomap.SafeRepoMap {}}
333+ repoKey := repository.RepositoryKey {Namespace : "test-ns" , Name : "test-repo" }
334+ mockRepo := & cachedRepository {
335+ key : repoKey ,
336+ cachedPackageRevisions : make (map [repository.PackageRevisionKey ]* cachedPackageRevision ),
337+ }
338+ _ , _ = cache .repositories .LoadOrCreate (repoKey , func () (repository.Repository , error ) {
339+ return mockRepo , nil
340+ })
341+
342+ // Create second repository for cross-repo testing
343+ repo2Key := repository.RepositoryKey {Namespace : "test-ns" , Name : "test-repo2" }
344+ mockRepo2 := & cachedRepository {
345+ key : repo2Key ,
346+ cachedPackageRevisions : make (map [repository.PackageRevisionKey ]* cachedPackageRevision ),
347+ }
348+ _ , _ = cache .repositories .LoadOrCreate (repo2Key , func () (repository.Repository , error ) {
349+ return mockRepo2 , nil
350+ })
351+
352+ addDownstream := func (repo * cachedRepository , downstreamPkgName , taskType , upstreamRefName string ) {
353+ key := repository.PackageRevisionKey {
354+ PkgKey : repository.PackageKey {RepoKey : repo .key , Package : downstreamPkgName },
355+ WorkspaceName : "v1" ,
356+ }
357+ var task porchapi.Task
358+ switch taskType {
359+ case "clone" :
360+ task = porchapi.Task {
361+ Type : "clone" ,
362+ Clone : & porchapi.PackageCloneTaskSpec {Upstream : porchapi.UpstreamPackage {UpstreamRef : & porchapi.PackageRevisionRef {Name : upstreamRefName }}},
363+ }
364+ case "upgrade" :
365+ task = porchapi.Task {
366+ Type : "upgrade" ,
367+ Upgrade : & porchapi.PackageUpgradeTaskSpec {NewUpstream : porchapi.PackageRevisionRef {Name : upstreamRefName }},
368+ }
369+ }
370+ repo .cachedPackageRevisions [key ] = & cachedPackageRevision {
371+ PackageRevision : & fake.FakePackageRevision {
372+ PrKey : key ,
373+ PackageRevision : & porchapi.PackageRevision {Spec : porchapi.PackageRevisionSpec {Tasks : []porchapi.Task {task }}},
374+ },
375+ }
376+ }
377+
378+ tests := map [string ]struct {
379+ namespace string
380+ upstreamPkgToDelete string
381+ repo * cachedRepository
382+ downstreamPkgName string
383+ upstreamRefName string
384+ taskType string
385+ wantDep string
386+ }{
387+ "no downstream" : {
388+ namespace : "test-ns" ,
389+ upstreamPkgToDelete : "test-repo.upstream.v1" ,
390+ wantDep : "" ,
391+ },
392+ "find clone downstream" : {
393+ namespace : "test-ns" ,
394+ upstreamPkgToDelete : "test-repo.upstream.v1" ,
395+ repo : mockRepo ,
396+ downstreamPkgName : "downstream" ,
397+ upstreamRefName : "test-repo.upstream.v1" ,
398+ taskType : "clone" ,
399+ wantDep : "test-repo.downstream.v1" ,
400+ },
401+ "find upgrade downstream" : {
402+ namespace : "test-ns" ,
403+ upstreamPkgToDelete : "test-repo.upstream.v1" ,
404+ repo : mockRepo ,
405+ downstreamPkgName : "upgrade" ,
406+ upstreamRefName : "test-repo.upstream.v1" ,
407+ taskType : "upgrade" ,
408+ wantDep : "test-repo.upgrade.v1" ,
409+ },
410+ "task without downstream" : {
411+ namespace : "test-ns" ,
412+ upstreamPkgToDelete : "test-repo.upstream.v1" ,
413+ repo : mockRepo ,
414+ downstreamPkgName : "other" ,
415+ upstreamRefName : "test-repo.different.v1" ,
416+ taskType : "clone" ,
417+ wantDep : "" ,
418+ },
419+ "different namespace" : {
420+ namespace : "other-ns" ,
421+ upstreamPkgToDelete : "test-repo.upstream.v1" ,
422+ wantDep : "" ,
423+ },
424+ "cross-repo downstream" : {
425+ namespace : "test-ns" ,
426+ upstreamPkgToDelete : "test-repo.base-pkg.v1" ,
427+ repo : mockRepo2 ,
428+ downstreamPkgName : "derived" ,
429+ upstreamRefName : "test-repo.base-pkg.v1" ,
430+ taskType : "clone" ,
431+ wantDep : "test-repo2.derived.v1" ,
432+ },
433+ }
434+
435+ for name , tt := range tests {
436+ t .Run (name , func (t * testing.T ) {
437+ mockRepo .cachedPackageRevisions = make (map [repository.PackageRevisionKey ]* cachedPackageRevision )
438+ mockRepo2 .cachedPackageRevisions = make (map [repository.PackageRevisionKey ]* cachedPackageRevision )
439+ if tt .taskType != "" {
440+ addDownstream (tt .repo , tt .downstreamPkgName , tt .taskType , tt .upstreamRefName )
441+ }
442+ dep , err := cache .FindAllUpstreamReferencesInRepositories (ctx , tt .namespace , tt .upstreamPkgToDelete )
443+ require .NoError (t , err )
444+ assert .Equal (t , tt .wantDep , dep )
445+ })
446+ }
447+ }
0 commit comments