34
34
use Magento \SalesRule \Model \Rule ;
35
35
use Magento \SalesRule \Model \Rule \Condition \Combine as CombineCondition ;
36
36
use Magento \SalesRule \Model \Rule \Condition \Product as ProductCondition ;
37
- use Magento \SalesRule \Test \Fixture \AddressCondition ;
38
37
use Magento \SalesRule \Test \Fixture \ProductCondition as ProductConditionFixture ;
39
38
use Magento \SalesRule \Test \Fixture \Rule as RuleFixture ;
40
39
use Magento \TestFramework \Fixture \AppIsolation ;
@@ -868,11 +867,6 @@ public function testDiscountOnSimpleProductWhenBuyXGetYRuleHasDiscountQtyStepSpe
868
867
869
868
#[
870
869
DataFixture(ProductFixture::class, ['price ' => 100 ], 'p1 ' ),
871
- DataFixture(
872
- AddressCondition::class,
873
- ['attribute ' => 'base_subtotal_with_discount ' , 'operator ' => '> ' , 'value ' => 75 ],
874
- 'cond1 '
875
- ),
876
870
DataFixture(
877
871
RuleFixture::class,
878
872
[
@@ -892,7 +886,9 @@ public function testDiscountOnSimpleProductWhenBuyXGetYRuleHasDiscountQtyStepSpe
892
886
'simple_action ' => Rule::BY_FIXED_ACTION ,
893
887
'sort_order ' => 2 ,
894
888
'apply_to_shipping ' => 1 ,
895
- 'conditions ' => ['$cond1$ ' ],
889
+ 'conditions ' => [
890
+ ['attribute ' => 'base_subtotal_with_discount ' , 'operator ' => '> ' , 'value ' => 75 ]
891
+ ],
896
892
],
897
893
'rule2 '
898
894
),
@@ -943,17 +939,6 @@ public function testSubtotalWithDiscountShouldReflectPreviouslyAppliedRules(): v
943
939
944
940
#[
945
941
DataFixture(ProductFixture::class, ['price ' => 100 ], 'p1 ' ),
946
- DataFixture(
947
- AddressCondition::class,
948
- ['attribute ' => 'base_subtotal_with_discount ' , 'operator ' => '> ' , 'value ' => 75 ],
949
- 'cond1 '
950
- ),
951
- DataFixture(
952
- ProductConditionFixture::class,
953
- // Ensures that the discount is applied to shipping only
954
- ['attribute ' => 'quote_item_price ' , 'operator ' => '< ' , 'value ' => 0 ],
955
- 'cond2 '
956
- ),
957
942
DataFixture(
958
943
RuleFixture::class,
959
944
[
@@ -973,8 +958,13 @@ public function testSubtotalWithDiscountShouldReflectPreviouslyAppliedRules(): v
973
958
'simple_action ' => Rule::BY_FIXED_ACTION ,
974
959
'sort_order ' => 2 ,
975
960
'apply_to_shipping ' => 1 ,
976
- 'conditions ' => ['$cond1$ ' ],
977
- 'actions ' => ['$cond2$ ' ],
961
+ 'conditions ' => [
962
+ ['attribute ' => 'base_subtotal_with_discount ' , 'operator ' => '> ' , 'value ' => 75 ]
963
+ ],
964
+ 'actions ' => [
965
+ // Ensures that the discount is applied to shipping only
966
+ ['attribute ' => 'quote_item_price ' , 'operator ' => '< ' , 'value ' => 0 ],
967
+ ],
978
968
],
979
969
'rule2 '
980
970
),
@@ -1023,4 +1013,94 @@ public function testSubtotalWithDiscountShouldReflectPreviouslyAppliedRulesForSh
1023
1013
$ this ->assertEquals ([$ rule1Id ], explode (', ' , $ cart ->getAppliedRuleIds ()));
1024
1014
$ this ->assertEquals ([$ rule1Id ], explode (', ' , current ($ cart ->getItems ())->getAppliedRuleIds ()));
1025
1015
}
1016
+
1017
+ #[
1018
+ DataFixture(ProductFixture::class, ['price ' => 100 ], 'p1 ' ),
1019
+ DataFixture(ProductFixture::class, ['price ' => 100 ], 'p2 ' ),
1020
+ DataFixture(ProductFixture::class, ['price ' => 100 ], 'p3 ' ),
1021
+ DataFixture(
1022
+ RuleFixture::class,
1023
+ [
1024
+ 'stop_rules_processing ' => 1 ,
1025
+ 'discount_amount ' => 50 ,
1026
+ 'simple_action ' => Rule::BY_PERCENT_ACTION ,
1027
+ 'sort_order ' => 1 ,
1028
+ 'actions ' => [
1029
+ ['attribute ' => 'sku ' , 'value ' => '$p1.sku$ ' ]
1030
+ ],
1031
+ ],
1032
+ 'rule1 '
1033
+ ),
1034
+ DataFixture(
1035
+ RuleFixture::class,
1036
+ [
1037
+ 'stop_rules_processing ' => 0 ,
1038
+ 'discount_amount ' => 25 ,
1039
+ 'simple_action ' => Rule::BY_PERCENT_ACTION ,
1040
+ 'sort_order ' => 2 ,
1041
+ 'apply_to_shipping ' => 0 ,
1042
+ 'conditions ' => [
1043
+ ['attribute ' => 'base_subtotal_with_discount ' , 'operator ' => '< ' , 'value ' => 300 ]
1044
+ ],
1045
+ 'actions ' => [
1046
+ ['attribute ' => 'sku ' , 'value ' => '$p2.sku$ ' ]
1047
+ ],
1048
+ ],
1049
+ 'rule2 '
1050
+ ),
1051
+ DataFixture(
1052
+ RuleFixture::class,
1053
+ [
1054
+ 'stop_rules_processing ' => 0 ,
1055
+ 'discount_amount ' => 30 ,
1056
+ 'simple_action ' => Rule::BY_FIXED_ACTION ,
1057
+ 'sort_order ' => 3 ,
1058
+ 'conditions ' => [
1059
+ ['attribute ' => 'base_subtotal_with_discount ' , 'operator ' => '> ' , 'value ' => 250 ]
1060
+ ],
1061
+ ],
1062
+ 'rule3 '
1063
+ ),
1064
+ DataFixture(GuestCartFixture::class, as: 'cart1 ' ),
1065
+ DataFixture(AddProductToCartFixture::class, ['cart_id ' => '$cart1.id$ ' , 'product_id ' => '$p1.id$ ' ]),
1066
+ DataFixture(AddProductToCartFixture::class, ['cart_id ' => '$cart1.id$ ' , 'product_id ' => '$p2.id$ ' ]),
1067
+ DataFixture(AddProductToCartFixture::class, ['cart_id ' => '$cart1.id$ ' , 'product_id ' => '$p3.id$ ' ]),
1068
+ ]
1069
+ public function testSubtotalWithDiscountShouldReflectPreviouslyAppliedRulesWithStopRulesProcessing (): void
1070
+ {
1071
+ $ rule1Id = (int )$ this ->fixtures ->get ('rule1 ' )->getId ();
1072
+ $ rule2Id = (int )$ this ->fixtures ->get ('rule2 ' )->getId ();
1073
+ $ p1Id = (int )$ this ->fixtures ->get ('p1 ' )->getId ();
1074
+ $ p2Id = (int )$ this ->fixtures ->get ('p2 ' )->getId ();
1075
+ $ p3Id = (int )$ this ->fixtures ->get ('p3 ' )->getId ();
1076
+ // Reset the state of the rule validator to ensure that it does not cache any previous state
1077
+ $ this ->objectManager ->get (\Magento \SalesRule \Model \Validator::class)->_resetState ();
1078
+ $ cart = $ this ->quoteRepository ->get ((int )$ this ->fixtures ->get ('cart1 ' )->getId ());
1079
+ $ cart ->collectTotals ();
1080
+
1081
+ $ this ->assertEquals (225 , $ cart ->getSubtotalWithDiscount ());
1082
+ $ this ->assertEquals (225 , $ cart ->getBaseSubtotalWithDiscount ());
1083
+ // Bypass getter methods for subtotal_with_discount and base_subtotal_with_discount to retrieve stored values
1084
+ $ this ->assertEquals (225 , $ cart ->getShippingAddress ()->getData ('subtotal_with_discount ' ));
1085
+ $ this ->assertEquals (225 , $ cart ->getShippingAddress ()->getData ('base_subtotal_with_discount ' ));
1086
+ $ this ->assertEquals (-75 , $ cart ->getShippingAddress ()->getBaseDiscountAmount ());
1087
+ $ this ->assertEquals (-75 , $ cart ->getShippingAddress ()->getDiscountAmount ());
1088
+ $ this ->assertEquals (0 , $ cart ->getShippingAddress ()->getShippingDiscountAmount ());
1089
+ $ this ->assertEquals (0 , $ cart ->getShippingAddress ()->getBaseShippingDiscountAmount ());
1090
+ // Check that rule3 is not applied because it requires subtotal with discount to be greater than 250
1091
+ $ this ->assertEquals ([$ rule1Id , $ rule2Id ], explode (', ' , $ cart ->getAppliedRuleIds ()));
1092
+ // rule2 is applied shipping only
1093
+ $ items = [];
1094
+ foreach ($ cart ->getAllItems () as $ item ) {
1095
+ $ items [$ item ->getProductId ()] = $ item ;
1096
+ }
1097
+ $ this ->assertEquals ([$ rule1Id ], explode (', ' , $ items [$ p1Id ]->getAppliedRuleIds ()));
1098
+ $ this ->assertEquals (50 , $ items [$ p1Id ]->getBaseDiscountAmount ());
1099
+
1100
+ $ this ->assertEquals ([$ rule2Id ], explode (', ' , $ items [$ p2Id ]->getAppliedRuleIds ()));
1101
+ $ this ->assertEquals (25 , $ items [$ p2Id ]->getBaseDiscountAmount ());
1102
+
1103
+ $ this ->assertEmpty ($ items [$ p3Id ]->getAppliedRuleIds ());
1104
+ $ this ->assertEquals (0 , $ items [$ p3Id ]->getBaseDiscountAmount ());
1105
+ }
1026
1106
}
0 commit comments