diff --git a/modules/product/src/Tests/ProductAdminTest.php b/modules/product/src/Tests/ProductAdminTest.php
index e7fb729..4280b81 100644
--- a/modules/product/src/Tests/ProductAdminTest.php
+++ b/modules/product/src/Tests/ProductAdminTest.php
@@ -18,9 +18,9 @@ use Drupal\commerce_product\Entity\ProductVariation;
 class ProductAdminTest extends ProductTestBase {
 
   /**
-   * Tests creating a product via the admin.
+   * Tests creating a product.
    */
-  function testAddProductAdmin() {
+  function testCreateProduct() {
     $title = $this->randomMachineName();
     $store_ids = array_map(function ($store) {
       return $store->id();
@@ -28,12 +28,23 @@ class ProductAdminTest extends ProductTestBase {
 
     $this->drupalGet('admin/commerce/products');
     $this->clickLink('Add product');
+
+    // Check the integrity of the add form.
+    $this->assertFieldByName('title[0][value]', NULL, 'Title field is present');
+    $this->assertFieldByName('variations[form][inline_entity_form][sku][0][value]', NULL, 'SKU field is present');
+    $this->assertFieldByName('variations[form][inline_entity_form][price][0][amount]', NULL, 'Price field is present');
+    $this->assertFieldByName('variations[form][inline_entity_form][status][value]', NULL, 'Status field is present');
+    $this->assertFieldsByValue(t('Create variation'), NULL, 'Create variation button is present');
+
+    // Submit product variation values.
     $product_variation_values = [
       'variations[form][inline_entity_form][sku][0][value]' => $this->randomMachineName(),
-      'variations[form][inline_entity_form][status][value]' => 1
+      'variations[form][inline_entity_form][price][0][amount]' => 999,
+      'variations[form][inline_entity_form][status][value]' => 1,
     ];
     $this->drupalPostForm(NULL, $product_variation_values, t('Create variation'));
 
+    // Submit product values.
     $edit = [
       'title[0][value]' => $title,
     ];
@@ -42,6 +53,8 @@ class ProductAdminTest extends ProductTestBase {
     }
     $this->drupalPostForm(NULL, $edit, t('Save and publish'));
 
+    // Test results.
+    // Test product.
     $result = \Drupal::entityQuery('commerce_product')
       ->condition("title", $edit['title[0][value]'])
       ->range(0, 1)
@@ -56,11 +69,11 @@ class ProductAdminTest extends ProductTestBase {
     $this->assertFieldValues($product->getStoreIds(), $store_ids, 'Created product has the correct associated store ids.');
 
     // Assert that the frontend product page is displaying.
-    $this->drupalGet('product/' . $product->id());
+    $this->drupalGet($product->toUrl('canonical'));
     $this->assertResponse(200);
     $this->assertText($product->getTitle(), 'Product title exists');
 
-    // Test product variations
+    // Test product variations.
     $product_variation = \Drupal::entityQuery('commerce_product_variation')
       ->condition("sku", $product_variation_values['variations[form][inline_entity_form][sku][0][value]'])
       ->range(0, 1)
@@ -71,19 +84,84 @@ class ProductAdminTest extends ProductTestBase {
   }
 
   /**
-   * Tests deleting a product via the admin.
+   * Tests creating a product.
+   */
+  function testEditProduct() {
+    // Create product and product variation entities.
+    $variation = $this->createEntity('commerce_product_variation', [
+      'type' => 'default',
+      'sku' => strtolower($this->randomMachineName()),
+    ]);
+    $product = $this->createEntity('commerce_product', [
+      'type' => 'default',
+      'variations' => [$variation],
+    ]);
+
+    // Assert that the frontend product page is displaying.
+    $this->drupalGet($product->toUrl('edit-form'));
+    $this->assertResponse(200);
+
+    // Check the integrity of the edit form.
+    $this->assertFieldByName('title[0][value]', NULL, 'Title field is present');
+    $this->assertFieldById('edit-variations-entities-0-actions-ief-entity-edit', NULL, 'The edit button for product variation is present');
+    $this->drupalPostForm(NULL, [], t('Edit'));
+
+    // Check the product variation edit form.
+    $this->assertFieldByName('variations[form][inline_entity_form][entities][0][form][sku][0][value]', NULL, 'SKU field is present');
+    $this->assertFieldByName('variations[form][inline_entity_form][entities][0][form][price][0][amount]', NULL, 'Price field is present');
+    $this->assertFieldByName('variations[form][inline_entity_form][entities][0][form][status][value]', NULL, 'Status field is present');
+    $this->assertFieldsByValue(t('Update variation'), NULL, 'Update variation button is present');
+
+    // Submit product variation values.
+    $new_sku = strtolower($this->randomMachineName());
+    $new_price_amount = 111;
+    $product_variation_values = [
+      'variations[form][inline_entity_form][entities][0][form][sku][0][value]' => $new_sku,
+      'variations[form][inline_entity_form][entities][0][form][price][0][amount]' => $new_price_amount,
+      'variations[form][inline_entity_form][entities][0][form][status][value]' => 1,
+    ];
+    $this->drupalPostForm(NULL, $product_variation_values, t('Update variation'));
+
+    // Submit product values.
+    $title = $this->randomMachineName();
+    $store_ids = array_map(function ($store) {
+      return $store->id();
+    }, $this->stores);
+    $edit = [
+      'title[0][value]' => $title,
+    ];
+    foreach ($store_ids as $store_id) {
+      $edit['stores[target_id][value]['. $store_id .']'] = $store_id;
+    }
+    $this->drupalPostForm(NULL, $edit, t('Save and keep published'));
+
+    // Test results.
+    \Drupal::service('entity_type.manager')->getStorage('commerce_product_variation')->resetCache([$variation->id()]);
+    $variation = ProductVariation::load($variation->id());
+    $this->assertEqual($variation->getSku(), $new_sku, 'The variation sku successfully updated.');
+    $this->assertEqual($variation->get('price')->amount, $new_price_amount, 'The variation price successfully updated.');
+    \Drupal::service('entity_type.manager')->getStorage('commerce_product')->resetCache([$product->id()]);
+    $product = Product::load($product->id());
+    $this->assertEqual($product->getTitle(), $title, 'The product title successfully updated.');
+    $this->assertFieldValues($product->getStores(), $this->stores, 'Updated product has the correct associated stores.');
+    $this->assertFieldValues($product->getStoreIds(), $store_ids, 'Updated product has the correct associated store ids.');
+  }
+
+  /**
+   * Tests deleting a product.
    */
-  function testDeleteProductAdmin() {
+  function testDeleteProduct() {
     $product = $this->createEntity('commerce_product', [
       'title' => $this->randomMachineName(),
       'type' => 'default',
     ]);
-    $this->drupalGet('product/' . $product->id() . '/delete');
+    $this->drupalGet($product->toUrl('delete-form'));
     $this->assertText(t("Are you sure you want to delete the product @product?", ['@product' => $product->getTitle()]), "Commerce Product deletion confirmation text is showing");
     $this->assertText(t('This action cannot be undone.'), 'The product deletion confirmation form is available');
     $this->drupalPostForm(NULL, NULL, t('Delete'));
-    \Drupal::service('entity_type.manager')->getStorage('commerce_product')->resetCache();
 
+    // Test results
+    \Drupal::service('entity_type.manager')->getStorage('commerce_product')->resetCache();
     $product_exists = (bool) Product::load($product->id());
     $this->assertFalse($product_exists, 'The new product has been deleted from the database.');
   }
