77
88namespace Magento \Bundle \Test \Unit \Model \Product \CopyConstructor ;
99
10- use Magento \Bundle \Api \Data \BundleOptionInterface ;
1110use Magento \Bundle \Model \Link ;
11+ use Magento \Bundle \Model \Option ;
1212use Magento \Bundle \Model \Product \CopyConstructor \Bundle ;
1313use Magento \Catalog \Api \Data \ProductExtensionInterface ;
1414use Magento \Catalog \Model \Product ;
@@ -65,38 +65,39 @@ public function testBuildPositive()
6565 $ product ->expects ($ this ->once ())
6666 ->method ('getExtensionAttributes ' )
6767 ->willReturn ($ extensionAttributesProduct );
68-
69- $ productLink = $ this ->getMockBuilder (Link::class)
70- ->addMethods (['setSelectionId ' ])
71- ->disableOriginalConstructor ()
72- ->getMock ();
73- $ productLink ->expects ($ this ->exactly (2 ))
74- ->method ('setSelectionId ' )
75- ->with ($ this ->identicalTo (null ));
76- $ firstOption = $ this ->getMockBuilder (BundleOptionInterface::class)
77- ->addMethods (['getProductLinks ' ])
78- ->disableOriginalConstructor ()
79- ->getMockForAbstractClass ();
80- $ firstOption ->expects ($ this ->once ())
81- ->method ('getProductLinks ' )
82- ->willReturn ([$ productLink ]);
83- $ firstOption ->expects ($ this ->once ())
84- ->method ('setOptionId ' )
85- ->with ($ this ->identicalTo (null ));
86- $ secondOption = $ this ->getMockBuilder (BundleOptionInterface::class)
87- ->addMethods (['getProductLinks ' ])
88- ->disableOriginalConstructor ()
89- ->getMockForAbstractClass ();
90- $ secondOption ->expects ($ this ->once ())
91- ->method ('getProductLinks ' )
92- ->willReturn ([$ productLink ]);
93- $ secondOption ->expects ($ this ->once ())
94- ->method ('setOptionId ' )
95- ->with ($ this ->identicalTo (null ));
96- $ bundleOptions = [
97- $ firstOption ,
98- $ secondOption
68+
69+ $ bundleOptionsData = [
70+ [
71+ 'option_id ' => 1 ,
72+ 'title ' => 'Option 1 ' ,
73+ 'product_links ' => [
74+ [
75+ 'option_id ' => 1 ,
76+ 'id ' => 1 ,
77+ 'selection_id ' => 1 ,
78+ 'sku ' => 'sku-1 '
79+ ],
80+ ]
81+ ],
82+ [
83+ 'option_id ' => 2 ,
84+ 'title ' => 'Option 2 ' ,
85+ 'product_links ' => [
86+ [
87+ 'option_id ' => 2 ,
88+ 'id ' => 2 ,
89+ 'selection_id ' => 2 ,
90+ 'sku ' => 'sku-2 '
91+ ]
92+ ]
93+ ]
9994 ];
95+ $ bundleOptions = array_map (
96+ fn ($ optionData ) => $ this ->createOptionMock (
97+ [...$ optionData , 'product_links ' => array_map ($ this ->createLinkMock (...), $ optionData ['product_links ' ])]
98+ ),
99+ $ bundleOptionsData
100+ );
100101 $ extensionAttributesProduct ->expects ($ this ->once ())
101102 ->method ('getBundleProductOptions ' )
102103 ->willReturn ($ bundleOptions );
@@ -115,13 +116,57 @@ public function testBuildPositive()
115116 ->willReturn ($ extensionAttributesDuplicate );
116117 $ extensionAttributesDuplicate ->expects ($ this ->once ())
117118 ->method ('setBundleProductOptions ' )
118- ->willReturnCallback (function ($ bundleOptions ) {
119- if ($ bundleOptions ) {
120- return null ;
121- }
122- });
119+ ->with (
120+ $ this ->callback (function ($ options ) use (&$ bundleOptionsClone ) {
121+ $ bundleOptionsClone = $ options ;
122+ return !empty ($ bundleOptionsClone );
123+ })
124+ );
123125
124126 $ this ->model ->build ($ product , $ duplicate );
127+ foreach ($ bundleOptionsData as $ key => $ optionData ) {
128+ $ bundleOption = $ bundleOptions [$ key ];
129+ $ bundleOptionClone = $ bundleOptionsClone [$ key ];
130+
131+ $ this ->assertEquals ($ optionData ['option_id ' ], $ bundleOption ->getOptionId ());
132+ $ this ->assertEquals ($ optionData ['title ' ], $ bundleOption ->getTitle ());
133+
134+ $ this ->assertNotEquals ($ bundleOption , $ bundleOptionClone );
135+
136+ $ this ->assertNull ($ bundleOptionClone ->getOptionId ());
137+ $ this ->assertEquals ($ optionData ['title ' ], $ bundleOptionClone ->getTitle ());
138+
139+ foreach ($ optionData ['product_links ' ] as $ productLinkKey => $ productLinkData ) {
140+ $ productLink = $ bundleOption ->getProductLinks ()[$ productLinkKey ];
141+ $ productLinkClone = $ bundleOptionClone ->getProductLinks ()[$ productLinkKey ];
142+
143+ $ this ->assertEquals ($ productLinkData ['option_id ' ], $ productLink ->getOptionId ());
144+ $ this ->assertEquals ($ productLinkData ['id ' ], $ productLink ->getId ());
145+ $ this ->assertEquals ($ productLinkData ['selection_id ' ], $ productLink ->getSelectionId ());
146+ $ this ->assertEquals ($ productLinkData ['sku ' ], $ productLink ->getSku ());
147+
148+ $ this ->assertNotEquals ($ productLink , $ productLinkClone );
149+
150+ $ this ->assertNull ($ productLinkClone ->getId ());
151+ $ this ->assertNull ($ productLinkClone ->getOptionId ());
152+ $ this ->assertNull ($ productLinkClone ->getSelectionId ());
153+ $ this ->assertEquals ($ productLinkData ['sku ' ], $ productLinkClone ->getSku ());
154+ }
155+ }
156+ }
157+
158+ private function createOptionMock (array $ data ): Option
159+ {
160+ $ option = $ this ->createPartialMock (Option::class, []);
161+ $ option ->addData ($ data );
162+ return $ option ;
163+ }
164+
165+ private function createLinkMock (array $ data ): Link
166+ {
167+ $ productLink = $ this ->createPartialMock (Link::class, []);
168+ $ productLink ->addData ($ data );
169+ return $ productLink ;
125170 }
126171
127172 /**
0 commit comments