/*
 * 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.testing.mock.sling.resource;

import static org.junit.Assert.assertEquals;

import org.apache.sling.api.resource.Resource;
import org.apache.sling.testing.mock.sling.ResourceResolverType;
import org.apache.sling.testing.mock.sling.junit.SlingContext;
import org.apache.sling.testing.mock.sling.junit.SlingContextBuilder;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import com.google.common.collect.ImmutableMap;

/**
 * Validates vanity path handling 
 */
public abstract class AbstractVanityPathTest {

    @Rule
    public SlingContext context = new SlingContextBuilder(getResourceResolverType())
        .resourceResolverFactoryActivatorProps(ImmutableMap.<String, Object>of(
            "resource.resolver.mapping", new String[] {
                "/:/", 
                "/content/test/</"
             }
        ))
        .build();

    protected abstract ResourceResolverType getResourceResolverType();

    @Before
    public void setUp() throws Exception {
       context.build().resource("/content")
               .resource("test")
               .resource("vanity", 
                       "sling:vanityPath", "/my-vanity");
    }

    @Test
    public void testVanityPath() throws Exception {
        String mappedPath = context.resourceResolver().map("/content/test/my-vanity");
        assertEquals("/my-vanity", mappedPath);

        Resource resolved = context.resourceResolver().resolve(mappedPath);
        assertEquals("sling:redirect", resolved.getResourceType());
    }

}
