Skip to content

Commit be0cbb8

Browse files
committed
Add failing test
1 parent f9bd349 commit be0cbb8

1 file changed

Lines changed: 136 additions & 0 deletions

File tree

tests/unit/elements/product/ProductTest.php

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,13 @@
88
namespace craftcommercetests\unit\elements\product;
99

1010
use Codeception\Test\Unit;
11+
use craft\commerce\db\Table;
1112
use craft\commerce\elements\Product;
1213
use craft\commerce\elements\Variant;
14+
use craft\commerce\Plugin;
15+
use craft\db\Query;
1316
use craftcommercetests\fixtures\ProductFixture;
17+
use DateTime;
1418

1519
/**
1620
* ProductTest
@@ -136,4 +140,136 @@ public function productVariantMethodsDataProvider(): array
136140
],
137141
];
138142
}
143+
144+
/**
145+
* @return void
146+
*/
147+
public function testSaveProductAndVariants(): void
148+
{
149+
$product = new Product();
150+
$product->title = 'Test Product';
151+
$product->typeId = 2000;
152+
$product->slug = 'test-product';
153+
$product->enabled = true;
154+
$product->enabledForSite = true;
155+
$product->availableForPurchase = true;
156+
$product->promotable = true;
157+
$product->postDate = (new DateTime('now'));
158+
$product->shippingCategoryId = 101;
159+
$product->taxCategoryId = 101;
160+
161+
$variants = [];
162+
$variant = new Variant();
163+
$variant->title = 'Test Variant';
164+
$variant->slug = 'test-variant';
165+
$variant->sku = 'test-variant-sku';
166+
$variant->price = 99.99;
167+
$variant->sortOrder = 0;
168+
$variant->width = null;
169+
$variant->height = null;
170+
$variant->length = null;
171+
$variant->weight = null;
172+
$variant->stock = null;
173+
$variant->hasUnlimitedStock = true;
174+
$variant->minQty = null;
175+
$variant->maxQty = null;
176+
$variant->isDefault = true;
177+
178+
$variants[] = $variant;
179+
180+
$variant = new Variant();
181+
$variant->title = 'Test Variant 2';
182+
$variant->slug = 'test-variant 2';
183+
$variant->sku = 'test-variant-sku2';
184+
$variant->price = 100.99;
185+
$variant->sortOrder = 1;
186+
$variant->width = null;
187+
$variant->height = null;
188+
$variant->length = null;
189+
$variant->weight = null;
190+
$variant->stock = null;
191+
$variant->hasUnlimitedStock = true;
192+
$variant->minQty = null;
193+
$variant->maxQty = null;
194+
$variant->isDefault = false;
195+
$variants[] = $variant;
196+
197+
$product->setVariants($variants);
198+
199+
\Craft::$app->getElements()->saveElement($product, false);
200+
201+
// Check default data when the variant is saved as part of the product save
202+
$productData = (new Query())
203+
->select([
204+
'defaultVariantId',
205+
'defaultSku',
206+
'defaultPrice',
207+
'defaultWidth',
208+
'defaultHeight',
209+
'defaultLength',
210+
'defaultWeight',
211+
])
212+
->from(Table::PRODUCTS)
213+
->where(['id' => $product->id])
214+
->one();
215+
216+
$defaultVariantData = (new Query())
217+
->select([
218+
'id',
219+
])
220+
->from(Table::VARIANTS)
221+
->where(['productId' => $product->id])
222+
->andWhere(['sku' => 'test-variant-sku'])
223+
->one();
224+
225+
// Check the product object
226+
self::assertEquals($defaultVariantData['id'], $product->defaultVariantId);
227+
self::assertEquals('test-variant-sku', $product->defaultSku);
228+
self::assertEquals(99.99, $product->defaultPrice);
229+
self::assertEquals(0, $product->defaultWidth);
230+
self::assertEquals(0, $product->defaultHeight);
231+
self::assertEquals(0, $product->defaultLength);
232+
self::assertEquals(0, $product->defaultWeight);
233+
234+
// Check the product data in the database
235+
self::assertEquals($defaultVariantData['id'], $productData['defaultVariantId']);
236+
self::assertEquals('test-variant-sku', $productData['defaultSku']);
237+
self::assertEquals(99.99, $productData['defaultPrice']);
238+
self::assertEquals(0, $productData['defaultWidth']);
239+
self::assertEquals(0, $productData['defaultHeight']);
240+
self::assertEquals(0, $productData['defaultLength']);
241+
self::assertEquals(0, $productData['defaultWeight']);
242+
243+
// Make changes and independently save the default variant to check the product data is updated
244+
$variant = $product->getDefaultVariant();
245+
$variant->setSku('test-variant-sku-updated');
246+
$variant->price = 199.99;
247+
248+
\Craft::$app->getElements()->saveElement($variant, false);
249+
250+
$newProductData = (new Query())
251+
->select([
252+
'defaultVariantId',
253+
'defaultSku',
254+
'defaultPrice',
255+
'defaultWidth',
256+
'defaultHeight',
257+
'defaultLength',
258+
'defaultWeight',
259+
])
260+
->from(Table::PRODUCTS)
261+
->where(['id' => $product->id])
262+
->one();
263+
264+
self::assertEquals($defaultVariantData['id'], $newProductData['defaultVariantId']);
265+
self::assertEquals('test-variant-sku-updated', $newProductData['defaultSku']);
266+
self::assertEquals(199.99, $newProductData['defaultPrice']);
267+
self::assertEquals(0, $newProductData['defaultWidth']);
268+
self::assertEquals(0, $newProductData['defaultHeight']);
269+
self::assertEquals(0, $newProductData['defaultLength']);
270+
self::assertEquals(0, $newProductData['defaultWeight']);
271+
272+
// Remove the product
273+
\Craft::$app->getElements()->deleteElementById($product->id, Product::class, null, true);
274+
}
139275
}

0 commit comments

Comments
 (0)