/**
******************************************************************************
* Copyright © 2018 PTA GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* 
*     http://www.eclipse.org/legal/epl-v10.html
* 
******************************************************************************
*/

package org.eclipse.openk.api;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import static junit.framework.TestCase.assertEquals;

public class ServiceDistributionClusterTest {

    private ServiceDistributionCluster.ServiceDistribution createDistribution(
            boolean active, String name, String host, String urlPath, String protocol,
            Integer portApp, Integer portHealth, String description) {

        ServiceDistributionCluster.ServiceDistribution sd = new ServiceDistributionCluster.ServiceDistribution();
        sd.setActive(true);
        sd.setName(name);
        sd.setHost(host);
        sd.setUrlPath(urlPath);
        sd.setProtocol(protocol);
        sd.setPortApp(portApp);
        sd.setPortHealth(portHealth);
        sd.setDescription(description);

        return sd;
    }

    @Test
    public void testPojo() throws IOException {
        List<ServiceDistributionCluster.ServiceDistribution> distList = new ArrayList<>();
        distList.add(createDistribution(true, "Hugo", "1.2.3.4", "19/eleven", "httpx",
                1000, 2000, "Hugo ist toll"));
        distList.add(createDistribution(false, "Bruno Haferkamp", "2.3.4.5", "seven/of/nine", "httpxy",
                10, null, "Bruno ist noch toller"));
        ServiceDistributionCluster.ServiceDistribution[] arr
                = new ServiceDistributionCluster.ServiceDistribution[distList.size()];
        ServiceDistributionCluster cluster = new ServiceDistributionCluster();

        cluster.setDistributions(distList.toArray(arr));
        cluster.setClustername("Kleister");
        cluster.setActive(true);
        cluster.setDescription("The cluster of kleister!");

        ObjectMapper om = new ObjectMapper();
        String json = om.writeValueAsString(cluster);

        ServiceDistributionCluster inCluster = om.readValue(json, ServiceDistributionCluster.class);

        assertEquals(cluster.getClustername(), inCluster.getClustername());
        assertEquals(cluster.isActive(), inCluster.isActive());
        assertEquals(cluster.getDescription(), inCluster.getDescription());
        for (int i = 0; i < cluster.getDistributions().length; i++) {
            assertEquals(cluster.getDistributions()[i].getName(), inCluster.getDistributions()[i].getName());
            assertEquals(cluster.getDistributions()[i].getHost(), inCluster.getDistributions()[i].getHost());
            assertEquals(cluster.getDistributions()[i].getUrlPath(), inCluster.getDistributions()[i].getUrlPath());
            assertEquals(cluster.getDistributions()[i].isActive(), inCluster.getDistributions()[i].isActive());
            assertEquals(cluster.getDistributions()[i].getPortApp(), inCluster.getDistributions()[i].getPortApp());
            assertEquals(cluster.getDistributions()[i].getPortHealth(), inCluster.getDistributions()[i].getPortHealth());
            assertEquals(cluster.getDistributions()[i].getDescription(), inCluster.getDistributions()[i].getDescription());
            assertEquals(cluster.getDistributions()[i].getProtocol(), inCluster.getDistributions()[i].getProtocol());
        }
    }
}
