diff --git a/modules/cart/src/Tests/CartTest.php b/modules/cart/src/Tests/CartTest.php
new file mode 100644
index 0000000..cad646a
--- /dev/null
+++ b/modules/cart/src/Tests/CartTest.php
@@ -0,0 +1,187 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\commerce_cart\Tests\CartTest.
+ */
+
+namespace Drupal\commerce_cart\Tests;
+
+use Drupal\commerce_order\Entity\Order;
+use Drupal\commerce_order\Tests\OrderTestBase;
+use Drupal\commerce_product\Entity\ProductVariation;
+
+/**
+ * Functional tests for the Commerce Cart module.
+ *
+ * @group commerce
+ */
+class CartTest extends OrderTestBase {
+
+  /**
+   * The cart order to test against
+   *
+   * @var \Drupal\commerce_order\Entity\Order
+   */
+  protected $cart;
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = [
+    'commerce',
+    'commerce_product',
+    'commerce_order',
+    'commerce_cart',
+    'commerce_price',
+    'inline_entity_form',
+    'block',
+    'node',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getAdministratorPermissions() {
+    return array_merge([
+      'administer products',
+      'access content',
+    ], parent::getAdministratorPermissions());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // Create a Cart order with the existing product variation.
+    $line_item = $this->createEntity('commerce_line_item', [
+      'type' => 'product_variation',
+      'purchased_entity' => $this->variation->id(),
+      'quantity' => 1,
+      'unit_price' => [
+        'amount' => 999,
+        'currency_code' => 'EUR',
+      ],
+    ]);
+    $order = $this->createEntity('commerce_order', [
+      'type' => 'default',
+      'store_id' => $this->store->id(),
+      'uid' => $this->loggedInUser->id(),
+      'mail' => $this->loggedInUser->getEmail(),
+      'line_items' => [$line_item],
+      'cart' => 1,
+    ]);
+    $this->cart = Order::load($order->id());
+
+  }
+
+  /**
+   * Test for cart order and product variation set.
+   */
+  public function testCartOrder() {
+    // Get the current cart order of the current user and check if matches
+    // the test order.
+    $card_id = \Drupal::service('commerce_cart.cart_provider')->getCartId('default', $this->store, $this->adminUser);
+    $this->assertTrue(($card_id == $this->cart->id()), t('User has currently an order in cart status.'));
+
+    // Check if the test product variation is present in the test cart order.
+    $line_item = \Drupal::service('commerce_cart.cart_manager')->createLineItem($this->variation);
+    $matching_line_item = \Drupal::service('commerce_cart.line_item_matcher')->match($line_item, $this->cart->getLineItems());
+    $this->assertNotNull($matching_line_item, t('The product @product has been added to cart.', ['@product' => $line_item->getTitle()]));
+  }
+
+  /**
+   * Test if the cart form has the correct fields and structure.
+   * Check if the form is present and it has the quantity field, remove and
+   * submit buttons.
+   */
+  public function testCartPage() {
+    // Get the cart page.
+    $this->drupalGet('cart');
+
+    // Check remove button.
+    $this->assertFieldByXPath("//input[starts-with(@id, 'edit-remove-button')]", NULL, t('Remove button is present.'));
+
+    // Check quantity field.
+    $this->assertFieldByXPath("//input[starts-with(@id, 'edit-edit-quantity')]", NULL, t('Quantity field present.'));
+    $this->assertFieldByXPath("//input[starts-with(@id, 'edit-edit-quantity')]", 1, t('Quantity field has correct number of items.'));
+
+    // Check if the Update cart button is present.
+    $this->assertField("edit-submit", t('Update cart button is present.'));
+  }
+
+  /**
+   * Test the quantity changes in the cart.
+   */
+  public function testCartChangeQuantity() {
+    // Get the cart page.
+    $this->drupalGet('cart');
+
+    // Change quantity in the cart view form and update the form.
+    $values = [
+      'edit_quantity[0]' => 2,
+    ];
+    $this->drupalPostForm(NULL, $values, t('Update cart'));
+
+    // Check if the quantity has been really changed.
+    $this->assertFieldByXPath("//input[starts-with(@id, 'edit-edit-quantity')]", 2, t('Cart updated with new quantity.'));
+  }
+
+  /**
+   * Test removing a product from the cart.
+   */
+  public function testCartRemove() {
+    // Get the cart page.
+    $this->drupalGet('cart');
+
+    // Remove the product from the cart.
+    $this->drupalPostForm(NULL, array(), t('Remove'));
+
+    // Test if the page resolves and there is something in the cart.
+    $this->assertText(t('Your shopping cart is empty.'), t('Removed product and cart is empty.'));
+  }
+
+  /**
+   * Tests for product Add to cart form.
+   */
+  public function testProductAddToCartForm() {
+    // Create a second product variation.
+    $values = [
+      'type' => 'default',
+      'sku' => $this->randomMachineName(),
+      'price' => [
+        'amount' => 999,
+        'currency_code' => 'EUR',
+      ]
+    ];
+    $new_variation = ProductVariation::create($values);
+    $new_variation->save();
+
+    // Create a new product for this variation.
+    $new_product = $this->createEntity('commerce_product', [
+      'type' => 'default',
+      'title' => $this->randomMachineName(),
+      'variations' => [$new_variation],
+    ]);
+
+    // Get the product page and submit Add to cart form.
+    $this->drupalGet('product/' . $new_product->id());
+    $this->assertField('edit-submit', t('Add to cart button exists.'));
+    $edit = [
+      'variation' => $new_variation->id(),
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Add to cart'));
+
+    // Check if the product was added to cart.
+    \Drupal::service('entity_type.manager')->getStorage('commerce_order')->resetCache();
+    $cart = Order::load($this->cart->id());
+    $line_item = \Drupal::service('commerce_cart.cart_manager')->createLineItem($new_variation);
+    $matching_line_item = \Drupal::service('commerce_cart.line_item_matcher')->match($line_item, $cart->getLineItems());
+    $this->assertNotNull($matching_line_item, t('The product @product has been added to cart.', ['@product' => $line_item->getTitle()]));
+  }
+
+}
