package org.apache.archiva.metadata.repository.storage.maven2;

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

import org.apache.archiva.metadata.model.ProjectVersionMetadata;
import org.apache.archiva.filter.AllFilter;
import org.apache.archiva.filter.Filter;
import org.apache.archiva.metadata.repository.storage.ReadMetadataRequest;
import org.apache.archiva.metadata.repository.storage.RepositoryStorageRuntimeException;
import org.apache.archiva.repository.RepositoryRegistry;
import org.junit.Before;
import org.junit.Test;

import javax.inject.Inject;
import javax.inject.Named;

public class Maven2RepositoryMetadataResolverManagedSnapshotTest
    extends Maven2RepositoryMetadataResolverTest
{
    private static final Filter<String> ALL = new AllFilter<String>();

    @Inject
    @Named ( "repositoryStorage#maven2")
    private Maven2RepositoryStorage storage;

    @Inject
    RepositoryRegistry repositoryRegistry;

    private static final String TEST_REPO_ID = "test";

    private static final String TEST_REMOTE_REPO_ID = "central";

    private static final String ASF_SCM_CONN_BASE = "scm:svn:http://svn.apache.org/repos/asf/";

    private static final String ASF_SCM_DEV_CONN_BASE = "scm:svn:https://svn.apache.org/repos/asf/";

    private static final String ASF_SCM_VIEWVC_BASE = "http://svn.apache.org/viewvc/";

    private static final String TEST_SCM_CONN_BASE = "scm:svn:http://svn.example.com/repos/";

    private static final String TEST_SCM_DEV_CONN_BASE = "scm:svn:https://svn.example.com/repos/";

    private static final String TEST_SCM_URL_BASE = "http://svn.example.com/repos/";

    private static final String EMPTY_MD5 = "d41d8cd98f00b204e9800998ecf8427e";


    private static final String EMPTY_SHA1 = "da39a3ee5e6b4b0d3255bfef95601890afd80709";


    @Before
    @Override
    public void setUp()
        throws Exception
    {
        super.setUp();

        testRepo.setReleases( false );
        testRepo.setSnapshots( true );

        configuration.save( c );

        repositoryRegistry.reload();

        assertTrue( c.getManagedRepositories().get( 0 ).isSnapshots() );
        assertFalse( c.getManagedRepositories().get( 0 ).isReleases() );
    }

    @Test (expected = RepositoryStorageRuntimeException.class)
    @Override
    public void testModelWithJdkProfileActivation()
        throws Exception
    {
        // skygo IMHO must fail because TEST_REPO_ID ( is snap ,no release) and we seek for a snapshot

        ReadMetadataRequest readMetadataRequest =
            new ReadMetadataRequest().repositoryId( TEST_REPO_ID ).namespace( "org.apache.maven" ).projectId(
                "maven-archiver" ).projectVersion( "2.4.1" );

        ProjectVersionMetadata metadata = storage.readProjectVersionMetadata( readMetadataRequest );
    }

    @Test (expected = RepositoryStorageRuntimeException.class)
    @Override
    public void testGetProjectVersionMetadataForMislocatedPom()
        throws Exception
    {
        ReadMetadataRequest readMetadataRequest =
            new ReadMetadataRequest().repositoryId( TEST_REPO_ID ).namespace( "com.example.test" ).projectId(
                "mislocated-pom" ).projectVersion( "1.0" );
        storage.readProjectVersionMetadata( readMetadataRequest );

    }

    @Test
    @Override
    public void testGetProjectVersionMetadata()
        throws Exception
    {
        // super test is on release
    }

    @Test (expected = RepositoryStorageRuntimeException.class)
    @Override
    public void testGetProjectVersionMetadataForInvalidPom()
        throws Exception
    {
        ReadMetadataRequest readMetadataRequest =
            new ReadMetadataRequest().repositoryId( TEST_REPO_ID ).namespace( "com.example.test" ).projectId(
                "invalid-pom" ).projectVersion( "1.0" );
        storage.readProjectVersionMetadata( readMetadataRequest );
    }

    @Test (expected = RepositoryStorageRuntimeException.class)
    @Override
    public void testGetProjectVersionMetadataForMissingPom()
        throws Exception
    {
        ReadMetadataRequest readMetadataRequest =
            new ReadMetadataRequest().repositoryId( TEST_REPO_ID ).namespace( "com.example.test" ).projectId(
                "missing-pom" ).projectVersion( "1.0" );
        storage.readProjectVersionMetadata( readMetadataRequest );
    }
}
