@Test
 public void testGetProductBags() throws Exception {
   ProductBagApi bags = new ProductBagApi(new MockContext());
   bags.addProduct("some bag name", new Product.Builder("product name", "product sku", 1).build());
   assertEquals("product name", bags.getBags().get(0).getProducts().get(0).getName());
   try {
     bags.getBags().clear();
   } catch (UnsupportedOperationException e) {
     return;
   }
   fail("Bag was able to be altered.");
 }
 @Test
 public void testClearProductBag() throws Exception {
   ProductBagApi bags = new ProductBagApi(new MockContext());
   assertFalse(bags.clearProductBag(""));
   assertFalse(bags.clearProductBag(null));
   assertFalse(bags.clearProductBag("whatever"));
   bags.addProduct("some bag name", new Product.Builder("product name", "product sku", 1).build());
   assertEquals(1, bags.getBags().size());
   assertEquals(1, bags.getBags().get(0).getProducts().size());
   assertFalse(bags.clearProductBag("whatever"));
   assertTrue(bags.clearProductBag("sOme bag name"));
   assertEquals(1, bags.getBags().size());
   assertEquals(0, bags.getBags().get(0).getProducts().size());
 }
  @Test
  public void testToString() throws Exception {
    ProductBagApi bags = new ProductBagApi(new MockContext());
    bags.addProduct("some bag name", new Product.Builder("product name", "product sku", 1).build());
    bags.addProduct(
        "some bag name", new Product.Builder("product name 2", "product sku 2", 1).build());
    bags.addProduct(
        "some bag name 2", new Product.Builder("product name 3", "product sku 3", 1).build());
    bags.addProduct("some bag name 3", null);
    JSONObject json = new JSONObject(bags.toString());
    assertTrue(json.has("some bag name"));
    JSONObject bag1 = json.getJSONObject("some bag name");
    assertTrue(bag1.has("pl"));
    JSONArray products1 = bag1.getJSONArray("pl");
    assertEquals(2, products1.length());
    JSONObject bag2 = json.getJSONObject("some bag name 2");
    assertTrue(bag2.has("pl"));
    JSONArray products2 = bag2.getJSONArray("pl");
    assertEquals(1, products2.length());

    JSONObject bag3 = json.getJSONObject("some bag name 3");
    assertTrue(bag3.has("pl"));
    JSONArray products3 = bag3.getJSONArray("pl");
    assertEquals(0, products3.length());
  }
  @Test
  public void testRemoveProduct() throws Exception {
    ProductBagApi bags = new ProductBagApi(new MockContext());
    // error scenarios
    assertFalse(bags.removeProduct(null, new Product.Builder("name", "sku", 1.0).build()));
    assertFalse(bags.removeProduct("whatever", new Product.Builder("name", "sku", 1.0).build()));
    assertFalse(bags.removeProduct("whatever", null));

    // remove a product that doesn't exist
    Product product = new Product.Builder("product name", "product sku", 1).build();
    Product product2 = new Product.Builder("product name 2", "product sku 2", 1).build();
    bags.addProduct("some bag name", product);
    ProductBag bag = bags.findBag("some bag name");
    assertEquals("some bag name", bag.getName());
    assertEquals(1, bag.getProducts().size());
    String bagString = bags.toString();
    assertFalse(bags.removeProduct("some bag name 2", product));
    assertFalse(bags.removeProduct("some bag name", product2));
    assertEquals(bagString, bags.toString());
    assertTrue(bags.removeProduct("some bag name", product));
    assertEquals(1, bags.getBags().size());
    assertEquals(0, bag.getProducts().size());
    assertNotEquals(bagString, bags.toString());
  }
 @Test
 public void testAddProduct() throws Exception {
   ProductBagApi bags = new ProductBagApi(new MockContext());
   String bagString = bags.toString();
   // make sure error conditions don't mutate the bags
   boolean result =
       bags.addProduct(null, new Product.Builder("product name", "product sku", 1).build());
   assertFalse(result);
   assertEquals(bagString, bags.toString());
   assertEquals(0, bags.getBags().size());
   result = bags.addProduct("bag name", null);
   // add an empty bag
   assertTrue(result);
   assertNotEquals(bagString, bags.toString());
   assertEquals(1, bags.getBags().size());
   // now test a simple add of a bag that doesn't exist
   result =
       bags.addProduct(
           "some bag name", new Product.Builder("product name", "product sku", 1).build());
   assertTrue(result);
   assertEquals(2, bags.getBags().size());
   assertEquals("some bag name", bags.findBag("some bag name").getName());
   assertNotEquals(bagString, bags.toString());
   bagString = bags.toString();
   // adding with an existing bag shouldn't create a whole new bag
   bags.addProduct(
       "some bag name", new Product.Builder("product name 2", "product sku 2", 1).build());
   assertEquals(2, bags.getBags().size());
   assertEquals("product name 2", bags.getBags().get(1).getProducts().get(1).getName());
   assertNotEquals(bagString, bags.toString());
 }