package org.jboss.resteasy.test.spring.unit;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MediaTypeEditor;
import java.beans.PropertyEditor;
import java.nio.charset.StandardCharsets;

/**
 * @tpSubChapter Spring
 * @tpChapter Unit test
 * @tpTestCaseDetails  Tests MediaTypeEditor
 * @tpSince RESTEasy 3.0.16
 */
public class MediaTypePropertyEditorTest {

    private PropertyEditor propertyEditor;
    private static final String ERROR_MESSAGE_TYPE = "Didn't get correct mediatype";
    private static final String ERROR_MESSAGE_ENCODING = "Didn't get correct mediatype";

    @Before
    public void setupEditor() {
        propertyEditor = new MediaTypeEditor();
    }

    /**
     * @tpTestDetails Tests that mediatype is set correctly to MediaTypeEditor
     * @tpSince RESTEasy 3.0.16
     */
    @Test
    public void testSetAsText() {
        propertyEditor.setAsText("application/xml");
        MediaType type = (MediaType) propertyEditor.getValue();
        Assert.assertEquals(ERROR_MESSAGE_TYPE, "application", type.getType());
        Assert.assertEquals(ERROR_MESSAGE_TYPE, "xml", type.getSubtype());
    }

    /**
     * @tpTestDetails Tests that mediatype and charset is set correctly to MediaTypeEditor
     * @tpSince RESTEasy 3.0.16
     */
    @Test
    public void testSetAsTextWithCharset() {
        propertyEditor.setAsText("application/xml;charset=UTF-8");
        MediaType type = (MediaType) propertyEditor.getValue();
        Assert.assertEquals(ERROR_MESSAGE_TYPE, "application", type.getType());
        Assert.assertEquals(ERROR_MESSAGE_TYPE, "xml", type.getSubtype());
        Assert.assertEquals(ERROR_MESSAGE_ENCODING, StandardCharsets.UTF_8.name(), type.getParameters().get("charset"));
    }

    /**
     * @tpTestDetails Tests that custom mediatype is set correctly to MediaTypeEditor
     * @tpSince RESTEasy 3.0.16
     */
    @Test
    public void testSetAsTextCustom() {
        propertyEditor.setAsText("application/custom");
        MediaType type = (MediaType) propertyEditor.getValue();
        Assert.assertEquals(ERROR_MESSAGE_TYPE, "application", type.getType());
        Assert.assertEquals(ERROR_MESSAGE_TYPE, "custom", type.getSubtype());
    }

    /**
     * @tpTestDetails Tests that getAsText() of MediaTypeEditor returns correct value
     * @tpSince RESTEasy 3.0.16
     */
    @Test
    public void testGetAsText() {
        MediaType type = MediaType.valueOf("application/xml");
        propertyEditor.setValue(type);
        String text = propertyEditor.getAsText();
        Assert.assertEquals(ERROR_MESSAGE_TYPE, "application/xml", text);
    }

    /**
     * @tpTestDetails Tests that getAsText() of MediaTypeEditor with custom MediaType returns correct value
     * @tpSince RESTEasy 3.0.16
     */
    @Test
    public void testGetAsTextCustom() {
        MediaType type = MediaType.valueOf("application/custom");
        propertyEditor.setValue(type);
        String text = propertyEditor.getAsText();
        Assert.assertEquals(ERROR_MESSAGE_TYPE, "application/custom", text);
    }

}
