/*******************************************************************************
 * Copyright (c) 2015, 2016 Christian Gaege and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Christian Gaege - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.hudson.tests.client;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.eclipse.mylyn.commons.repositories.core.RepositoryLocation;
import org.eclipse.mylyn.commons.sdk.util.CommonTestUtil.PrivilegeLevel;
import org.eclipse.mylyn.hudson.tests.support.HudsonFixture;
import org.eclipse.mylyn.hudson.tests.support.HudsonHarness;
import org.eclipse.mylyn.internal.hudson.core.client.HudsonException;
import org.eclipse.mylyn.internal.hudson.core.client.HudsonUrlUtil;
import org.eclipse.mylyn.internal.hudson.core.client.RestfulHudsonClient;
import org.junit.Assert;

import junit.framework.TestCase;

/**
 * @author Christian Gaege
 */
public class HudsonUrlUtilTest extends TestCase {

	private HudsonUrlUtil hudsonUrlUtil;

	private HudsonHarness harness;

	private RepositoryLocation repositoryLocation;

	@Override
	protected void setUp() throws Exception {
		harness = HudsonFixture.current().createHarness();
		RestfulHudsonClient client = harness.connect(PrivilegeLevel.ANONYMOUS);
		repositoryLocation = client.getLocation();

		hudsonUrlUtil = new HudsonUrlUtil(repositoryLocation);
	}

	public void testBaseUrl() {

		Assert.assertEquals(repositoryLocation.getUrl(), hudsonUrlUtil.baseUrl());
	}

	public void testAssembleJobUrl() throws HudsonException {

		String jobName = harness.getPlanNestedTwo();
		String folderUrl = repositoryLocation.getUrl();
		String expectedJobUrl = folderUrl + "job/" + jobName + "/";

		Assert.assertEquals(expectedJobUrl, hudsonUrlUtil.assembleJobUrl(jobName, folderUrl));
	}

	public void testAssembleJobUrlWithWhitespace() throws HudsonException, URISyntaxException {

		String jobName = harness.getPlanWhitespace();
		String folderUrl = repositoryLocation.getUrl();
		String encodedJobName = new URI(null, jobName, null).toASCIIString();
		String expectedJobUrl = folderUrl + "job/" + encodedJobName + "/";

		Assert.assertEquals(expectedJobUrl, hudsonUrlUtil.assembleJobUrl(jobName, folderUrl));
	}

	public void testGroupJobNamesByFolderUrlWithoutJobUrls() throws HudsonException {

		Map<String, List<String>> jobNamesByFolderUrl = hudsonUrlUtil.groupJobNamesByFolderUrl(new ArrayList<String>());

		Assert.assertNotNull(jobNamesByFolderUrl);
		Assert.assertTrue(jobNamesByFolderUrl.isEmpty());
	}

	public void testGroupJobNameByFolderUrlWithJobUrlIds() throws HudsonException {

		String baseUrl = repositoryLocation.getUrl();
		String folderUrl = baseUrl + "job/test-folder/";
		String subFolderUrl = folderUrl + "job/test-sub-folder/";

		List<String> jobIds = new ArrayList<String>();
		jobIds.add(baseUrl + "job/test-succeeding/");
		jobIds.add(baseUrl + "job/test-white%20space/");
		jobIds.add(folderUrl + "job/test-nested-one/");
		jobIds.add(subFolderUrl + "job/test-nested-two/");

		Map<String, List<String>> jobNamesByFolderUrl = hudsonUrlUtil.groupJobNamesByFolderUrl(jobIds);

		Assert.assertNotNull(jobNamesByFolderUrl);
		Assert.assertEquals(3, jobNamesByFolderUrl.keySet().size());

		Assert.assertTrue(jobNamesByFolderUrl.containsKey(baseUrl));
		List<String> baseUrlJobs = jobNamesByFolderUrl.get(baseUrl);
		Assert.assertNotNull(baseUrlJobs);
		Assert.assertTrue(baseUrlJobs.contains("test-succeeding"));
		Assert.assertTrue(baseUrlJobs.contains("test-white space"));

		Assert.assertTrue(jobNamesByFolderUrl.containsKey(baseUrl));
		List<String> folderUrlJobs = jobNamesByFolderUrl.get(folderUrl);
		Assert.assertNotNull(folderUrlJobs);
		Assert.assertTrue(folderUrlJobs.contains("test-nested-one"));

		Assert.assertTrue(jobNamesByFolderUrl.containsKey(baseUrl));
		List<String> subFolderUrlJobs = jobNamesByFolderUrl.get(subFolderUrl);
		Assert.assertNotNull(subFolderUrlJobs);
		Assert.assertTrue(subFolderUrlJobs.contains("test-nested-two"));
	}

	public void testGroupJobNameByFolderUrlWithJobNameIds() throws HudsonException {

		String baseUrl = repositoryLocation.getUrl();

		List<String> jobIds = new ArrayList<String>();
		jobIds.add(harness.getPlanGit());
		jobIds.add(harness.getPlanWhitespace());

		Map<String, List<String>> jobNamesByFolderUrl = hudsonUrlUtil.groupJobNamesByFolderUrl(jobIds);

		Assert.assertNotNull(jobNamesByFolderUrl);
		Assert.assertEquals(1, jobNamesByFolderUrl.keySet().size());
		List<String> baseUrlJobs = jobNamesByFolderUrl.get(baseUrl);
		Assert.assertNotNull(baseUrlJobs);
		Assert.assertTrue(baseUrlJobs.contains(harness.getPlanGit()));
		Assert.assertTrue(baseUrlJobs.contains(harness.getPlanWhitespace()));
	}

	public void testGroupJobNameByFolderUrlWithJobNameIdsAndJobUrlIds() throws HudsonException {

		String baseUrl = repositoryLocation.getUrl();
		String folderUrl = baseUrl + "job/test-folder/";

		List<String> jobIds = new ArrayList<String>();
		jobIds.add(harness.getPlanGit());
		jobIds.add(harness.getPlanWhitespace());
		jobIds.add(baseUrl + "job/test-succeeding/");
		jobIds.add(folderUrl + "job/test-nested-one/");

		Map<String, List<String>> jobNamesByFolderUrl = hudsonUrlUtil.groupJobNamesByFolderUrl(jobIds);

		Assert.assertNotNull(jobNamesByFolderUrl);
		Assert.assertEquals(2, jobNamesByFolderUrl.keySet().size());

		List<String> baseUrlJobs = jobNamesByFolderUrl.get(baseUrl);
		Assert.assertNotNull(baseUrlJobs);
		Assert.assertTrue(baseUrlJobs.contains(harness.getPlanGit()));
		Assert.assertTrue(baseUrlJobs.contains(harness.getPlanWhitespace()));
		Assert.assertTrue(baseUrlJobs.contains("test-succeeding"));

		List<String> folderUrlJobs = jobNamesByFolderUrl.get(folderUrl);
		Assert.assertNotNull(folderUrlJobs);
		Assert.assertTrue(folderUrlJobs.contains("test-nested-one"));
	}

	public void testGetJobUrlFromJobIdWithJobName() throws HudsonException {

		String jobId = harness.getPlanGit();
		String expectedJobUrl = repositoryLocation.getUrl() + "job/" + jobId + "/";

		String jobUrl = hudsonUrlUtil.getJobUrlFromJobId(jobId);

		Assert.assertEquals(expectedJobUrl, jobUrl);
	}

	public void testGetJobUrlFromJobIdWithJobUrl() throws HudsonException {

		String jobId = this.repositoryLocation.getUrl() + "job/" + harness.getPlanSucceeding() + "/";

		String jobUrl = hudsonUrlUtil.getJobUrlFromJobId(jobId);

		Assert.assertEquals(jobId, jobUrl);
	}

	public void testGetJobUrlFromJobIdWithNestedJobUrl() throws HudsonException {

		String jobId = this.repositoryLocation.getUrl() + "job/" + harness.getPlanFolder() + "/job/"
				+ harness.getPlanNestedOne() + "/";

		String jobUrl = hudsonUrlUtil.getJobUrlFromJobId(jobId);

		Assert.assertEquals(jobId, jobUrl);
	}

	public void testIsNestedJobWithNestedJob() {

		String nestedJobId = this.repositoryLocation.getUrl() + "job/" + harness.getPlanFolder() + "/job/"
				+ harness.getPlanNestedOne() + "/";

		Assert.assertTrue(hudsonUrlUtil.isNestedJob(nestedJobId));
	}

	public void testIsNestedJobWithTopLevelJob() {

		String topLevelJobId = this.repositoryLocation.getUrl() + "job/" + harness.getPlanSucceeding() + "/";

		Assert.assertFalse(hudsonUrlUtil.isNestedJob(topLevelJobId));
	}

	public void testGetDisplayNameWithTopLevelJob() throws HudsonException {

		String nestedJobUrl = this.repositoryLocation.getUrl() + "job/" + harness.getPlanSucceeding() + "/";
		String expectedDisplayName = harness.getPlanSucceeding();

		Assert.assertEquals(expectedDisplayName, hudsonUrlUtil.getDisplayName(nestedJobUrl));
	}

	public void testGetDisplayNameWithNestedJob() throws HudsonException {

		String nestedJobUrl = this.repositoryLocation.getUrl() + "job/" + harness.getPlanFolder() + "/job/"
				+ harness.getPlanNestedOne() + "/";
		String expectedDisplayName = harness.getPlanFolder() + "/" + harness.getPlanNestedOne();

		Assert.assertEquals(expectedDisplayName, hudsonUrlUtil.getDisplayName(nestedJobUrl));
	}

	public void testGetDisplayNameWithJobNamedJob() throws HudsonException {

		String nestedJobUrl = this.repositoryLocation.getUrl() + "job/job/";
		String expectedDisplayName = "job";

		Assert.assertEquals(expectedDisplayName, hudsonUrlUtil.getDisplayName(nestedJobUrl));
	}

	public void testGetDisplayNameWithFolderAndJobNamedJob() throws HudsonException {

		String nestedJobUrl = this.repositoryLocation.getUrl() + "job/job/job/job/";
		String expectedDisplayName = "job/job";

		Assert.assertEquals(expectedDisplayName, hudsonUrlUtil.getDisplayName(nestedJobUrl));
	}

	public void testGetDisplayNameWithWhitespace() throws URISyntaxException, HudsonException {

		String jobUrl = new URI(null, this.repositoryLocation.getUrl() + "job/" + harness.getPlanWhitespace() + "/",
				null).toASCIIString();
		String expectedDisplayName = harness.getPlanWhitespace();

		Assert.assertEquals(expectedDisplayName, hudsonUrlUtil.getDisplayName(jobUrl));
	}
}
