//
//  ========================================================================
//  Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
//  ------------------------------------------------------------------------
//  All rights reserved. This program and the accompanying materials
//  are made available under the terms of the Eclipse Public License v1.0
//  and Apache License v2.0 which accompanies this distribution.
//
//      The Eclipse Public License is available at
//      http://www.eclipse.org/legal/epl-v10.html
//
//      The Apache License v2.0 is available at
//      http://www.opensource.org/licenses/apache2.0.php
//
//  You may elect to redistribute this code under either of these licenses.
//  ========================================================================
//

package org.eclipse.jetty.start.fileinits;

import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertThat;

import java.io.IOException;
import java.net.URI;
import java.nio.file.Path;

import org.eclipse.jetty.start.BaseHome;
import org.eclipse.jetty.start.config.ConfigSources;
import org.eclipse.jetty.start.config.JettyBaseConfigSource;
import org.eclipse.jetty.start.config.JettyHomeConfigSource;
import org.eclipse.jetty.start.fileinits.MavenLocalRepoFileInitializer.Coordinates;
import org.eclipse.jetty.toolchain.test.TestingDir;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

public class MavenLocalRepoFileInitializerTest
{
    @Rule
    public ExpectedException expectedException = ExpectedException.none();
    
    @Rule
    public TestingDir testdir = new TestingDir();
    
    private BaseHome baseHome;
    
    @Before
    public void setupBaseHome() throws IOException
    {
        Path homeDir = testdir.getEmptyPathDir();
        
        ConfigSources config = new ConfigSources();
        config.add(new JettyHomeConfigSource(homeDir));
        config.add(new JettyBaseConfigSource(homeDir));

        this.baseHome = new BaseHome(config);
    }

    @Test
    public void testGetCoordinate_NotMaven()
    {
        MavenLocalRepoFileInitializer repo = new MavenLocalRepoFileInitializer(baseHome);
        String ref = "http://www.eclipse.org/jetty";
        Coordinates coords = repo.getCoordinates(URI.create(ref));
        assertThat("Coords",coords,nullValue());
    }

    @Test
    public void testGetCoordinate_InvalidMaven()
    {
        MavenLocalRepoFileInitializer repo = new MavenLocalRepoFileInitializer(baseHome);
        String ref = "maven://www.eclipse.org/jetty";
        expectedException.expect(RuntimeException.class);
        expectedException.expectMessage(containsString("Not a valid maven:// uri"));
        repo.getCoordinates(URI.create(ref));
    }

    @Test
    public void testGetCoordinate_Normal()
    {
        MavenLocalRepoFileInitializer repo = new MavenLocalRepoFileInitializer(baseHome);
        String ref = "maven://org.eclipse.jetty/jetty-start/9.3.x";
        Coordinates coords = repo.getCoordinates(URI.create(ref));
        assertThat("Coordinates",coords,notNullValue());

        assertThat("coords.groupId",coords.groupId,is("org.eclipse.jetty"));
        assertThat("coords.artifactId",coords.artifactId,is("jetty-start"));
        assertThat("coords.version",coords.version,is("9.3.x"));
        assertThat("coords.type",coords.type,is("jar"));
        assertThat("coords.classifier",coords.classifier,nullValue());
        
        assertThat("coords.toCentralURI", coords.toCentralURI().toASCIIString(), 
                is("http://central.maven.org/maven2/org/eclipse/jetty/jetty-start/9.3.x/jetty-start-9.3.x.jar"));
    }

    @Test
    public void testGetCoordinate_Zip()
    {
        MavenLocalRepoFileInitializer repo = new MavenLocalRepoFileInitializer(baseHome);
        String ref = "maven://org.eclipse.jetty/jetty-distribution/9.3.x/zip";
        Coordinates coords = repo.getCoordinates(URI.create(ref));
        assertThat("Coordinates",coords,notNullValue());

        assertThat("coords.groupId",coords.groupId,is("org.eclipse.jetty"));
        assertThat("coords.artifactId",coords.artifactId,is("jetty-distribution"));
        assertThat("coords.version",coords.version,is("9.3.x"));
        assertThat("coords.type",coords.type,is("zip"));
        assertThat("coords.classifier",coords.classifier,nullValue());
        
        assertThat("coords.toCentralURI", coords.toCentralURI().toASCIIString(), 
                is("http://central.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.3.x/jetty-distribution-9.3.x.zip"));
    }

    @Test
    public void testGetCoordinate_TestJar()
    {
        MavenLocalRepoFileInitializer repo = new MavenLocalRepoFileInitializer(baseHome);
        String ref = "maven://org.eclipse.jetty/jetty-http/9.3.x/jar/tests";
        Coordinates coords = repo.getCoordinates(URI.create(ref));
        assertThat("Coordinates",coords,notNullValue());

        assertThat("coords.groupId",coords.groupId,is("org.eclipse.jetty"));
        assertThat("coords.artifactId",coords.artifactId,is("jetty-http"));
        assertThat("coords.version",coords.version,is("9.3.x"));
        assertThat("coords.type",coords.type,is("jar"));
        assertThat("coords.classifier",coords.classifier,is("tests"));
        
        assertThat("coords.toCentralURI", coords.toCentralURI().toASCIIString(), 
                is("http://central.maven.org/maven2/org/eclipse/jetty/jetty-http/9.3.x/jetty-http-9.3.x-tests.jar"));
    }
    
    @Test
    public void testGetCoordinate_Test_UnspecifiedType()
    {
        MavenLocalRepoFileInitializer repo = new MavenLocalRepoFileInitializer(baseHome);
        String ref = "maven://org.eclipse.jetty/jetty-http/9.3.x//tests";
        Coordinates coords = repo.getCoordinates(URI.create(ref));
        assertThat("Coordinates",coords,notNullValue());

        assertThat("coords.groupId",coords.groupId,is("org.eclipse.jetty"));
        assertThat("coords.artifactId",coords.artifactId,is("jetty-http"));
        assertThat("coords.version",coords.version,is("9.3.x"));
        assertThat("coords.type",coords.type,is("jar"));
        assertThat("coords.classifier",coords.classifier,is("tests"));
        
        assertThat("coords.toCentralURI", coords.toCentralURI().toASCIIString(), 
                is("http://central.maven.org/maven2/org/eclipse/jetty/jetty-http/9.3.x/jetty-http-9.3.x-tests.jar"));
    }
}
