/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF 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.apache.sling.servlets.get.impl;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.lang.reflect.Field;
import java.util.Map;

import javax.servlet.Servlet;
import javax.servlet.ServletContext;

import org.junit.Test;
import org.mockito.Mockito;

public class DefaultGetServletTest {

    @Test
    public void testDisabledAlias() throws Exception {
        @SuppressWarnings("serial")
        final DefaultGetServlet servlet = new DefaultGetServlet() {
            public ServletContext getServletContext() {
                return null;
            }
        };
        final DefaultGetServlet.Config config = Mockito.mock(DefaultGetServlet.Config.class);
        Mockito.when(config.enable_html()).thenReturn(true);
        Mockito.when(config.enable_json()).thenReturn(true);
        Mockito.when(config.enable_xml()).thenReturn(false);
        Mockito.when(config.enable_txt()).thenReturn(false);
        Mockito.when(config.aliases()).thenReturn(new String[] { "xml:pdf" });
        servlet.activate(config);

        servlet.init();

        final Field field = DefaultGetServlet.class.getDeclaredField("rendererMap");
        field.setAccessible(true);

        @SuppressWarnings("unchecked")
        final Map<String, Servlet> map = (Map<String, Servlet>) field.get(servlet);
        assertEquals(5, map.size());
        assertNotNull(map.get(DefaultGetServlet.EXT_RES));
        assertNotNull(map.get(DefaultGetServlet.EXT_HTML));
        assertNotNull(map.get(DefaultGetServlet.EXT_JSON));
        assertNotNull(map.get("pdf"));
        assertNotNull(map.get(null));
    }
}
