package com.quorum.tessera.config;

import com.quorum.tessera.config.util.JaxbUtil;
import org.junit.Test;

import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonString;
import javax.json.JsonValue;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;

import static org.assertj.core.api.Assertions.assertThat;

public class CrossDomainConfigTest {

    @Test
    public void unmarshal() {
        byte[] json = "{\"allowedMethods\" : [\"GET\", \"OPTIONS\"], \"allowedOrigins\": [\"*\"], \"allowedHeaders\": [\"*\"], \"allowCredentials\": false}".getBytes();

        CrossDomainConfig result = JaxbUtil.unmarshal(new ByteArrayInputStream(json), CrossDomainConfig.class);

        assertThat(result.getAllowedMethods()).containsExactly("GET", "OPTIONS");
        assertThat(result.getAllowedOrigins()).containsExactly("*");
        assertThat(result.getAllowedHeaders()).containsExactly("*");
        assertThat(result.getAllowCredentials()).isFalse();
    }

    @Test
    public void unmarshalDefaults() {
        byte[] json = "{}".getBytes();

        CrossDomainConfig result = JaxbUtil.unmarshal(new ByteArrayInputStream(json), CrossDomainConfig.class);

        assertThat(result.getAllowedMethods()).containsExactly("GET", "POST", "PUT", "DELETE", "OPTIONS", "HEAD");
        assertThat(result.getAllowedOrigins()).isNull();
        assertThat(result.getAllowedHeaders()).isNull();
        assertThat(result.getAllowCredentials()).isTrue();
    }

    @Test
    public void marshal() {
        CrossDomainConfig config = new CrossDomainConfig();
        config.setAllowedMethods(Arrays.asList("GET", "OPTIONS"));
        config.setAllowedOrigins(Arrays.asList("a", "b"));
        config.setAllowedHeaders(Arrays.asList("A", "B"));
        config.setAllowCredentials(Boolean.TRUE);

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        JaxbUtil.marshal(config, out);

        JsonObject result = Json.createReader(new ByteArrayInputStream(out.toByteArray())).readObject();

        assertThat(result.getJsonArray("allowedMethods").getValuesAs(JsonString.class)).containsExactlyInAnyOrder(Json.createValue("GET"), Json.createValue("OPTIONS"));
        assertThat(result.getJsonArray("allowedOrigins").getValuesAs(JsonString.class)).containsExactlyInAnyOrder(Json.createValue("a"), Json.createValue("b"));
        assertThat(result.getJsonArray("allowedHeaders").getValuesAs(JsonString.class)).containsExactlyInAnyOrder(Json.createValue("A"), Json.createValue("B"));
        assertThat(result.get("allowCredentials")).isEqualTo(JsonValue.TRUE);
    }

    @Test
    public void marshalEmpty() {
        CrossDomainConfig config = new CrossDomainConfig();

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        JaxbUtil.marshal(config, out);

        JsonObject result = Json.createReader(new ByteArrayInputStream(out.toByteArray())).readObject();

        assertThat(result.getJsonArray("allowedMethods")).isNull();
        assertThat(result.getJsonArray("allowedOrigins")).isNull();
        assertThat(result.getJsonArray("allowedHeaders")).isNull();
        assertThat(result.get("allowCredentials")).isNull();
    }
}