@@ -772,6 +772,78 @@ describe('MetadataManager — IMetadataService Contract', () => {
772772 expect ( result . success ) . toBe ( true ) ;
773773 expect ( result . itemsPublished ) . toBe ( 1 ) ;
774774 } ) ;
775+
776+ it ( 'should fail when dependency is not found or not published' , async ( ) => {
777+ await manager . register ( 'view' , 'opp_list' , {
778+ name : 'opp_list' , label : 'Opp List' , packageId : 'com.acme.dep' ,
779+ metadata : { columns : [ 'name' ] } ,
780+ } ) ;
781+
782+ // Register a dependency pointing to a non-existent item
783+ manager . addDependency ( {
784+ sourceType : 'view' ,
785+ sourceName : 'opp_list' ,
786+ targetType : 'object' ,
787+ targetName : 'opportunity' ,
788+ kind : 'reference' ,
789+ } ) ;
790+
791+ const result = await manager . publishPackage ( 'com.acme.dep' , { validate : true } ) ;
792+ expect ( result . success ) . toBe ( false ) ;
793+ expect ( result . validationErrors ) . toBeDefined ( ) ;
794+ expect ( result . validationErrors ! . some ( e => e . message . includes ( 'opportunity' ) ) ) . toBe ( true ) ;
795+ } ) ;
796+
797+ it ( 'should pass dependency check when target is in the same package' , async ( ) => {
798+ await manager . register ( 'object' , 'project' , {
799+ name : 'project' , label : 'Project' , packageId : 'com.acme.same' ,
800+ metadata : { fields : [ 'name' ] } ,
801+ } ) ;
802+ await manager . register ( 'view' , 'project_list' , {
803+ name : 'project_list' , label : 'Project List' , packageId : 'com.acme.same' ,
804+ metadata : { columns : [ 'name' ] } ,
805+ } ) ;
806+
807+ // Dependency within the same package
808+ manager . addDependency ( {
809+ sourceType : 'view' ,
810+ sourceName : 'project_list' ,
811+ targetType : 'object' ,
812+ targetName : 'project' ,
813+ kind : 'reference' ,
814+ } ) ;
815+
816+ const result = await manager . publishPackage ( 'com.acme.same' , { validate : true } ) ;
817+ expect ( result . success ) . toBe ( true ) ;
818+ expect ( result . itemsPublished ) . toBe ( 2 ) ;
819+ } ) ;
820+
821+ it ( 'should pass dependency check when target is already published' , async ( ) => {
822+ // Pre-existing published object (different package)
823+ await manager . register ( 'object' , 'account' , {
824+ name : 'account' , label : 'Account' , packageId : 'com.acme.core' ,
825+ publishedDefinition : { fields : [ 'name' ] } ,
826+ state : 'active' ,
827+ } ) ;
828+
829+ // View in a different package references the published object
830+ await manager . register ( 'view' , 'account_list' , {
831+ name : 'account_list' , label : 'Account List' , packageId : 'com.acme.views' ,
832+ metadata : { columns : [ 'name' ] } ,
833+ } ) ;
834+
835+ manager . addDependency ( {
836+ sourceType : 'view' ,
837+ sourceName : 'account_list' ,
838+ targetType : 'object' ,
839+ targetName : 'account' ,
840+ kind : 'reference' ,
841+ } ) ;
842+
843+ const result = await manager . publishPackage ( 'com.acme.views' , { validate : true } ) ;
844+ expect ( result . success ) . toBe ( true ) ;
845+ expect ( result . itemsPublished ) . toBe ( 1 ) ;
846+ } ) ;
775847 } ) ;
776848
777849 describe ( 'revertPackage' , ( ) => {
0 commit comments