/*******************************************************************************
 *  Copyright (c) 2011 Christian Trutz
 *  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 Trutz - initial API and implementation
 *******************************************************************************/
package org.eclipse.egit.github.core.tests;

import static org.junit.Assert.assertNotNull;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;

import com.google.gson.reflect.TypeToken;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

import org.eclipse.egit.github.core.Label;
import org.eclipse.egit.github.core.RepositoryId;
import org.eclipse.egit.github.core.client.GitHubClient;
import org.eclipse.egit.github.core.client.GitHubRequest;
import org.eclipse.egit.github.core.client.GitHubResponse;
import org.eclipse.egit.github.core.service.LabelService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

/**
 * Unit tests of {@link LabelService}
 */
@RunWith(MockitoJUnitRunner.class)
public class LabelServiceTest {

	@Mock
	private GitHubClient gitHubClient;

	@Mock
	private GitHubResponse response;

	private LabelService labelService;

	/**
	 * Test case set up
	 *
	 * @throws IOException
	 */
	@Before
	public void before() throws IOException {
		doReturn(response).when(gitHubClient).get(any(GitHubRequest.class));
		labelService = new LabelService(gitHubClient);
	}

	/**
	 * Create label service with null client
	 */
	@Test(expected = IllegalArgumentException.class)
	public void constructorNullArgument() {
		new LabelService(null);
	}

	/**
	 * Create label service using default constructor
	 */
	@Test
	public void defaultConstuctor() {
		assertNotNull(new LabelService().getClient());
	}

	/**
	 * Get labels with null user
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void getLabelsNullUser() throws IOException {
		labelService.getLabels(null, "not null");
	}

	/**
	 * Get labels with null repository name
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void getLabelsNullRepositoryName() throws IOException {
		labelService.getLabels("not null", null);
	}

	/**
	 * Get labels with valid parameters
	 *
	 * @throws IOException
	 */
	@Test
	public void getLabels() throws IOException {
		labelService.getLabels("lu", "lr");
		GitHubRequest request = new GitHubRequest();
		request.setUri(Utils.page("/repos/lu/lr/labels"));
		verify(gitHubClient).get(request);
	}

	/**
	 * Get labels with valid parameters
	 *
	 * @throws IOException
	 */
	@Test
	public void getLabelsWithRepositoryId() throws IOException {
		RepositoryId repo = new RepositoryId("lu", "lr");
		labelService.getLabels(repo);
		GitHubRequest request = new GitHubRequest();
		request.setUri(Utils.page("/repos/lu/lr/labels"));
		verify(gitHubClient).get(request);
	}

	/**
	 * Set labels with null user
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void setLabelsNullUser() throws IOException {
		labelService.setLabels(null, "not null", "not null",
				new LinkedList<Label>());
	}

	/**
	 * Set labels with null repository name
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void setLabelsNullRepositoryName() throws IOException {
		labelService.setLabels("not null", null, "not null",
				new LinkedList<Label>());
	}

	/**
	 * Set labels with null issue id
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void setLabelsNullIssueId() throws IOException {
		labelService.setLabels("not null", "not null", null,
				new LinkedList<Label>());
	}

	/**
	 * Set labels with empty issue id
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void setLabelsEmptyIssueId() throws IOException {
		labelService.setLabels("not null", "not null", "",
				new LinkedList<Label>());
	}

	/**
	 * Set labels with null labels list
	 *
	 * @throws IOException
	 */
	@Test
	public void setLabelsNullLabels() throws IOException {
		labelService.setLabels("test_user", "test_repository", "1", null);
		TypeToken<List<Label>> labelsToken = new TypeToken<List<Label>>() {
		};
		verify(gitHubClient).put(
				"/repos/test_user/test_repository/issues/1/labels", null,
				labelsToken.getType());
	}

	/**
	 * Set labels with valid parameters
	 *
	 * @throws IOException
	 */
	@Test
	public void setLabels() throws IOException {
		List<Label> labels = new LinkedList<Label>();
		labelService.setLabels("test_user", "test_repository", "1", labels);
		TypeToken<List<Label>> labelsToken = new TypeToken<List<Label>>() {
		};
		verify(gitHubClient).put(
				"/repos/test_user/test_repository/issues/1/labels", labels,
				labelsToken.getType());
	}

	/**
	 * Set labels with valid parameters
	 *
	 * @throws IOException
	 */
	@Test
	public void setLabelsWithRepositoryId() throws IOException {
		RepositoryId repo = new RepositoryId("test_user", "test_repository");
		List<Label> labels = new LinkedList<Label>();
		labelService.setLabels(repo, "1", labels);
		TypeToken<List<Label>> labelsToken = new TypeToken<List<Label>>() {
		};
		verify(gitHubClient).put(
				"/repos/test_user/test_repository/issues/1/labels", labels,
				labelsToken.getType());
	}

	/**
	 * Create label with null user
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void createLabelNullUser() throws IOException {
		labelService.createLabel(null, "not null", new Label());
	}

	/**
	 * Create label with null repository name
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void createLabelNullRepositoryName() throws IOException {
		labelService.createLabel("not null", null, new Label());
	}

	/**
	 * Create label with null label
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void createLabelNullLabel() throws IOException {
		labelService.createLabel("not null", "not null", null);
	}

	/**
	 * Create label with valid parameters
	 *
	 * @throws IOException
	 */
	@Test
	public void createLabel() throws IOException {
		Label label = new Label();
		labelService.createLabel("test_user", "test_repository", label);
		verify(gitHubClient).post("/repos/test_user/test_repository/labels",
				label, Label.class);
	}

	/**
	 * Create label with valid parameters
	 *
	 * @throws IOException
	 */
	@Test
	public void createLabelWithRepositoryId() throws IOException {
		RepositoryId repo = new RepositoryId("test_user", "test_repository");
		Label label = new Label();
		labelService.createLabel(repo, label);
		verify(gitHubClient).post("/repos/test_user/test_repository/labels",
				label, Label.class);
	}

	/**
	 * Delete label with null user
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void deleteNullUser() throws IOException {
		labelService.deleteLabel(null, "repo", "label");
	}

	/**
	 * Delete label with empty user
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void deleteEmptyUser() throws IOException {
		labelService.deleteLabel("", "repo", "label");
	}

	/**
	 * Delete label with null repository name
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void deleteNullRepositoryName() throws IOException {
		labelService.deleteLabel("user", null, "label");
	}

	/**
	 * Delete label with empty repository name
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void deleteEmptyRepositoryName() throws IOException {
		labelService.deleteLabel("user", "", "label");
	}

	/**
	 * Delete label with null name
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void deleteNullLabel() throws IOException {
		labelService.deleteLabel("user", "repo", null);
	}

	/**
	 * Delete label with empty name
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void deleteEmptyLabel() throws IOException {
		labelService.deleteLabel("user", "repo", "");
	}

	/**
	 * Get label with valid parameters
	 *
	 * @throws IOException
	 */
	@Test
	public void deleteLabel() throws IOException {
		labelService.deleteLabel("user", "repo", "label");
		verify(gitHubClient).delete("/repos/user/repo/labels/label");
	}

	/**
	 * Get label with valid parameters
	 *
	 * @throws IOException
	 */
	@Test
	public void deleteLabelWithRepositoryId() throws IOException {
		RepositoryId repo = new RepositoryId("user", "repo");
		labelService.deleteLabel(repo, "label");
		verify(gitHubClient).delete("/repos/user/repo/labels/label");
	}

	/**
	 * Get label with null user
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void getNullUser() throws IOException {
		labelService.getLabel(null, "repo", "label");
	}

	/**
	 * Get label with empty user
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void getEmptyUser() throws IOException {
		labelService.getLabel("", "repo", "label");
	}

	/**
	 * Get label with null repository name
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void getNullRepositoryName() throws IOException {
		labelService.getLabel("user", null, "label");
	}

	/**
	 * Get label with empty repository name
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void getEmptyRepositoryName() throws IOException {
		labelService.getLabel("user", "", "label");
	}

	/**
	 * Get label with null name
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void getNullLabel() throws IOException {
		labelService.getLabel("user", "repo", null);
	}

	/**
	 * Get label with empty name
	 *
	 * @throws IOException
	 */
	@Test(expected = IllegalArgumentException.class)
	public void getEmptyLabel() throws IOException {
		labelService.getLabel("user", "repo", "");
	}

	/**
	 * Get label with valid parameters
	 *
	 * @throws IOException
	 */
	@Test
	public void getLabel() throws IOException {
		labelService.getLabel("user", "repo", "bugs");
		GitHubRequest request = new GitHubRequest();
		request.setUri("/repos/user/repo/labels/bugs");
		verify(gitHubClient).get(request);
	}

	/**
	 * Get label with valid parameters
	 *
	 * @throws IOException
	 */
	@Test
	public void getLabelWithRepositoryId() throws IOException {
		RepositoryId repo = new RepositoryId("user", "repo");
		labelService.getLabel(repo, "bugs");
		GitHubRequest request = new GitHubRequest();
		request.setUri("/repos/user/repo/labels/bugs");
		verify(gitHubClient).get(request);
	}
}
