/*
 * Copyright 2010-2013 Ning, Inc.
 * Copyright 2014 Groupon, Inc
 * Copyright 2014 The Billing Project, LLC
 *
 * The Billing Project licenses this file to you under the Apache License, version 2.0
 * (the "License"); you may not use this file except in compliance with the
 * License.  You may obtain a copy of the License at:
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

package org.killbill.billing.jaxrs;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.killbill.billing.client.model.Catalog;
import org.killbill.billing.client.model.Plan;
import org.killbill.billing.client.model.PlanDetail;
import org.killbill.billing.client.model.Product;
import org.testng.Assert;
import org.testng.annotations.Test;

import com.google.common.io.Resources;

public class TestCatalog extends TestJaxrsBase {

    @Test(groups = "slow", description = "Upload and retrieve a per tenant catalog")
    public void testMultiTenantCatalog() throws Exception {
        final String catalogPath = Resources.getResource("SpyCarBasic.xml").getPath();
        killBillClient.uploadXMLCatalog(catalogPath, createdBy, reason, comment);

        final String catalog = killBillClient.getXMLCatalog();
        Assert.assertNotNull(catalog);
    }

    @Test(groups = "slow", description = "Can retrieve a simplified version of the catalog")
    public void testCatalogSimple() throws Exception {
        final Set<String> allBasePlans = new HashSet<String>();

        final Catalog catalogJsonSimple = killBillClient.getSimpleCatalog();
        for (final Product productJson : catalogJsonSimple.getProducts()) {
            if (!"BASE".equals(productJson.getType())) {
                Assert.assertEquals(productJson.getIncluded().size(), 0);
                Assert.assertEquals(productJson.getAvailable().size(), 0);
                continue;
            }

            // Save all plans for later (see below)
            for (final Plan planJson : productJson.getPlans()) {
                allBasePlans.add(planJson.getName());
            }

            // Retrieve available products (addons) for that base product
            final List<PlanDetail> availableAddons = killBillClient.getAvailableAddons(productJson.getName());
            final Set<String> availableAddonsNames = new HashSet<String>();
            for (final PlanDetail planDetailJson : availableAddons) {
                availableAddonsNames.add(planDetailJson.getProduct());
            }
            Assert.assertEquals(availableAddonsNames, new HashSet<String>(productJson.getAvailable()));
        }

        // Verify base plans endpoint
        final List<PlanDetail> basePlans = killBillClient.getBasePlans();
        final Set<String> foundBasePlans = new HashSet<String>();
        for (final PlanDetail planDetailJson : basePlans) {
            foundBasePlans.add(planDetailJson.getPlan());
        }
        Assert.assertEquals(foundBasePlans, allBasePlans);
    }
}

@@ -792,16 +792,38 @@
 l.List;%0A
+import java.util.Map;%0A
 import j
@@ -836,16 +836,16 @@
 il.Set;%0A
-
 %0Aimport 
@@ -1037,16 +1037,71 @@
 roduct;%0A
+import org.killbill.billing.util.jackson.ObjectMapper;%0A
 import o
@@ -1615,32 +1615,32 @@
 etXMLCatalog();%0A
-
         Assert.a
@@ -1665,24 +1665,1831 @@
 og);%0A    %7D%0A%0A
+    @Test(groups = %22slow%22, description = %22Can retrieve the full catalog as JSON, see https://github.com/killbill/killbill/issues/272%22)%0A    public void testFullCatalogJSON() throws Exception %7B%0A        final String jsonCatalog = killBillClient.getJSONCatalog();%0A        // Verify we can serialize the StandaloneCatalog as JSON. While we usually never serialize%0A        // directly API objects (we always transform them in the JAX-RS layer), this is a good%0A        // regression test to make sure there are no loops and/or exceptions going through all%0A        // the getters, which can be problematic in the Ruby bridge (see in particular%0A        // https://github.com/killbill/killbill-java-parser/issues/6 and https://github.com/killbill/killbill-java-parser/issues/7).%0A        // We don't attempt to de-serialize it back however because there is not enough information%0A        // for Jackson (e.g. which concrete implementation of catalog objects to use). If we want to support%0A        // this one day, we will need a translation layer in JAX-RS for all catalog objects.%0A        final Map standaloneCatalog = new ObjectMapper().readValue(jsonCatalog, Map.class);%0A        Assert.assertEquals(standaloneCatalog.get(%22catalogName%22), %22Firearms%22);%0A        Assert.assertEquals(standaloneCatalog.get(%22recurringBillingMode%22), %22IN_ADVANCE%22);%0A        Assert.assertEquals(standaloneCatalog.get(%22effectiveDate%22), %222011-01-01T00:00:00.000+0000%22);%0A        Assert.assertEquals(((List) standaloneCatalog.get(%22currentSupportedCurrencies%22)).size(), 3);%0A        Assert.assertEquals(((List) standaloneCatalog.get(%22currentProducts%22)).size(), 11);%0A        Assert.assertEquals(((List) standaloneCatalog.get(%22currentPlans%22)).size(), 20);%0A        Assert.assertEquals(((List) standaloneCatalog.get(%22currentUnits%22)).size(), 1);%0A    %7D%0A%0A
     @Test(gr

add regression test for the JSON Catalog endpoint