package org.apache.maven.repository.internal;

/*
 * 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 static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

import org.eclipse.aether.RepositoryEvent;
import org.eclipse.aether.RepositoryEvent.EventType;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.impl.ArtifactDescriptorReader;
import org.eclipse.aether.impl.RepositoryEventDispatcher;
import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
import org.mockito.ArgumentCaptor;

public class DefaultArtifactDescriptorReaderTest
    extends AbstractRepositoryTestCase
{

    public void testMng5459()
        throws Exception
    {
        // prepare
        DefaultArtifactDescriptorReader reader = (DefaultArtifactDescriptorReader) lookup( ArtifactDescriptorReader.class );

        RepositoryEventDispatcher eventDispatcher = mock( RepositoryEventDispatcher.class );

        ArgumentCaptor<RepositoryEvent> event = ArgumentCaptor.forClass( RepositoryEvent.class );

        reader.setRepositoryEventDispatcher( eventDispatcher );

        ArtifactDescriptorRequest request = new ArtifactDescriptorRequest();

        request.addRepository( newTestRepository() );

        request.setArtifact( new DefaultArtifact( "org.apache.maven.its", "dep-mng5459", "jar", "0.4.0-SNAPSHOT" ) );

        // execute
        reader.readArtifactDescriptor( session, request );

        // verify
        verify( eventDispatcher ).dispatch( event.capture() );

        boolean missingArtifactDescriptor = false;

        for( RepositoryEvent evt : event.getAllValues() )
        {
            if ( EventType.ARTIFACT_DESCRIPTOR_MISSING.equals( evt.getType() ) )
            {
                assertEquals( "Could not find artifact org.apache.maven.its:dep-mng5459:pom:0.4.0-20130404.090532-2 in repo (" + newTestRepository().getUrl() + ")", evt.getException().getMessage() );
                missingArtifactDescriptor = true;
            }
        }

        if( !missingArtifactDescriptor )
        {
            fail( "Expected missing artifact descriptor for org.apache.maven.its:dep-mng5459:pom:0.4.0-20130404.090532-2" );
        }
    }
}
