/*
 * 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.helpers;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.io.IOException;

import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.request.RequestPathInfo;
import org.apache.sling.api.resource.Resource;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Matchers;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

public class JsonRendererServletTest {
    
    private SlingHttpServletRequest request;
    private SlingHttpServletResponse response;
    private String [] selectors;
    private JsonRenderer jrs;
    
    @Before
    public void setup() {
        request = Mockito.mock(SlingHttpServletRequest.class);
        
        final RequestPathInfo rpi = Mockito.mock(RequestPathInfo.class);
        Mockito.when(request.getRequestPathInfo()).thenReturn(rpi);
        Mockito.when(rpi.getSelectors()).thenAnswer(new Answer<String[]>(){
            public String [] answer(InvocationOnMock invocation) {
                return selectors;
            }
        });
        
        final Resource resource = Mockito.mock(Resource.class);
        Mockito.when(request.getResource()).thenReturn(resource);
        
        response = Mockito.mock(SlingHttpServletResponse.class);
        
        jrs = new JsonRenderer(42);
    }
    
    @Test
    public void testRecursionLevelA() {
        selectors = new String[] { "12" };
        assertEquals(12, jrs.getMaxRecursionLevel(request));
        assertFalse(jrs.isTidy(request));
    }
    
    @Test(expected=IllegalArgumentException.class)
    public void testRecursionLevelB() {
        selectors = new String[] { "42", "more" };
        jrs.getMaxRecursionLevel(request);
    }
    
    @Test(expected=IllegalArgumentException.class)
    public void testRecursionLevelC() {
        selectors = new String[] { "more" };
        jrs.getMaxRecursionLevel(request);
    }
    
    @Test
    public void testRecursionLevelD() {
        selectors = new String[] { "tidy" };
        assertEquals(0, jrs.getMaxRecursionLevel(request));
    }

    @Test
    public void testRecursionLevelE() {
        // Level must be the last selector but
        // if the last selector is "tidy" there's
        // no error. "for historical reasons"
        selectors = new String[] { "46", "tidy" };
        assertEquals(0, jrs.getMaxRecursionLevel(request));
    }

    @Test
    public void testRecursionLevelF() {
        selectors = new String[] { "tidy", "45" };
        assertEquals(45, jrs.getMaxRecursionLevel(request));
        assertTrue(jrs.isTidy(request));
    }
    
    @Test
    public void testBadRequest() throws IOException {
        selectors = new String[] { "bad", "selectors" };
        jrs.render(request, response);
        Mockito.verify(response, Mockito.times(1)).sendError(Matchers.anyInt(), Matchers.anyString());
    }
}