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

import org.apache.openejb.junit.ContextConfig;
import org.apache.openejb.junit.Property;
import org.apache.openejb.junit.TestResource;
import org.apache.openejb.junit.TestResourceTypes;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

import java.util.Hashtable;

import static org.junit.jupiter.api.Assertions.*;


/**
 * Here we test class level dual config, with method level overrides. We check some
 * properties in all tests (even when not in it's config), to ensure overrides work
 * properly, and also that context sharing doesn't happen.
 */
@RunWithOpenEjb
@ContextConfig(
    configFile = "/META-INF/test-config.properties",
    properties = {
        @Property("junit.test-property-override=New Class Property Value")
    }
)
public class TestDualConfigOverride {
    @TestResource(TestResourceTypes.CONTEXT_CONFIG)
    private Hashtable<String, String> contextConfig;

    public TestDualConfigOverride() {
    }

    @Test
    public void testClassConfig() {
        assertNotNull(contextConfig);

        checkProperty("junit.test-property", "Test String");
        checkProperty("junit.test-property-override", "New Class Property Value");
        checkProperty("junit.test-property-override2", "Original Value 2");
        checkProperty("junit.test-property-override3", "Original Value 3");
        assertNull(contextConfig.get("junit.test-new-method-file-property"));
        assertNull(contextConfig.get("junit.test-new-method-property"));
    }

    @Test
    @ContextConfig(
        configFile = "/META-INF/test-config-method.properties"
    )
    public void testMethodFileOverride() {
        assertNotNull(contextConfig);

        checkProperty("junit.test-property", "Test String");
        checkProperty("junit.test-property-override", "New Class Property Value");
        checkProperty("junit.test-property-override2", "New Method File Value 2");
        checkProperty("junit.test-property-override3", "Original Value 3");
        checkProperty("junit.test-new-method-file-property", "New Method Value");
        assertNull(contextConfig.get("junit.test-new-method-property"));
    }

    @Test
    @ContextConfig(
        properties = {
            @Property("junit.test-property-override3=New Method Property Value 3"),
            @Property("junit.test-new-method-property=New Method Property Value")
        }
    )
    public void testMethodPropertiesOverride() {
        assertNotNull(contextConfig);

        checkProperty("junit.test-property", "Test String");
        checkProperty("junit.test-property-override", "New Class Property Value");
        checkProperty("junit.test-property-override2", "Original Value 2");
        checkProperty("junit.test-property-override3", "New Method Property Value 3");
        checkProperty("junit.test-new-method-property", "New Method Property Value");
        assertNull(contextConfig.get("junit.test-new-method-file-property"));
    }

    @Test
    @ContextConfig(
        configFile = "/META-INF/test-config-method.properties",
        properties = {
            @Property("junit.test-property-override2=New Method Property Value 2"),
            @Property("junit.test-new-method-property=New Method Property Value")
        }
    )
    public void testMethodDualOverride() {
        assertNotNull(contextConfig);

        checkProperty("junit.test-property", "Test String");
        checkProperty("junit.test-property-override", "New Class Property Value");
        checkProperty("junit.test-property-override2", "New Method Property Value 2");
        checkProperty("junit.test-property-override3", "Original Value 3");
        checkProperty("junit.test-new-method-file-property", "New Method Value");
        checkProperty("junit.test-new-method-property", "New Method Property Value");
    }

    private void checkProperty(final String key, final String expected) {
        final String value = contextConfig.get(key);
        assertEquals(expected, value);
    }
}
