package pta.de.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 protocol,
            Integer portApp, Integer portHealth, String description) {

        ServiceDistributionCluster.ServiceDistribution sd = new ServiceDistributionCluster.ServiceDistribution();
        sd.setActive(true);
        sd.setName(name);
        sd.setHost(host);
        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", "httpx",
                1000, 2000, "Hugo ist toll"));
        distList.add(createDistribution(false, "Bruno Haferkamp", "2.3.4.5", "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].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());
        }
    }
}
